brackt/app/routes/api/__tests__/queue.add.test.ts

267 lines
7.5 KiB
TypeScript
Raw Normal View History

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