From 7b04d397687ff49c2cd708b3cd0cf0e4114585f6 Mon Sep 17 00:00:00 2001 From: FragginWagon Date: Thu, 29 Jan 2026 05:12:15 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9C=85=20Add=20unit=20tests=20for=20Challong?= =?UTF-8?q?e=20composable=20functions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../composables/useChallongeTests.test.js | 242 ++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 code/websites/pokedex.online/tests/unit/composables/useChallongeTests.test.js diff --git a/code/websites/pokedex.online/tests/unit/composables/useChallongeTests.test.js b/code/websites/pokedex.online/tests/unit/composables/useChallongeTests.test.js new file mode 100644 index 0000000..3644df1 --- /dev/null +++ b/code/websites/pokedex.online/tests/unit/composables/useChallongeTests.test.js @@ -0,0 +1,242 @@ +/** + * useChallongeTests Composable Tests + */ + +import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { ref } from 'vue'; + +// Mock dependencies +vi.mock('../../../src/utilities/tournament-query.js', () => ({ + queryAllTournaments: vi.fn(() => Promise.resolve([ + { id: 1, name: 'Tournament 1', state: 'pending' }, + { id: 2, name: 'Tournament 2', state: 'underway' } + ])) +})); + +vi.mock('../../../src/composables/useAsyncState.js', () => ({ + useAsyncState: vi.fn(() => { + const data = ref(null); + const isLoading = ref(false); + const error = ref(null); + + return { + data, + isLoading, + error, + execute: vi.fn(async (fn) => { + isLoading.value = true; + error.value = null; + try { + const result = await fn(); + data.value = result; + return result; + } catch (e) { + error.value = e; + throw e; + } finally { + isLoading.value = false; + } + }), + reset: vi.fn(() => { + data.value = null; + error.value = null; + isLoading.value = false; + }) + }; + }) +})); + +import { useChallongeTests } from '../../../src/composables/useChallongeTests.js'; + +describe('useChallongeTests', () => { + let mockClient; + let apiVersion; + let tournamentScope; + + beforeEach(() => { + vi.clearAllMocks(); + + mockClient = ref({ + tournaments: { + list: vi.fn(() => Promise.resolve([ + { id: 1, name: 'Test Tournament 1' }, + { id: 2, name: 'Test Tournament 2' } + ])), + get: vi.fn((id) => Promise.resolve({ + id, + name: `Tournament ${id}`, + participants: [] + })) + } + }); + + apiVersion = ref('v2.1'); + tournamentScope = ref('user'); + }); + + it('creates composable with initial state', () => { + const { + tournaments, + loading, + error, + searchQuery, + currentPage + } = useChallongeTests(mockClient, apiVersion, tournamentScope); + + expect(tournaments.value).toBeNull(); + expect(loading.value).toBe(false); + expect(error.value).toBeNull(); + expect(searchQuery.value).toBe(''); + expect(currentPage.value).toBe(1); + }); + + it('loads tournaments successfully', async () => { + const { testListTournaments, tournaments } = useChallongeTests( + mockClient, + apiVersion, + tournamentScope + ); + + await testListTournaments(); + + expect(tournaments.value).toBeDefined(); + expect(Array.isArray(tournaments.value)).toBe(true); + }); + + it('filters tournaments by search query', async () => { + const { testListTournaments, searchQuery, filteredTournaments } = useChallongeTests( + mockClient, + apiVersion, + tournamentScope + ); + + await testListTournaments(); + + // Set search query + searchQuery.value = 'Tournament 1'; + + expect(filteredTournaments.value).toBeDefined(); + expect(filteredTournaments.value.length).toBeGreaterThan(0); + }); + + it('gets tournament name from different structures', () => { + const { getTournamentName } = useChallongeTests( + mockClient, + apiVersion, + tournamentScope + ); + + // v1 structure + expect(getTournamentName({ tournament: { name: 'Test' } })).toBe('Test'); + + // v2.1 structure + expect(getTournamentName({ name: 'Test' })).toBe('Test'); + + // Empty + expect(getTournamentName({})).toBe(''); + }); + + it('gets tournament ID from different structures', () => { + const { getTournamentId } = useChallongeTests( + mockClient, + apiVersion, + tournamentScope + ); + + expect(getTournamentId({ tournament: { id: 123 } })).toBe(123); + expect(getTournamentId({ id: 456 })).toBe(456); + }); + + it('gets tournament property', () => { + const { getTournamentProp } = useChallongeTests( + mockClient, + apiVersion, + tournamentScope + ); + + const tournament = { tournament: { state: 'pending', url: 'test-url' } }; + + expect(getTournamentProp(tournament, 'state')).toBe('pending'); + expect(getTournamentProp(tournament, 'url')).toBe('test-url'); + }); + + it('toggles tournament details', async () => { + const { toggleTournamentDetails, expandedTournamentId } = useChallongeTests( + mockClient, + apiVersion, + tournamentScope + ); + + expect(expandedTournamentId.value).toBeNull(); + + await toggleTournamentDetails(1); + + expect(expandedTournamentId.value).toBe(1); + + // Toggle off + await toggleTournamentDetails(1); + + expect(expandedTournamentId.value).toBeNull(); + }); + + it('resets state', async () => { + const { + testListTournaments, + resetState, + tournaments, + searchQuery, + expandedTournamentId + } = useChallongeTests(mockClient, apiVersion, tournamentScope); + + await testListTournaments(); + searchQuery.value = 'test'; + expandedTournamentId.value = 1; + + resetState(); + + expect(searchQuery.value).toBe(''); + expect(expandedTournamentId.value).toBeNull(); + }); + + it('formats dates correctly', () => { + const { formatDate } = useChallongeTests( + mockClient, + apiVersion, + tournamentScope + ); + + const date = '2024-01-15T10:30:00Z'; + const formatted = formatDate(date); + + expect(formatted).toBeTruthy(); + expect(typeof formatted).toBe('string'); + expect(formatDate(null)).toBe(''); + }); + + it('computes pagination info', async () => { + const { testListTournaments, paginationInfo } = useChallongeTests( + mockClient, + apiVersion, + tournamentScope + ); + + await testListTournaments(); + + expect(paginationInfo.value).toContain('Showing'); + }); + + it('handles v1 API without pagination', async () => { + apiVersion.value = 'v1'; + + const { testListTournaments, tournaments } = useChallongeTests( + mockClient, + apiVersion, + tournamentScope + ); + + await testListTournaments(); + + expect(mockClient.value.tournaments.list).toHaveBeenCalled(); + expect(tournaments.value).toBeDefined(); + }); +});