Skip to content

Commit 7a9e7b6

Browse files
committed
e2e/acceptance/crate-following: Migrate from mirage to @crates-io/msw
1 parent 40265cb commit 7a9e7b6

File tree

1 file changed

+44
-51
lines changed

1 file changed

+44
-51
lines changed

e2e/acceptance/crate-following.spec.ts

Lines changed: 44 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,32 @@
1-
import { test, expect } from '@/e2e/helper';
1+
import { defer } from '@/e2e/deferred';
2+
import { expect, test } from '@/e2e/helper';
3+
import { http, HttpResponse } from 'msw';
24

35
test.describe('Acceptance | Crate following', { tag: '@acceptance' }, () => {
4-
test.beforeEach(async ({ mirage }) => {
5-
let hook = String(server => {
6-
let crate = server.create('crate', { name: 'nanomsg' });
7-
server.create('version', { crate, num: '0.6.0' });
8-
9-
let loggedIn = !globalThis.skipLogin;
10-
if (loggedIn) {
11-
let followedCrates = !!globalThis.following ? [crate] : [];
12-
let user = server.create('user', { followedCrates });
13-
globalThis.authenticateAs(user);
14-
}
15-
});
16-
await mirage.addHook(hook);
17-
});
6+
async function prepare(msw, { skipLogin = false, following = false } = {}) {
7+
let crate = msw.db.crate.create({ name: 'nanomsg' });
8+
msw.db.version.create({ crate, num: '0.6.0' });
9+
10+
let loggedIn = !skipLogin;
11+
if (loggedIn) {
12+
let followedCrates = following ? [crate] : [];
13+
let user = msw.db.user.create({ followedCrates });
14+
await msw.authenticateAs(user);
15+
}
16+
}
17+
18+
test("unauthenticated users don't see the follow button", async ({ page, msw }) => {
19+
await prepare(msw, { skipLogin: true });
1820

19-
test("unauthenticated users don't see the follow button", async ({ page }) => {
20-
await page.addInitScript(() => {
21-
globalThis.skipLogin = true;
22-
});
2321
await page.goto('/crates/nanomsg');
2422
await expect(page.locator('[data-test-follow-button]')).toHaveCount(0);
2523
});
2624

27-
test('authenticated users see a loading spinner and can follow/unfollow crates', async ({ page, mirage }) => {
28-
await mirage.addHook(server => {
29-
globalThis.defer = require('rsvp').defer;
30-
globalThis.followingDeferred = globalThis.defer();
31-
server.get('/api/v1/crates/:crate_id/following', globalThis.followingDeferred.promise);
32-
});
25+
test('authenticated users see a loading spinner and can follow/unfollow crates', async ({ page, msw }) => {
26+
await prepare(msw);
27+
28+
let followingDeferred = defer();
29+
await msw.worker.use(http.get('/api/v1/crates/:crate_id/following', () => followingDeferred.promise));
3330

3431
await page.goto('/crates/nanomsg');
3532

@@ -39,44 +36,41 @@ test.describe('Acceptance | Crate following', { tag: '@acceptance' }, () => {
3936
await expect(followButton).toBeDisabled();
4037
await expect(spinner).toBeVisible();
4138

42-
await page.evaluate(() => globalThis.followingDeferred.resolve({ following: false }));
39+
followingDeferred.resolve(HttpResponse.json({ following: false }));
4340
await expect(followButton).toHaveText('Follow');
4441
await expect(followButton).toBeEnabled();
4542
await expect(spinner).toHaveCount(0);
4643

47-
await page.evaluate(() => {
48-
globalThis.followDeferred = globalThis.defer();
49-
server.put('/api/v1/crates/:crate_id/follow', globalThis.followDeferred.promise);
50-
});
44+
let followDeferred = defer();
45+
await msw.worker.use(http.put('/api/v1/crates/:crate_id/follow', () => followDeferred.promise));
5146
await followButton.click();
5247
await expect(followButton).toHaveText('Loading…');
5348
await expect(followButton).toBeDisabled();
5449
await expect(spinner).toBeVisible();
5550

56-
await page.evaluate(() => globalThis.followDeferred.resolve({ ok: true }));
51+
followDeferred.resolve(HttpResponse.json({ ok: true }));
5752
await expect(followButton).toHaveText('Unfollow');
5853
await expect(followButton).toBeEnabled();
5954
await expect(spinner).toHaveCount(0);
6055

61-
await page.evaluate(() => {
62-
globalThis.unfollowDeferred = globalThis.defer();
63-
server.delete('/api/v1/crates/:crate_id/follow', globalThis.unfollowDeferred.promise);
64-
});
56+
let unfollowDeferred = defer();
57+
await msw.worker.use(http.delete('/api/v1/crates/:crate_id/follow', () => unfollowDeferred.promise));
6558
await followButton.click();
6659
await expect(followButton).toHaveText('Loading…');
6760
await expect(followButton).toBeDisabled();
6861
await expect(spinner).toBeVisible();
6962

70-
await page.evaluate(() => globalThis.unfollowDeferred.resolve({ ok: true }));
63+
unfollowDeferred.resolve(HttpResponse.json({ ok: true }));
7164
await expect(followButton).toHaveText('Follow');
7265
await expect(followButton).toBeEnabled();
7366
await expect(spinner).toHaveCount(0);
7467
});
7568

76-
test('error handling when loading following state fails', async ({ mirage, page }) => {
77-
await mirage.addHook(server => {
78-
server.get('/api/v1/crates/:crate_id/following', {}, 500);
79-
});
69+
test('error handling when loading following state fails', async ({ msw, page }) => {
70+
await prepare(msw);
71+
72+
let error = HttpResponse.json({}, { status: 500 });
73+
await msw.worker.use(http.get('/api/v1/crates/:crate_id/following', () => error));
8074

8175
await page.goto('/crates/nanomsg');
8276
const followButton = page.locator('[data-test-follow-button]');
@@ -87,10 +81,11 @@ test.describe('Acceptance | Crate following', { tag: '@acceptance' }, () => {
8781
);
8882
});
8983

90-
test('error handling when follow fails', async ({ mirage, page }) => {
91-
await mirage.addHook(server => {
92-
server.put('/api/v1/crates/:crate_id/follow', {}, 500);
93-
});
84+
test('error handling when follow fails', async ({ msw, page }) => {
85+
await prepare(msw);
86+
87+
let error = HttpResponse.json({}, { status: 500 });
88+
await msw.worker.use(http.put('/api/v1/crates/:crate_id/follow', () => error));
9489

9590
await page.goto('/crates/nanomsg');
9691
await page.locator('[data-test-follow-button]').click();
@@ -99,13 +94,11 @@ test.describe('Acceptance | Crate following', { tag: '@acceptance' }, () => {
9994
);
10095
});
10196

102-
test('error handling when unfollow fails', async ({ mirage, page }) => {
103-
await page.addInitScript(() => {
104-
globalThis.following = true;
105-
});
106-
await mirage.addHook(server => {
107-
server.del('/api/v1/crates/:crate_id/follow', {}, 500);
108-
});
97+
test('error handling when unfollow fails', async ({ msw, page }) => {
98+
await prepare(msw, { following: true });
99+
100+
let error = HttpResponse.json({}, { status: 500 });
101+
await msw.worker.use(http.delete('/api/v1/crates/:crate_id/follow', () => error));
109102

110103
await page.goto('/crates/nanomsg');
111104
await page.locator('[data-test-follow-button]').click();

0 commit comments

Comments
 (0)