| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- 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);
- });
|