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
35test . 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+ 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+ msw . authenticateAs ( user ) ;
15+ }
16+ }
17+
18+ test ( "unauthenticated users don't see the follow button" , async ( { page , msw } ) => {
19+ 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+ 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+ 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+ 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+ 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