From ad476c55c252cc283a20a884fe9236b44f594d6f Mon Sep 17 00:00:00 2001 From: Ezekiel Kigbo Date: Wed, 24 Apr 2019 13:21:36 +0200 Subject: Create project list counts component Signed-off-by: Ezekiel Kigbo --- .../components/projects_list/project_counts.vue | 106 +++++++++++++++++++++ .../projects_list/project_counts_spec.js | 73 ++++++++++++++ 2 files changed, 179 insertions(+) create mode 100644 app/assets/javascripts/vue_shared/components/projects_list/project_counts.vue create mode 100644 spec/javascripts/vue_shared/components/projects_list/project_counts_spec.js diff --git a/app/assets/javascripts/vue_shared/components/projects_list/project_counts.vue b/app/assets/javascripts/vue_shared/components/projects_list/project_counts.vue new file mode 100644 index 00000000000..5f8c5696528 --- /dev/null +++ b/app/assets/javascripts/vue_shared/components/projects_list/project_counts.vue @@ -0,0 +1,106 @@ + + diff --git a/spec/javascripts/vue_shared/components/projects_list/project_counts_spec.js b/spec/javascripts/vue_shared/components/projects_list/project_counts_spec.js new file mode 100644 index 00000000000..bbefa9360d6 --- /dev/null +++ b/spec/javascripts/vue_shared/components/projects_list/project_counts_spec.js @@ -0,0 +1,73 @@ +import Vue from 'vue'; +import ProjectListItem from '~/vue_shared/components/projects_list/project_list_item.vue'; +import mountComponent from 'spec/helpers/vue_mount_component_helper'; + +// TODO: move to shallow mount / vue test utils ?? + +loadJSONFixtures('projects.json'); +const projects = getJSONFixture('projects.json'); +const selectedProject = projects[1]; + +const createComponent = (props, defaultComponent = ProjectListItem) => { + const Component = Vue.extend(defaultComponent); + + return mountComponent(Component, props); +}; + +describe('ProjectCounts', () => { + let vm; + const path = selectedProject.path_with_namespace; + const urls = { + forks: `/${path}/forks`, + issues: `/${path}/issues`, + 'merge-requests': `/${path}/merge_requests`, + }; + + beforeEach(() => { + vm = createComponent({ project: selectedProject }); + }); + + afterEach(() => { + vm.$destroy(); + }); + + it('renders a warning if the project is archived', () => { + const archivedVm = createComponent({ project: { ...selectedProject, archived: true } }); + + expect(archivedVm.$el.querySelector('.icon-container .badge').textContent).toBe('archived'); + + expect(archivedVm.$el.querySelector('.icon-container .badge').classList).toContain( + 'badge-warning', + ); + }); + + it('renders the correct urls for forks, issues and merge requests', () => { + Object.entries(urls).forEach(([key, url]) => { + expect(vm.$el.querySelector(`.icon-container .${key}`).href).toContain(url); + }); + }); + + it('renders the correct star count', () => { + const stars = Number(vm.$el.querySelector('.stars').textContent); + + expect(stars).toEqual(selectedProject.star_count); + }); + + it('renders the correct fork count', () => { + const forks = Number(vm.$el.querySelector('.forks').textContent); + + expect(forks).toEqual(selectedProject.forks_count); + }); + + it('renders the correct issue count', () => { + const issues = Number(vm.$el.querySelector('.issues').textContent); + + expect(issues).toEqual(selectedProject.open_issues_count); + }); + + it('renders the correct merge request count', () => { + const mergeRequests = Number(vm.$el.querySelector('.merge-requests').textContent); + + expect(mergeRequests).toEqual(selectedProject.merge_requests_count); + }); +}); -- cgit v1.2.1