305 lines
7.7 KiB
TypeScript
305 lines
7.7 KiB
TypeScript
/**
|
|
* Unit Tests: Player Profile Enhancements
|
|
*
|
|
* Tests for player profile page enhancements including:
|
|
* - Tournaments participated in
|
|
* - Recent games
|
|
* - Partnership performance
|
|
*/
|
|
|
|
import { describe, test, expect, vi } from 'vitest';
|
|
import { prisma } from '@/lib/prisma';
|
|
import type { Player, Event, Match, PartnershipStat } from '@prisma/client';
|
|
|
|
// Mock the prisma module
|
|
vi.mock('@/lib/prisma', () => ({
|
|
prisma: {
|
|
player: {
|
|
findUnique: vi.fn(),
|
|
},
|
|
event: {
|
|
findMany: vi.fn(),
|
|
},
|
|
match: {
|
|
findMany: vi.fn(),
|
|
},
|
|
partnershipStat: {
|
|
findMany: vi.fn(),
|
|
},
|
|
},
|
|
}));
|
|
|
|
// Helper to create mock player
|
|
const createMockPlayer = (id: number, name: string): Player => ({
|
|
id,
|
|
name,
|
|
normalizedName: name.toLowerCase(),
|
|
rating: 0,
|
|
currentElo: 1000,
|
|
gamesPlayed: 10,
|
|
wins: 6,
|
|
losses: 4,
|
|
createdAt: new Date(),
|
|
updatedAt: new Date(),
|
|
});
|
|
|
|
// Helper to create mock tournament
|
|
const createMockTournament = (id: number, name: string): Event => ({
|
|
id,
|
|
name,
|
|
description: null,
|
|
eventDate: new Date(),
|
|
eventType: 'tournament',
|
|
format: 'round_robin',
|
|
status: 'completed',
|
|
maxParticipants: null,
|
|
ownerId: null,
|
|
createdAt: new Date(),
|
|
updatedAt: new Date(),
|
|
});
|
|
|
|
// Helper to create mock match
|
|
const createMockMatch = (
|
|
id: number,
|
|
team1P1Id: number,
|
|
team1P2Id: number,
|
|
team2P1Id: number,
|
|
team2P2Id: number,
|
|
team1Score: number,
|
|
team2Score: number,
|
|
eventId?: number
|
|
): Match => ({
|
|
id,
|
|
eventId: eventId || null,
|
|
playedAt: new Date(),
|
|
team1P1Id,
|
|
team1P2Id,
|
|
team2P1Id,
|
|
team2P2Id,
|
|
team1Score,
|
|
team2Score,
|
|
status: 'completed',
|
|
createdById: null,
|
|
createdAt: new Date(),
|
|
updatedAt: new Date(),
|
|
});
|
|
|
|
// Helper to create mock partnership stat
|
|
const createMockPartnershipStat = (
|
|
id: number,
|
|
player1Id: number,
|
|
player2Id: number,
|
|
gamesPlayed: number,
|
|
wins: number,
|
|
losses: number
|
|
): PartnershipStat => ({
|
|
id,
|
|
player1Id,
|
|
player2Id,
|
|
gamesPlayed,
|
|
wins,
|
|
losses,
|
|
totalEloChange: 0,
|
|
lastPlayed: new Date(),
|
|
createdAt: new Date(),
|
|
updatedAt: new Date(),
|
|
});
|
|
|
|
describe('Player Profile Enhancements', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
describe('Tournaments Participated', () => {
|
|
test('should fetch tournaments where player participated', async () => {
|
|
const mockPlayer = createMockPlayer(1, 'Test Player');
|
|
const mockTournaments = [
|
|
createMockTournament(1, 'Tournament A'),
|
|
createMockTournament(2, 'Tournament B'),
|
|
];
|
|
|
|
vi.mocked(prisma.player.findUnique).mockResolvedValue(mockPlayer);
|
|
vi.mocked(prisma.event.findMany).mockResolvedValue(mockTournaments);
|
|
|
|
// Simulate the query that would be run
|
|
const tournaments = await prisma.event.findMany({
|
|
where: {
|
|
participants: {
|
|
some: {
|
|
playerId: 1,
|
|
},
|
|
},
|
|
},
|
|
orderBy: { eventDate: 'desc' },
|
|
take: 10,
|
|
});
|
|
|
|
expect(tournaments).toEqual(mockTournaments);
|
|
expect(tournaments.length).toBe(2);
|
|
});
|
|
|
|
test('should return empty array if player has no tournaments', async () => {
|
|
const mockPlayer = createMockPlayer(1, 'Test Player');
|
|
|
|
vi.mocked(prisma.player.findUnique).mockResolvedValue(mockPlayer);
|
|
vi.mocked(prisma.event.findMany).mockResolvedValue([]);
|
|
|
|
const tournaments = await prisma.event.findMany({
|
|
where: {
|
|
participants: {
|
|
some: {
|
|
playerId: 1,
|
|
},
|
|
},
|
|
},
|
|
orderBy: { eventDate: 'desc' },
|
|
take: 10,
|
|
});
|
|
|
|
expect(tournaments).toEqual([]);
|
|
expect(tournaments.length).toBe(0);
|
|
});
|
|
});
|
|
|
|
describe('Recent Games', () => {
|
|
test('should fetch recent matches for a player', async () => {
|
|
const mockPlayer = createMockPlayer(1, 'Test Player');
|
|
const mockMatches = [
|
|
createMockMatch(1, 1, 2, 3, 4, 5, 3),
|
|
createMockMatch(2, 1, 3, 5, 6, 4, 4),
|
|
];
|
|
|
|
vi.mocked(prisma.player.findUnique).mockResolvedValue(mockPlayer);
|
|
vi.mocked(prisma.match.findMany).mockResolvedValue(mockMatches);
|
|
|
|
// Simulate the query that would be run
|
|
const matches = await prisma.match.findMany({
|
|
where: {
|
|
OR: [
|
|
{ team1P1Id: 1 },
|
|
{ team1P2Id: 1 },
|
|
{ team2P1Id: 1 },
|
|
{ team2P2Id: 1 },
|
|
],
|
|
},
|
|
include: {
|
|
team1P1: true,
|
|
team1P2: true,
|
|
team2P1: true,
|
|
team2P2: true,
|
|
event: true,
|
|
},
|
|
orderBy: { playedAt: 'desc' },
|
|
take: 10,
|
|
});
|
|
|
|
expect(matches).toEqual(mockMatches);
|
|
expect(matches.length).toBe(2);
|
|
});
|
|
|
|
test('should return empty array if player has no matches', async () => {
|
|
const mockPlayer = createMockPlayer(1, 'Test Player');
|
|
|
|
vi.mocked(prisma.player.findUnique).mockResolvedValue(mockPlayer);
|
|
vi.mocked(prisma.match.findMany).mockResolvedValue([]);
|
|
|
|
const matches = await prisma.match.findMany({
|
|
where: {
|
|
OR: [
|
|
{ team1P1Id: 1 },
|
|
{ team1P2Id: 1 },
|
|
{ team2P1Id: 1 },
|
|
{ team2P2Id: 1 },
|
|
],
|
|
},
|
|
include: {
|
|
team1P1: true,
|
|
team1P2: true,
|
|
team2P1: true,
|
|
team2P2: true,
|
|
event: true,
|
|
},
|
|
orderBy: { playedAt: 'desc' },
|
|
take: 10,
|
|
});
|
|
|
|
expect(matches).toEqual([]);
|
|
expect(matches.length).toBe(0);
|
|
});
|
|
});
|
|
|
|
describe('Partnership Performance', () => {
|
|
test('should fetch partnership stats for a player', async () => {
|
|
const mockPlayer = createMockPlayer(1, 'Test Player');
|
|
const mockPartnershipStats = [
|
|
createMockPartnershipStat(1, 1, 2, 10, 7, 3),
|
|
createMockPartnershipStat(2, 1, 3, 5, 2, 3),
|
|
];
|
|
|
|
vi.mocked(prisma.player.findUnique).mockResolvedValue(mockPlayer);
|
|
vi.mocked(prisma.partnershipStat.findMany).mockResolvedValue(mockPartnershipStats);
|
|
|
|
// Simulate the query that would be run
|
|
const partnershipStats = await prisma.partnershipStat.findMany({
|
|
where: {
|
|
OR: [
|
|
{ player1Id: 1 },
|
|
{ player2Id: 1 },
|
|
],
|
|
},
|
|
include: {
|
|
player1: true,
|
|
player2: true,
|
|
},
|
|
orderBy: { gamesPlayed: 'desc' },
|
|
});
|
|
|
|
expect(partnershipStats).toEqual(mockPartnershipStats);
|
|
expect(partnershipStats.length).toBe(2);
|
|
});
|
|
|
|
test('should return empty array if player has no partnership data', async () => {
|
|
const mockPlayer = createMockPlayer(1, 'Test Player');
|
|
|
|
vi.mocked(prisma.player.findUnique).mockResolvedValue(mockPlayer);
|
|
vi.mocked(prisma.partnershipStat.findMany).mockResolvedValue([]);
|
|
|
|
const partnershipStats = await prisma.partnershipStat.findMany({
|
|
where: {
|
|
OR: [
|
|
{ player1Id: 1 },
|
|
{ player2Id: 1 },
|
|
],
|
|
},
|
|
include: {
|
|
player1: true,
|
|
player2: true,
|
|
},
|
|
orderBy: { gamesPlayed: 'desc' },
|
|
});
|
|
|
|
expect(partnershipStats).toEqual([]);
|
|
expect(partnershipStats.length).toBe(0);
|
|
});
|
|
});
|
|
|
|
describe('Profile Statistics', () => {
|
|
test('should calculate win rate correctly', async () => {
|
|
const mockPlayer = createMockPlayer(1, 'Test Player');
|
|
// wins: 6, gamesPlayed: 10
|
|
const winRate = (mockPlayer.wins / mockPlayer.gamesPlayed) * 100;
|
|
|
|
expect(winRate).toBe(60.0);
|
|
});
|
|
|
|
test('should handle zero games played', async () => {
|
|
const mockPlayer = { ...createMockPlayer(1, 'Test Player'), gamesPlayed: 0, wins: 0 };
|
|
const winRate = mockPlayer.gamesPlayed > 0
|
|
? ((mockPlayer.wins / mockPlayer.gamesPlayed) * 100).toFixed(1)
|
|
: "0.0";
|
|
|
|
expect(winRate).toBe("0.0");
|
|
});
|
|
});
|
|
});
|