Skip to content

Commit 58a0221

Browse files
committed
Update frontend tests for nodejs, jest, and vue/test-utils upgrades
1 parent def87ae commit 58a0221

File tree

110 files changed

+2531
-2213
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

110 files changed

+2531
-2213
lines changed

contentcuration/contentcuration/frontend/accounts/pages/__tests__/accountsMain.spec.js

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ import { mount } from '@vue/test-utils';
22
import router from '../../router';
33
import AccountsMain from '../AccountsMain.vue';
44

5-
const login = jest.fn();
6-
7-
function makeWrapper() {
5+
async function makeWrapper() {
86
const wrapper = mount(AccountsMain, {
97
router,
108
stubs: ['GlobalSnackbar', 'PolicyModals'],
@@ -18,19 +16,14 @@ function makeWrapper() {
1816
},
1917
},
2018
});
21-
wrapper.setMethods({
22-
login: data => {
23-
return new Promise(resolve => {
24-
login(data);
25-
resolve();
26-
});
27-
},
28-
});
29-
wrapper.setData({
19+
await wrapper.setData({
3020
username: '[email protected]',
3121
password: 'pass',
3222
});
33-
return wrapper;
23+
24+
const login = jest.spyOn(wrapper.vm, 'login');
25+
login.mockImplementation(() => Promise.resolve());
26+
return [wrapper, login];
3427
}
3528

3629
function makeFailedPromise(statusCode) {
@@ -46,54 +39,62 @@ function makeFailedPromise(statusCode) {
4639
}
4740

4841
describe('main', () => {
49-
let wrapper, loginToProceed;
42+
let wrapper, login, loginToProceed;
43+
5044
beforeEach(async () => {
51-
wrapper = makeWrapper();
52-
login.mockReset();
45+
[wrapper, login] = await makeWrapper();
5346
await wrapper.vm.$nextTick();
54-
loginToProceed = wrapper.findAll('[data-test="loginToProceed"]').at(0);
47+
loginToProceed = wrapper.findAllComponents('[data-test="loginToProceed"]').at(0);
5548
});
49+
5650
afterEach(() => {
5751
if (wrapper) {
5852
wrapper.destroy();
5953
}
6054
});
61-
it('should trigger submit method when form is submitted', () => {
55+
56+
it('should trigger submit method when form is submitted', async () => {
6257
expect(loginToProceed.isVisible()).toBe(false);
63-
const submit = jest.fn();
64-
wrapper.setMethods({ submit });
65-
wrapper.find({ ref: 'form' }).trigger('submit');
58+
const submit = jest.spyOn(wrapper.vm, 'submit');
59+
submit.mockImplementation(() => {});
60+
await wrapper.findComponent({ ref: 'form' }).trigger('submit');
6661
expect(submit).toHaveBeenCalled();
6762
});
63+
6864
it('should call login with username and password provided', () => {
6965
expect(loginToProceed.isVisible()).toBe(false);
7066
wrapper.vm.submit();
7167
expect(login).toHaveBeenCalled();
7268
});
73-
it('should fail if username is not provided', () => {
69+
70+
it('should fail if username is not provided', async () => {
7471
expect(loginToProceed.isVisible()).toBe(false);
75-
wrapper.setData({ username: ' ' });
72+
await wrapper.setData({ username: ' ' });
7673
wrapper.vm.submit();
7774
expect(login).not.toHaveBeenCalled();
7875
});
79-
it('should fail if password is not provided', () => {
76+
77+
it('should fail if password is not provided', async () => {
8078
expect(loginToProceed.isVisible()).toBe(false);
81-
wrapper.setData({ password: '' });
79+
await wrapper.setData({ password: '' });
8280
wrapper.vm.submit();
8381
expect(login).not.toHaveBeenCalled();
8482
});
83+
8584
it('should set loginFailed if login fails', async () => {
8685
expect(loginToProceed.isVisible()).toBe(false);
87-
wrapper.setMethods({ login: makeFailedPromise() });
86+
jest.spyOn(wrapper.vm, 'login').mockImplementation(makeFailedPromise());
8887
await wrapper.vm.submit();
8988
expect(wrapper.vm.loginFailed).toBe(true);
9089
});
90+
9191
it('should say account has not been activated if login returns 405', async () => {
9292
expect(loginToProceed.isVisible()).toBe(false);
93-
wrapper.setMethods({ login: makeFailedPromise() });
93+
jest.spyOn(wrapper.vm, 'login').mockImplementation(makeFailedPromise());
9494
await wrapper.vm.submit();
9595
expect(wrapper.vm.loginFailed).toBe(true);
9696
});
97+
9798
it('should navigate to next url if next query param is set', async () => {
9899
const testUrl = '/testnext/';
99100
const location = new URL(`http://studio.time/?next=${testUrl}`);
@@ -103,7 +104,7 @@ describe('main', () => {
103104
window.location.assign = jest.fn();
104105

105106
wrapper.destroy();
106-
wrapper = makeWrapper();
107+
[wrapper, login] = await makeWrapper();
107108
await wrapper.vm.$nextTick();
108109
loginToProceed = wrapper.findAll('[data-test="loginToProceed"]').at(0);
109110
expect(loginToProceed.isVisible()).toBe(true);

contentcuration/contentcuration/frontend/accounts/pages/__tests__/create.spec.js

Lines changed: 67 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,7 @@ const defaultData = {
3131
accepted_tos: true,
3232
};
3333

34-
const register = jest.fn();
35-
36-
function makeWrapper(formData) {
34+
async function makeWrapper(formData) {
3735
const wrapper = mount(Create, {
3836
router,
3937
computed: {
@@ -46,21 +44,15 @@ function makeWrapper(formData) {
4644
stubs: ['PolicyModals'],
4745
mocks: connectionStateMocks,
4846
});
49-
wrapper.setData({
47+
await wrapper.setData({
5048
form: {
5149
...defaultData,
5250
...formData,
5351
},
5452
});
55-
wrapper.setMethods({
56-
register: data => {
57-
return new Promise(resolve => {
58-
register(data);
59-
resolve();
60-
});
61-
},
62-
});
63-
return wrapper;
53+
const register = jest.spyOn(wrapper.vm, 'register');
54+
register.mockImplementation(() => Promise.resolve());
55+
return [wrapper, { register }];
6456
}
6557
function makeFailedPromise(statusCode) {
6658
return () => {
@@ -75,38 +67,39 @@ function makeFailedPromise(statusCode) {
7567
}
7668

7769
describe('create', () => {
78-
beforeEach(() => {
79-
register.mockReset();
80-
});
81-
it('should trigger submit method when form is submitted', () => {
82-
const submit = jest.fn();
83-
const wrapper = makeWrapper();
84-
wrapper.setMethods({ submit });
85-
wrapper.find({ ref: 'form' }).trigger('submit');
70+
it('should trigger submit method when form is submitted', async () => {
71+
const [wrapper] = await makeWrapper();
72+
const submit = jest.spyOn(wrapper.vm, 'submit');
73+
submit.mockImplementation(() => Promise.resolve());
74+
await wrapper.findComponent({ ref: 'form' }).trigger('submit');
8675
expect(submit).toHaveBeenCalled();
8776
});
88-
it('should call register with form data', () => {
89-
const wrapper = makeWrapper();
90-
wrapper.find({ ref: 'form' }).trigger('submit');
91-
expect(register.mock.calls[0][0]).toEqual({
77+
78+
it('should call register with form data', async () => {
79+
const [wrapper, mocks] = await makeWrapper();
80+
await wrapper.findComponent({ ref: 'form' }).trigger('submit');
81+
expect(mocks.register.mock.calls[0][0]).toEqual({
9282
...defaultData,
9383
locations: defaultData.locations.join('|'),
9484
uses: defaultData.uses.join('|'),
9585
policies: '{}',
9686
});
9787
});
88+
9889
it('should automatically fill the email if provided in the query param', () => {
9990
router.push({ name: 'Create', query: { email: '[email protected]' } });
10091
const wrapper = mount(Create, { router, stubs: ['PolicyModals'], mocks: connectionStateMocks });
10192
expect(wrapper.vm.form.email).toBe('[email protected]');
10293
});
94+
10395
describe('validation', () => {
104-
it('should call register if form is valid', () => {
105-
const wrapper = makeWrapper();
96+
it('should call register if form is valid', async () => {
97+
const [wrapper, mocks] = await makeWrapper();
10698
wrapper.vm.submit();
107-
expect(register).toHaveBeenCalled();
99+
expect(mocks.register).toHaveBeenCalled();
108100
});
109-
it('should fail if required fields are not set', () => {
101+
102+
it('should fail if required fields are not set', async () => {
110103
const form = {
111104
first_name: '',
112105
last_name: '',
@@ -120,55 +113,67 @@ describe('create', () => {
120113
accepted_tos: false,
121114
};
122115

123-
Object.keys(form).forEach(field => {
124-
const wrapper = makeWrapper({ [field]: form[field] });
125-
wrapper.vm.submit();
126-
expect(register).not.toHaveBeenCalled();
127-
});
128-
});
129-
it('should fail if password1 is too short', () => {
130-
const wrapper = makeWrapper({ password1: '123' });
131-
wrapper.vm.submit();
132-
expect(register).not.toHaveBeenCalled();
133-
});
134-
it('should fail if password1 and password2 do not match', () => {
135-
const wrapper = makeWrapper({ password1: 'some other password' });
136-
wrapper.vm.submit();
137-
expect(register).not.toHaveBeenCalled();
116+
for (const field of Object.keys(form)) {
117+
const [wrapper, mocks] = await makeWrapper({ [field]: form[field] });
118+
await wrapper.vm.submit();
119+
expect(mocks.register).not.toHaveBeenCalled();
120+
}
138121
});
139-
it('should fail if uses field is set to fields that require more input that is not provided', () => {
140-
[uses.STORING, uses.OTHER].forEach(use => {
141-
const wrapper = makeWrapper({ uses: [use] });
142-
wrapper.vm.submit();
143-
expect(register).not.toHaveBeenCalled();
144-
});
122+
123+
it('should fail if password1 is too short', async () => {
124+
const [wrapper, mocks] = await makeWrapper({ password1: '123' });
125+
await wrapper.vm.submit();
126+
expect(mocks.register).not.toHaveBeenCalled();
145127
});
146-
it('should fail if source field is set to an option that requires more input that is not provided', () => {
147-
[sources.ORGANIZATION, sources.CONFERENCE, sources.OTHER].forEach(source => {
148-
const wrapper = makeWrapper({ source });
149-
wrapper.vm.submit();
150-
expect(register).not.toHaveBeenCalled();
151-
});
128+
129+
it('should fail if password1 and password2 do not match', async () => {
130+
const [wrapper, mocks] = await makeWrapper({ password1: 'some other password' });
131+
await wrapper.vm.submit();
132+
expect(mocks.register).not.toHaveBeenCalled();
152133
});
134+
135+
it.each(
136+
[uses.STORING, uses.OTHER],
137+
'should fail if uses field is set to fields that require more input that is not provided',
138+
async use => {
139+
const [wrapper, mocks] = await makeWrapper({ uses: [use] });
140+
await wrapper.vm.submit();
141+
expect(mocks.register).not.toHaveBeenCalled();
142+
},
143+
);
144+
145+
it.each(
146+
[sources.ORGANIZATION, sources.CONFERENCE, sources.OTHER],
147+
'should fail if source field is set to an option that requires more input that is not provided',
148+
async source => {
149+
const [wrapper, mocks] = await makeWrapper({ source });
150+
await wrapper.vm.submit();
151+
expect(mocks.register).not.toHaveBeenCalled();
152+
},
153+
);
153154
});
154155

155156
describe('on backend failures', () => {
156-
let wrapper;
157-
beforeEach(() => {
158-
wrapper = makeWrapper();
157+
let wrapper, mocks;
158+
159+
beforeEach(async () => {
160+
[wrapper, mocks] = await makeWrapper();
159161
});
162+
160163
it('should say account with email already exists if register returns a 403', async () => {
161-
wrapper.setMethods({ register: makeFailedPromise(403) });
164+
mocks.register.mockImplementation(makeFailedPromise(403));
162165
await wrapper.vm.submit();
163166
expect(wrapper.vm.errors.email).toHaveLength(1);
164167
});
168+
165169
it('should say account has not been activated if register returns 405', async () => {
166-
wrapper.setMethods({ register: makeFailedPromise(405) });
170+
mocks.register.mockImplementation(makeFailedPromise(405));
167171
await wrapper.vm.submit();
168172
expect(wrapper.vm.$route.name).toBe('AccountNotActivated');
169173
});
174+
170175
it('registrationFailed should be true if any other error is returned', async () => {
171-
wrapper.setMethods({ register: makeFailedPromise() });
176+
mocks.register.mockImplementation(makeFailedPromise());
172177
await wrapper.vm.submit();
173178
expect(wrapper.vm.valid).toBe(false);
174179
expect(wrapper.vm.registrationFailed).toBe(true);

contentcuration/contentcuration/frontend/accounts/pages/__tests__/forgotPassword.spec.js

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,32 @@ import { mount } from '@vue/test-utils';
22
import VueRouter from 'vue-router';
33
import ForgotPassword from '../resetPassword/ForgotPassword';
44

5-
const sendPasswordResetLink = jest.fn();
6-
75
function makeWrapper() {
8-
return mount({
9-
...ForgotPassword,
6+
return mount(ForgotPassword, {
107
// Need to add a router instance as a child component relies on route linking
118
router: new VueRouter(),
129
});
1310
}
1411

1512
describe('forgotPassword', () => {
1613
let wrapper;
14+
let sendPasswordResetLink;
15+
1716
beforeEach(() => {
1817
wrapper = makeWrapper();
19-
wrapper.setMethods({
20-
sendPasswordResetLink: () => {
21-
return new Promise(resolve => {
22-
sendPasswordResetLink();
23-
resolve();
24-
});
25-
},
26-
});
27-
sendPasswordResetLink.mockReset();
18+
sendPasswordResetLink = jest.spyOn(wrapper.vm, 'sendPasswordResetLink');
19+
sendPasswordResetLink.mockImplementation(() => Promise.resolve());
2820
});
29-
it('should not call sendPasswordResetLink on submit if email is invalid', () => {
30-
wrapper.find({ ref: 'form' }).trigger('submit');
21+
it('should not call sendPasswordResetLink on submit if email is invalid', async () => {
22+
wrapper.findComponent({ ref: 'form' }).trigger('submit');
23+
await wrapper.vm.$nextTick();
3124
expect(sendPasswordResetLink).not.toHaveBeenCalled();
3225
});
33-
it('should call sendPasswordResetLink on submit if email is valid', () => {
26+
it('should call sendPasswordResetLink on submit if email is valid', async () => {
3427
wrapper.setData({ email: '[email protected]' });
35-
wrapper.find({ ref: 'form' }).trigger('submit');
28+
await wrapper.vm.$nextTick();
29+
wrapper.findComponent({ ref: 'form' }).trigger('submit');
30+
await wrapper.vm.$nextTick();
3631
expect(sendPasswordResetLink).toHaveBeenCalled();
3732
});
3833
});

0 commit comments

Comments
 (0)