@@ -5,7 +5,14 @@ import type { Event } from '@sentry/types';
55import { sentryTest } from '../../../../utils/fixtures' ;
66import { getFirstSentryEnvelopeRequest , shouldSkipTracingTest } from '../../../../utils/helpers' ;
77
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 } ) => {
916 if ( shouldSkipTracingTest ( ) || browserName !== 'chromium' ) {
1017 sentryTest . skip ( ) ;
1118 }
@@ -25,20 +32,21 @@ sentryTest('should capture a LCP vital with element details.', async ({ browserN
2532 expect ( eventData . measurements ) . toBeDefined ( ) ;
2633 expect ( eventData . measurements ?. lcp ?. value ) . toBeDefined ( ) ;
2734
28- // XXX: This should be body > img, but it can be flakey as sometimes it will report
29- // the button as LCP.
3035 expect ( eventData . contexts ?. trace ?. data ?. [ 'lcp.element' ] . startsWith ( 'body >' ) ) . toBe ( true ) ;
3136 expect ( eventData . contexts ?. trace ?. data ?. [ 'lcp.size' ] ) . toBeGreaterThan ( 0 ) ;
3237 expect ( eventData . contexts ?. trace ?. data ?. [ 'lcp.loadTime' ] ) . toBeGreaterThan ( 0 ) ;
3338
3439 // renderTime is not set because we do not return the `Timing-Allow-Origin` header
3540 // and the image is loaded from a 3rd party origin
3641 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' ] ) ;
3745} ) ;
3846
3947sentryTest (
4048 'captures LCP renderTime when returning Timing-Allow-Origin header.' ,
41- async ( { browserName, getLocalTestPath , page } ) => {
49+ async ( { browserName, getLocalTestUrl , page } ) => {
4250 if ( shouldSkipTracingTest ( ) || browserName !== 'chromium' ) {
4351 sentryTest . skip ( ) ;
4452 }
@@ -51,7 +59,7 @@ sentryTest(
5159 } ) ;
5260 } ) ;
5361
54- const url = await getLocalTestPath ( { testDir : __dirname } ) ;
62+ const url = await getLocalTestUrl ( { testDir : __dirname } ) ;
5563 const [ eventData ] = await Promise . all ( [
5664 getFirstSentryEnvelopeRequest < Event > ( page ) ,
5765 page . goto ( url ) ,
@@ -61,14 +69,12 @@ sentryTest(
6169 expect ( eventData . measurements ) . toBeDefined ( ) ;
6270 expect ( eventData . measurements ?. lcp ?. value ) . toBeDefined ( ) ;
6371
64- // XXX: This should be body > img, but it can be flakey as sometimes it will report
65- // the button as LCP.
6672 expect ( eventData . contexts ?. trace ?. data ?. [ 'lcp.element' ] . startsWith ( 'body >' ) ) . toBe ( true ) ;
6773 expect ( eventData . contexts ?. trace ?. data ?. [ 'lcp.size' ] ) . toBeGreaterThan ( 0 ) ;
6874 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
7275 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' ] ) ;
7379 } ,
7480) ;
0 commit comments