Files
esports/test/match/queue.test.ts
2026-03-11 12:51:20 -04:00

88 lines
2.6 KiB
TypeScript

import { beforeEach, describe, expect, it, mock } from 'bun:test';
import { MATCH_STATES } from '../../src/lib/server/match/types';
const mocks = {
db: {
query: {
matchParticipantPlayer: { findMany: mock() },
playerRating: { findFirst: mock() },
matchQueue: { findFirst: mock() }
},
delete: mock()
}
};
mock.module('$lib/server/db', () => ({ db: mocks.db }));
mock.module('drizzle-orm', () => ({
eq: mock(() => ({})),
asc: mock(() => ({})),
lt: mock(() => ({})),
inArray: mock(() => ({})),
sql: mock(() => ({}))
}));
mock.module('$lib/server/db/schema', () => ({
match: {},
matchQueue: {},
matchParticipantPlayer: {},
playerRating: {}
}));
mock.module('$lib/server/match/engine', () => ({
createMatch: mock()
}));
const { joinQueue } = await import('../../src/lib/server/match/queue');
describe('joinQueue', () => {
beforeEach(() => {
mocks.db.query.matchParticipantPlayer.findMany.mockReset();
mocks.db.query.playerRating.findFirst.mockReset();
mocks.db.query.matchQueue.findFirst.mockReset();
mocks.db.delete.mockReset();
});
it('throws when user is already in an active match', async () => {
mocks.db.delete.mockReturnValue({
where: mock(() => ({ returning: mock(() => Promise.resolve([])) }))
});
mocks.db.query.matchParticipantPlayer.findMany.mockResolvedValue([
{
participant: {
match: { id: 'match-1', state: MATCH_STATES.PLAYING, createdAt: new Date().toISOString() }
}
}
]);
await expect(joinQueue('user-1', 'team-1')).rejects.toThrow('You are already in an active match');
expect(mocks.db.query.playerRating.findFirst).not.toHaveBeenCalled();
});
it('throws when user has no rating', async () => {
mocks.db.delete.mockReturnValue({
where: mock(() => ({ returning: mock(() => Promise.resolve([])) }))
});
mocks.db.query.matchParticipantPlayer.findMany.mockResolvedValue([]);
mocks.db.query.playerRating.findFirst.mockResolvedValue(null);
await expect(joinQueue('user-1', 'team-1')).rejects.toThrow(
'No rating found — please re-register'
);
});
it('throws when user is already in queue', async() => {
mocks.db.delete.mockReturnValue({
where: mock(() => ({ returning: mock(() => Promise.resolve([])) }))
});
mocks.db.query.matchParticipantPlayer.findMany.mockResolvedValue([]);
mocks.db.query.playerRating.findFirst.mockResolvedValue({ elo: 1500 });
mocks.db.query.matchQueue.findFirst.mockResolvedValue({ userId: 'user-1', teamId: 'team-1' });
await expect(joinQueue('user-1', 'team-1')).rejects.toThrow('Already in queue');
});
});