diff options
Diffstat (limited to 'spec/frontend/badges')
-rw-r--r-- | spec/frontend/badges/components/badge_form_spec.js | 15 | ||||
-rw-r--r-- | spec/frontend/badges/components/badge_list_row_spec.js | 119 | ||||
-rw-r--r-- | spec/frontend/badges/components/badge_list_spec.js | 95 | ||||
-rw-r--r-- | spec/frontend/badges/components/badge_settings_spec.js | 41 |
4 files changed, 106 insertions, 164 deletions
diff --git a/spec/frontend/badges/components/badge_form_spec.js b/spec/frontend/badges/components/badge_form_spec.js index d7519f1f80d..d3d2544dc4f 100644 --- a/spec/frontend/badges/components/badge_form_spec.js +++ b/spec/frontend/badges/components/badge_form_spec.js @@ -1,5 +1,6 @@ import MockAdapter from 'axios-mock-adapter'; import Vue from 'vue'; +// eslint-disable-next-line no-restricted-imports import Vuex from 'vuex'; import { mount } from '@vue/test-utils'; import { DUMMY_IMAGE_URL, TEST_HOST } from 'helpers/test_constants'; @@ -49,7 +50,7 @@ describe('BadgeForm component', () => { it('stops editing when cancel button is clicked', async () => { createComponent({ isEditing: true }); - const cancelButton = wrapper.find('.row-content-block button'); + const cancelButton = wrapper.findAll('[data-testid="action-buttons"] button').at(1); await cancelButton.trigger('click'); @@ -143,13 +144,13 @@ describe('BadgeForm component', () => { describe('if isEditing is false', () => { const props = { isEditing: false }; - it('renders one button', () => { + it('renders two buttons', () => { createComponent(props); expect(wrapper.find('.row-content-block').exists()).toBe(false); - const buttons = wrapper.findAll('.form-group:last-of-type button'); + const buttons = wrapper.findAll('[data-testid="action-buttons"] button'); - expect(buttons).toHaveLength(1); + expect(buttons).toHaveLength(2); const buttonAddWrapper = buttons.at(0); expect(buttonAddWrapper.isVisible()).toBe(true); @@ -164,15 +165,15 @@ describe('BadgeForm component', () => { it('renders two buttons', () => { createComponent(props); - const buttons = wrapper.findAll('.row-content-block button'); + const buttons = wrapper.findAll('[data-testid="action-buttons"] button'); expect(buttons).toHaveLength(2); - const saveButton = buttons.at(1); + const saveButton = buttons.at(0); expect(saveButton.isVisible()).toBe(true); expect(saveButton.text()).toBe('Save changes'); - const cancelButton = buttons.at(0); + const cancelButton = buttons.at(1); expect(cancelButton.isVisible()).toBe(true); expect(cancelButton.text()).toBe('Cancel'); }); diff --git a/spec/frontend/badges/components/badge_list_row_spec.js b/spec/frontend/badges/components/badge_list_row_spec.js deleted file mode 100644 index cbbeb36ff33..00000000000 --- a/spec/frontend/badges/components/badge_list_row_spec.js +++ /dev/null @@ -1,119 +0,0 @@ -import Vue from 'vue'; -import Vuex from 'vuex'; -import { mount } from '@vue/test-utils'; - -import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures'; -import BadgeListRow from '~/badges/components/badge_list_row.vue'; -import { GROUP_BADGE, PROJECT_BADGE } from '~/badges/constants'; - -import createState from '~/badges/store/state'; -import mutations from '~/badges/store/mutations'; -import actions from '~/badges/store/actions'; - -import { createDummyBadge } from '../dummy_badge'; - -Vue.use(Vuex); - -describe('BadgeListRow component', () => { - let badge; - let wrapper; - let mockedActions; - - const createComponent = (kind) => { - setHTMLFixture(`<div id="delete-badge-modal" class="modal"></div>`); - - mockedActions = Object.fromEntries(Object.keys(actions).map((name) => [name, jest.fn()])); - - const store = new Vuex.Store({ - state: { - ...createState(), - kind: PROJECT_BADGE, - }, - mutations, - actions: mockedActions, - }); - - badge = createDummyBadge(); - badge.kind = kind; - wrapper = mount(BadgeListRow, { - attachTo: document.body, - store, - propsData: { badge }, - }); - }; - - afterEach(() => { - resetHTMLFixture(); - }); - - describe('for a project badge', () => { - beforeEach(() => { - createComponent(PROJECT_BADGE); - }); - - it('renders the badge', () => { - const badgeImage = wrapper.find('.project-badge'); - - expect(badgeImage.exists()).toBe(true); - expect(badgeImage.attributes('src')).toBe(badge.renderedImageUrl); - }); - - it('renders the badge name', () => { - expect(wrapper.text()).toMatch(badge.name); - }); - - it('renders the badge link', () => { - expect(wrapper.text()).toMatch(badge.linkUrl); - }); - - it('renders the badge kind', () => { - expect(wrapper.text()).toMatch('Project Badge'); - }); - - it('shows edit and delete buttons', () => { - const buttons = wrapper.findAll('.table-button-footer button'); - - expect(buttons).toHaveLength(2); - const editButton = buttons.at(0); - - expect(editButton.isVisible()).toBe(true); - expect(editButton.element).toHaveSpriteIcon('pencil'); - - const deleteButton = buttons.at(1); - expect(deleteButton.isVisible()).toBe(true); - expect(deleteButton.element).toHaveSpriteIcon('remove'); - }); - - it('calls editBadge when clicking then edit button', async () => { - const editButton = wrapper.find('.table-button-footer button:first-of-type'); - - await editButton.trigger('click'); - - expect(mockedActions.editBadge).toHaveBeenCalled(); - }); - - it('calls updateBadgeInModal and shows modal when clicking then delete button', async () => { - const deleteButton = wrapper.find('.table-button-footer button:last-of-type'); - - await deleteButton.trigger('click'); - - expect(mockedActions.updateBadgeInModal).toHaveBeenCalled(); - }); - }); - - describe('for a group badge', () => { - beforeEach(() => { - createComponent(GROUP_BADGE); - }); - - it('renders the badge kind', () => { - expect(wrapper.text()).toMatch('Group Badge'); - }); - - it('hides edit and delete buttons', () => { - const buttons = wrapper.findAll('.table-button-footer button'); - - expect(buttons).toHaveLength(0); - }); - }); -}); diff --git a/spec/frontend/badges/components/badge_list_spec.js b/spec/frontend/badges/components/badge_list_spec.js index 374b7b50af4..612e9bdc41f 100644 --- a/spec/frontend/badges/components/badge_list_spec.js +++ b/spec/frontend/badges/components/badge_list_spec.js @@ -1,14 +1,13 @@ +import { GlTable, GlButton } from '@gitlab/ui'; import Vue from 'vue'; +// eslint-disable-next-line no-restricted-imports import Vuex from 'vuex'; -import { mount } from '@vue/test-utils'; - -import BadgeList from '~/badges/components/badge_list.vue'; +import { mountExtended } from 'helpers/vue_test_utils_helper'; import { GROUP_BADGE, PROJECT_BADGE } from '~/badges/constants'; - import createState from '~/badges/store/state'; import mutations from '~/badges/store/mutations'; import actions from '~/badges/store/actions'; - +import BadgeList from '~/badges/components/badge_list.vue'; import { createDummyBadge } from '../dummy_badge'; Vue.use(Vuex); @@ -21,9 +20,16 @@ const badges = Array.from({ length: numberOfDummyBadges }).map((_, idx) => ({ describe('BadgeList component', () => { let wrapper; + let mockedActions; + + const findTable = () => wrapper.findComponent(GlTable); + const findTableRow = (pos) => findTable().find('tbody').findAll('tr').at(pos); + const findButtons = () => wrapper.findByTestId('badge-actions').findAllComponents(GlButton); + const findEditButton = () => wrapper.findByTestId('edit-badge-button'); + const findDeleteButton = () => wrapper.findByTestId('delete-badge'); const createComponent = (customState) => { - const mockedActions = Object.fromEntries(Object.keys(actions).map((name) => [name, jest.fn()])); + mockedActions = Object.fromEntries(Object.keys(actions).map((name) => [name, jest.fn()])); const store = new Vuex.Store({ state: { @@ -35,28 +41,23 @@ describe('BadgeList component', () => { actions: mockedActions, }); - wrapper = mount(BadgeList, { store }); + wrapper = mountExtended(BadgeList, { + store, + stubs: { + GlTable, + GlButton, + }, + }); }; describe('for project badges', () => { - it('renders a header with the badge count', () => { - createComponent({ - kind: PROJECT_BADGE, - badges, - }); - - const header = wrapper.find('.card-header'); - - expect(header.text()).toMatchInterpolatedText('Your badges 3'); - }); - it('renders a row for each badge', () => { createComponent({ kind: PROJECT_BADGE, badges, }); - const rows = wrapper.findAll('.gl-responsive-table-row'); + const rows = findTable().find('tbody').findAll('tr'); expect(rows).toHaveLength(numberOfDummyBadges); }); @@ -89,4 +90,60 @@ describe('BadgeList component', () => { expect(wrapper.text()).toMatch('This group has no badges'); }); }); + + describe('BadgeList item', () => { + beforeEach(() => { + createComponent({ + kind: PROJECT_BADGE, + badges, + }); + }); + + it('renders the badge', () => { + const badgeImage = wrapper.find('.project-badge'); + + expect(badgeImage.exists()).toBe(true); + expect(badgeImage.attributes('src')).toBe(badges[0].renderedImageUrl); + }); + + it('renders the badge name', () => { + const badgeCell = findTableRow(0).findAll('td').at(0); + + expect(badgeCell.text()).toMatch(badges[0].name); + }); + + it('renders the badge link', () => { + expect(wrapper.text()).toMatch(badges[0].linkUrl); + }); + + it('renders the badge kind', () => { + expect(wrapper.text()).toMatch('Project Badge'); + }); + + it('shows edit and delete buttons', () => { + expect(findButtons()).toHaveLength(2); + + const editButton = findEditButton(); + + expect(editButton.isVisible()).toBe(true); + expect(editButton.element).toHaveSpriteIcon('pencil'); + + const deleteButton = findDeleteButton(); + + expect(deleteButton.isVisible()).toBe(true); + expect(deleteButton.element).toHaveSpriteIcon('remove'); + }); + + it('calls editBadge when clicking then edit button', () => { + findEditButton().trigger('click'); + + expect(mockedActions.editBadge).toHaveBeenCalled(); + }); + + it('calls updateBadgeInModal and shows modal when clicking then delete button', () => { + findDeleteButton().trigger('click'); + + expect(mockedActions.updateBadgeInModal).toHaveBeenCalled(); + }); + }); }); diff --git a/spec/frontend/badges/components/badge_settings_spec.js b/spec/frontend/badges/components/badge_settings_spec.js index 7ad2c99869c..af7389b4240 100644 --- a/spec/frontend/badges/components/badge_settings_spec.js +++ b/spec/frontend/badges/components/badge_settings_spec.js @@ -1,10 +1,11 @@ -import { GlModal } from '@gitlab/ui'; +import { GlCard, GlTable } from '@gitlab/ui'; import { shallowMount } from '@vue/test-utils'; -import Vue, { nextTick } from 'vue'; +import Vue from 'vue'; +// eslint-disable-next-line no-restricted-imports import Vuex from 'vuex'; -import BadgeList from '~/badges/components/badge_list.vue'; -import BadgeListRow from '~/badges/components/badge_list_row.vue'; import BadgeSettings from '~/badges/components/badge_settings.vue'; +import BadgeList from '~/badges/components/badge_list.vue'; +import BadgeForm from '~/badges/components/badge_form.vue'; import store from '~/badges/store'; import { createDummyBadge } from '../dummy_badge'; @@ -22,8 +23,10 @@ describe('BadgeSettings component', () => { wrapper = shallowMount(BadgeSettings, { store, stubs: { + GlCard, + GlTable, 'badge-list': BadgeList, - 'badge-list-row': BadgeListRow, + 'badge-form': BadgeForm, }, }); }; @@ -32,35 +35,35 @@ describe('BadgeSettings component', () => { createComponent(); }); - it('displays modal if button for deleting a badge is clicked', async () => { - const button = wrapper.find('[data-testid="delete-badge"]'); + it('renders a header with the badge count', () => { + createComponent(); - button.vm.$emit('click'); - await nextTick(); + const cardTitle = wrapper.find('.gl-new-card-title'); + const cardCount = wrapper.find('.gl-new-card-count'); - const modal = wrapper.findComponent(GlModal); - expect(modal.isVisible()).toBe(true); + expect(cardTitle.text()).toContain('Your badges'); + expect(cardCount.text()).toContain('1'); }); - it('displays a form to add a badge', () => { - expect(wrapper.find('[data-testid="add-new-badge"]').isVisible()).toBe(true); + it('displays a table', () => { + expect(wrapper.findComponent(GlTable).isVisible()).toBe(true); }); - it('displays badge list', () => { + it('renders badge add form', () => { + expect(wrapper.findComponent(BadgeForm).exists()).toBe(true); + }); + + it('renders badge list', () => { expect(wrapper.findComponent(BadgeList).isVisible()).toBe(true); }); describe('when editing', () => { beforeEach(() => { - createComponent(true); + createComponent({ isEditing: true }); }); it('displays a form to edit a badge', () => { expect(wrapper.find('[data-testid="edit-badge"]').isVisible()).toBe(true); }); - - it('displays no badge list', () => { - expect(wrapper.findComponent(BadgeList).isVisible()).toBe(false); - }); }); }); |