Files
euchre_camp/src/__tests__/unit/player-profile.test.ts
T

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");
});
});
});