import { randomUUID } from 'node:crypto'; import { afterEach, beforeEach, expect, it, vi } from 'vitest'; import { newFixture, type Fixture } from '../helpers/fixture.js'; let fixture: Fixture; beforeEach(async () => { vi.resetModules(); fixture = await newFixture(); const { db } = await import('../../src/lib/server/db/index.js'); for (const id of ['first', 'second']) db() .prepare( `INSERT INTO auth_users(id,username,display_name,password_hash,role,created_at,updated_at) VALUES(?,?,?,'unused','moderator',0,0)` ) .run(id, id, id); }); afterEach(async () => fixture.cleanup()); it('filters case queues by workflow, priority and ownership while prioritizing active work', async () => { const { mutateModeration } = await import('../../src/lib/server/moderation/actions.js'); const { moderationOverview, moderationQuery } = await import('../../src/lib/server/moderation/overview.js'); const { db } = await import('../../src/lib/server/db/index.js'); const ids: string[] = []; for (const [title, priority, status, owner] of [ ['Normal report', 'normal', 'open', null], ['Urgent review', 'urgent', 'in_review', 'first'], ['High escalation', 'high', 'escalated', 'second'], ['Closed urgent appeal', 'urgent', 'appeal_upheld', 'first'] ]) { const { id } = mutateModeration('first', { op: 'create-case', game: 't5', guid: '123', title, idempotencyKey: randomUUID() }); ids.push(id); db() .prepare('UPDATE moderation_cases SET priority=?,status=?,assignee_id=? WHERE id=?') .run(priority, status, owner, id); } const read = (extra = '') => moderationOverview('first', moderationQuery(new URLSearchParams(`view=cases&${extra}`))); expect(read().cases.map((item) => item.id)).toEqual([ids[1], ids[2], ids[0], ids[3]]); expect(read('caseStatus=active').total).toBe(3); expect(read('caseStatus=closed').cases.map((item) => item.id)).toEqual([ids[3]]); expect(read('caseStatus=escalated&priority=high').cases.map((item) => item.id)).toEqual([ ids[2] ]); expect(read('assignedTo=me').cases.map((item) => item.id)).toEqual([ids[1], ids[3]]); expect(read('assignedTo=unassigned').cases.map((item) => item.id)).toEqual([ids[0]]); expect(read('assignedTo=second').cases[0].assignee).toBe('second'); expect( read('caseStatus=active&assignedTo=me&priority=urgent&game=t5&guid=123&q=review&offset=100') .query.offset ).toBe(0); expect(read('caseStatus=active&assignedTo=me&priority=urgent&game=t6').total).toBe(0); expect(read('caseStatus=invalid&priority=invalid').total).toBe(4); expect( moderationOverview( 'first', moderationQuery( new URLSearchParams('caseStatus=closed&assignedTo=unassigned&priority=urgent') ) ).total ).toBe(1); });