193 lines
5.7 KiB
JavaScript
193 lines
5.7 KiB
JavaScript
import { mount } from '@vue/test-utils';
|
|
|
|
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
|
|
|
|
import SettingsDropdown from '~/diffs/components/settings_dropdown.vue';
|
|
import { PARALLEL_DIFF_VIEW_TYPE, INLINE_DIFF_VIEW_TYPE } from '~/diffs/constants';
|
|
import eventHub from '~/diffs/event_hub';
|
|
|
|
import createDiffsStore from '../create_diffs_store';
|
|
|
|
describe('Diff settings dropdown component', () => {
|
|
let wrapper;
|
|
let vm;
|
|
let store;
|
|
|
|
function createComponent(extendStore = () => {}) {
|
|
store = createDiffsStore();
|
|
|
|
extendStore(store);
|
|
|
|
wrapper = extendedWrapper(
|
|
mount(SettingsDropdown, {
|
|
store,
|
|
}),
|
|
);
|
|
vm = wrapper.vm;
|
|
}
|
|
|
|
function getFileByFileCheckbox(vueWrapper) {
|
|
return vueWrapper.findByTestId('file-by-file');
|
|
}
|
|
|
|
function setup({ storeUpdater } = {}) {
|
|
createComponent(storeUpdater);
|
|
jest.spyOn(store, 'dispatch').mockImplementation(() => {});
|
|
}
|
|
|
|
beforeEach(() => {
|
|
setup();
|
|
});
|
|
|
|
afterEach(() => {
|
|
store.dispatch.mockRestore();
|
|
wrapper.destroy();
|
|
});
|
|
|
|
describe('tree view buttons', () => {
|
|
it('list view button dispatches setRenderTreeList with false', () => {
|
|
wrapper.find('.js-list-view').trigger('click');
|
|
|
|
expect(store.dispatch).toHaveBeenCalledWith('diffs/setRenderTreeList', false);
|
|
});
|
|
|
|
it('tree view button dispatches setRenderTreeList with true', () => {
|
|
wrapper.find('.js-tree-view').trigger('click');
|
|
|
|
expect(store.dispatch).toHaveBeenCalledWith('diffs/setRenderTreeList', true);
|
|
});
|
|
|
|
it('sets list button as selected when renderTreeList is false', () => {
|
|
setup({
|
|
storeUpdater: (origStore) =>
|
|
Object.assign(origStore.state.diffs, { renderTreeList: false }),
|
|
});
|
|
|
|
expect(wrapper.find('.js-list-view').classes('selected')).toBe(true);
|
|
expect(wrapper.find('.js-tree-view').classes('selected')).toBe(false);
|
|
});
|
|
|
|
it('sets tree button as selected when renderTreeList is true', () => {
|
|
setup({
|
|
storeUpdater: (origStore) => Object.assign(origStore.state.diffs, { renderTreeList: true }),
|
|
});
|
|
|
|
expect(wrapper.find('.js-list-view').classes('selected')).toBe(false);
|
|
expect(wrapper.find('.js-tree-view').classes('selected')).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('compare changes', () => {
|
|
it('sets inline button as selected', () => {
|
|
setup({
|
|
storeUpdater: (origStore) =>
|
|
Object.assign(origStore.state.diffs, { diffViewType: INLINE_DIFF_VIEW_TYPE }),
|
|
});
|
|
|
|
expect(wrapper.find('.js-inline-diff-button').classes('selected')).toBe(true);
|
|
expect(wrapper.find('.js-parallel-diff-button').classes('selected')).toBe(false);
|
|
});
|
|
|
|
it('sets parallel button as selected', () => {
|
|
setup({
|
|
storeUpdater: (origStore) =>
|
|
Object.assign(origStore.state.diffs, { diffViewType: PARALLEL_DIFF_VIEW_TYPE }),
|
|
});
|
|
|
|
expect(wrapper.find('.js-inline-diff-button').classes('selected')).toBe(false);
|
|
expect(wrapper.find('.js-parallel-diff-button').classes('selected')).toBe(true);
|
|
});
|
|
|
|
it('calls setInlineDiffViewType when clicking inline button', () => {
|
|
wrapper.find('.js-inline-diff-button').trigger('click');
|
|
|
|
expect(store.dispatch).toHaveBeenCalledWith('diffs/setInlineDiffViewType', expect.anything());
|
|
});
|
|
|
|
it('calls setParallelDiffViewType when clicking parallel button', () => {
|
|
wrapper.find('.js-parallel-diff-button').trigger('click');
|
|
|
|
expect(store.dispatch).toHaveBeenCalledWith(
|
|
'diffs/setParallelDiffViewType',
|
|
expect.anything(),
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('whitespace toggle', () => {
|
|
it('does not set as checked when showWhitespace is false', () => {
|
|
setup({
|
|
storeUpdater: (origStore) =>
|
|
Object.assign(origStore.state.diffs, { showWhitespace: false }),
|
|
});
|
|
|
|
expect(wrapper.findByTestId('show-whitespace').element.checked).toBe(false);
|
|
});
|
|
|
|
it('sets as checked when showWhitespace is true', () => {
|
|
setup({
|
|
storeUpdater: (origStore) => Object.assign(origStore.state.diffs, { showWhitespace: true }),
|
|
});
|
|
|
|
expect(wrapper.findByTestId('show-whitespace').element.checked).toBe(true);
|
|
});
|
|
|
|
it('calls setShowWhitespace on change', async () => {
|
|
const checkbox = wrapper.findByTestId('show-whitespace');
|
|
const { checked } = checkbox.element;
|
|
|
|
checkbox.trigger('click');
|
|
|
|
await vm.$nextTick();
|
|
|
|
expect(store.dispatch).toHaveBeenCalledWith('diffs/setShowWhitespace', {
|
|
showWhitespace: !checked,
|
|
pushState: true,
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('file-by-file toggle', () => {
|
|
beforeEach(() => {
|
|
jest.spyOn(eventHub, '$emit');
|
|
});
|
|
|
|
it.each`
|
|
fileByFile | checked
|
|
${true} | ${true}
|
|
${false} | ${false}
|
|
`(
|
|
'sets the checkbox to { checked: $checked } if the fileByFile setting is $fileByFile',
|
|
({ fileByFile, checked }) => {
|
|
setup({
|
|
storeUpdater: (origStore) =>
|
|
Object.assign(origStore.state.diffs, { viewDiffsFileByFile: fileByFile }),
|
|
});
|
|
|
|
expect(getFileByFileCheckbox(wrapper).element.checked).toBe(checked);
|
|
},
|
|
);
|
|
|
|
it.each`
|
|
start | setting
|
|
${true} | ${false}
|
|
${false} | ${true}
|
|
`(
|
|
'when the file by file setting starts as $start, toggling the checkbox should call setFileByFile with $setting',
|
|
async ({ start, setting }) => {
|
|
setup({
|
|
storeUpdater: (origStore) =>
|
|
Object.assign(origStore.state.diffs, { viewDiffsFileByFile: start }),
|
|
});
|
|
|
|
getFileByFileCheckbox(wrapper).trigger('click');
|
|
|
|
await vm.$nextTick();
|
|
|
|
expect(store.dispatch).toHaveBeenCalledWith('diffs/setFileByFile', {
|
|
fileByFile: setting,
|
|
});
|
|
},
|
|
);
|
|
});
|
|
});
|