Files
hunjing/frontend/src/lib/hooks/useEasterEgg.test.ts
T
2026-08-21 16:00:13 +08:00

58 lines
2.1 KiB
TypeScript

import { act, renderHook } from "@testing-library/react";
import { describe, expect, it, vi } from "vitest";
import { EGG_VERSES, pickEggVerse, useEasterEgg } from "./useEasterEgg";
describe("useEasterEgg", () => {
it("连点 5 次触发 onReveal", () => {
const onReveal = vi.fn();
const { result } = renderHook(() => useEasterEgg({ onReveal }));
for (let i = 0; i < 5; i++) act(() => result.current.onClick());
expect(onReveal).toHaveBeenCalledTimes(1);
});
it("不足 5 次不触发 onReveal", () => {
const onReveal = vi.fn();
const { result } = renderHook(() => useEasterEgg({ onReveal }));
for (let i = 0; i < 4; i++) act(() => result.current.onClick());
expect(onReveal).not.toHaveBeenCalled();
});
it("连点 9 次触发 onAscend(九枢升格)", () => {
const onAscend = vi.fn();
const { result } = renderHook(() => useEasterEgg({ onAscend }));
for (let i = 0; i < 9; i++) act(() => result.current.onClick());
expect(onAscend).toHaveBeenCalledTimes(1);
});
it("双层彩蛋:5 次弹谶语、9 次升格,各触发一次", () => {
const onReveal = vi.fn();
const onAscend = vi.fn();
const { result } = renderHook(() => useEasterEgg({ onReveal, onAscend }));
for (let i = 0; i < 9; i++) act(() => result.current.onClick());
expect(onReveal).toHaveBeenCalledTimes(1);
expect(onAscend).toHaveBeenCalledTimes(1);
});
it("升格后归零,可再次触发双层", () => {
const onReveal = vi.fn();
const onAscend = vi.fn();
const { result } = renderHook(() => useEasterEgg({ onReveal, onAscend }));
for (let i = 0; i < 9; i++) act(() => result.current.onClick());
for (let i = 0; i < 9; i++) act(() => result.current.onClick());
expect(onReveal).toHaveBeenCalledTimes(2);
expect(onAscend).toHaveBeenCalledTimes(2);
});
it("pickEggVerse 返回谶语池中一条", () => {
expect(EGG_VERSES).toContain(pickEggVerse());
});
it("未传回调时达阈值不抛错", () => {
const { result } = renderHook(() => useEasterEgg());
expect(() => {
for (let i = 0; i < 9; i++) act(() => result.current.onClick());
}).not.toThrow();
});
});