@@ -5,7 +5,7 @@ import { htmlTreeAsString } from '../../../src/utils/browser';
55beforeAll ( ( ) => {
66 const dom = new JSDOM ( ) ;
77 global . document = dom . window . document ;
8- global . HTMLElement = new JSDOM ( ) . window . HTMLElement ;
8+ global . HTMLElement = dom . window . HTMLElement ;
99} ) ;
1010
1111describe ( 'htmlTreeAsString' , ( ) => {
@@ -73,4 +73,83 @@ describe('htmlTreeAsString', () => {
7373 'div#main-cta > div.container > button.bg-blue-500.hover:bg-blue-700.text-white.hover:text-blue-100' ,
7474 ) ;
7575 } ) ;
76+
77+ describe ( 'data-sentry-label support' , ( ) => {
78+ it ( 'returns data-sentry-label when element has the attribute directly' , ( ) => {
79+ const el = document . createElement ( 'div' ) ;
80+ el . innerHTML = '<button data-sentry-label="SubmitButton" class="btn" />' ;
81+ document . body . appendChild ( el ) ;
82+
83+ expect ( htmlTreeAsString ( document . querySelector ( 'button' ) ) ) . toBe (
84+ 'body > div > [data-sentry-label="SubmitButton"]' ,
85+ ) ;
86+ } ) ;
87+
88+ it ( 'includes data-sentry-label from ancestor element in the path' , ( ) => {
89+ const el = document . createElement ( 'div' ) ;
90+ el . innerHTML = `<div data-sentry-label="LoginForm">
91+ <div class="form-group">
92+ <button id="submit-btn" class="btn" />
93+ </div>
94+ </div>` ;
95+ document . body . appendChild ( el ) ;
96+
97+ expect ( htmlTreeAsString ( document . getElementById ( 'submit-btn' ) ) ) . toBe (
98+ 'div > [data-sentry-label="LoginForm"] > div.form-group > button#submit-btn.btn' ,
99+ ) ;
100+ } ) ;
101+
102+ it ( 'finds data-sentry-label on a distant ancestor within traverse limit' , ( ) => {
103+ const el = document . createElement ( 'div' ) ;
104+ el . innerHTML = `<div data-sentry-label="DeepForm">
105+ <div class="level-1">
106+ <div class="level-2">
107+ <div class="level-3">
108+ <div class="level-4">
109+ <div class="level-5">
110+ <button id="deep-btn" />
111+ </div>
112+ </div>
113+ </div>
114+ </div>
115+ </div>
116+ </div>` ;
117+ document . body . appendChild ( el ) ;
118+
119+ const result = htmlTreeAsString ( document . getElementById ( 'deep-btn' ) ) ;
120+ expect ( result ) . toContain ( '[data-sentry-label="DeepForm"]' ) ;
121+ } ) ;
122+
123+ it ( 'does not add prefix if data-sentry-label is already in cssSelector path' , ( ) => {
124+ const el = document . createElement ( 'div' ) ;
125+ el . innerHTML = `<div data-sentry-label="OuterLabel">
126+ <div data-sentry-label="InnerLabel">
127+ <button id="btn" />
128+ </div>
129+ </div>` ;
130+ document . body . appendChild ( el ) ;
131+
132+ expect ( htmlTreeAsString ( document . getElementById ( 'btn' ) ) ) . toBe ( '[data-sentry-label="InnerLabel"] > button#btn' ) ;
133+ } ) ;
134+
135+ it ( 'returns normal cssSelector when no data-sentry-label exists' , ( ) => {
136+ const el = document . createElement ( 'div' ) ;
137+ el . innerHTML = `<div class="container">
138+ <button id="no-label-btn" class="btn" />
139+ </div>` ;
140+ document . body . appendChild ( el ) ;
141+
142+ expect ( htmlTreeAsString ( document . getElementById ( 'no-label-btn' ) ) ) . toBe (
143+ 'body > div > div.container > button#no-label-btn.btn' ,
144+ ) ;
145+ } ) ;
146+
147+ it ( 'prioritizes data-sentry-label over data-sentry-component' , ( ) => {
148+ const el = document . createElement ( 'div' ) ;
149+ el . innerHTML = '<button data-sentry-component="MyComponent" data-sentry-label="MyLabel" class="btn" />' ;
150+ document . body . appendChild ( el ) ;
151+
152+ expect ( htmlTreeAsString ( document . querySelector ( 'button' ) ) ) . toBe ( 'body > div > [data-sentry-label="MyLabel"]' ) ;
153+ } ) ;
154+ } ) ;
76155} ) ;
0 commit comments