267 lines
7.5 KiB
TypeScript
267 lines
7.5 KiB
TypeScript
|
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
||
|
|
import { addToQueue, getTeamQueue, isParticipantInQueue } from '~/models/draft-queue';
|
||
|
|
|
||
|
|
// Mock the models
|
||
|
|
vi.mock('~/models/draft-queue', () => ({
|
||
|
|
addToQueue: vi.fn(),
|
||
|
|
getTeamQueue: vi.fn(),
|
||
|
|
isParticipantInQueue: vi.fn(),
|
||
|
|
}));
|
||
|
|
|
||
|
|
describe('Queue Add - Duplicate Prevention', () => {
|
||
|
|
beforeEach(() => {
|
||
|
|
vi.clearAllMocks();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should successfully add a participant to an empty queue', async () => {
|
||
|
|
const teamId = 'team-1';
|
||
|
|
const participantId = 'participant-1';
|
||
|
|
const seasonId = 'season-1';
|
||
|
|
|
||
|
|
// Mock that participant is not in queue
|
||
|
|
vi.mocked(isParticipantInQueue).mockResolvedValue(false);
|
||
|
|
|
||
|
|
// Mock empty queue
|
||
|
|
vi.mocked(getTeamQueue).mockResolvedValue([]);
|
||
|
|
|
||
|
|
// Mock successful add
|
||
|
|
const mockQueueItem = {
|
||
|
|
id: 'queue-1',
|
||
|
|
seasonId,
|
||
|
|
teamId,
|
||
|
|
participantId,
|
||
|
|
queuePosition: 1,
|
||
|
|
createdAt: new Date(),
|
||
|
|
updatedAt: new Date(),
|
||
|
|
};
|
||
|
|
vi.mocked(addToQueue).mockResolvedValue(mockQueueItem);
|
||
|
|
|
||
|
|
// Simulate the logic
|
||
|
|
const alreadyInQueue = await isParticipantInQueue(teamId, participantId);
|
||
|
|
expect(alreadyInQueue).toBe(false);
|
||
|
|
|
||
|
|
const currentQueue = await getTeamQueue(teamId);
|
||
|
|
const queuePosition = currentQueue.length + 1;
|
||
|
|
|
||
|
|
const result = await addToQueue({
|
||
|
|
seasonId,
|
||
|
|
teamId,
|
||
|
|
participantId,
|
||
|
|
queuePosition,
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(isParticipantInQueue).toHaveBeenCalledWith(teamId, participantId);
|
||
|
|
expect(getTeamQueue).toHaveBeenCalledWith(teamId);
|
||
|
|
expect(addToQueue).toHaveBeenCalledWith({
|
||
|
|
seasonId,
|
||
|
|
teamId,
|
||
|
|
participantId,
|
||
|
|
queuePosition: 1,
|
||
|
|
});
|
||
|
|
expect(result.participantId).toBe(participantId);
|
||
|
|
expect(result.queuePosition).toBe(1);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should prevent adding duplicate participant to queue', async () => {
|
||
|
|
const teamId = 'team-1';
|
||
|
|
const participantId = 'participant-1';
|
||
|
|
|
||
|
|
// Mock that participant is already in queue
|
||
|
|
vi.mocked(isParticipantInQueue).mockResolvedValue(true);
|
||
|
|
|
||
|
|
const alreadyInQueue = await isParticipantInQueue(teamId, participantId);
|
||
|
|
|
||
|
|
expect(alreadyInQueue).toBe(true);
|
||
|
|
expect(isParticipantInQueue).toHaveBeenCalledWith(teamId, participantId);
|
||
|
|
|
||
|
|
// Should not call addToQueue if already in queue
|
||
|
|
expect(addToQueue).not.toHaveBeenCalled();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should add participant to queue when other participants exist', async () => {
|
||
|
|
const teamId = 'team-1';
|
||
|
|
const newParticipantId = 'participant-3';
|
||
|
|
const seasonId = 'season-1';
|
||
|
|
|
||
|
|
// Mock existing queue with 2 participants
|
||
|
|
const existingQueue = [
|
||
|
|
{
|
||
|
|
id: 'queue-1',
|
||
|
|
seasonId,
|
||
|
|
teamId,
|
||
|
|
participantId: 'participant-1',
|
||
|
|
queuePosition: 1,
|
||
|
|
createdAt: new Date(),
|
||
|
|
updatedAt: new Date(),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: 'queue-2',
|
||
|
|
seasonId,
|
||
|
|
teamId,
|
||
|
|
participantId: 'participant-2',
|
||
|
|
queuePosition: 2,
|
||
|
|
createdAt: new Date(),
|
||
|
|
updatedAt: new Date(),
|
||
|
|
},
|
||
|
|
];
|
||
|
|
|
||
|
|
vi.mocked(isParticipantInQueue).mockResolvedValue(false);
|
||
|
|
vi.mocked(getTeamQueue).mockResolvedValue(existingQueue);
|
||
|
|
|
||
|
|
const mockQueueItem = {
|
||
|
|
id: 'queue-3',
|
||
|
|
seasonId,
|
||
|
|
teamId,
|
||
|
|
participantId: newParticipantId,
|
||
|
|
queuePosition: 3,
|
||
|
|
createdAt: new Date(),
|
||
|
|
updatedAt: new Date(),
|
||
|
|
};
|
||
|
|
vi.mocked(addToQueue).mockResolvedValue(mockQueueItem);
|
||
|
|
|
||
|
|
// Simulate the logic
|
||
|
|
const alreadyInQueue = await isParticipantInQueue(teamId, newParticipantId);
|
||
|
|
expect(alreadyInQueue).toBe(false);
|
||
|
|
|
||
|
|
const currentQueue = await getTeamQueue(teamId);
|
||
|
|
const queuePosition = currentQueue.length + 1;
|
||
|
|
|
||
|
|
const result = await addToQueue({
|
||
|
|
seasonId,
|
||
|
|
teamId,
|
||
|
|
participantId: newParticipantId,
|
||
|
|
queuePosition,
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(result.queuePosition).toBe(3);
|
||
|
|
expect(result.participantId).toBe(newParticipantId);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should prevent adding same participant multiple times in quick succession', async () => {
|
||
|
|
const teamId = 'team-1';
|
||
|
|
const participantId = 'participant-1';
|
||
|
|
|
||
|
|
// First call - not in queue
|
||
|
|
vi.mocked(isParticipantInQueue).mockResolvedValueOnce(false);
|
||
|
|
|
||
|
|
const firstCheck = await isParticipantInQueue(teamId, participantId);
|
||
|
|
expect(firstCheck).toBe(false);
|
||
|
|
|
||
|
|
// Second call (rapid click) - now in queue
|
||
|
|
vi.mocked(isParticipantInQueue).mockResolvedValueOnce(true);
|
||
|
|
|
||
|
|
const secondCheck = await isParticipantInQueue(teamId, participantId);
|
||
|
|
expect(secondCheck).toBe(true);
|
||
|
|
|
||
|
|
// Verify the function was called twice
|
||
|
|
expect(isParticipantInQueue).toHaveBeenCalledTimes(2);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should allow adding different participants to the same queue', async () => {
|
||
|
|
const teamId = 'team-1';
|
||
|
|
const participant1 = 'participant-1';
|
||
|
|
const participant2 = 'participant-2';
|
||
|
|
const seasonId = 'season-1';
|
||
|
|
|
||
|
|
// Add first participant
|
||
|
|
vi.mocked(isParticipantInQueue).mockResolvedValueOnce(false);
|
||
|
|
vi.mocked(getTeamQueue).mockResolvedValueOnce([]);
|
||
|
|
vi.mocked(addToQueue).mockResolvedValueOnce({
|
||
|
|
id: 'queue-1',
|
||
|
|
seasonId,
|
||
|
|
teamId,
|
||
|
|
participantId: participant1,
|
||
|
|
queuePosition: 1,
|
||
|
|
createdAt: new Date(),
|
||
|
|
updatedAt: new Date(),
|
||
|
|
});
|
||
|
|
|
||
|
|
let alreadyInQueue = await isParticipantInQueue(teamId, participant1);
|
||
|
|
expect(alreadyInQueue).toBe(false);
|
||
|
|
|
||
|
|
await addToQueue({
|
||
|
|
seasonId,
|
||
|
|
teamId,
|
||
|
|
participantId: participant1,
|
||
|
|
queuePosition: 1,
|
||
|
|
});
|
||
|
|
|
||
|
|
// Add second participant
|
||
|
|
vi.mocked(isParticipantInQueue).mockResolvedValueOnce(false);
|
||
|
|
vi.mocked(getTeamQueue).mockResolvedValueOnce([
|
||
|
|
{
|
||
|
|
id: 'queue-1',
|
||
|
|
seasonId,
|
||
|
|
teamId,
|
||
|
|
participantId: participant1,
|
||
|
|
queuePosition: 1,
|
||
|
|
createdAt: new Date(),
|
||
|
|
updatedAt: new Date(),
|
||
|
|
},
|
||
|
|
]);
|
||
|
|
vi.mocked(addToQueue).mockResolvedValueOnce({
|
||
|
|
id: 'queue-2',
|
||
|
|
seasonId,
|
||
|
|
teamId,
|
||
|
|
participantId: participant2,
|
||
|
|
queuePosition: 2,
|
||
|
|
createdAt: new Date(),
|
||
|
|
updatedAt: new Date(),
|
||
|
|
});
|
||
|
|
|
||
|
|
alreadyInQueue = await isParticipantInQueue(teamId, participant2);
|
||
|
|
expect(alreadyInQueue).toBe(false);
|
||
|
|
|
||
|
|
const result = await addToQueue({
|
||
|
|
seasonId,
|
||
|
|
teamId,
|
||
|
|
participantId: participant2,
|
||
|
|
queuePosition: 2,
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(result.participantId).toBe(participant2);
|
||
|
|
expect(addToQueue).toHaveBeenCalledTimes(2);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should handle the case where participant is in another teams queue', async () => {
|
||
|
|
const team1Id = 'team-1';
|
||
|
|
const team2Id = 'team-2';
|
||
|
|
const participantId = 'participant-1';
|
||
|
|
const seasonId = 'season-1';
|
||
|
|
|
||
|
|
// Participant is in team1's queue
|
||
|
|
vi.mocked(isParticipantInQueue).mockImplementation(async (teamId, pId) => {
|
||
|
|
return teamId === team1Id && pId === participantId;
|
||
|
|
});
|
||
|
|
|
||
|
|
// Check team1 - should be in queue
|
||
|
|
const inTeam1Queue = await isParticipantInQueue(team1Id, participantId);
|
||
|
|
expect(inTeam1Queue).toBe(true);
|
||
|
|
|
||
|
|
// Check team2 - should not be in queue
|
||
|
|
const inTeam2Queue = await isParticipantInQueue(team2Id, participantId);
|
||
|
|
expect(inTeam2Queue).toBe(false);
|
||
|
|
|
||
|
|
// Should be able to add to team2
|
||
|
|
vi.mocked(getTeamQueue).mockResolvedValue([]);
|
||
|
|
vi.mocked(addToQueue).mockResolvedValue({
|
||
|
|
id: 'queue-2',
|
||
|
|
seasonId,
|
||
|
|
teamId: team2Id,
|
||
|
|
participantId,
|
||
|
|
queuePosition: 1,
|
||
|
|
createdAt: new Date(),
|
||
|
|
updatedAt: new Date(),
|
||
|
|
});
|
||
|
|
|
||
|
|
const result = await addToQueue({
|
||
|
|
seasonId,
|
||
|
|
teamId: team2Id,
|
||
|
|
participantId,
|
||
|
|
queuePosition: 1,
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(result.teamId).toBe(team2Id);
|
||
|
|
});
|
||
|
|
});
|