2020-09-24 08:09:37 -04:00
|
|
|
import { GlButton } from '@gitlab/ui';
|
2022-01-21 13:12:45 -05:00
|
|
|
import { shallowMount } from '@vue/test-utils';
|
2022-01-25 07:14:14 -05:00
|
|
|
import Vue, { nextTick } from 'vue';
|
2021-02-14 13:09:20 -05:00
|
|
|
import Vuex from 'vuex';
|
2020-02-25 16:09:23 -05:00
|
|
|
import DiscussionCounter from '~/notes/components/discussion_counter.vue';
|
2021-02-14 13:09:20 -05:00
|
|
|
import notesModule from '~/notes/stores/modules';
|
2020-02-25 16:09:23 -05:00
|
|
|
import * as types from '~/notes/stores/mutation_types';
|
2021-02-01 10:08:56 -05:00
|
|
|
import { noteableDataMock, discussionMock, notesDataMock, userDataMock } from '../mock_data';
|
2020-02-25 16:09:23 -05:00
|
|
|
|
|
|
|
describe('DiscussionCounter component', () => {
|
|
|
|
let store;
|
|
|
|
let wrapper;
|
2020-09-24 08:09:37 -04:00
|
|
|
let setExpandDiscussionsFn;
|
2020-02-25 16:09:23 -05:00
|
|
|
|
2022-01-21 13:12:45 -05:00
|
|
|
Vue.use(Vuex);
|
2020-02-25 16:09:23 -05:00
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
window.mrTabs = {};
|
|
|
|
const { state, getters, mutations, actions } = notesModule();
|
2020-09-24 08:09:37 -04:00
|
|
|
setExpandDiscussionsFn = jest.fn().mockImplementation(actions.setExpandDiscussions);
|
2020-02-25 16:09:23 -05:00
|
|
|
|
|
|
|
store = new Vuex.Store({
|
|
|
|
state: {
|
|
|
|
...state,
|
|
|
|
userData: userDataMock,
|
|
|
|
},
|
|
|
|
getters,
|
|
|
|
mutations,
|
2020-09-24 08:09:37 -04:00
|
|
|
actions: {
|
|
|
|
...actions,
|
|
|
|
setExpandDiscussions: setExpandDiscussionsFn,
|
|
|
|
},
|
2020-02-25 16:09:23 -05:00
|
|
|
});
|
|
|
|
store.dispatch('setNoteableData', {
|
|
|
|
...noteableDataMock,
|
|
|
|
create_issue_to_resolve_discussions_path: '/test',
|
|
|
|
});
|
|
|
|
store.dispatch('setNotesData', notesDataMock);
|
|
|
|
});
|
|
|
|
|
|
|
|
afterEach(() => {
|
|
|
|
wrapper.vm.$destroy();
|
|
|
|
wrapper = null;
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('has no discussions', () => {
|
|
|
|
it('does not render', () => {
|
2022-01-21 13:12:45 -05:00
|
|
|
wrapper = shallowMount(DiscussionCounter, { store });
|
2020-02-25 16:09:23 -05:00
|
|
|
|
|
|
|
expect(wrapper.find({ ref: 'discussionCounter' }).exists()).toBe(false);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('has no resolvable discussions', () => {
|
|
|
|
it('does not render', () => {
|
2021-11-16 04:13:21 -05:00
|
|
|
store.commit(types.ADD_OR_UPDATE_DISCUSSIONS, [{ ...discussionMock, resolvable: false }]);
|
2020-02-25 16:09:23 -05:00
|
|
|
store.dispatch('updateResolvableDiscussionsCounts');
|
2022-01-21 13:12:45 -05:00
|
|
|
wrapper = shallowMount(DiscussionCounter, { store });
|
2020-02-25 16:09:23 -05:00
|
|
|
|
|
|
|
expect(wrapper.find({ ref: 'discussionCounter' }).exists()).toBe(false);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('has resolvable discussions', () => {
|
|
|
|
const updateStore = (note = {}) => {
|
|
|
|
discussionMock.notes[0] = { ...discussionMock.notes[0], ...note };
|
2021-11-16 04:13:21 -05:00
|
|
|
store.commit(types.ADD_OR_UPDATE_DISCUSSIONS, [discussionMock]);
|
2020-02-25 16:09:23 -05:00
|
|
|
store.dispatch('updateResolvableDiscussionsCounts');
|
|
|
|
};
|
|
|
|
|
|
|
|
afterEach(() => {
|
|
|
|
delete discussionMock.notes[0].resolvable;
|
|
|
|
delete discussionMock.notes[0].resolved;
|
|
|
|
});
|
|
|
|
|
|
|
|
it('renders', () => {
|
|
|
|
updateStore();
|
2022-01-21 13:12:45 -05:00
|
|
|
wrapper = shallowMount(DiscussionCounter, { store });
|
2020-02-25 16:09:23 -05:00
|
|
|
|
|
|
|
expect(wrapper.find({ ref: 'discussionCounter' }).exists()).toBe(true);
|
|
|
|
});
|
|
|
|
|
|
|
|
it.each`
|
2020-05-04 08:09:46 -04:00
|
|
|
title | resolved | isActive | groupLength
|
|
|
|
${'not allResolved'} | ${false} | ${false} | ${3}
|
|
|
|
${'allResolved'} | ${true} | ${true} | ${1}
|
|
|
|
`('renders correctly if $title', ({ resolved, isActive, groupLength }) => {
|
2020-02-25 16:09:23 -05:00
|
|
|
updateStore({ resolvable: true, resolved });
|
2022-01-21 13:12:45 -05:00
|
|
|
wrapper = shallowMount(DiscussionCounter, { store });
|
2020-02-25 16:09:23 -05:00
|
|
|
|
|
|
|
expect(wrapper.find(`.is-active`).exists()).toBe(isActive);
|
2020-09-24 08:09:37 -04:00
|
|
|
expect(wrapper.findAll(GlButton)).toHaveLength(groupLength);
|
2020-02-25 16:09:23 -05:00
|
|
|
});
|
|
|
|
});
|
2020-03-24 08:09:42 -04:00
|
|
|
|
|
|
|
describe('toggle all threads button', () => {
|
|
|
|
let toggleAllButton;
|
2020-12-23 19:10:25 -05:00
|
|
|
const updateStoreWithExpanded = (expanded) => {
|
2020-03-24 08:09:42 -04:00
|
|
|
const discussion = { ...discussionMock, expanded };
|
2021-11-16 04:13:21 -05:00
|
|
|
store.commit(types.ADD_OR_UPDATE_DISCUSSIONS, [discussion]);
|
2020-03-24 08:09:42 -04:00
|
|
|
store.dispatch('updateResolvableDiscussionsCounts');
|
2022-01-21 13:12:45 -05:00
|
|
|
wrapper = shallowMount(DiscussionCounter, { store });
|
2020-03-24 08:09:42 -04:00
|
|
|
toggleAllButton = wrapper.find('.toggle-all-discussions-btn');
|
|
|
|
};
|
|
|
|
|
|
|
|
afterEach(() => wrapper.destroy());
|
|
|
|
|
|
|
|
it('calls button handler when clicked', () => {
|
|
|
|
updateStoreWithExpanded(true);
|
|
|
|
|
2020-09-24 08:09:37 -04:00
|
|
|
toggleAllButton.vm.$emit('click');
|
2020-03-24 08:09:42 -04:00
|
|
|
|
2020-09-24 08:09:37 -04:00
|
|
|
expect(setExpandDiscussionsFn).toHaveBeenCalledTimes(1);
|
2020-03-24 08:09:42 -04:00
|
|
|
});
|
|
|
|
|
2022-01-25 07:14:14 -05:00
|
|
|
it('collapses all discussions if expanded', async () => {
|
2020-03-24 08:09:42 -04:00
|
|
|
updateStoreWithExpanded(true);
|
|
|
|
|
|
|
|
expect(wrapper.vm.allExpanded).toBe(true);
|
2020-09-24 08:09:37 -04:00
|
|
|
expect(toggleAllButton.props('icon')).toBe('angle-up');
|
2020-03-24 08:09:42 -04:00
|
|
|
|
2020-09-24 08:09:37 -04:00
|
|
|
toggleAllButton.vm.$emit('click');
|
2020-03-24 08:09:42 -04:00
|
|
|
|
2022-01-25 07:14:14 -05:00
|
|
|
await nextTick();
|
|
|
|
expect(wrapper.vm.allExpanded).toBe(false);
|
|
|
|
expect(toggleAllButton.props('icon')).toBe('angle-down');
|
2020-03-24 08:09:42 -04:00
|
|
|
});
|
|
|
|
|
2022-01-25 07:14:14 -05:00
|
|
|
it('expands all discussions if collapsed', async () => {
|
2020-03-24 08:09:42 -04:00
|
|
|
updateStoreWithExpanded(false);
|
|
|
|
|
|
|
|
expect(wrapper.vm.allExpanded).toBe(false);
|
2020-09-24 08:09:37 -04:00
|
|
|
expect(toggleAllButton.props('icon')).toBe('angle-down');
|
2020-03-24 08:09:42 -04:00
|
|
|
|
2020-09-24 08:09:37 -04:00
|
|
|
toggleAllButton.vm.$emit('click');
|
2020-03-24 08:09:42 -04:00
|
|
|
|
2022-01-25 07:14:14 -05:00
|
|
|
await nextTick();
|
|
|
|
expect(wrapper.vm.allExpanded).toBe(true);
|
|
|
|
expect(toggleAllButton.props('icon')).toBe('angle-up');
|
2020-03-24 08:09:42 -04:00
|
|
|
});
|
|
|
|
});
|
2020-02-25 16:09:23 -05:00
|
|
|
});
|