Compact archived evidence transcripts (Refs #159)
CI / checks (push) Failing after 7m22s

This commit is contained in:
2026-10-18 16:20:29 -04:00
parent a7f1c65d17
commit f2b2541b46
6 changed files with 210 additions and 110 deletions
+1 -1
View File
@@ -83,7 +83,7 @@ it('selects messages across participants, previews their context, and attaches t
);
expect(fetch.mock.calls[0][0]).toContain('game=t5&guid=11');
expect(document.querySelector('dialog')?.textContent).toContain('GUID 22');
expect(document.querySelector('dialog')?.textContent).toContain('Message time unknown');
expect(document.querySelector('dialog')?.textContent).toContain('Unknown time');
const excerpt = document.querySelector('dialog [aria-label="Preserved conversation excerpt"]')!;
expect(excerpt.querySelectorAll('li')).toHaveLength(3);
expect(excerpt.querySelector('.highlighted')?.textContent).toContain('A concerning reply');
+64
View File
@@ -205,6 +205,18 @@ it('preserves original evidence context, linked restrictions, and staff history
expect(document.body.textContent).toContain('Read-only moderation access');
expect(document.body.textContent).toContain('Round 9');
expect(document.body.textContent).toContain('Original log time · 12:34');
const evidence = document.querySelector('[aria-labelledby="evidence-title"]')!;
expect(
evidence.querySelector('[aria-label="Preserved conversation excerpt"]')?.textContent
).toContain('abusive message');
const technical = [...evidence.querySelectorAll('details')].find(
(node) => node.querySelector('summary')?.textContent === 'Technical details'
)!;
expect(technical.open).toBe(false);
expect(technical.textContent).toContain('Archived chat · theater · match 17');
expect(JSON.parse(technical.querySelector('pre')!.textContent!)).toEqual(
JSON.parse(detail().case.evidence[0].snapshot!)
);
expect(document.body.textContent).toContain('Check the earlier warning.');
expect(document.body.textContent).toContain('Prior warning ignored');
expect(document.body.textContent).toContain('Policy pending');
@@ -223,6 +235,58 @@ it('preserves original evidence context, linked restrictions, and staff history
expect(document.querySelector('dialog')).toBeNull();
});
it('summarizes a preserved conversation across midnight and keeps identifiers on demand', () => {
const initial = detail();
const archive = JSON.parse(initial.case.evidence[0].snapshot!);
archive.entries = [
{
...archive.entry,
messageId: 'subject-message',
context: { realTime: '2026-10-16T03:59:00Z', round: 4 },
message: { ...archive.entry.message, message: '<b>First message</b>', channel: 'team' }
},
{
...archive.entry,
messageId: 'witness-message',
context: { realTime: '2026-10-16T04:01:00Z', round: 9 },
message: { ...archive.entry.message, guid: '42', player: 'Witness', message: 'Reply' }
},
{
...archive.entry,
messageId: 'unknown-time',
context: { realTime: null, round: null }
}
];
archive.selectedMessageIds = ['subject-message', 'witness-message'];
archive.highlightedMessageIds = ['subject-message'];
initial.case.evidence[0].snapshot = JSON.stringify(archive);
show(initial);
const evidence = document.querySelector('[aria-labelledby="evidence-title"]')!;
const excerpt = evidence.querySelector('[aria-label="Preserved conversation excerpt"]')!;
const rows = excerpt.querySelectorAll('li');
expect(rows).toHaveLength(3);
expect(rows[0].classList.contains('highlighted')).toBe(true);
expect(rows[1].classList.contains('highlighted')).toBe(false);
expect(rows[0].textContent).toContain('Team chat');
expect(rows[0].textContent).toContain('<b>First message</b>');
expect(rows[0].querySelector('b')).toBeNull();
expect(rows[1].textContent).toContain('Selected context');
expect(rows[2].textContent).toContain('Unknown time');
expect(excerpt.textContent).not.toContain(guid);
expect(excerpt.textContent).not.toContain('subject-message');
expect(excerpt.textContent).not.toContain('Round');
const context = excerpt.previousElementSibling!.textContent!;
expect(context).toContain('Kino Der Toten · Match #17');
expect(context).toContain('Oct 15, 2026 – Oct 16, 2026');
expect(context).toContain('Rounds 4–9 (some unknown)');
expect(context).toContain('Times are estimates.');
const details = excerpt.nextElementSibling as HTMLDetailsElement;
expect(details.open).toBe(false);
expect(details.textContent).toContain(`GUID ${guid}`);
expect(details.textContent).toContain('Message identifier subject-message');
expect(details.textContent).toContain('Message identifier witness-message');
});
it('locks case restrictions to the recorded identity and revision without closing the case', async () => {
const updated = detail();
updated.case.revision = 5;