Expand moderation case workflows
CI / checks (push) Successful in 6m49s

This commit is contained in:
2026-10-17 16:19:33 -04:00
parent 4501eba873
commit 7f2205e9c4
22 changed files with 2815 additions and 167 deletions
@@ -0,0 +1,69 @@
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);
});