import assert from 'node:assert/strict';
import { describe, it } from 'node:test';
import { parseHomeworkPage } from '../src/core/homework-page.ts';
/**
* Fixtures mirror the legacy client's templates (feedback.hbs, submission.hbs)
* as actually served — including the parts that are absent for a student, which
* is what makes every field optional.
*/
const page = (parts: { submission?: string; feedback?: string }) => `
keine Beschreibung vorhanden${parts.submission ?? ''}
${parts.feedback === undefined ? '' : `${parts.feedback}`}
`;
const fileCard = (id: string, name: string, size = 1234) =>
``;
describe('parseHomeworkPage', () => {
it("reads the teacher's written feedback, which no API exposes", () => {
const html = page({
feedback: `
vollständig und nachvollziehbar
`,
});
assert.equal(parseHomeworkPage(html)?.gradeComment, 'vollständig und nachvollziehbar');
});
it('reads a percentage grade from the feedback tab', () => {
const html = page({ feedback: '
Du hast 85% erreicht
' });
assert.equal(parseHomeworkPage(html)?.gradePercent, 85);
});
it('reads the student\'s typed answer from the editable textarea', () => {
const html = page({
submission: ``,
});
assert.equal(parseHomeworkPage(html)?.submittedText, 'Meine Lösung');
});
it('reads the typed answer from the read-only form once submission closed', () => {
const html = page({ submission: `
Abgegebener Text
` });
assert.equal(parseHomeworkPage(html)?.submittedText, 'Abgegebener Text');
});
it('separates submitted files from files the teacher returned', () => {
const html = page({
submission: fileCard('a'.repeat(24), 'meine-abgabe.pdf'),
feedback: fileCard('b'.repeat(24), 'korrektur.pdf'),
});
const detail = parseHomeworkPage(html);
assert.deepEqual(detail?.submittedFiles, [{ id: 'a'.repeat(24), name: 'meine-abgabe.pdf' }]);
assert.deepEqual(detail?.gradingFiles, [{ id: 'b'.repeat(24), name: 'korrektur.pdf' }]);
});
it('returns a result with nothing set when the page carries no submission', () => {
// The common case for an ungraded task: sections present but empty.
const detail = parseHomeworkPage(page({}));
assert.ok(detail);
assert.equal(detail.submittedText, undefined);
assert.equal(detail.gradeComment, undefined);
assert.deepEqual(detail.gradingFiles, []);
});
it('gives up rather than guessing when the markup is not a homework page', () => {
assert.equal(parseHomeworkPage('Anmelden'), undefined);
});
it('decodes entities in file names', () => {
const html = page({ submission: fileCard('c'.repeat(24), 'A&B "final".pdf') });
assert.equal(parseHomeworkPage(html)?.submittedFiles[0]?.name, 'A&B "final".pdf');
});
});
vollständig und nachvollziehbar