@@ -5,7 +5,14 @@ import type { Event } from '@sentry/types';
5
5
import { sentryTest } from '../../../../utils/fixtures' ;
6
6
import { getFirstSentryEnvelopeRequest , shouldSkipTracingTest } from '../../../../utils/helpers' ;
7
7
8
- sentryTest ( 'should capture a LCP vital with element details.' , async ( { browserName, getLocalTestUrl, page } ) => {
8
+ /*
9
+ Because we "serve" the html test page as a static file, all requests for the image
10
+ are considered 3rd party requests. So the LCP value we obtain for the image is also
11
+ considered a 3rd party LCP value, meaning `renderTime` is only set if we also
12
+ return the `Timing-Allow-Origin` header.
13
+ */
14
+
15
+ sentryTest ( 'captures LCP vitals with element details.' , async ( { browserName, getLocalTestUrl, page } ) => {
9
16
if ( shouldSkipTracingTest ( ) || browserName !== 'chromium' ) {
10
17
sentryTest . skip ( ) ;
11
18
}
@@ -25,20 +32,21 @@ sentryTest('should capture a LCP vital with element details.', async ({ browserN
25
32
expect ( eventData . measurements ) . toBeDefined ( ) ;
26
33
expect ( eventData . measurements ?. lcp ?. value ) . toBeDefined ( ) ;
27
34
28
- // XXX: This should be body > img, but it can be flakey as sometimes it will report
29
- // the button as LCP.
30
35
expect ( eventData . contexts ?. trace ?. data ?. [ 'lcp.element' ] . startsWith ( 'body >' ) ) . toBe ( true ) ;
31
36
expect ( eventData . contexts ?. trace ?. data ?. [ 'lcp.size' ] ) . toBeGreaterThan ( 0 ) ;
32
37
expect ( eventData . contexts ?. trace ?. data ?. [ 'lcp.loadTime' ] ) . toBeGreaterThan ( 0 ) ;
33
38
34
39
// renderTime is not set because we do not return the `Timing-Allow-Origin` header
35
40
// and the image is loaded from a 3rd party origin
36
41
expect ( eventData . contexts ?. trace ?. data ?. [ 'lcp.renderTime' ] ) . toBeUndefined ( ) ;
42
+
43
+ // The LCP value should be the loadTime because the renderTime is not set
44
+ expect ( eventData . measurements ?. lcp ?. value ) . toBeCloseTo ( eventData . contexts ?. trace ?. data ?. [ 'lcp.loadTime' ] ) ;
37
45
} ) ;
38
46
39
47
sentryTest (
40
48
'captures LCP renderTime when returning Timing-Allow-Origin header.' ,
41
- async ( { browserName, getLocalTestPath , page } ) => {
49
+ async ( { browserName, getLocalTestUrl , page } ) => {
42
50
if ( shouldSkipTracingTest ( ) || browserName !== 'chromium' ) {
43
51
sentryTest . skip ( ) ;
44
52
}
@@ -51,7 +59,7 @@ sentryTest(
51
59
} ) ;
52
60
} ) ;
53
61
54
- const url = await getLocalTestPath ( { testDir : __dirname } ) ;
62
+ const url = await getLocalTestUrl ( { testDir : __dirname } ) ;
55
63
const [ eventData ] = await Promise . all ( [
56
64
getFirstSentryEnvelopeRequest < Event > ( page ) ,
57
65
page . goto ( url ) ,
@@ -61,14 +69,12 @@ sentryTest(
61
69
expect ( eventData . measurements ) . toBeDefined ( ) ;
62
70
expect ( eventData . measurements ?. lcp ?. value ) . toBeDefined ( ) ;
63
71
64
- // XXX: This should be body > img, but it can be flakey as sometimes it will report
65
- // the button as LCP.
66
72
expect ( eventData . contexts ?. trace ?. data ?. [ 'lcp.element' ] . startsWith ( 'body >' ) ) . toBe ( true ) ;
67
73
expect ( eventData . contexts ?. trace ?. data ?. [ 'lcp.size' ] ) . toBeGreaterThan ( 0 ) ;
68
74
expect ( eventData . contexts ?. trace ?. data ?. [ 'lcp.loadTime' ] ) . toBeGreaterThan ( 0 ) ;
69
-
70
- // renderTime is not set because we do not return the `Timing-Allow-Origin` header
71
- // and the image is loaded from a 3rd party origin
72
75
expect ( eventData . contexts ?. trace ?. data ?. [ 'lcp.renderTime' ] ) . toBeGreaterThan ( 0 ) ;
76
+
77
+ // The LCP value should be the renderTime because the renderTime is set
78
+ expect ( eventData . measurements ?. lcp ?. value ) . toBeCloseTo ( eventData . contexts ?. trace ?. data ?. [ 'lcp.renderTime' ] ) ;
73
79
} ,
74
80
) ;
0 commit comments