import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import { render, screen, fireEvent, waitFor } from '@testing-library/react'; import { QuestCompletionModal } from '../../src/components/minigames/QuestCompletionModal'; vi.mock('../../src/components/minigames/TriviaGame', () => ({ TriviaGame: ({ onSuccess, onFail }: { onSuccess: () => void; onFail: () => void }) => (

Mock Trivia

), })); vi.mock('../../src/components/minigames/MemoryGame', () => ({ MemoryGame: ({ onSuccess, onFail }: { onSuccess: () => void; onFail: () => void }) => (

Mock Memory

), })); vi.mock('../../src/components/minigames/ReactionGame', () => ({ ReactionGame: ({ onSuccess, onFail }: { onSuccess: () => void; onFail: () => void }) => (

Mock Reaction

), })); vi.mock('../../src/components/minigames/FindTheRingGame', () => ({ FindTheRingGame: ({ onSuccess, onFail }: { onSuccess: () => void; onFail: () => void }) => (

Mock Find Ring

), })); describe('QuestCompletionModal integration', () => { beforeEach(() => { vi.useRealTimers(); vi.spyOn(Math, 'random').mockReturnValue(0); }); afterEach(() => { vi.useRealTimers(); vi.restoreAllMocks(); }); it('completes a quest only after winning and claiming reward', async () => { const onClose = vi.fn(); const onComplete = vi.fn().mockResolvedValue(undefined); render( ); expect(await screen.findByText('Mock Trivia')).toBeTruthy(); fireEvent.click(screen.getByRole('button', { name: 'Win Mini-game' })); fireEvent.click(await screen.findByRole('button', { name: /Claim Reward/i })); await waitFor(() => { expect(onComplete).toHaveBeenCalledWith(42); expect(onClose).toHaveBeenCalled(); }); }); it('keeps modal open and does not complete on mini-game failure', async () => { const onClose = vi.fn(); const onComplete = vi.fn().mockResolvedValue(undefined); render( ); expect(await screen.findByText('Mock Trivia')).toBeTruthy(); fireEvent.click(screen.getByRole('button', { name: 'Lose Mini-game' })); expect(screen.getByText(/Resetting challenge/i)).toBeTruthy(); await waitFor(() => { expect(screen.getByText('Mock Trivia')).toBeTruthy(); }, { timeout: 1500 }); expect(onComplete).not.toHaveBeenCalled(); expect(onClose).not.toHaveBeenCalled(); }); });