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
36test . 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