|
1 | | -import { Span, Transaction } from '../../src'; |
2 | | -import { _startChild, _addResourceSpans, MetricsInstrumentation, ResourceEntry } from '../../src/browser/metrics'; |
3 | | -import { addDOMPropertiesToGlobal } from '../testutils'; |
4 | | - |
5 | | -// eslint-disable-next-line @typescript-eslint/no-explicit-any, no-var |
6 | | -declare var global: any; |
7 | | - |
8 | | -describe('_startChild()', () => { |
9 | | - it('creates a span with given properties', () => { |
10 | | - const transaction = new Transaction({ name: 'test' }); |
11 | | - const span = _startChild(transaction, { |
12 | | - description: 'evaluation', |
13 | | - op: 'script', |
14 | | - }); |
| 1 | +import { Transaction } from '../../../src'; |
| 2 | +import { _addResourceSpans, _addMeasureSpans, ResourceEntry } from '../../../src/browser/metrics'; |
15 | 3 |
|
16 | | - expect(span).toBeInstanceOf(Span); |
17 | | - expect(span.description).toBe('evaluation'); |
18 | | - expect(span.op).toBe('script'); |
| 4 | +describe('_addMeasureSpans', () => { |
| 5 | + const transaction = new Transaction({ op: 'pageload', name: '/' }); |
| 6 | + beforeEach(() => { |
| 7 | + transaction.startChild = jest.fn(); |
19 | 8 | }); |
20 | 9 |
|
21 | | - it('adjusts the start timestamp if child span starts before transaction', () => { |
22 | | - const transaction = new Transaction({ name: 'test', startTimestamp: 123 }); |
23 | | - const span = _startChild(transaction, { |
24 | | - description: 'script.js', |
25 | | - op: 'resource', |
26 | | - startTimestamp: 100, |
27 | | - }); |
| 10 | + it('adds measure spans to a transaction', () => { |
| 11 | + const entry: Omit<PerformanceMeasure, 'toJSON'> = { |
| 12 | + entryType: 'measure', |
| 13 | + name: 'measure-1', |
| 14 | + duration: 10, |
| 15 | + startTime: 12, |
| 16 | + }; |
28 | 17 |
|
29 | | - expect(transaction.startTimestamp).toEqual(span.startTimestamp); |
30 | | - expect(transaction.startTimestamp).toEqual(100); |
31 | | - }); |
| 18 | + const timeOrigin = 100; |
| 19 | + const startTime = 23; |
| 20 | + const duration = 356; |
32 | 21 |
|
33 | | - it('does not adjust start timestamp if child span starts after transaction', () => { |
34 | | - const transaction = new Transaction({ name: 'test', startTimestamp: 123 }); |
35 | | - const span = _startChild(transaction, { |
36 | | - description: 'script.js', |
37 | | - op: 'resource', |
38 | | - startTimestamp: 150, |
| 22 | + expect(transaction.startChild).toHaveBeenCalledTimes(0); |
| 23 | + _addMeasureSpans(transaction, entry, startTime, duration, timeOrigin); |
| 24 | + expect(transaction.startChild).toHaveBeenCalledTimes(1); |
| 25 | + expect(transaction.startChild).toHaveBeenLastCalledWith({ |
| 26 | + description: 'measure-1', |
| 27 | + startTimestamp: timeOrigin + startTime, |
| 28 | + endTimestamp: timeOrigin + startTime + duration, |
| 29 | + op: 'measure', |
39 | 30 | }); |
40 | | - |
41 | | - expect(transaction.startTimestamp).not.toEqual(span.startTimestamp); |
42 | | - expect(transaction.startTimestamp).toEqual(123); |
43 | 31 | }); |
44 | 32 | }); |
45 | 33 |
|
46 | 34 | describe('_addResourceSpans', () => { |
47 | | - const transaction = new Transaction({ name: 'hello' }); |
| 35 | + const transaction = new Transaction({ op: 'pageload', name: '/' }); |
48 | 36 | beforeEach(() => { |
49 | 37 | transaction.startChild = jest.fn(); |
50 | 38 | }); |
@@ -169,54 +157,3 @@ describe('_addResourceSpans', () => { |
169 | 157 | ); |
170 | 158 | }); |
171 | 159 | }); |
172 | | - |
173 | | -// TODO: Add these tests back |
174 | | -// describe('MetricsInstrumentation', () => { |
175 | | -// afterEach(() => { |
176 | | -// jest.clearAllMocks(); |
177 | | -// }); |
178 | | - |
179 | | -// it('does not initialize trackers when on node', () => { |
180 | | -// const trackers = ['_trackCLS', '_trackLCP', '_trackFID'].map(tracker => |
181 | | -// jest.spyOn(MetricsInstrumentation.prototype as any, tracker), |
182 | | -// ); |
183 | | - |
184 | | -// new MetricsInstrumentation(); |
185 | | - |
186 | | -// trackers.forEach(tracker => expect(tracker).not.toBeCalled()); |
187 | | -// }); |
188 | | - |
189 | | -// it('initializes trackers when not on node and `global.performance` and `global.document` are available.', () => { |
190 | | -// addDOMPropertiesToGlobal(['performance', 'document', 'addEventListener', 'window']); |
191 | | - |
192 | | -// const backup = global.process; |
193 | | -// global.process = undefined; |
194 | | - |
195 | | -// const trackers = ['_trackCLS', '_trackLCP', '_trackFID'].map(tracker => |
196 | | -// jest.spyOn(MetricsInstrumentation.prototype as any, tracker), |
197 | | -// ); |
198 | | -// new MetricsInstrumentation(); |
199 | | -// global.process = backup; |
200 | | - |
201 | | -// trackers.forEach(tracker => expect(tracker).toBeCalled()); |
202 | | -// }); |
203 | | - |
204 | | -// it('does not initialize trackers when not on node but `global.document` is not available (in worker)', () => { |
205 | | -// // window not necessary for this test, but it is here to exercise that it is absence of document that is checked |
206 | | -// addDOMPropertiesToGlobal(['performance', 'addEventListener', 'window']); |
207 | | - |
208 | | -// const processBackup = global.process; |
209 | | -// global.process = undefined; |
210 | | -// const documentBackup = global.document; |
211 | | -// global.document = undefined; |
212 | | - |
213 | | -// const trackers = ['_trackCLS', '_trackLCP', '_trackFID'].map(tracker => |
214 | | -// jest.spyOn(MetricsInstrumentation.prototype as any, tracker), |
215 | | -// ); |
216 | | -// new MetricsInstrumentation(); |
217 | | -// global.process = processBackup; |
218 | | -// global.document = documentBackup; |
219 | | - |
220 | | -// trackers.forEach(tracker => expect(tracker).not.toBeCalled()); |
221 | | -// }); |
222 | | -// }); |
0 commit comments