✅ Add unit tests for Challonge composable functions
This commit is contained in:
@@ -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();
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user