import React, { useEffect, useLayoutEffect, act } from 'react'
import { appendComponent } from '../../../test/appendComponent'
import { initializeReactPlugin } from '../../../test/initializeReactPlugin'
import type { Clock } from '../../../../core/test'
import { mockClock } from '../../../../core/test'
import { UNSTABLE_ReactComponentTracker as ReactComponentTracker } from './reactComponentTracker'
const RENDER_DURATION = 100
const EFFECT_DURATION = 101
const LAYOUT_EFFECT_DURATION = 102
const TOTAL_DURATION = RENDER_DURATION + EFFECT_DURATION + LAYOUT_EFFECT_DURATION
function ChildComponent({ clock }: { clock: Clock }) {
clock.tick(RENDER_DURATION)
useEffect(() => clock.tick(EFFECT_DURATION))
useLayoutEffect(() => clock.tick(LAYOUT_EFFECT_DURATION))
return null
}
describe('UNSTABLE_ReactComponentTracker', () => {
let clock: Clock
beforeEach(() => {
clock = mockClock()
})
it('should call addDurationVital after the component rendering', () => {
const addDurationVitalSpy = jasmine.createSpy()
initializeReactPlugin({
publicApi: {
addDurationVital: addDurationVitalSpy,
},
})
appendComponent(
)
expect(addDurationVitalSpy).toHaveBeenCalledTimes(1)
const [name, options] = addDurationVitalSpy.calls.mostRecent().args
expect(name).toBe('reactComponentRender')
expect(options).toEqual({
description: 'ChildComponent',
startTime: clock.timeStamp(0),
duration: TOTAL_DURATION,
context: {
is_first_render: true,
render_phase_duration: RENDER_DURATION,
effect_phase_duration: EFFECT_DURATION,
layout_effect_phase_duration: LAYOUT_EFFECT_DURATION,
framework: 'react',
},
})
})
it('should call addDurationVital on rerender', () => {
const addDurationVitalSpy = jasmine.createSpy()
initializeReactPlugin({
publicApi: {
addDurationVital: addDurationVitalSpy,
},
})
let forceUpdate: () => void
function App() {
const [, setState] = React.useState(0)
forceUpdate = () => setState((prev) => prev + 1)
return (
<>
>
)
}
appendComponent()
clock.tick(1)
act(() => {
forceUpdate!()
})
expect(addDurationVitalSpy).toHaveBeenCalledTimes(2)
const options = addDurationVitalSpy.calls.mostRecent().args[1]
expect(options).toEqual({
description: 'ChildComponent',
startTime: clock.timeStamp(TOTAL_DURATION + 1),
duration: TOTAL_DURATION,
context: {
is_first_render: false,
render_phase_duration: RENDER_DURATION,
effect_phase_duration: EFFECT_DURATION,
layout_effect_phase_duration: LAYOUT_EFFECT_DURATION,
framework: 'react',
},
})
})
})