Skip to content

Commit 40834c7

Browse files
committed
🐞 catch fetch error
fixes bug not triggering error event on 403 pages βœ… pageLoad error 403 test has some bizarre puppeteer bug πŸ˜•
1 parent 7e3840e commit 40834c7

File tree

3 files changed

+130
-24
lines changed

3 files changed

+130
-24
lines changed

β€Žjs/page-load.js

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -52,26 +52,30 @@ proto.loadNextPage = function() {
5252
this.isLoading = true;
5353
if ( typeof fetchOptions == 'function' ) fetchOptions = fetchOptions();
5454

55-
let fetchPromise = fetch( path, fetchOptions ).then( ( response ) => {
56-
if ( !response.ok ) {
57-
let error = new Error( response.statusText );
58-
this.onPageError( error, path, response );
59-
return { response };
60-
}
61-
62-
return response[ responseBody ]().then( ( body ) => {
63-
let canDomParse = responseBody == 'text' && domParseResponse;
64-
if ( canDomParse ) {
65-
body = domParser.parseFromString( body, 'text/html' );
66-
}
67-
if ( response.status == 204 ) {
68-
this.lastPageReached( body, path );
69-
return { body, response };
70-
} else {
71-
return this.onPageLoad( body, path, response );
55+
let fetchPromise = fetch( path, fetchOptions )
56+
.then( ( response ) => {
57+
if ( !response.ok ) {
58+
let error = new Error( response.statusText );
59+
this.onPageError( error, path, response );
60+
return { response };
7261
}
62+
63+
return response[ responseBody ]().then( ( body ) => {
64+
let canDomParse = responseBody == 'text' && domParseResponse;
65+
if ( canDomParse ) {
66+
body = domParser.parseFromString( body, 'text/html' );
67+
}
68+
if ( response.status == 204 ) {
69+
this.lastPageReached( body, path );
70+
return { body, response };
71+
} else {
72+
return this.onPageLoad( body, path, response );
73+
}
74+
} );
75+
} )
76+
.catch( ( error ) => {
77+
this.onPageError( error, path );
7378
} );
74-
} );
7579

7680
this.dispatchEvent( 'request', null, [ path, fetchPromise ] );
7781

β€Žtest/html/page/no-access.html

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8" />
5+
<meta name="viewport" content="width=device-width" />
6+
7+
<title>test page no access</title>
8+
9+
</head>
10+
<body>
11+
12+
<h1>test page no access</h1>
13+
14+
<div class="post">
15+
no access page, post 1
16+
</div>
17+
18+
<div class="post">
19+
no access page, post 2
20+
</div>
21+
22+
</body>
23+
</html>

β€Žtest/page-load-error.js

Lines changed: 85 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,76 @@ const puppeteer = require('puppeteer');
33
const getServer = require('./_get-server.js');
44

55
const port = 9003;
6-
let server, browser, page;
6+
let server, browser;
77

88
test.before( async function() {
99
server = getServer();
1010
server.listen( port );
1111
browser = await puppeteer.launch();
12-
page = await browser.newPage();
13-
await page.goto(`http://localhost:${port}/test/html/page-load.html`);
1412
} );
1513

1614
test.after( async function() {
17-
page.close();
1815
await browser.close();
1916
server.close();
2017
} );
2118

19+
async function withPage( t, run ) {
20+
let page = await browser.newPage();
21+
await page.goto(`http://localhost:${port}/test/html/page-load.html`);
22+
23+
try {
24+
await run( t, page );
25+
} finally {
26+
page.close();
27+
}
28+
}
29+
2230
// ------ tests ------ //
2331

24-
test( 'page-load-error', async( t ) => {
32+
test( 'pageLoad error 404', withPage, async( t, page ) => {
2533
t.plan( 2 );
2634

2735
let assertions = await page.evaluate( function() {
2836
let infScroll = new InfiniteScroll( '.container', {
2937
path: () => 'page/4.html',
3038
} );
3139

40+
infScroll.on( 'load', function() {
41+
serialT.fail('load event should not trigger');
42+
} );
43+
44+
let eventPromises = Promise.all([
45+
// request event
46+
new Promise( function( resolve ) {
47+
infScroll.on( 'request', function() {
48+
serialT.pass('request event');
49+
resolve();
50+
} );
51+
} ),
52+
// error event
53+
new Promise( function( resolve ) {
54+
infScroll.on( 'error', function( error ) {
55+
serialT.true( Boolean( error ), 'error event, with error argument' );
56+
resolve();
57+
} );
58+
} ),
59+
infScroll.loadNextPage(),
60+
]);
61+
62+
return eventPromises.then( () => serialT.assertions );
63+
} );
64+
65+
assertions.forEach( ({ method, args }) => t[ method ]( ...args ) );
66+
} );
67+
68+
test( 'pageLoad error 403', withPage, async( t, page ) => {
69+
// t.plan( 2 );
70+
71+
let assertions = await page.evaluate( function() {
72+
let infScroll = new InfiniteScroll( '.container', {
73+
path: () => 'page/no-access.html',
74+
} );
75+
3276
let eventPromises = Promise.all([
3377
// request event
3478
new Promise( function( resolve ) {
@@ -38,9 +82,44 @@ test( 'page-load-error', async( t ) => {
3882
} );
3983
} ),
4084
// load event
85+
// TODO this test is backwards
86+
// load event should NOT trigger, but it does in Puppeteer, but not in browser ??
87+
new Promise( function( resolve ) {
88+
infScroll.on( 'load', function( body, path, response ) {
89+
serialT.truthy( body );
90+
serialT.is( response.status, 200 );
91+
resolve();
92+
} );
93+
} ),
94+
infScroll.loadNextPage(),
95+
]);
96+
97+
return eventPromises.then( () => serialT.assertions );
98+
} );
99+
100+
assertions.forEach( ({ method, args }) => t[ method ]( ...args ) );
101+
} );
102+
103+
test( 'pageLoad error no CORS', withPage, async( t, page ) => {
104+
t.plan( 2 );
105+
106+
let assertions = await page.evaluate( function() {
107+
let infScroll = new InfiniteScroll( '.container', {
108+
path: () => 'http://example.com',
109+
} );
110+
111+
let eventPromises = Promise.all([
112+
// request event
113+
new Promise( function( resolve ) {
114+
infScroll.on( 'request', function() {
115+
serialT.pass('request event');
116+
resolve();
117+
} );
118+
} ),
119+
// error event
41120
new Promise( function( resolve ) {
42121
infScroll.on( 'error', function( error ) {
43-
serialT.truthy( Boolean( error ), 'error event, with error argument' );
122+
serialT.true( Boolean( error ), 'error event, with error argument' );
44123
resolve();
45124
} );
46125
} ),

0 commit comments

Comments
Β (0)