1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
import { GlModal } from '@gitlab/ui';
import { stubComponent } from 'helpers/stub_component';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import CsvImportModal from '~/issuable/components/csv_import_modal.vue';
import { __ } from '~/locale';
jest.mock('~/lib/utils/csrf', () => ({ token: 'mock-csrf-token' }));
describe('CsvImportModal', () => {
let wrapper;
let formSubmitSpy;
function createComponent(options = {}) {
const { injectedProperties = {}, props = {} } = options;
return mountExtended(CsvImportModal, {
propsData: {
modalId: 'csv-import-modal',
...props,
},
provide: {
...injectedProperties,
},
stubs: {
GlModal: stubComponent(GlModal, {
template: '<div><slot></slot><slot name="modal-footer"></slot></div>',
}),
},
});
}
beforeEach(() => {
formSubmitSpy = jest.spyOn(HTMLFormElement.prototype, 'submit').mockImplementation();
});
const findModal = () => wrapper.findComponent(GlModal);
const findForm = () => wrapper.find('form');
const findFileInput = () => wrapper.findByLabelText('Upload CSV file');
const findAuthenticityToken = () => new FormData(findForm().element).get('authenticity_token');
describe('template', () => {
it('passes correct title props to modal', () => {
wrapper = createComponent();
expect(findModal().props('title')).toContain('Import issues');
});
it('displays a note about the maximum allowed file size', () => {
const maxAttachmentSize = 500;
wrapper = createComponent({ injectedProperties: { maxAttachmentSize } });
expect(findModal().text()).toContain(`The maximum file size allowed is ${maxAttachmentSize}`);
});
describe('form', () => {
const importCsvIssuesPath = 'gitlab-org/gitlab-test/-/issues/import_csv';
beforeEach(() => {
wrapper = createComponent({ injectedProperties: { importCsvIssuesPath } });
});
it('displays the form with the correct action and inputs', () => {
expect(findForm().exists()).toBe(true);
expect(findForm().attributes('action')).toBe(importCsvIssuesPath);
expect(findAuthenticityToken()).toBe('mock-csrf-token');
expect(findFileInput().exists()).toBe(true);
});
it('displays the correct primary button action text', () => {
expect(findModal().props('actionPrimary')).toEqual({ text: __('Import issues') });
});
it('submits the form when the primary action is clicked', () => {
findModal().vm.$emit('primary');
expect(formSubmitSpy).toHaveBeenCalled();
});
it('displays the cancel button', () => {
expect(findModal().props('actionCancel')).toEqual({ text: __('Cancel') });
});
});
});
});
|