@@ -65,6 +65,50 @@ jest.mock(
65
65
{ virtual : true } ,
66
66
)
67
67
68
+ jest . mock (
69
+ 'routes-manifest.json' ,
70
+ ( ) => ( {
71
+ dynamicRoutes : [
72
+ {
73
+ page : '/posts/[title]' ,
74
+ regex : '^/posts/([^/]+?)(?:/)?$' ,
75
+ routeKeys : {
76
+ nxtPtitle : 'nxtPtitle' ,
77
+ } ,
78
+ namedRegex : '^/posts/(?<nxtPtitle>[^/]+?)(?:/)?$' ,
79
+ } ,
80
+ {
81
+ page : '/blog/[author]/[slug]' ,
82
+ regex : '^/blog/([^/]+?)/([^/]+?)(?:/)?$' ,
83
+ routeKeys : {
84
+ nxtPauthor : 'nxtPauthor' ,
85
+ nxtPslug : 'nxtPslug' ,
86
+ } ,
87
+ namedRegex : '^/blog/(?<nxtPauthor>[^/]+?)/(?<nxtPslug>[^/]+?)(?:/)?$' ,
88
+ } ,
89
+ ] ,
90
+ staticRoutes : [
91
+ {
92
+ page : '/non-i18n/with-revalidate' ,
93
+ regex : '^/non-i18n/with-revalidate(?:/)?$' ,
94
+ routeKeys : { } ,
95
+ namedRegex : '^/non-i18n/with-revalidate(?:/)?$' ,
96
+ } ,
97
+ {
98
+ page : '/i18n/with-revalidate' ,
99
+ regex : '^/i18n/with-revalidate(?:/)?$' ,
100
+ routeKeys : { } ,
101
+ namedRegex : '^/i18n/with-revalidate(?:/)?$' ,
102
+ } ,
103
+ ] ,
104
+ } ) ,
105
+ { virtual : true } ,
106
+ )
107
+
108
+ const appPathsManifest = {
109
+ '/blog/(test)/[author]/[slug]/page' : 'app/blog/[author]/[slug]/page.js' ,
110
+ }
111
+
68
112
let NetlifyNextServer : NetlifyNextServerType
69
113
beforeAll ( ( ) => {
70
114
const NextServer : NextServerType = require ( getServerFile ( __dirname , false ) ) . default
@@ -76,12 +120,14 @@ beforeAll(() => {
76
120
this . buildId = mockBuildId
77
121
this . nextConfig = nextOptions . conf
78
122
this . netlifyConfig = netlifyConfig
123
+ this . renderOpts = { previewProps : { } }
124
+ this . appPathsManifest = appPathsManifest
79
125
}
80
126
Object . setPrototypeOf ( NetlifyNextServer , MockNetlifyNextServerConstructor )
81
127
} )
82
128
83
129
describe ( 'the netlify next server' , ( ) => {
84
- it . skip ( 'does not revalidate a request without an `x-prerender-revalidate` header' , async ( ) => {
130
+ it ( 'does not revalidate a request without an `x-prerender-revalidate` header' , async ( ) => {
85
131
const netlifyNextServer = new NetlifyNextServer ( { conf : { } } , { ...mockTokenConfig } )
86
132
const requestHandler = netlifyNextServer . getRequestHandler ( )
87
133
@@ -92,7 +138,7 @@ describe('the netlify next server', () => {
92
138
expect ( mockedApiFetch ) . not . toHaveBeenCalled ( )
93
139
} )
94
140
95
- it . skip ( 'revalidates a static non-i18n route with an `x-prerender-revalidate` header' , async ( ) => {
141
+ it ( 'revalidates a static non-i18n route with an `x-prerender-revalidate` header' , async ( ) => {
96
142
const netlifyNextServer = new NetlifyNextServer ( { conf : { } } , { ...mockTokenConfig } )
97
143
const requestHandler = netlifyNextServer . getRequestHandler ( )
98
144
@@ -112,7 +158,7 @@ describe('the netlify next server', () => {
112
158
)
113
159
} )
114
160
115
- it . skip ( 'revalidates a static i18n route with an `x-prerender-revalidate` header' , async ( ) => {
161
+ it ( 'revalidates a static i18n route with an `x-prerender-revalidate` header' , async ( ) => {
116
162
const netlifyNextServer = new NetlifyNextServer ( { conf : { ...mocki18nConfig } } , { ...mockTokenConfig } )
117
163
const requestHandler = netlifyNextServer . getRequestHandler ( )
118
164
@@ -132,7 +178,7 @@ describe('the netlify next server', () => {
132
178
)
133
179
} )
134
180
135
- it . skip ( 'revalidates a dynamic non-i18n route with an `x-prerender-revalidate` header' , async ( ) => {
181
+ it ( 'revalidates a dynamic non-i18n route with an `x-prerender-revalidate` header' , async ( ) => {
136
182
const netlifyNextServer = new NetlifyNextServer ( { conf : { } } , { ...mockTokenConfig } )
137
183
const requestHandler = netlifyNextServer . getRequestHandler ( )
138
184
@@ -152,7 +198,7 @@ describe('the netlify next server', () => {
152
198
)
153
199
} )
154
200
155
- it . skip ( 'revalidates a dynamic i18n route with an `x-prerender-revalidate` header' , async ( ) => {
201
+ it ( 'revalidates a dynamic i18n route with an `x-prerender-revalidate` header' , async ( ) => {
156
202
const netlifyNextServer = new NetlifyNextServer ( { conf : { ...mocki18nConfig } } , { ...mockTokenConfig } )
157
203
const requestHandler = netlifyNextServer . getRequestHandler ( )
158
204
@@ -172,7 +218,7 @@ describe('the netlify next server', () => {
172
218
)
173
219
} )
174
220
175
- it . skip ( 'throws an error when route is not found in the manifest' , async ( ) => {
221
+ it ( 'throws an error when route is not found in the manifest' , async ( ) => {
176
222
const netlifyNextServer = new NetlifyNextServer ( { conf : { } } , mockTokenConfig )
177
223
const requestHandler = netlifyNextServer . getRequestHandler ( )
178
224
@@ -187,7 +233,7 @@ describe('the netlify next server', () => {
187
233
)
188
234
} )
189
235
190
- it . skip ( 'throws an error when paths are not found by the API' , async ( ) => {
236
+ it ( 'throws an error when paths are not found by the API' , async ( ) => {
191
237
const netlifyNextServer = new NetlifyNextServer ( { conf : { } } , mockTokenConfig )
192
238
const requestHandler = netlifyNextServer . getRequestHandler ( )
193
239
@@ -203,7 +249,7 @@ describe('the netlify next server', () => {
203
249
)
204
250
} )
205
251
206
- it . skip ( 'throws an error when the revalidate API is unreachable' , async ( ) => {
252
+ it ( 'throws an error when the revalidate API is unreachable' , async ( ) => {
207
253
const netlifyNextServer = new NetlifyNextServer ( { conf : { } } , mockTokenConfig )
208
254
const requestHandler = netlifyNextServer . getRequestHandler ( )
209
255
@@ -218,4 +264,52 @@ describe('the netlify next server', () => {
218
264
'Unable to connect' ,
219
265
)
220
266
} )
267
+
268
+ it ( 'resolves react as normal for pages routes' , async ( ) => {
269
+ const netlifyNextServer = new NetlifyNextServer ( { conf : { } } , { } )
270
+ const requestHandler = netlifyNextServer . getRequestHandler ( )
271
+
272
+ const { req : mockReq , res : mockRes } = createRequestResponseMocks ( {
273
+ url : '/posts/hello' ,
274
+ } )
275
+
276
+ // @ts -expect-error - Types are incorrect for `MockedResponse`
277
+ await requestHandler ( new NodeNextRequest ( mockReq ) , new NodeNextResponse ( mockRes ) )
278
+
279
+ // eslint-disable-next-line no-underscore-dangle
280
+ expect ( process . env . __NEXT_PRIVATE_PREBUNDLED_REACT ) . toBe ( '' )
281
+ } )
282
+
283
+ it ( 'resolves the prebundled react version for app routes' , async ( ) => {
284
+ const netlifyNextServer = new NetlifyNextServer ( { conf : { experimental : { appDir : true } } } , { } )
285
+ const requestHandler = netlifyNextServer . getRequestHandler ( )
286
+
287
+ const { req : mockReq , res : mockRes } = createRequestResponseMocks ( {
288
+ url : '/blog/rob/hello' ,
289
+ } )
290
+
291
+ // @ts -expect-error - Types are incorrect for `MockedResponse`
292
+ await requestHandler ( new NodeNextRequest ( mockReq ) , new NodeNextResponse ( mockRes ) )
293
+
294
+ // eslint-disable-next-line no-underscore-dangle
295
+ expect ( process . env . __NEXT_PRIVATE_PREBUNDLED_REACT ) . toBe ( 'next' )
296
+ } )
297
+
298
+ it ( 'resolves the experimental prebundled react version for app routes with server actions' , async ( ) => {
299
+ const netlifyNextServer = new NetlifyNextServer (
300
+ { conf : { experimental : { appDir : true , serverActions : true } } } ,
301
+ { } ,
302
+ )
303
+ const requestHandler = netlifyNextServer . getRequestHandler ( )
304
+
305
+ const { req : mockReq , res : mockRes } = createRequestResponseMocks ( {
306
+ url : '/blog/rob/hello' ,
307
+ } )
308
+
309
+ // @ts -expect-error - Types are incorrect for `MockedResponse`
310
+ await requestHandler ( new NodeNextRequest ( mockReq ) , new NodeNextResponse ( mockRes ) )
311
+
312
+ // eslint-disable-next-line no-underscore-dangle
313
+ expect ( process . env . __NEXT_PRIVATE_PREBUNDLED_REACT ) . toBe ( 'experimental' )
314
+ } )
221
315
} )
0 commit comments