Skip to content

Commit fc81c54

Browse files
committed
e2e/acceptance/invites: Migrate from mirage to @crates-io/msw
1 parent c1f5f1f commit fc81c54

File tree

1 file changed

+123
-102
lines changed

1 file changed

+123
-102
lines changed

e2e/acceptance/invites.spec.ts

Lines changed: 123 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { test, expect } from '@/e2e/helper';
1+
import { expect, test } from '@/e2e/helper';
2+
import { http, HttpResponse } from 'msw';
23

34
test.describe('Acceptance | /me/pending-invites', { tag: '@acceptance' }, () => {
45
test('shows "page requires authentication" error when not logged in', async ({ page }) => {
@@ -10,38 +11,38 @@ test.describe('Acceptance | /me/pending-invites', { tag: '@acceptance' }, () =>
1011
});
1112

1213
test.describe('Acceptance | /me/pending-invites', { tag: '@acceptance' }, () => {
13-
test.beforeEach(async ({ mirage }) => {
14-
await mirage.addHook(server => {
15-
let inviter = server.create('user', { name: 'janed' });
16-
let inviter2 = server.create('user', { name: 'wycats' });
17-
18-
let user = server.create('user');
19-
20-
let nanomsg = server.create('crate', { name: 'nanomsg' });
21-
server.create('version', { crate: nanomsg });
22-
server.create('crate-owner-invitation', {
23-
crate: nanomsg,
24-
createdAt: '2016-12-24T12:34:56Z',
25-
invitee: user,
26-
inviter,
27-
});
28-
29-
let ember = server.create('crate', { name: 'ember-rs' });
30-
server.create('version', { crate: ember });
31-
server.create('crate-owner-invitation', {
32-
crate: ember,
33-
createdAt: '2020-12-31T12:34:56Z',
34-
invitee: user,
35-
inviter: inviter2,
36-
});
37-
38-
authenticateAs(user);
39-
40-
Object.assign(globalThis, { nanomsg, user });
14+
async function prepare(msw) {
15+
let inviter = msw.db.user.create({ name: 'janed' });
16+
let inviter2 = msw.db.user.create({ name: 'wycats' });
17+
18+
let user = msw.db.user.create();
19+
20+
let nanomsg = msw.db.crate.create({ name: 'nanomsg' });
21+
msw.db.version.create({ crate: nanomsg });
22+
msw.db.crateOwnerInvitation.create({
23+
crate: nanomsg,
24+
createdAt: '2016-12-24T12:34:56Z',
25+
invitee: user,
26+
inviter,
4127
});
42-
});
4328

44-
test('list all pending crate owner invites', async ({ page }) => {
29+
let ember = msw.db.crate.create({ name: 'ember-rs' });
30+
msw.db.version.create({ crate: ember });
31+
msw.db.crateOwnerInvitation.create({
32+
crate: ember,
33+
createdAt: '2020-12-31T12:34:56Z',
34+
invitee: user,
35+
inviter: inviter2,
36+
});
37+
38+
await msw.authenticateAs(user);
39+
40+
return { nanomsg, user };
41+
}
42+
43+
test('list all pending crate owner invites', async ({ page, msw }) => {
44+
await prepare(msw);
45+
4546
await page.goto('/me/pending-invites');
4647
await expect(page).toHaveURL('/me/pending-invites');
4748
await expect(page.locator('[data-test-invite]')).toHaveCount(2);
@@ -67,85 +68,102 @@ test.describe('Acceptance | /me/pending-invites', { tag: '@acceptance' }, () =>
6768
await expect(page.locator('[data-test-declined-message]')).toHaveCount(0);
6869
});
6970

70-
test('shows empty list message', async ({ page, mirage }) => {
71-
await mirage.addHook(server => {
72-
server.schema['crateOwnerInvitations'].all().destroy();
73-
});
71+
test('shows empty list message', async ({ page, msw }) => {
72+
await prepare(msw);
73+
msw.db.crateOwnerInvitation.deleteMany({});
7474

7575
await page.goto('/me/pending-invites');
7676
await expect(page).toHaveURL('/me/pending-invites');
7777
await expect(page.locator('[data-test-invite]')).toHaveCount(0);
7878
await expect(page.locator('[data-test-empty-state]')).toBeVisible();
7979
});
8080

81-
test('invites can be declined', async ({ page }) => {
82-
await page.goto('/me/pending-invites');
83-
await expect(page).toHaveURL('/me/pending-invites');
81+
test('invites can be declined', async ({ page, msw }) => {
82+
let { nanomsg, user } = await prepare(msw);
8483

85-
await page.waitForFunction(expect => {
86-
const { crateOwnerInvitations }: any = server.schema;
87-
const { nanomsg, user }: any = globalThis;
88-
return crateOwnerInvitations.where({ crateId: nanomsg.id, inviteeId: user.id }).length === expect;
89-
}, 1);
84+
let invites = msw.db.crateOwnerInvitation.findMany({
85+
where: {
86+
crate: { id: { equals: nanomsg.id } },
87+
invitee: { id: { equals: user.id } },
88+
},
89+
});
90+
expect(invites.length).toBe(1);
9091

91-
await page.waitForFunction(expect => {
92-
const { crateOwnerships }: any = server.schema;
93-
return crateOwnerships.where({ crateId: globalThis.nanomsg.id, userId: globalThis.user.id }).length === expect;
94-
}, 0);
92+
let owners = msw.db.crateOwnership.findMany({
93+
where: {
94+
crate: { id: { equals: nanomsg.id } },
95+
user: { id: { equals: user.id } },
96+
},
97+
});
98+
expect(owners.length).toBe(0);
9599

96-
const nanomsg = page.locator('[data-test-invite="nanomsg"]');
97-
await nanomsg.locator('[data-test-decline-button]').click();
98-
await expect(nanomsg.and(page.locator('[data-test-declined-message]'))).toHaveText(
100+
await page.goto('/me/pending-invites');
101+
await expect(page).toHaveURL('/me/pending-invites');
102+
103+
const nanomsgL = page.locator('[data-test-invite="nanomsg"]');
104+
await nanomsgL.locator('[data-test-decline-button]').click();
105+
await expect(nanomsgL.and(page.locator('[data-test-declined-message]'))).toHaveText(
99106
'Declined. You have not been added as an owner of crate nanomsg.',
100107
);
101-
await expect(nanomsg.locator('[data-test-crate-link]')).toHaveCount(0);
102-
await expect(nanomsg.locator('[data-test-inviter-link]')).toHaveCount(0);
108+
await expect(nanomsgL.locator('[data-test-crate-link]')).toHaveCount(0);
109+
await expect(nanomsgL.locator('[data-test-inviter-link]')).toHaveCount(0);
103110

104111
await expect(page.locator('[data-test-error-message]')).toHaveCount(0);
105112
await expect(page.locator('[data-test-accepted-message]')).toHaveCount(0);
106113

107-
await page.waitForFunction(expect => {
108-
const { crateOwnerInvitations }: any = server.schema;
109-
const { nanomsg, user }: any = globalThis;
110-
return crateOwnerInvitations.where({ crateId: nanomsg.id, inviteeId: user.id }).length === expect;
111-
}, 0);
112-
113-
await page.waitForFunction(expect => {
114-
const { crateOwnerships }: any = server.schema;
115-
const { nanomsg, user }: any = globalThis;
116-
return crateOwnerships.where({ crateId: nanomsg.id, userId: user.id }).length === expect;
117-
}, 0);
114+
invites = msw.db.crateOwnerInvitation.findMany({
115+
where: {
116+
crate: { id: { equals: nanomsg.id } },
117+
invitee: { id: { equals: user.id } },
118+
},
119+
});
120+
expect(invites.length).toBe(0);
121+
122+
owners = msw.db.crateOwnership.findMany({
123+
where: {
124+
crate: { id: { equals: nanomsg.id } },
125+
user: { id: { equals: user.id } },
126+
},
127+
});
128+
expect(owners.length).toBe(0);
118129
});
119130

120-
test('error message is shown if decline request fails', async ({ page, mirage }) => {
131+
test('error message is shown if decline request fails', async ({ page, msw }) => {
132+
await prepare(msw);
133+
121134
await page.goto('/me/pending-invites');
122135
await expect(page).toHaveURL('/me/pending-invites');
123136

124-
await page.evaluate(() => {
125-
server.put('/api/v1/me/crate_owner_invitations/:crate_id', {}, 500);
126-
});
137+
let error = HttpResponse.json({}, { status: 500 });
138+
await msw.worker.use(http.put('/api/v1/me/crate_owner_invitations/:crate_id', () => error));
127139

128140
await page.click('[data-test-invite="nanomsg"] [data-test-decline-button]');
129141
await expect(page.locator('[data-test-notification-message="error"]')).toContainText('Error in declining invite');
130142
await expect(page.locator('[data-test-accepted-message]')).toHaveCount(0);
131143
await expect(page.locator('[data-test-declined-message]')).toHaveCount(0);
132144
});
133145

134-
test('invites can be accepted', async ({ page, percy }) => {
135-
await page.goto('/me/pending-invites');
136-
await expect(page).toHaveURL('/me/pending-invites');
146+
test('invites can be accepted', async ({ page, percy, msw }) => {
147+
let { nanomsg, user } = await prepare(msw);
137148

138-
await page.waitForFunction(expect => {
139-
const { crateOwnerInvitations }: any = server.schema;
140-
const { nanomsg, user }: any = globalThis;
141-
return crateOwnerInvitations.where({ crateId: nanomsg.id, inviteeId: user.id }).length === expect;
142-
}, 1);
149+
let invites = msw.db.crateOwnerInvitation.findMany({
150+
where: {
151+
crate: { id: { equals: nanomsg.id } },
152+
invitee: { id: { equals: user.id } },
153+
},
154+
});
155+
expect(invites.length).toBe(1);
143156

144-
await page.waitForFunction(expect => {
145-
const { crateOwnerships }: any = server.schema;
146-
const { nanomsg, user }: any = globalThis;
147-
return crateOwnerships.where({ crateId: nanomsg.id, userId: user.id }).length === expect;
148-
}, 0);
157+
let owners = msw.db.crateOwnership.findMany({
158+
where: {
159+
crate: { id: { equals: nanomsg.id } },
160+
user: { id: { equals: user.id } },
161+
},
162+
});
163+
expect(owners.length).toBe(0);
164+
165+
await page.goto('/me/pending-invites');
166+
await expect(page).toHaveURL('/me/pending-invites');
149167

150168
await page.click('[data-test-invite="nanomsg"] [data-test-accept-button]');
151169
await expect(page.locator('[data-test-error-message]')).toHaveCount(0);
@@ -158,42 +176,45 @@ test.describe('Acceptance | /me/pending-invites', { tag: '@acceptance' }, () =>
158176

159177
await percy.snapshot();
160178

161-
await page.waitForFunction(expect => {
162-
const { crateOwnerInvitations }: any = server.schema;
163-
const { nanomsg, user }: any = globalThis;
164-
return crateOwnerInvitations.where({ crateId: nanomsg.id, inviteeId: user.id }).length === expect;
165-
}, 0);
166-
167-
await page.waitForFunction(expect => {
168-
const { crateOwnerships }: any = server.schema;
169-
const { nanomsg, user }: any = globalThis;
170-
return crateOwnerships.where({ crateId: nanomsg.id, userId: user.id }).length === expect;
171-
}, 1);
179+
invites = msw.db.crateOwnerInvitation.findMany({
180+
where: {
181+
crate: { id: { equals: nanomsg.id } },
182+
invitee: { id: { equals: user.id } },
183+
},
184+
});
185+
expect(invites.length).toBe(0);
186+
187+
owners = msw.db.crateOwnership.findMany({
188+
where: {
189+
crate: { id: { equals: nanomsg.id } },
190+
user: { id: { equals: user.id } },
191+
},
192+
});
193+
expect(owners.length).toBe(1);
172194
});
173195

174-
test('error message is shown if accept request fails', async ({ page }) => {
196+
test('error message is shown if accept request fails', async ({ page, msw }) => {
197+
await prepare(msw);
198+
175199
await page.goto('/me/pending-invites');
176200
await expect(page).toHaveURL('/me/pending-invites');
177201

178-
page.evaluate(() => {
179-
server.put('/api/v1/me/crate_owner_invitations/:crate_id', {}, 500);
180-
});
202+
let error = HttpResponse.json({}, { status: 500 });
203+
await msw.worker.use(http.put('/api/v1/me/crate_owner_invitations/:crate_id', () => error));
181204

182205
await page.click('[data-test-invite="nanomsg"] [data-test-accept-button]');
183206
await expect(page.locator('[data-test-notification-message="error"]')).toHaveText('Error in accepting invite');
184207
await expect(page.locator('[data-test-accepted-message]')).toHaveCount(0);
185208
await expect(page.locator('[data-test-declined-message]')).toHaveCount(0);
186209
});
187210

188-
test('specific error message is shown if accept request fails', async ({ page, mirage }) => {
211+
test('specific error message is shown if accept request fails', async ({ page, msw }) => {
212+
await prepare(msw);
213+
189214
let errorMessage =
190215
'The invitation to become an owner of the demo_crate crate expired. Please reach out to an owner of the crate to request a new invitation.';
191-
await page.exposeBinding('_errorMessage', () => errorMessage);
192-
await mirage.addHook(async server => {
193-
let errorMessage = await globalThis._errorMessage();
194-
let payload = { errors: [{ detail: errorMessage }] };
195-
server.put('/api/v1/me/crate_owner_invitations/:crate_id', payload, 410);
196-
});
216+
let error = HttpResponse.json({ errors: [{ detail: errorMessage }] }, { status: 410 });
217+
await msw.worker.use(http.put('/api/v1/me/crate_owner_invitations/:crate_id', () => error));
197218

198219
await page.goto('/me/pending-invites');
199220
await expect(page).toHaveURL('/me/pending-invites');

0 commit comments

Comments
 (0)