Sifa professional network frontend (Next.js, React, TailwindCSS)
sifa.id/
1import { renderHook, act } from '@testing-library/react';
2import { describe, it, expect } from 'vitest';
3import { useKonamiCode } from '@/hooks/use-konami-code';
4
5function pressKey(key: string) {
6 window.dispatchEvent(new KeyboardEvent('keydown', { key }));
7}
8
9const KONAMI_SEQUENCE = [
10 'ArrowUp',
11 'ArrowUp',
12 'ArrowDown',
13 'ArrowDown',
14 'ArrowLeft',
15 'ArrowRight',
16 'ArrowLeft',
17 'ArrowRight',
18 'b',
19 'a',
20];
21
22describe('useKonamiCode', () => {
23 it('starts not activated', () => {
24 const { result } = renderHook(() => useKonamiCode());
25 expect(result.current.activated).toBe(false);
26 });
27
28 it('activates after full Konami Code sequence', () => {
29 const { result } = renderHook(() => useKonamiCode());
30
31 act(() => {
32 for (const key of KONAMI_SEQUENCE) {
33 pressKey(key);
34 }
35 });
36
37 expect(result.current.activated).toBe(true);
38 });
39
40 it('does not activate on partial sequence', () => {
41 const { result } = renderHook(() => useKonamiCode());
42
43 act(() => {
44 pressKey('ArrowUp');
45 pressKey('ArrowUp');
46 pressKey('ArrowDown');
47 });
48
49 expect(result.current.activated).toBe(false);
50 });
51
52 it('resets on wrong key', () => {
53 const { result } = renderHook(() => useKonamiCode());
54
55 act(() => {
56 pressKey('ArrowUp');
57 pressKey('ArrowUp');
58 pressKey('ArrowDown');
59 pressKey('x'); // wrong key
60 });
61
62 expect(result.current.activated).toBe(false);
63
64 // Should need full sequence again
65 act(() => {
66 for (const key of KONAMI_SEQUENCE) {
67 pressKey(key);
68 }
69 });
70
71 expect(result.current.activated).toBe(true);
72 });
73
74 it('works with uppercase B and A (Caps Lock)', () => {
75 const { result } = renderHook(() => useKonamiCode());
76
77 act(() => {
78 for (const key of KONAMI_SEQUENCE.slice(0, 8)) {
79 pressKey(key);
80 }
81 pressKey('B');
82 pressKey('A');
83 });
84
85 expect(result.current.activated).toBe(true);
86 });
87
88 it('dismiss resets activated state', () => {
89 const { result } = renderHook(() => useKonamiCode());
90
91 act(() => {
92 for (const key of KONAMI_SEQUENCE) {
93 pressKey(key);
94 }
95 });
96
97 expect(result.current.activated).toBe(true);
98
99 act(() => {
100 result.current.dismiss();
101 });
102
103 expect(result.current.activated).toBe(false);
104 });
105});