preact-missing-hooks 4.6.0 → 4.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Readme.md +84 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.modern.mjs +1 -1
- package/dist/index.modern.mjs.map +1 -1
- package/dist/index.module.js +1 -1
- package/dist/index.module.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/react.js +270 -0
- package/dist/useDeviceData.d.ts +82 -0
- package/dist/usePoll.d.ts +47 -0
- package/docs/README.md +2 -0
- package/docs/main.js +66 -0
- package/llm.package.json +57 -72
- package/llm.package.txt +21 -19
- package/package.json +15 -3
- package/scripts/ensure-microbundle-patch.cjs +46 -0
- package/src/index.ts +2 -0
- package/src/useDeviceData.ts +285 -0
- package/src/usePoll.ts +110 -0
- package/tests/useDeviceData.test.tsx +213 -0
- package/tests/usePoll.test.tsx +110 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/** @jsx h */
|
|
2
|
+
import { h } from 'preact'
|
|
3
|
+
import { render, waitFor } from '@testing-library/preact'
|
|
4
|
+
import { usePoll } from '../src/usePoll'
|
|
5
|
+
|
|
6
|
+
const isReact = !!(globalThis as unknown as { __VITEST_REACT__?: boolean }).__VITEST_REACT__
|
|
7
|
+
|
|
8
|
+
describe('usePoll', () => {
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
vi.useFakeTimers()
|
|
11
|
+
})
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
vi.useRealTimers()
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
it.skipIf(isReact)('returns data and done when pollFn returns done: true with data', async () => {
|
|
17
|
+
const pollFn = vi.fn()
|
|
18
|
+
.mockResolvedValueOnce({ done: false })
|
|
19
|
+
.mockResolvedValueOnce({ done: true, data: { ok: true } })
|
|
20
|
+
function TestComponent() {
|
|
21
|
+
const { data, done, pollCount } = usePoll(pollFn, { intervalMs: 100, immediate: true })
|
|
22
|
+
return (
|
|
23
|
+
<div>
|
|
24
|
+
<span data-testid="done">{String(done)}</span>
|
|
25
|
+
<span data-testid="count">{pollCount}</span>
|
|
26
|
+
<span data-testid="data">{data ? JSON.stringify(data) : 'null'}</span>
|
|
27
|
+
</div>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
const { getByTestId } = render(<TestComponent />)
|
|
31
|
+
await vi.runAllTimersAsync()
|
|
32
|
+
await waitFor(() => {
|
|
33
|
+
expect(getByTestId('done').textContent).toBe('true')
|
|
34
|
+
expect(getByTestId('data').textContent).toBe('{"ok":true}')
|
|
35
|
+
})
|
|
36
|
+
expect(pollFn).toHaveBeenCalled()
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
it.skipIf(isReact)('stops polling when done: true', async () => {
|
|
40
|
+
const pollFn = vi.fn().mockResolvedValue({ done: false })
|
|
41
|
+
function TestComponent() {
|
|
42
|
+
const { done, pollCount } = usePoll(pollFn, { intervalMs: 50, immediate: true })
|
|
43
|
+
return (
|
|
44
|
+
<div>
|
|
45
|
+
<span data-testid="done">{String(done)}</span>
|
|
46
|
+
<span data-testid="count">{pollCount}</span>
|
|
47
|
+
</div>
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
const { getByTestId } = render(<TestComponent />)
|
|
51
|
+
await vi.advanceTimersByTimeAsync(150)
|
|
52
|
+
const countBefore = Number(getByTestId('count').textContent)
|
|
53
|
+
pollFn.mockResolvedValue({ done: true })
|
|
54
|
+
await vi.advanceTimersByTimeAsync(100)
|
|
55
|
+
await waitFor(() => {
|
|
56
|
+
expect(getByTestId('done').textContent).toBe('true')
|
|
57
|
+
})
|
|
58
|
+
const countAfter = Number(getByTestId('count').textContent)
|
|
59
|
+
expect(countAfter).toBeGreaterThanOrEqual(countBefore + 1)
|
|
60
|
+
const callsAfterDone = pollFn.mock.calls.length
|
|
61
|
+
await vi.advanceTimersByTimeAsync(200)
|
|
62
|
+
expect(pollFn.mock.calls.length).toBe(callsAfterDone)
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
it.skipIf(isReact)('sets error and stops when pollFn throws', async () => {
|
|
66
|
+
const err = new Error('poll failed')
|
|
67
|
+
const pollFn = vi.fn().mockRejectedValue(err)
|
|
68
|
+
function TestComponent() {
|
|
69
|
+
const { error, done } = usePoll(pollFn, { intervalMs: 100, immediate: true })
|
|
70
|
+
return (
|
|
71
|
+
<div>
|
|
72
|
+
<span data-testid="done">{String(done)}</span>
|
|
73
|
+
<span data-testid="error">{error?.message ?? 'none'}</span>
|
|
74
|
+
</div>
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
const { getByTestId } = render(<TestComponent />)
|
|
78
|
+
await vi.advanceTimersByTimeAsync(0)
|
|
79
|
+
await waitFor(() => {
|
|
80
|
+
expect(getByTestId('error').textContent).toBe('poll failed')
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
it('does not start when enabled: false', async () => {
|
|
85
|
+
const pollFn = vi.fn().mockResolvedValue({ done: false })
|
|
86
|
+
function TestComponent() {
|
|
87
|
+
const { pollCount } = usePoll(pollFn, { intervalMs: 100, immediate: true, enabled: false })
|
|
88
|
+
return <span data-testid="count">{pollCount}</span>
|
|
89
|
+
}
|
|
90
|
+
const { getByTestId } = render(<TestComponent />)
|
|
91
|
+
await vi.advanceTimersByTimeAsync(500)
|
|
92
|
+
expect(getByTestId('count').textContent).toBe('0')
|
|
93
|
+
expect(pollFn).not.toHaveBeenCalled()
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
it('exposes start and stop', () => {
|
|
97
|
+
const pollFn = vi.fn().mockResolvedValue({ done: false })
|
|
98
|
+
let startFn: () => void
|
|
99
|
+
let stopFn: () => void
|
|
100
|
+
function TestComponent() {
|
|
101
|
+
const result = usePoll(pollFn, { intervalMs: 1000, immediate: false, enabled: false })
|
|
102
|
+
startFn = result.start
|
|
103
|
+
stopFn = result.stop
|
|
104
|
+
return <span data-testid="count">{result.pollCount}</span>
|
|
105
|
+
}
|
|
106
|
+
render(<TestComponent />)
|
|
107
|
+
expect(typeof startFn!).toBe('function')
|
|
108
|
+
expect(typeof stopFn!).toBe('function')
|
|
109
|
+
})
|
|
110
|
+
})
|