#!/usr/bin/env node // Fast, isolated unit test for student-csv.js — no Postgres, no HTTP. No framework, matching // project convention (see platform/lab-router/test/run.js). const assert = require('assert'); const { parseStudentCsv } = require('../src/student-csv'); function main() { { const r = parseStudentCsv('display_name,email,login_identifier,cohort_id\nAlice,alice@example.com,,root-fall\nBob,,bob01,root-fall'); assert.equal(r.errors.length, 0); assert.equal(r.rows.length, 2); assert.equal(r.rows[0].email, 'alice@example.com'); assert.equal(r.rows[1].login_identifier, 'bob01'); console.log('ok — valid file parses'); } { const r = parseStudentCsv('email\na@b.com'); assert.ok(r.errors.length > 0); console.log('ok — missing display_name column rejected'); } { const r = parseStudentCsv('display_name,password\nAlice,hunter2'); assert.ok(r.errors.some((e) => e.message.includes('password'))); console.log('ok — password column never accepted from a file'); } { const r = parseStudentCsv('display_name,email\nAlice,a@b.com,extra'); assert.ok(r.errors.length > 0); assert.equal(r.rows.length, 0); console.log('ok — a malformed row rejects the whole file (transactional, no partial import)'); } { const r = parseStudentCsv('display_name,email\nAlice,a@b.com\nBob,a@b.com'); assert.ok(r.errors.some((e) => e.message.includes('duplicate email'))); console.log('ok — duplicate email within one file rejected'); } { const r = parseStudentCsv('display_name,email\nAlice,not-an-email'); assert.ok(r.errors.some((e) => e.message.includes('invalid email'))); console.log('ok — invalid email format rejected'); } console.log('\nAll student-csv unit tests passed.'); } main();