Sifa professional network frontend (Next.js, React, TailwindCSS) sifa.id/
at main 105 lines 2.3 kB view raw
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});