@@ -69,6 +69,43 @@ describe('sentryMiddleware', () => {
69
69
expect ( resultFromNext ) . toStrictEqual ( nextResult ) ;
70
70
} ) ;
71
71
72
+ it ( "sets source route if the url couldn't be decoded correctly" , async ( ) => {
73
+ const middleware = handleRequest ( ) ;
74
+ const ctx = {
75
+ request : {
76
+ method : 'GET' ,
77
+ url : '/a%xx' ,
78
+ headers : new Headers ( ) ,
79
+ } ,
80
+ url : { pathname : 'a%xx' , href : 'http://localhost:1234/a%xx' } ,
81
+ params : { } ,
82
+ } ;
83
+ const next = vi . fn ( ( ) => nextResult ) ;
84
+
85
+ // @ts -expect-error, a partial ctx object is fine here
86
+ const resultFromNext = middleware ( ctx , next ) ;
87
+
88
+ expect ( startSpanSpy ) . toHaveBeenCalledWith (
89
+ {
90
+ data : {
91
+ method : 'GET' ,
92
+ url : 'http://localhost:1234/a%xx' ,
93
+ } ,
94
+ metadata : {
95
+ source : 'url' ,
96
+ } ,
97
+ name : 'GET a%xx' ,
98
+ op : 'http.server' ,
99
+ origin : 'auto.http.astro' ,
100
+ status : 'ok' ,
101
+ } ,
102
+ expect . any ( Function ) , // the `next` function
103
+ ) ;
104
+
105
+ expect ( next ) . toHaveBeenCalled ( ) ;
106
+ expect ( resultFromNext ) . toStrictEqual ( nextResult ) ;
107
+ } ) ;
108
+
72
109
it ( 'throws and sends an error to sentry if `next()` throws' , async ( ) => {
73
110
const captureExceptionSpy = vi . spyOn ( SentryNode , 'captureException' ) ;
74
111
@@ -308,6 +345,18 @@ describe('interpolateRouteFromUrlAndParams', () => {
308
345
expect ( interpolateRouteFromUrlAndParams ( rawUrl , params ) ) . toEqual ( expectedRoute ) ;
309
346
} ) ;
310
347
348
+ it . each ( [
349
+ [ '/(a+)+/aaaaaaaaa!' , { id : '(a+)+' , slug : 'aaaaaaaaa!' } , '/[id]/[slug]' ] ,
350
+ [ '/([a-zA-Z]+)*/aaaaaaaaa!' , { id : '([a-zA-Z]+)*' , slug : 'aaaaaaaaa!' } , '/[id]/[slug]' ] ,
351
+ [ '/(a|aa)+/aaaaaaaaa!' , { id : '(a|aa)+' , slug : 'aaaaaaaaa!' } , '/[id]/[slug]' ] ,
352
+ [ '/(a|a?)+/aaaaaaaaa!' , { id : '(a|a?)+' , slug : 'aaaaaaaaa!' } , '/[id]/[slug]' ] ,
353
+ // with URL encoding
354
+ [ '/(a%7Caa)+/aaaaaaaaa!' , { id : '(a|aa)+' , slug : 'aaaaaaaaa!' } , '/[id]/[slug]' ] ,
355
+ [ '/(a%7Ca?)+/aaaaaaaaa!' , { id : '(a|a?)+' , slug : 'aaaaaaaaa!' } , '/[id]/[slug]' ] ,
356
+ ] ) ( 'handles regex characters in param values correctly %s' , ( rawUrl , params , expectedRoute ) => {
357
+ expect ( interpolateRouteFromUrlAndParams ( rawUrl , params ) ) . toEqual ( expectedRoute ) ;
358
+ } ) ;
359
+
311
360
it ( 'handles params across multiple URL segments in catchall routes' , ( ) => {
312
361
// Ideally, Astro would let us know that this is a catchall route so we can make the param [...catchall] but it doesn't
313
362
expect (
@@ -324,4 +373,11 @@ describe('interpolateRouteFromUrlAndParams', () => {
324
373
const expectedRoute = '/usernames/[name]' ;
325
374
expect ( interpolateRouteFromUrlAndParams ( rawUrl , params ) ) . toEqual ( expectedRoute ) ;
326
375
} ) ;
376
+
377
+ it ( 'handles set but undefined params' , ( ) => {
378
+ const rawUrl = '/usernames/user' ;
379
+ const params = { name : undefined } ;
380
+ const expectedRoute = '/usernames/user' ;
381
+ expect ( interpolateRouteFromUrlAndParams ( rawUrl , params ) ) . toEqual ( expectedRoute ) ;
382
+ } ) ;
327
383
} ) ;
0 commit comments