1
1
import { expect } from '@playwright/test' ;
2
- import type { Event as SentryEvent , SpanJSON } from '@sentry/types' ;
2
+ import type { Event as SentryEvent , SpanEnvelope , SpanJSON } from '@sentry/types' ;
3
3
4
4
import { sentryTest } from '../../../../utils/fixtures' ;
5
5
import {
6
6
getFirstSentryEnvelopeRequest ,
7
7
getMultipleSentryEnvelopeRequests ,
8
+ properFullEnvelopeRequestParser ,
8
9
shouldSkipTracingTest ,
9
10
} from '../../../../utils/helpers' ;
11
+ import { getFullRecordingSnapshots } from '../../../../utils/replayHelpers' ;
10
12
11
13
sentryTest ( 'should capture an INP click event span.' , async ( { browserName, getLocalTestPath, page } ) => {
12
14
const supportedBrowsers = [ 'chromium' ] ;
@@ -28,9 +30,12 @@ sentryTest('should capture an INP click event span.', async ({ browserName, getL
28
30
await page . goto ( url ) ;
29
31
await getFirstSentryEnvelopeRequest < SentryEvent > ( page ) ; // wait for page load
30
32
31
- const spanEnvelopesPromise = getMultipleSentryEnvelopeRequests < SpanJSON > ( page , 1 , {
32
- envelopeType : 'span' ,
33
- } ) ;
33
+ const spanEnvelopePromise = getMultipleSentryEnvelopeRequests < SpanEnvelope > (
34
+ page ,
35
+ 1 ,
36
+ { envelopeType : 'span' } ,
37
+ properFullEnvelopeRequestParser ,
38
+ ) ;
34
39
35
40
await page . locator ( '[data-test-id=normal-button]' ) . click ( ) ;
36
41
await page . locator ( '.clicked[data-test-id=normal-button]' ) . isVisible ( ) ;
@@ -43,14 +48,53 @@ sentryTest('should capture an INP click event span.', async ({ browserName, getL
43
48
} ) ;
44
49
45
50
// Get the INP span envelope
46
- const spanEnvelopes = await spanEnvelopesPromise ;
47
-
48
- expect ( spanEnvelopes ) . toHaveLength ( 1 ) ;
49
- expect ( spanEnvelopes [ 0 ] . op ) . toBe ( 'ui.interaction.click' ) ;
50
- expect ( spanEnvelopes [ 0 ] . description ) . toBe ( 'body > NormalButton' ) ;
51
- expect ( spanEnvelopes [ 0 ] . exclusive_time ) . toBeGreaterThan ( 0 ) ;
52
- expect ( spanEnvelopes [ 0 ] . measurements ?. inp . value ) . toBeGreaterThan ( 0 ) ;
53
- expect ( spanEnvelopes [ 0 ] . measurements ?. inp . unit ) . toBe ( 'millisecond' ) ;
51
+ const spanEnvelope = ( await spanEnvelopePromise ) [ 0 ] ;
52
+
53
+ const spanEnvelopeHeaders = spanEnvelope [ 0 ] ;
54
+ const spanEnvelopeItem = spanEnvelope [ 1 ] [ 0 ] [ 1 ] ;
55
+
56
+ const traceId = spanEnvelopeHeaders . trace ! . trace_id ;
57
+ expect ( traceId ) . toMatch ( / [ a - f 0 - 9 ] { 32 } / ) ;
58
+
59
+ expect ( spanEnvelopeHeaders ) . toEqual ( {
60
+ sent_at : expect . any ( String ) ,
61
+ trace : {
62
+ environment : 'production' ,
63
+ public_key : 'public' ,
64
+ sample_rate : '1' ,
65
+ sampled : 'true' ,
66
+ trace_id : traceId ,
67
+ } ,
68
+ } ) ;
69
+
70
+ const inpValue = spanEnvelopeItem . measurements ?. inp . value ;
71
+ expect ( inpValue ) . toBeGreaterThan ( 0 ) ;
72
+
73
+ expect ( spanEnvelopeItem ) . toEqual ( {
74
+ data : {
75
+ 'sentry.exclusive_time' : inpValue ,
76
+ 'sentry.op' : 'ui.interaction.click' ,
77
+ 'sentry.origin' : 'manual' ,
78
+ 'sentry.sample_rate' : 1 ,
79
+ 'sentry.source' : 'custom' ,
80
+ } ,
81
+ measurements : {
82
+ inp : {
83
+ unit : 'millisecond' ,
84
+ value : inpValue ,
85
+ } ,
86
+ } ,
87
+ description : 'body > NormalButton' ,
88
+ exclusive_time : inpValue ,
89
+ op : 'ui.interaction.click' ,
90
+ origin : 'manual' ,
91
+ is_segment : true ,
92
+ segment_id : spanEnvelopeItem . span_id ,
93
+ span_id : expect . stringMatching ( / [ a - f 0 - 9 ] { 16 } / ) ,
94
+ start_timestamp : expect . any ( Number ) ,
95
+ timestamp : expect . any ( Number ) ,
96
+ trace_id : traceId ,
97
+ } ) ;
54
98
} ) ;
55
99
56
100
sentryTest (
@@ -85,7 +129,7 @@ sentryTest(
85
129
86
130
await page . waitForTimeout ( 500 ) ;
87
131
88
- const spanEnvelopesPromise = getMultipleSentryEnvelopeRequests < SpanJSON > ( page , 1 , {
132
+ const spanPromise = getMultipleSentryEnvelopeRequests < SpanJSON > ( page , 1 , {
89
133
envelopeType : 'span' ,
90
134
} ) ;
91
135
@@ -95,13 +139,12 @@ sentryTest(
95
139
} ) ;
96
140
97
141
// Get the INP span envelope
98
- const spanEnvelopes = await spanEnvelopesPromise ;
99
-
100
- expect ( spanEnvelopes ) . toHaveLength ( 1 ) ;
101
- expect ( spanEnvelopes [ 0 ] . op ) . toBe ( 'ui.interaction.click' ) ;
102
- expect ( spanEnvelopes [ 0 ] . description ) . toBe ( 'body > SlowButton' ) ;
103
- expect ( spanEnvelopes [ 0 ] . exclusive_time ) . toBeGreaterThan ( 400 ) ;
104
- expect ( spanEnvelopes [ 0 ] . measurements ?. inp . value ) . toBeGreaterThan ( 400 ) ;
105
- expect ( spanEnvelopes [ 0 ] . measurements ?. inp . unit ) . toBe ( 'millisecond' ) ;
142
+ const span = ( await spanPromise ) [ 0 ] ;
143
+
144
+ expect ( span . op ) . toBe ( 'ui.interaction.click' ) ;
145
+ expect ( span . description ) . toBe ( 'body > SlowButton' ) ;
146
+ expect ( span . exclusive_time ) . toBeGreaterThan ( 400 ) ;
147
+ expect ( span . measurements ?. inp . value ) . toBeGreaterThan ( 400 ) ;
148
+ expect ( span . measurements ?. inp . unit ) . toBe ( 'millisecond' ) ;
106
149
} ,
107
150
) ;
0 commit comments