@@ -4,7 +4,7 @@ import { HttpResponse, http, passthrough } from 'msw'
4
4
import { setupServer } from 'msw/node'
5
5
import { platform } from 'node:process'
6
6
import { v4 } from 'uuid'
7
- import { afterAll , afterEach , beforeAll , beforeEach , expect , test , vi } from 'vitest'
7
+ import { afterAll , afterEach , beforeAll , beforeEach , describe , expect , test , vi } from 'vitest'
8
8
import { type FixtureTestContext } from '../utils/contexts.js'
9
9
import { createFixture , invokeFunction , runPlugin } from '../utils/fixture.js'
10
10
import { encodeBlobKey , generateRandomObjectID , startMockBlobStore } from '../utils/helpers.js'
@@ -126,10 +126,6 @@ test<FixtureTestContext>('Should serve correct locale-aware custom 404 pages', a
126
126
load ( responseImplicitDefaultLocale . body ) ( '[data-testid="locale"]' ) . text ( ) ,
127
127
'Served 404 page content should use default locale if locale is not explicitly used in pathname (after basePath)' ,
128
128
) . toBe ( 'en' )
129
- expect (
130
- responseImplicitDefaultLocale . headers [ 'netlify-cdn-cache-control' ] ,
131
- 'Response for not existing route if locale is not explicitly used in pathname (after basePath) should have 404 status' ,
132
- ) . toBe ( 's-maxage=31536000, stale-while-revalidate=31536000, durable' )
133
129
134
130
const responseExplicitDefaultLocale = await invokeFunction ( ctx , {
135
131
url : '/base/path/en/not-existing-page' ,
@@ -143,10 +139,6 @@ test<FixtureTestContext>('Should serve correct locale-aware custom 404 pages', a
143
139
load ( responseExplicitDefaultLocale . body ) ( '[data-testid="locale"]' ) . text ( ) ,
144
140
'Served 404 page content should use default locale if default locale is explicitly used in pathname (after basePath)' ,
145
141
) . toBe ( 'en' )
146
- expect (
147
- responseExplicitDefaultLocale . headers [ 'netlify-cdn-cache-control' ] ,
148
- 'Response for not existing route if locale is not explicitly used in pathname (after basePath) should have 404 status' ,
149
- ) . toBe ( 's-maxage=31536000, stale-while-revalidate=31536000, durable' )
150
142
151
143
const responseNonDefaultLocale = await invokeFunction ( ctx , {
152
144
url : '/base/path/fr/not-existing-page' ,
@@ -160,8 +152,137 @@ test<FixtureTestContext>('Should serve correct locale-aware custom 404 pages', a
160
152
load ( responseNonDefaultLocale . body ) ( '[data-testid="locale"]' ) . text ( ) ,
161
153
'Served 404 page content should use non-default locale if non-default locale is explicitly used in pathname (after basePath)' ,
162
154
) . toBe ( 'fr' )
163
- expect (
164
- responseNonDefaultLocale . headers [ 'netlify-cdn-cache-control' ] ,
165
- 'Response for not existing route if locale is not explicitly used in pathname (after basePath) should have 404 status' ,
166
- ) . toBe ( 's-maxage=31536000, stale-while-revalidate=31536000, durable' )
155
+ } )
156
+
157
+ describe ( '404 caching' , ( ) => {
158
+ describe ( 'default nextjs 404 (no custom 404)' , ( ) => {
159
+ test . todo < FixtureTestContext > ( 'not matching dynamic paths' )
160
+ test . todo < FixtureTestContext > ( 'matching dynamic path without revalidate' )
161
+ test . todo < FixtureTestContext > ( 'matching dynamic path with revalidate' )
162
+ } )
163
+
164
+ describe ( '404 without getStaticProps' , ( ) => {
165
+ test . todo < FixtureTestContext > ( 'not matching dynamic paths' )
166
+ test . todo < FixtureTestContext > ( 'matching dynamic path without revalidate' )
167
+ test . todo < FixtureTestContext > ( 'matching dynamic path with revalidate' )
168
+ } )
169
+
170
+ describe ( '404 with getStaticProps without revalidate' , ( ) => {
171
+ test < FixtureTestContext > ( 'not matching dynamic paths should be cached permanently' , async ( ctx ) => {
172
+ console . log ( '[test] not matching dynamic paths' )
173
+
174
+ await createFixture ( 'page-router-base-path-i18n' , ctx )
175
+ await runPlugin ( ctx )
176
+
177
+ const notExistingPage = await invokeFunction ( ctx , {
178
+ url : '/base/path/not-existing-page' ,
179
+ } )
180
+
181
+ expect (
182
+ notExistingPage . headers [ 'netlify-cdn-cache-control' ] ,
183
+ 'should be cached permanently' ,
184
+ ) . toBe ( 's-maxage=31536000, stale-while-revalidate=31536000, durable' )
185
+ } )
186
+ test < FixtureTestContext > ( 'matching dynamic path without revalidate should be cached permanently' , async ( ctx ) => {
187
+ console . log ( '[test] matching dynamic path without revalidate' )
188
+
189
+ await createFixture ( 'page-router-base-path-i18n' , ctx )
190
+ await runPlugin ( ctx )
191
+
192
+ const notExistingPage = await invokeFunction ( ctx , {
193
+ url : '/base/path/products/not-found-no-revalidate' ,
194
+ } )
195
+
196
+ expect (
197
+ notExistingPage . headers [ 'netlify-cdn-cache-control' ] ,
198
+ 'should be cached permanently' ,
199
+ ) . toBe ( 's-maxage=31536000, stale-while-revalidate=31536000, durable' )
200
+ } )
201
+ test < FixtureTestContext > ( 'matching dynamic path with revalidate should be cached for revalidate time' , async ( ctx ) => {
202
+ console . log ( '[test] matching dynamic path with revalidate' )
203
+
204
+ await createFixture ( 'page-router-base-path-i18n' , ctx )
205
+ await runPlugin ( ctx )
206
+
207
+ const notExistingPage = await invokeFunction ( ctx , {
208
+ url : '/base/path/products/not-found-with-revalidate' ,
209
+ } )
210
+
211
+ expect ( notExistingPage . statusCode ) . toBe ( 404 )
212
+ // this page was not prerendered, so no STALE case here
213
+ expect (
214
+ notExistingPage . headers [ 'netlify-cdn-cache-control' ] ,
215
+ 'should be cached for 600 seconds' ,
216
+ ) . toBe ( 's-maxage=600, stale-while-revalidate=31536000, durable' )
217
+ } )
218
+ } )
219
+
220
+ describe ( '404 with getStaticProps with revalidate' , ( ) => {
221
+ test < FixtureTestContext > ( 'not matching dynamic paths should be cached for 404 page revalidate' , async ( ctx ) => {
222
+ console . log ( '[test] not matching dynamic paths' )
223
+
224
+ await createFixture ( 'page-router-404-get-static-props-with-revalidate' , ctx )
225
+ await runPlugin ( ctx )
226
+
227
+ // ignoring initial stale case
228
+ await invokeFunction ( ctx , {
229
+ url : 'not-existing-page' ,
230
+ } )
231
+ await new Promise ( ( res ) => setTimeout ( res , 100 ) )
232
+
233
+ const notExistingPage = await invokeFunction ( ctx , {
234
+ url : 'not-existing-page' ,
235
+ } )
236
+
237
+ expect (
238
+ notExistingPage . headers [ 'netlify-cdn-cache-control' ] ,
239
+ 'should be cached permanently' ,
240
+ ) . toBe ( 's-maxage=300, stale-while-revalidate=31536000, durable' )
241
+ } )
242
+ test . only < FixtureTestContext > ( 'matching dynamic path without revalidate should be cached permanently' , async ( ctx ) => {
243
+ console . log ( '[test] matching dynamic path without revalidate' )
244
+
245
+ await createFixture ( 'page-router-404-get-static-props-with-revalidate' , ctx )
246
+ await runPlugin ( ctx )
247
+
248
+ // // ignoring initial stale case
249
+ // await invokeFunction(ctx, {
250
+ // url: 'products/not-found-no-revalidate',
251
+ // })
252
+ // await new Promise((res) => setTimeout(res, 100))
253
+
254
+ const notExistingPage = await invokeFunction ( ctx , {
255
+ url : 'products/not-found-no-revalidate' ,
256
+ } )
257
+
258
+ expect (
259
+ notExistingPage . headers [ 'netlify-cdn-cache-control' ] ,
260
+ 'should be cached permanently' ,
261
+ ) . toBe ( 's-maxage=31536000, durable' )
262
+ } )
263
+
264
+ test . only < FixtureTestContext > ( 'matching dynamic path with revalidate should be cached for revalidate time' , async ( ctx ) => {
265
+ console . log ( '[test] matching dynamic path with revalidate' )
266
+
267
+ await createFixture ( 'page-router-404-get-static-props-with-revalidate' , ctx )
268
+ await runPlugin ( ctx )
269
+
270
+ // // ignoring initial stale case
271
+ // await invokeFunction(ctx, {
272
+ // url: 'products/not-found-with-revalidate',
273
+ // })
274
+ // await new Promise((res) => setTimeout(res, 100))
275
+
276
+ const notExistingPage = await invokeFunction ( ctx , {
277
+ url : 'products/not-found-with-revalidate' ,
278
+ } )
279
+
280
+ expect ( notExistingPage . statusCode ) . toBe ( 404 )
281
+ // this page was not prerendered, so no STALE case here
282
+ expect (
283
+ notExistingPage . headers [ 'netlify-cdn-cache-control' ] ,
284
+ 'should be cached for 600 seconds' ,
285
+ ) . toBe ( 's-maxage=600, stale-while-revalidate=31535400, durable' )
286
+ } )
287
+ } )
167
288
} )
0 commit comments