Skip to content

Commit 3d0318d

Browse files
committed
chore: modernize tests
1 parent 2147b4b commit 3d0318d

File tree

6 files changed

+170
-115
lines changed

6 files changed

+170
-115
lines changed

.eslintignore

Lines changed: 0 additions & 5 deletions
This file was deleted.

.eslintrc

Lines changed: 0 additions & 32 deletions
This file was deleted.

example/package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"private": true,
77
"type": "module",
88
"dependencies": {
9+
"prop-types": "^15.8.1",
910
"react": "18.1",
1011
"react-bottom-scroll-listener": "workspace:*",
1112
"react-dom": "18.1",
@@ -16,5 +17,8 @@
1617
"not dead",
1718
"not ie <= 11",
1819
"not op_mini all"
19-
]
20+
],
21+
"devDependencies": {
22+
"@types/prop-types": "^15"
23+
}
2024
}

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
],
4343
"scripts": {
4444
"build": "vite build && tsc",
45-
"dev": "vite",
45+
"dev": "vite build --watch",
4646
"build:example": "vite build example --base=/react-bottom-scroll-listener/",
4747
"dev:example": "vite example",
4848
"lint": "biome check src",
@@ -59,7 +59,8 @@
5959
"devDependencies": {
6060
"@biomejs/biome": "1.9.3",
6161
"@karl-run/prettier-config": "^1.0.1",
62-
"@testing-library/react-hooks": "^8.0.1",
62+
"@testing-library/dom": "^10.4.0",
63+
"@testing-library/react": "^16.0.1",
6364
"@types/lodash.debounce": "^4.0.7",
6465
"@types/node": "^22.7.4",
6566
"@types/react": "^18.0.15",

src/hook/index.test.tsx

Lines changed: 30 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import { describe, expect, it, vi } from 'vitest'
1+
import { afterEach, describe, expect, it, vi } from 'vitest'
22

3-
import { renderHook } from '@testing-library/react-hooks'
3+
import { render, renderHook, screen, fireEvent, cleanup } from '@testing-library/react'
44
import type React from 'react'
5-
import ReactDOM from 'react-dom'
65

76
import useBottomScrollListener from './'
87

@@ -37,7 +36,8 @@ describe('useBottomScrollListener', () => {
3736

3837
// window size is 768.
3938
// 768 + 400 = 1168, should not scroll
40-
;(document.documentElement as unknown as Record<string, unknown>).scrollHeight = 1200
39+
// @ts-expect-error scrollHeight is a mock property
40+
document.documentElement.scrollHeight = 1200
4141
document.documentElement.scrollTop = 400
4242

4343
window.dispatchEvent(new Event('scroll'))
@@ -52,7 +52,8 @@ describe('useBottomScrollListener', () => {
5252

5353
// window size is 768.
5454
// 768 + 432 = 1200, should scroll
55-
;(document.documentElement as unknown as Record<string, unknown>).scrollHeight = 1200
55+
// @ts-expect-error scrollHeight is a mock property
56+
document.documentElement.scrollHeight = 1200
5657
document.documentElement.scrollTop = 432
5758

5859
window.dispatchEvent(new Event('scroll'))
@@ -68,69 +69,50 @@ describe('useBottomScrollListener', () => {
6869
})
6970

7071
describe('given a ref it should use the given ref and', () => {
71-
const setupFakeContainer = (containerRef: React.RefObject<HTMLDivElement>) => {
72-
const div = document.createElement('div')
73-
74-
// biome-ignore lint: should be migrated to a more modern way of doing this
75-
const renderedNode: HTMLDivElement = ReactDOM.render(<div ref={containerRef} />, div) as unknown as HTMLDivElement
76-
77-
;(renderedNode as unknown as Record<string, unknown>).clientHeight = 600
78-
79-
let triggerScroll: (() => void) | null = null
80-
renderedNode.addEventListener = vi.fn().mockImplementation((_, cb) => {
81-
triggerScroll = cb
82-
})
83-
84-
return { renderedNode, getTriggerScroll: () => triggerScroll }
72+
const TestComponent = ({ onBottom }: { onBottom: () => void }) => {
73+
const ref = useBottomScrollListener<HTMLDivElement>(onBottom, { offset: 0, debounce: 0 })
74+
75+
return (
76+
<div ref={ref} style={{ height: '600px' }} data-testid="container">
77+
<h1>I am test</h1>
78+
</div>
79+
)
8580
}
8681

82+
afterEach(cleanup)
83+
8784
it('shall not invoke onBottom when container has not hit bottom', () => {
8885
const onBottom = vi.fn()
86+
render(<TestComponent onBottom={onBottom} />)
8987

90-
const hook = renderHook(() => useBottomScrollListener<HTMLDivElement>(onBottom, { offset: 0, debounce: 0 }))
91-
const containerRef: React.RefObject<HTMLDivElement> = hook.result.current
92-
93-
const { renderedNode, getTriggerScroll } = setupFakeContainer(containerRef)
94-
95-
hook.rerender()
96-
97-
const triggerScroll = getTriggerScroll()
98-
if (triggerScroll == null) {
99-
throw new Error('Hook setup failed, callback never set')
100-
}
88+
const container: { clientHeight: number; scrollHeight: number; scrollTop: number } =
89+
screen.getByTestId('container')
10190

10291
// container size is 600.
10392
// 600 + 300 = 900, should not scroll
104-
;(renderedNode as unknown as Record<string, unknown>).scrollHeight = 1000
105-
renderedNode.scrollTop = 300
93+
container.clientHeight = 600
94+
container.scrollHeight = 1000
95+
container.scrollTop = 300
10696

107-
triggerScroll()
97+
fireEvent.scroll(container as Element, { target: { scrollY: 300 } })
10898

10999
expect(onBottom).not.toHaveBeenCalled()
110100
})
111101

112102
it('shall invoke onBottom when container is exactly at bottom', () => {
113103
const onBottom = vi.fn()
104+
render(<TestComponent onBottom={onBottom} />)
114105

115-
const hook = renderHook(() => useBottomScrollListener<HTMLDivElement>(onBottom, { offset: 0, debounce: 0 }))
116-
const containerRef: React.RefObject<HTMLDivElement> = hook.result.current
117-
118-
const { renderedNode, getTriggerScroll } = setupFakeContainer(containerRef)
119-
120-
hook.rerender()
121-
122-
const triggerScroll = getTriggerScroll()
123-
if (triggerScroll == null) {
124-
throw new Error('Hook setup failed, callback never set')
125-
}
106+
const container: { clientHeight: number; scrollHeight: number; scrollTop: number } =
107+
screen.getByTestId('container')
126108

127109
// container size is 600.
128110
// 600 + 400 = 1000, should scroll
111+
container.clientHeight = 600
112+
container.scrollHeight = 1000
113+
container.scrollTop = 400
129114

130-
;(renderedNode as unknown as Record<string, unknown>).scrollHeight = 1000
131-
renderedNode.scrollTop = 400
132-
133-
triggerScroll()
115+
fireEvent.scroll(container as Element, { target: { scrollY: 400 } })
134116

135117
expect(onBottom).toHaveBeenCalledTimes(1)
136118
})

0 commit comments

Comments
 (0)