11import { Page , Request } from '@playwright/test' ;
2- import { Event , EventEnvelopeHeaders } from '@sentry/types' ;
2+ import { EnvelopeItemType , Event , EventEnvelopeHeaders } from '@sentry/types' ;
33
44const envelopeUrlRegex = / \. s e n t r y \. i o \/ a p i \/ \d + \/ e n v e l o p e \/ / ;
55
@@ -19,6 +19,58 @@ export const envelopeHeaderRequestParser = (request: Request | null): EventEnvel
1919 return envelope . split ( '\n' ) . map ( line => JSON . parse ( line ) ) [ 0 ] ;
2020} ;
2121
22+ export const getEnvelopeType = ( request : Request | null ) : EnvelopeItemType => {
23+ const envelope = request ?. postData ( ) || '' ;
24+
25+ return ( envelope . split ( '\n' ) . map ( line => JSON . parse ( line ) ) [ 1 ] as Record < string , unknown > ) . type as EnvelopeItemType ;
26+ } ;
27+
28+ export const countEnvelopes = async (
29+ page : Page ,
30+ options ?: {
31+ url ?: string ;
32+ timeout ?: number ;
33+ envelopeType : EnvelopeItemType | EnvelopeItemType [ ] ;
34+ } ,
35+ ) : Promise < number > => {
36+ const countPromise = new Promise < number > ( ( resolve , reject ) => {
37+ let reqCount = 0 ;
38+
39+ const requestHandler = ( request : Request ) : void => {
40+ if ( envelopeUrlRegex . test ( request . url ( ) ) ) {
41+ try {
42+ if ( options ?. envelopeType ) {
43+ const envelopeTypeArray = options
44+ ? typeof options . envelopeType === 'string'
45+ ? [ options . envelopeType ]
46+ : options . envelopeType || ( [ 'event' ] as EnvelopeItemType [ ] )
47+ : ( [ 'event' ] as EnvelopeItemType [ ] ) ;
48+
49+ if ( envelopeTypeArray . includes ( getEnvelopeType ( request ) ) ) {
50+ reqCount ++ ;
51+ }
52+ }
53+ } catch ( e ) {
54+ reject ( e ) ;
55+ }
56+ }
57+ } ;
58+
59+ page . on ( 'request' , requestHandler ) ;
60+
61+ setTimeout ( ( ) => {
62+ page . off ( 'request' , requestHandler ) ;
63+ resolve ( reqCount ) ;
64+ } , options ?. timeout || 200 ) ;
65+ } ) ;
66+
67+ if ( options ?. url ) {
68+ await page . goto ( options . url ) ;
69+ }
70+
71+ return countPromise ;
72+ } ;
73+
2274/**
2375 * Run script at the given path inside the test environment.
2476 *
@@ -51,24 +103,37 @@ async function getSentryEvents(page: Page, url?: string): Promise<Array<Event>>
51103 * If the timout option is configured, this function will abort waiting, even if it hasn't reveived the configured
52104 * amount of requests, and returns all the events recieved up to that point in time.
53105 */
54- async function getMultipleRequests (
106+ async function getMultipleRequests < T > (
55107 page : Page ,
56108 count : number ,
57109 urlRgx : RegExp ,
58- requestParser : ( req : Request ) => Event ,
110+ requestParser : ( req : Request ) => T ,
59111 options ?: {
60112 url ?: string ;
61113 timeout ?: number ;
114+ envelopeType ?: EnvelopeItemType | EnvelopeItemType [ ] ;
62115 } ,
63- ) : Promise < Event [ ] > {
64- const requests : Promise < Event [ ] > = new Promise ( ( resolve , reject ) => {
116+ ) : Promise < T [ ] > {
117+ const requests : Promise < T [ ] > = new Promise ( ( resolve , reject ) => {
65118 let reqCount = count ;
66- const requestData : Event [ ] = [ ] ;
119+ const requestData : T [ ] = [ ] ;
67120 let timeoutId : NodeJS . Timeout | undefined = undefined ;
68121
69122 function requestHandler ( request : Request ) : void {
70123 if ( urlRgx . test ( request . url ( ) ) ) {
71124 try {
125+ if ( options ?. envelopeType ) {
126+ const envelopeTypeArray = options
127+ ? typeof options . envelopeType === 'string'
128+ ? [ options . envelopeType ]
129+ : options . envelopeType || ( [ 'event' ] as EnvelopeItemType [ ] )
130+ : ( [ 'event' ] as EnvelopeItemType [ ] ) ;
131+
132+ if ( ! envelopeTypeArray . includes ( getEnvelopeType ( request ) ) ) {
133+ return ;
134+ }
135+ }
136+
72137 reqCount -- ;
73138 requestData . push ( requestParser ( request ) ) ;
74139
@@ -110,11 +175,10 @@ async function getMultipleSentryEnvelopeRequests<T>(
110175 options ?: {
111176 url ?: string ;
112177 timeout ?: number ;
178+ envelopeType ?: EnvelopeItemType | EnvelopeItemType [ ] ;
113179 } ,
114180 requestParser : ( req : Request ) => T = envelopeRequestParser as ( req : Request ) => T ,
115181) : Promise < T [ ] > {
116- // TODO: This is not currently checking the type of envelope, just casting for now.
117- // We can update this to include optional type-guarding when we have types for Envelope.
118182 return getMultipleRequests ( page , count , envelopeUrlRegex , requestParser , options ) as Promise < T [ ] > ;
119183}
120184
0 commit comments