import { test } from 'node:test'; import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import { randomBytes } from 'node:crypto'; import vm from 'node:vm'; const source = readFileSync(new URL('../backfill-legacy-users.mjs', import.meta.url), 'utf8'); function plan(rows, existing = []) { const context = vm.createContext({ company: { __type: 'Pointer', className: 'Company', objectId: 'co' }, source: { rows }, byLegacyId: new Map(existing.map(row => [row.legacyUserId, row])), byUsername: new Map(existing.map(row => [row.username, row])), refreshExisting: false, randomBytes, }); const helpers = source.slice(source.indexOf('function text(value)'), source.indexOf('function requestGroups(')); const planner = source.slice(source.indexOf('const requests = [];'), source.indexOf('const groups = requestGroups(requests);')); vm.runInContext(helpers + planner + '\nglobalThis.planned = requests;', context); return context.planned; } test('manual legacy import initializes new students consistently and leaves existing credentials alone', () => { const requests = plan([ { UserID: 20, UserName: 'existing', GroupID: 1 }, { UserID: 21, UserName: 'new-student', GroupID: 1, State: 1, Password: 'ignored-source-secret' }, { UserID: 22, UserName: 'disabled-student', GroupID: 1, State: 0 }, ], [{ objectId: 'existing', username: 'existing', legacyUserId: 20, identityType: 'member' }]); assert.equal(requests.length, 2); for (const request of requests) { assert.equal(request.method, 'POST'); assert.equal(request.body.password, '12345678'); assert.equal(request.body.passwordResetRequired, false); assert.equal(request.body.legacyPasswordMigrationAllowed, undefined); assert.equal(request.body.legacyUserData.Password, undefined); } assert.equal(requests[0].body.isDisabled, false); assert.equal(requests[1].body.isDisabled, true); }); test('manual import keeps distinct random credentials for nonstudent roles', () => { const requests = plan([ { UserID: 31, UserName: 'store', GroupID: 2 }, { UserID: 32, UserName: 'coach', GroupID: 3 }, ]); assert.equal(requests.length, 2); assert.ok(requests.every(row => row.body.password.length > 30)); assert.notEqual(requests[0].body.password, requests[1].body.password); });