feat: add waiting-list off-duty and return quick buttons

This commit is contained in:
tothbt committed 2026-11-02 18:01:13 +01:00
1 parent 848e12e2d6
commit 7c5384621a
13 files changed
+450 -9

No files matched your search

@@ -0,0 +1,95 @@
import { TestBed } from '@angular/core/testing';
import { db } from 'db';
import { WaitingDutyService } from './waiting-duty.service';
describe('WaitingDutyService', () => {
let service: WaitingDutyService;
beforeEach(async () => {
await Promise.all([
db.settings.clear(),
db.umpires.clear(),
db.waitingUmpires.clear(),
db.waitingServiceJudges.clear(),
db.courtUmpires.clear(),
db.courtServiceJudges.clear()
]);
await db.settings.put({
id: 1,
withServiceJudge: true,
waitingListQuickButtons: true,
showAlert: false,
numberOfCourts: 5
});
await db.umpires.put({
id: 1,
firstName: 'Alex',
lastName: 'Smith',
gender: 'M',
country: 'GB'
});
service = TestBed.inject(WaitingDutyService);
});
afterEach(async () => {
TestBed.resetTestingModule();
await Promise.all([
db.settings.clear(),
db.umpires.clear(),
db.waitingUmpires.clear(),
db.waitingServiceJudges.clear(),
db.courtUmpires.clear(),
db.courtServiceJudges.clear()
]);
});
for (const role of ['umpire', 'serviceJudge'] as const) {
it(`remembers the ${role} queue and returns at its bottom only once`, async () => {
if (role === 'umpire')
await db.waitingUmpires.add({ umpireId: 1, order: 1 });
else await db.waitingServiceJudges.add({ serviceJudgeId: 1, order: 1 });
await service.move(1, 'rest');
expect((await db.umpires.get(1))?.returnToQueue).toBe(role);
expect(
(await db.waitingUmpires.count()) +
(await db.waitingServiceJudges.count())
).toBe(0);
if (role === 'umpire')
await db.waitingUmpires.add({ umpireId: 2, order: 1 });
else await db.waitingServiceJudges.add({ serviceJudgeId: 2, order: 1 });
await Promise.all([service.move(1, 'umpire'), service.move(1, 'umpire')]);
const items =
role === 'umpire'
? await db.waitingUmpires.orderBy('order').toArray()
: await db.waitingServiceJudges.orderBy('order').toArray();
expect(items.map((item) => item.order)).toEqual([1, 2]);
expect((await db.umpires.get(1))?.returnToQueue).toBeUndefined();
});
}
for (const role of ['umpire', 'serviceJudge'] as const) {
it(`saves the ${role} origin on a drag move even with quick buttons disabled`, async () => {
await db.settings.update(1, { waitingListQuickButtons: false });
if (role === 'umpire')
await db.waitingUmpires.add({ umpireId: 1, order: 1 });
else await db.waitingServiceJudges.add({ serviceJudgeId: 1, order: 1 });
await service.moveToRest(1);
expect((await db.umpires.get(1))?.returnToQueue).toBe(role);
expect(await db.waitingUmpires.count()).toBe(0);
expect(await db.waitingServiceJudges.count()).toBe(0);
});
}
it('does not return officials without a saved origin', async () => {
await service.move(1, 'umpire');
expect(await db.waitingUmpires.count()).toBe(0);
expect(await db.waitingServiceJudges.count()).toBe(0);
});
it('ignores stale return actions for assigned officials', async () => {
await db.courtUmpires.add({ umpireId: 1, courtNo: 1 });
await service.move(1, 'umpire');
expect(await db.waitingUmpires.count()).toBe(0);
});
it('does nothing when service judges are disabled', async () => {
await db.settings.update(1, { withServiceJudge: false });
await service.move(1, 'umpire');
expect(await db.waitingUmpires.count()).toBe(0);
});
});