Skip to content

Commit dc2066f

Browse files
committed
e2e/acceptance/search: Migrate from mirage to @crates-io/msw
1 parent 25d3846 commit dc2066f

File tree

1 file changed

+79
-106
lines changed

1 file changed

+79
-106
lines changed

e2e/acceptance/search.spec.ts

Lines changed: 79 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import { test, expect } from '@/e2e/helper';
1+
import { defer } from '@/e2e/deferred';
2+
import { expect, test } from '@/e2e/helper';
3+
import { loadFixtures } from '@crates-io/msw/fixtures';
4+
import { http, HttpResponse } from 'msw';
25

36
test.describe('Acceptance | search', { tag: '@acceptance' }, () => {
4-
test('searching for "rust"', async ({ page, mirage, percy, a11y }) => {
5-
await mirage.addHook(server => {
6-
server.loadFixtures();
7-
});
7+
test('searching for "rust"', async ({ page, msw, percy, a11y }) => {
8+
loadFixtures(msw.db);
89

910
await page.goto('/');
1011
await page.fill('[data-test-search-input]', 'rust');
@@ -31,10 +32,8 @@ test.describe('Acceptance | search', { tag: '@acceptance' }, () => {
3132
await a11y.audit();
3233
});
3334

34-
test('searching for "rust" from query', async ({ page, mirage }) => {
35-
await mirage.addHook(server => {
36-
server.loadFixtures();
37-
});
35+
test('searching for "rust" from query', async ({ page, msw }) => {
36+
loadFixtures(msw.db);
3837

3938
await page.goto('/search?q=rust');
4039

@@ -46,10 +45,8 @@ test.describe('Acceptance | search', { tag: '@acceptance' }, () => {
4645
await expect(page.locator('[data-test-search-nav]')).toHaveText('Displaying 1-7 of 7 total results');
4746
});
4847

49-
test('clearing search results', async ({ page, mirage }) => {
50-
await mirage.addHook(server => {
51-
server.loadFixtures();
52-
});
48+
test('clearing search results', async ({ page, msw }) => {
49+
loadFixtures(msw.db);
5350

5451
await page.goto('/search?q=rust');
5552

@@ -63,10 +60,8 @@ test.describe('Acceptance | search', { tag: '@acceptance' }, () => {
6360
await expect(page.locator('[data-test-search-input]')).toHaveValue('');
6461
});
6562

66-
test('pressing S key to focus the search bar', async ({ page, mirage }) => {
67-
await mirage.addHook(server => {
68-
server.loadFixtures();
69-
});
63+
test('pressing S key to focus the search bar', async ({ page, msw }) => {
64+
loadFixtures(msw.db);
7065

7166
await page.goto('/');
7267

@@ -94,10 +89,8 @@ test.describe('Acceptance | search', { tag: '@acceptance' }, () => {
9489
await expect(page.locator('[data-test-search-input]')).toBeFocused();
9590
});
9691

97-
test('check search results are by default displayed by relevance', async ({ page, mirage }) => {
98-
await mirage.addHook(server => {
99-
server.loadFixtures();
100-
});
92+
test('check search results are by default displayed by relevance', async ({ page, msw }) => {
93+
loadFixtures(msw.db);
10194

10295
await page.goto('/');
10396
await page.fill('[data-test-search-input]', 'rust');
@@ -106,14 +99,12 @@ test.describe('Acceptance | search', { tag: '@acceptance' }, () => {
10699
await expect(page.locator('[data-test-search-sort] [data-test-current-order]')).toHaveText('Relevance');
107100
});
108101

109-
test('error handling when searching from the frontpage', async ({ page, mirage }) => {
110-
await mirage.addHook(server => {
111-
globalThis._routes = server._config.routes;
112-
let crate = server.create('crate', { name: 'rust' });
113-
server.create('version', { crate, num: '1.0.0' });
102+
test('error handling when searching from the frontpage', async ({ page, msw }) => {
103+
let crate = msw.db.crate.create({ name: 'rust' });
104+
msw.db.version.create({ crate, num: '1.0.0' });
114105

115-
server.get('/api/v1/crates', {}, 500);
116-
});
106+
let error = HttpResponse.json({}, { status: 500 });
107+
await msw.worker.use(http.get('/api/v1/crates', () => error));
117108

118109
await page.goto('/');
119110
await page.fill('[data-test-search-input]', 'rust');
@@ -122,131 +113,113 @@ test.describe('Acceptance | search', { tag: '@acceptance' }, () => {
122113
await expect(page.locator('[data-test-error-message]')).toBeVisible();
123114
await expect(page.locator('[data-test-try-again-button]')).toBeEnabled();
124115

125-
await page.evaluate(() => {
126-
const deferred = (globalThis.deferred = require('rsvp').defer());
127-
server.get('/api/v1/crates', () => deferred.promise);
128-
});
116+
await msw.worker.resetHandlers();
117+
let deferred = defer();
118+
await msw.worker.use(http.get('/api/v1/crates', () => deferred.promise));
129119

130120
await page.click('[data-test-try-again-button]');
131121
await expect(page.locator('[data-test-page-header] [data-test-spinner]')).toBeVisible();
132122
await expect(page.locator('[data-test-crate-row]')).toHaveCount(0);
133123
await expect(page.locator('[data-test-error-message]')).toBeVisible();
134124
await expect(page.locator('[data-test-try-again-button]')).toBeDisabled();
135125

136-
await page.evaluate(async () => {
137-
// Restore the routes
138-
globalThis._routes.call(server);
139-
const data = await globalThis.fetch('/api/v1/crates').then(r => r.json());
140-
globalThis.deferred.resolve(data);
141-
});
126+
deferred.resolve();
142127
await expect(page.locator('[data-test-error-message]')).toHaveCount(0);
143128
await expect(page.locator('[data-test-try-again-button]')).toHaveCount(0);
144129
await expect(page.locator('[data-test-crate-row]')).toHaveCount(1);
145130
});
146131

147-
test('error handling when searching from the search page', async ({ page, mirage }) => {
148-
await mirage.addHook(server => {
149-
globalThis._routes = server._config.routes;
150-
let crate = server.create('crate', { name: 'rust' });
151-
server.create('version', { crate, num: '1.0.0' });
152-
});
132+
test('error handling when searching from the search page', async ({ page, msw }) => {
133+
let crate = msw.db.crate.create({ name: 'rust' });
134+
msw.db.version.create({ crate, num: '1.0.0' });
153135

154136
await page.goto('/search?q=rust');
155137
await expect(page.locator('[data-test-crate-row]')).toHaveCount(1);
156138
await expect(page.locator('[data-test-error-message]')).toHaveCount(0);
157139
await expect(page.locator('[data-test-try-again-button]')).toHaveCount(0);
158140

159-
await page.evaluate(() => {
160-
server.get('/api/v1/crates', {}, 500);
161-
});
141+
let error = HttpResponse.json({}, { status: 500 });
142+
await msw.worker.use(http.get('/api/v1/crates', () => error));
162143

163144
await page.fill('[data-test-search-input]', 'ru');
164145
await page.locator('[data-test-search-form]').getByRole('button', { name: 'Submit' }).click();
165146
await expect(page.locator('[data-test-crate-row]')).toHaveCount(0);
166147
await expect(page.locator('[data-test-error-message]')).toBeVisible();
167148
await expect(page.locator('[data-test-try-again-button]')).toBeEnabled();
168149

169-
await page.evaluate(() => {
170-
const deferred = (globalThis.deferred = require('rsvp').defer());
171-
server.get('/api/v1/crates', () => deferred.promise);
172-
});
150+
await msw.worker.resetHandlers();
151+
let deferred = defer();
152+
await msw.worker.use(http.get('/api/v1/crates', () => deferred.promise));
173153

174154
await page.click('[data-test-try-again-button]');
175155
await expect(page.locator('[data-test-page-header] [data-test-spinner]')).toBeVisible();
176156
await expect(page.locator('[data-test-crate-row]')).toHaveCount(0);
177157
await expect(page.locator('[data-test-error-message]')).toBeVisible();
178158
await expect(page.locator('[data-test-try-again-button]')).toBeDisabled();
179159

180-
await page.evaluate(async () => {
181-
// Restore the routes
182-
globalThis._routes.call(server);
183-
const data = await globalThis.fetch('/api/v1/crates').then(r => r.json());
184-
globalThis.deferred.resolve(data);
185-
});
160+
deferred.resolve();
186161
await expect(page.locator('[data-test-crate-row]')).toHaveCount(1);
187162
});
188163

189-
test('passes query parameters to the backend', async ({ page, mirage }) => {
190-
await mirage.config({ trackRequests: true });
191-
await mirage.addHook(server => {
192-
server.get('/api/v1/crates', () => ({ crates: [], meta: { total: 0 } }));
193-
});
164+
test('passes query parameters to the backend', async ({ page, msw }) => {
165+
msw.worker.use(
166+
http.get('/api/v1/crates', function ({ request }) {
167+
let url = new URL(request.url);
168+
expect(Object.fromEntries(url.searchParams.entries())).toEqual({
169+
all_keywords: 'fire ball',
170+
page: '3',
171+
per_page: '15',
172+
q: 'rust',
173+
sort: 'new',
174+
});
175+
176+
return HttpResponse.json({ crates: [], meta: { total: 0 } });
177+
}),
178+
);
194179

195180
await page.goto('/search?q=rust&page=3&per_page=15&sort=new&all_keywords=fire ball');
196-
const queryParams = await page.evaluate(
197-
() => server.pretender.handledRequests.find(req => req.url.startsWith('/api/v1/crates')).queryParams,
198-
);
199-
expect(queryParams).toEqual({
200-
all_keywords: 'fire ball',
201-
page: '3',
202-
per_page: '15',
203-
q: 'rust',
204-
sort: 'new',
205-
});
206181
});
207182

208-
test('supports `keyword:bla` filters', async ({ page, mirage }) => {
209-
await mirage.config({ trackRequests: true });
210-
await mirage.addHook(server => {
211-
server.get('/api/v1/crates', () => ({ crates: [], meta: { total: 0 } }));
212-
});
183+
test('supports `keyword:bla` filters', async ({ page, msw }) => {
184+
msw.worker.use(
185+
http.get('/api/v1/crates', function ({ request }) {
186+
let url = new URL(request.url);
187+
expect(Object.fromEntries(url.searchParams.entries())).toEqual({
188+
all_keywords: 'fire ball',
189+
page: '3',
190+
per_page: '15',
191+
q: 'rust',
192+
sort: 'new',
193+
});
194+
195+
return HttpResponse.json({ crates: [], meta: { total: 0 } });
196+
}),
197+
);
213198

214199
await page.goto('/search?q=rust keyword:fire keyword:ball&page=3&per_page=15&sort=new');
215-
const queryParams = await page.evaluate(
216-
() => server.pretender.handledRequests.find(req => req.url.startsWith('/api/v1/crates')).queryParams,
217-
);
218-
expect(queryParams).toEqual({
219-
all_keywords: 'fire ball',
220-
page: '3',
221-
per_page: '15',
222-
q: 'rust',
223-
sort: 'new',
224-
});
225200
});
226201

227-
test('`all_keywords` query parameter takes precedence over `keyword` filters', async ({ page, mirage }) => {
228-
await mirage.config({ trackRequests: true });
229-
await mirage.addHook(server => {
230-
server.get('/api/v1/crates', () => ({ crates: [], meta: { total: 0 } }));
231-
});
202+
test('`all_keywords` query parameter takes precedence over `keyword` filters', async ({ page, msw }) => {
203+
msw.worker.use(
204+
http.get('/api/v1/crates', function ({ request }) {
205+
let url = new URL(request.url);
206+
expect(Object.fromEntries(url.searchParams.entries())).toEqual({
207+
all_keywords: 'fire ball',
208+
page: '3',
209+
per_page: '15',
210+
q: 'rust keywords:foo',
211+
sort: 'new',
212+
});
213+
214+
return HttpResponse.json({ crates: [], meta: { total: 0 } });
215+
}),
216+
);
232217

233218
await page.goto('/search?q=rust keywords:foo&page=3&per_page=15&sort=new&all_keywords=fire ball');
234-
const queryParams = await page.evaluate(
235-
() => server.pretender.handledRequests.find(req => req.url.startsWith('/api/v1/crates')).queryParams,
236-
);
237-
expect(queryParams).toEqual({
238-
all_keywords: 'fire ball',
239-
page: '3',
240-
per_page: '15',
241-
q: 'rust keywords:foo',
242-
sort: 'new',
243-
});
244219
});
245220

246-
test('visiting without query parameters works', async ({ page, mirage }) => {
247-
await mirage.addHook(server => {
248-
server.loadFixtures();
249-
});
221+
test('visiting without query parameters works', async ({ page, msw }) => {
222+
loadFixtures(msw.db);
250223

251224
await page.goto('/search');
252225

0 commit comments

Comments
 (0)