Skip to content

Commit 5fbfb12

Browse files
committed
Update tests
1 parent 9f87f73 commit 5fbfb12

File tree

1 file changed

+43
-95
lines changed

1 file changed

+43
-95
lines changed
Lines changed: 43 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,123 +1,71 @@
1-
import { act, render, renderHook, screen } from "@testing-library/react"
1+
import { act, renderHook } from "@testing-library/react"
22
import { useResizeObserver } from "@trashpanda001/helpers/react"
3-
import { useRef } from "react"
43
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"
54

6-
// Mock implementation of ResizeObserver
7-
class MockResizeObserver {
8-
callback: ResizeObserverCallback
9-
elements: Set<Element>
10-
constructor(callback: ResizeObserverCallback) {
11-
this.callback = callback
12-
this.elements = new Set()
13-
}
14-
disconnect() {
15-
this.elements.clear()
16-
}
17-
observe(element: Element) {
18-
this.elements.add(element)
19-
}
20-
triggerResize(element: Element, rect: DOMRectReadOnly) {
21-
this.callback(
22-
[
23-
{
24-
contentRect: rect,
25-
target: element,
26-
} as ResizeObserverEntry,
27-
],
28-
this,
29-
)
30-
}
31-
unobserve(element: Element) {
32-
this.elements.delete(element)
33-
}
34-
}
35-
36-
function TestComponent() {
37-
const ref = useRef<HTMLDivElement>(null)
38-
const rect = useResizeObserver(ref)
39-
40-
return (
41-
<div>
42-
<div data-testid="resizable-element" ref={ref} style={{ height: "100px", width: "100px" }} />
43-
<div data-testid="rect-info">
44-
Width: {rect.width}, Height: {rect.height}
45-
</div>
46-
</div>
47-
)
48-
}
49-
505
describe("useResizeObserver", () => {
51-
let originalResizeObserver: typeof ResizeObserver
52-
let mockObserver: MockResizeObserver
6+
let OriginalRO: typeof ResizeObserver
7+
let observe: ReturnType<typeof vi.fn>
8+
let unobserve: ReturnType<typeof vi.fn>
9+
let callback: ResizeObserverCallback
5310

5411
beforeEach(() => {
55-
originalResizeObserver = window.ResizeObserver
56-
mockObserver = new MockResizeObserver(() => {})
57-
window.ResizeObserver = class extends MockResizeObserver {
58-
constructor(callback: ResizeObserverCallback) {
59-
super(callback)
60-
// eslint-disable-next-line @typescript-eslint/no-this-alias
61-
mockObserver = this
12+
OriginalRO = window.ResizeObserver
13+
14+
observe = vi.fn()
15+
unobserve = vi.fn()
16+
17+
class ROStub {
18+
disconnect = vi.fn()
19+
observe = observe
20+
unobserve = unobserve
21+
constructor(cb: ResizeObserverCallback) {
22+
callback = cb
6223
}
63-
} as unknown as typeof ResizeObserver
64-
})
24+
}
6525

66-
afterEach(() => {
67-
window.ResizeObserver = originalResizeObserver
26+
window.ResizeObserver = ROStub as unknown as typeof ResizeObserver
6827
})
6928

70-
it("initializes with empty DOMRectReadOnly", () => {
71-
const { result } = renderHook(() => {
72-
const ref = { current: document.createElement("div") }
73-
return useResizeObserver(ref)
74-
})
75-
76-
expect(result.current.width).toBe(0)
77-
expect(result.current.height).toBe(0)
29+
afterEach(() => {
30+
window.ResizeObserver = OriginalRO
31+
vi.restoreAllMocks()
7832
})
7933

80-
it("throws an error if ref is not set", () => {
34+
it("throws if ref is not set", () => {
8135
expect(() => {
82-
renderHook(() => {
83-
const ref = { current: null }
84-
return useResizeObserver(ref)
85-
})
36+
renderHook(() => useResizeObserver({ current: null }))
8637
}).toThrow("useResizeObserver: ref is not set")
8738
})
8839

89-
it("observes the referenced element", () => {
90-
const spyObserve = vi.spyOn(MockResizeObserver.prototype, "observe")
91-
92-
renderHook(() => {
93-
const ref = { current: document.createElement("div") }
94-
return useResizeObserver(ref)
95-
})
96-
97-
expect(spyObserve).toHaveBeenCalledTimes(1)
98-
})
99-
100-
it("unobserves the element on unmount", () => {
101-
const spyUnobserve = vi.spyOn(MockResizeObserver.prototype, "unobserve")
40+
it("observes on mount and unobserves on unmount", () => {
41+
const ref = { current: document.createElement("div") }
42+
const { unmount } = renderHook(() => useResizeObserver(ref))
10243

103-
const { unmount } = renderHook(() => {
104-
const ref = { current: document.createElement("div") }
105-
return useResizeObserver(ref)
106-
})
44+
expect(observe).toHaveBeenCalledWith(ref.current)
10745

10846
unmount()
109-
expect(spyUnobserve).toHaveBeenCalledTimes(1)
47+
expect(unobserve).toHaveBeenCalledWith(ref.current)
11048
})
11149

112-
it("updates rect when element size changes", async () => {
113-
render(<TestComponent />)
50+
it("updates rect when element size changes", () => {
51+
const ref = { current: document.createElement("div") }
52+
const { result } = renderHook(() => useResizeObserver(ref))
11453

115-
const element = screen.getByTestId("resizable-element")
54+
expect(result.current.width).toBe(0)
55+
expect(result.current.height).toBe(0)
11656

11757
act(() => {
118-
mockObserver.triggerResize(element, new DOMRectReadOnly(0, 0, 200, 150))
58+
callback(
59+
[
60+
{
61+
contentRect: new DOMRectReadOnly(0, 0, 200, 150),
62+
} as unknown as ResizeObserverEntry,
63+
] as unknown as ResizeObserverEntry[],
64+
{} as unknown as ResizeObserver,
65+
)
11966
})
12067

121-
expect(screen.getByTestId("rect-info").textContent).toBe("Width: 200, Height: 150")
68+
expect(result.current.width).toBe(200)
69+
expect(result.current.height).toBe(150)
12270
})
12371
})

0 commit comments

Comments
 (0)