@@ -69,6 +69,43 @@ describe('sentryMiddleware', () => {
6969 expect ( resultFromNext ) . toStrictEqual ( nextResult ) ;
7070 } ) ;
7171
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+
72109 it ( 'throws and sends an error to sentry if `next()` throws' , async ( ) => {
73110 const captureExceptionSpy = vi . spyOn ( SentryNode , 'captureException' ) ;
74111
@@ -308,6 +345,18 @@ describe('interpolateRouteFromUrlAndParams', () => {
308345 expect ( interpolateRouteFromUrlAndParams ( rawUrl , params ) ) . toEqual ( expectedRoute ) ;
309346 } ) ;
310347
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+
311360 it ( 'handles params across multiple URL segments in catchall routes' , ( ) => {
312361 // Ideally, Astro would let us know that this is a catchall route so we can make the param [...catchall] but it doesn't
313362 expect (
@@ -324,4 +373,11 @@ describe('interpolateRouteFromUrlAndParams', () => {
324373 const expectedRoute = '/usernames/[name]' ;
325374 expect ( interpolateRouteFromUrlAndParams ( rawUrl , params ) ) . toEqual ( expectedRoute ) ;
326375 } ) ;
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+ } ) ;
327383} ) ;
0 commit comments