@@ -5,12 +5,26 @@ const { sleep } = require('./lib/utils');
55const { getServer } = require ( './server' ) ;
66const startChrome = require ( './lib/chrome' ) ;
77
8+ async function enableOfflineMode ( page , browser ) {
9+ await sleep ( 2000 ) ; // wait for service worker installation.
10+ await page . setOfflineMode ( true ) ;
11+ const targets = await browser . targets ( ) ;
12+ const serviceWorker = targets . find ( ( t ) => t . type ( ) === 'service_worker' ) ;
13+ const serviceWorkerConnection = await serviceWorker . createCDPSession ( ) ;
14+ await serviceWorkerConnection . send ( 'Network.enable' ) ;
15+ await serviceWorkerConnection . send ( 'Network.emulateNetworkConditions' , {
16+ offline : true ,
17+ latency : 0 ,
18+ downloadThroughput : 0 ,
19+ uploadThroughput : 0 ,
20+ } ) ;
21+ }
22+
823describe ( 'preact service worker tests' , ( ) => {
924 let server , browser , dir ;
1025
1126 beforeAll ( async ( ) => {
1227 dir = await create ( 'default' ) ;
13- browser = await startChrome ( ) ;
1428 await build ( dir , {
1529 sw : true ,
1630 esm : true ,
@@ -19,9 +33,16 @@ describe('preact service worker tests', () => {
1933 server = getServer ( dir ) ;
2034 } ) ;
2135
36+ beforeEach ( async ( ) => {
37+ browser = await startChrome ( ) ;
38+ } ) ;
39+
40+ afterEach ( async ( ) => {
41+ await browser . close ( ) ;
42+ } ) ;
43+
2244 afterAll ( async ( ) => {
2345 await server . server . stop ( ) ;
24- await browser . close ( ) ;
2546 } ) ;
2647
2748 it ( 'works offline' , async ( ) => {
@@ -31,15 +52,14 @@ describe('preact service worker tests', () => {
3152 waitUntil : 'networkidle0' ,
3253 } ) ;
3354 const initialContent = await page . content ( ) ;
34- await sleep ( 2000 ) ; // wait for service worker installation.
35- await page . setOfflineMode ( true ) ;
36- await page . reload ( ) ;
55+ await enableOfflineMode ( page , browser ) ;
56+ await page . reload ( { waitUntil : 'networkidle0' } ) ;
3757 const offlineContent = await page . content ( ) ;
3858 await page . waitForSelector ( 'h1' ) ;
3959 expect (
40- await page . $$eval ( 'h1' , nodes => nodes . map ( n => n . innerText ) )
60+ await page . $$eval ( 'h1' , ( nodes ) => nodes . map ( ( n ) => n . innerText ) )
4161 ) . toEqual ( [ 'Preact App' , 'Home' ] ) ;
42- expect ( offlineContent ) . toEqual ( initialContent ) ;
62+ expect ( offlineContent ) . not . toEqual ( initialContent ) ;
4363 } ) ;
4464
4565 it ( 'should fetch navigation requests with networkFirst' , async ( ) => {
@@ -64,4 +84,26 @@ describe('preact service worker tests', () => {
6484 expect ( initialContent ) . not . toEqual ( refreshedContent ) ;
6585 expect ( refreshedContent . includes ( NEW_TITLE ) ) . toEqual ( true ) ;
6686 } ) ;
87+
88+ it ( 'should respond with 200.html when offline' , async ( ) => {
89+ const swText = await fetch ( 'http://localhost:3000/sw-esm.js' ) . then ( ( res ) =>
90+ res . text ( )
91+ ) ;
92+ // eslint-disable-next-line no-useless-escape
93+ expect ( swText ) . toContain (
94+ 'caches.match((t="/200.html",ce().getCacheKeyForURL(t)))'
95+ ) ;
96+ const page = await browser . newPage ( ) ;
97+ await page . setCacheEnabled ( false ) ;
98+ await page . goto ( 'http://localhost:3000' , {
99+ waitUntil : 'networkidle0' ,
100+ } ) ;
101+ await enableOfflineMode ( page , browser ) ;
102+ await page . reload ( { waitUntil : 'networkidle0' } ) ;
103+ expect (
104+ await page . $$eval ( 'script[type=__PREACT_CLI_DATA__]' , ( nodes ) =>
105+ nodes . map ( ( n ) => n . innerText )
106+ )
107+ ) . toEqual ( [ '%7B%22preRenderData%22:%7B%22url%22:%22/200.html%22%7D%7D' ] ) ;
108+ } ) ;
67109} ) ;
0 commit comments