Skip to content

Commit e8a7913

Browse files
authored
Merge pull request #429 from tungulin/test/useTextareaAutosize
[test]: useTextareaAutosize
2 parents b45d3d4 + 9f8f765 commit e8a7913

1 file changed

Lines changed: 92 additions & 0 deletions

File tree

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import { act, fireEvent, renderHook } from "@testing-library/react";
2+
import { renderHookServer } from "@/tests";
3+
4+
import { useTextareaAutosize } from "./useTextareaAutosize";
5+
6+
if (typeof document !== "undefined") {
7+
const target = document.createElement("textarea");
8+
target.id = "textarea-target";
9+
document.body.appendChild(target);
10+
}
11+
12+
const element = document.getElementById(
13+
"textarea-target"
14+
) as HTMLTextAreaElement;
15+
16+
it("Should use textarea autosize", () => {
17+
const { result } = renderHook(useTextareaAutosize);
18+
19+
act(() => result.current.ref(element));
20+
21+
expect(result.current.value).toEqual("");
22+
expect(result.current.setValue).toBeTypeOf("function");
23+
expect(result.current.clear).toBeTypeOf("function");
24+
});
25+
26+
it("Should use textarea autosize on server side", () => {
27+
const { result } = renderHookServer(useTextareaAutosize);
28+
29+
act(() => result.current.ref(element));
30+
31+
expect(result.current.value).toEqual("");
32+
expect(result.current.setValue).toBeTypeOf("function");
33+
expect(result.current.clear).toBeTypeOf("function");
34+
});
35+
36+
it("Should set initial value in textarea", () => {
37+
const { result } = renderHook(() => useTextareaAutosize("initial"));
38+
39+
act(() => result.current.ref(element));
40+
expect(result.current.value).toEqual("initial");
41+
});
42+
43+
it("Should update and clear value in textarea", () => {
44+
const { result } = renderHook(() => useTextareaAutosize("initial"));
45+
46+
act(() => {
47+
result.current.ref(element);
48+
result.current.setValue("initial_2");
49+
});
50+
51+
expect(result.current.value).toEqual("initial_2");
52+
53+
act(() => {
54+
result.current.clear();
55+
});
56+
57+
expect(result.current.value).toEqual("");
58+
});
59+
60+
it("Should call callback on resize", () => {
61+
const onResize = vi.fn();
62+
vi.useFakeTimers();
63+
64+
const { result } = renderHook(() => useTextareaAutosize({ onResize }));
65+
66+
act(() => result.current.ref(element));
67+
expect(onResize).toHaveBeenCalledTimes(1);
68+
69+
fireEvent.input(element, { target: { value: "hello_world" } });
70+
71+
vi.runAllTimers();
72+
expect(onResize).toHaveBeenCalledTimes(3);
73+
vi.useRealTimers();
74+
});
75+
76+
it("Should cleanup on unmount", () => {
77+
const removeEventListenerSpy = vi.spyOn(element, "removeEventListener");
78+
const { result, unmount } = renderHook(useTextareaAutosize);
79+
80+
act(() => result.current.ref(element));
81+
82+
unmount();
83+
84+
expect(removeEventListenerSpy).toHaveBeenCalledWith(
85+
"input",
86+
expect.any(Function)
87+
);
88+
expect(removeEventListenerSpy).toHaveBeenCalledWith(
89+
"resize",
90+
expect.any(Function)
91+
);
92+
});

0 commit comments

Comments
 (0)