test: add comprehensive tests for player deduplication, permissions, and user management
This commit is contained in:
@@ -0,0 +1,304 @@
|
||||
/**
|
||||
* 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");
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user