Skip to content

Commit 1ad01cc

Browse files
ModuloMphilibea
andauthored
fix(useSegment): add ready state (#1722)
* fix(useSegment): add isAnalyticsReady state * test: add tests * fix: fix dependencies precision Co-authored-by: philibeaux <[email protected]> * refactor: refactor to avoid using new prop * refactor(useSegment): introduce new prop to get rid of undefined shouldLoad status * feat(useSegment): new prop that render children conditionaly * test(provider): add some test on Segment Provider --------- Co-authored-by: philibeaux <[email protected]>
1 parent 931402c commit 1ad01cc

File tree

4 files changed

+287
-36
lines changed

4 files changed

+287
-36
lines changed

.changeset/plenty-dogs-shake.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@scaleway/use-segment': minor
3+
---
4+
5+
Add ready state to useSegment
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import { describe, expect, it, jest } from '@jest/globals'
2+
import type { Context } from '@segment/analytics-next'
3+
import { AnalyticsBrowser } from '@segment/analytics-next'
4+
import { render, screen, waitFor } from '@testing-library/react'
5+
import SegmentProvider from '..'
6+
import type { Analytics } from '../index'
7+
8+
const TestChildren = () => <div data-testid="test">children</div>
9+
10+
describe('SegmentProvider', () => {
11+
it('Provider should render children when shouldRenderOnlyWhenReady is false', async () => {
12+
const mock = jest
13+
.spyOn(AnalyticsBrowser, 'load')
14+
.mockResolvedValue([{} as Analytics, {} as Context])
15+
16+
const settings = { writeKey: 'helloworld' }
17+
18+
render(
19+
<SegmentProvider
20+
settings={settings}
21+
initOptions={{}}
22+
areOptionsLoaded={false}
23+
events={{
24+
event: () => () => Promise.resolve(),
25+
}}
26+
>
27+
<TestChildren />
28+
</SegmentProvider>,
29+
)
30+
31+
await waitFor(() => {
32+
expect(mock).toHaveBeenCalledTimes(0)
33+
})
34+
35+
expect(screen.getByTestId('test')).toBeTruthy()
36+
})
37+
38+
it('Provider should not render children when options are not loaded ', async () => {
39+
const mock = jest
40+
.spyOn(AnalyticsBrowser, 'load')
41+
.mockResolvedValue([{} as Analytics, {} as Context])
42+
43+
const settings = { writeKey: 'helloworld' }
44+
45+
render(
46+
<SegmentProvider
47+
settings={settings}
48+
initOptions={{}}
49+
areOptionsLoaded={false}
50+
shouldRenderOnlyWhenReady
51+
events={{
52+
event: () => () => Promise.resolve(),
53+
}}
54+
>
55+
<TestChildren />
56+
</SegmentProvider>,
57+
)
58+
59+
await waitFor(() => {
60+
expect(mock).toHaveBeenCalledTimes(0)
61+
})
62+
63+
expect(screen.queryByTestId('test')).toBe(null)
64+
})
65+
66+
it('Provider should not render children when options are not loaded at first render, but load after options changed', async () => {
67+
const mock = jest
68+
.spyOn(AnalyticsBrowser, 'load')
69+
.mockResolvedValue([{} as Analytics, {} as Context])
70+
71+
const settings = { writeKey: 'helloworld' }
72+
73+
const { rerender } = render(
74+
<SegmentProvider
75+
settings={settings}
76+
initOptions={{}}
77+
areOptionsLoaded={false}
78+
shouldRenderOnlyWhenReady
79+
events={{
80+
event: () => () => Promise.resolve(),
81+
}}
82+
>
83+
<TestChildren />
84+
</SegmentProvider>,
85+
)
86+
87+
await waitFor(() => {
88+
expect(mock).toHaveBeenCalledTimes(0)
89+
})
90+
91+
expect(screen.queryByTestId('test')).toBe(null)
92+
93+
rerender(
94+
<SegmentProvider
95+
settings={settings}
96+
initOptions={{}}
97+
areOptionsLoaded
98+
shouldRenderOnlyWhenReady
99+
events={{
100+
event: () => () => Promise.resolve(),
101+
}}
102+
>
103+
<TestChildren />
104+
</SegmentProvider>,
105+
)
106+
107+
await waitFor(() => {
108+
expect(mock).toHaveBeenCalledTimes(1)
109+
})
110+
111+
expect(screen.queryByTestId('test')).toBeTruthy()
112+
})
113+
})

0 commit comments

Comments
 (0)