| 123456789101112131415161718 |
- import {test} from 'node:test';import assert from 'node:assert/strict';import {readFileSync} from 'node:fs';import vm from 'node:vm';import {PGlite} from '@electric-sql/pglite';
- test('enrollment catalog uses creation order, legacy IDs as migration fallback and preserves tenant/content scope',async()=>{
- const db=new PGlite();try{
- await db.exec(`CREATE TABLE "Node"(company text,"nodeId" numeric,"nodeName" text,"parentId" numeric,zstatus numeric,"createdAt" timestamptz,"updatedAt" timestamptz,"sourceKey" text);
- CREATE TABLE "CourseTeachingProfile"(company text,"courseId" numeric);
- CREATE TABLE "CommonModel"(company text,"objectId" text,"nodeId" numeric,"modelId" numeric,status numeric);
- INSERT INTO "Node" VALUES ('a',10,'高中',0,99,null,null,'legacy:node:10'),
- ('a',600,'Z 最新课程',10,99,'2026-10-15','2026-10-15','cloud:600'),
- ('a',700,'A 较早课程',10,99,'2026-10-14','2026-10-16','cloud:700'),
- ('a',464,'历史最新',10,99,'2026-10-08','2026-10-08','legacy:node:464'),
- ('a',13,'历史较早',10,99,'2026-10-09','2026-10-09', '[["NodeID",13]]' ),
- ('b',999,'别的租户',10,99,'2026-10-16','2026-10-16','cloud:999'),
- ('a',601,'章节',600,99,'2026-10-15','2026-10-15','cloud:601');
- INSERT INTO "CommonModel" VALUES ('a','w1',601,52,99),('a','w2',601,52,-2),('b','w3',601,52,99);`);
- const ctx=vm.createContext({Psql:{query:async(sql,args)=>(await db.query(sql,args)).rows},companyIdOf:()=> 'a',number:(v,f=0)=>v==null?f:Number(v),text:v=>String(v??''),courseStageFromDatabase:()=>({key:'high',name:'高中'})});vm.runInContext(readFileSync(new URL('../cloud/member-enrollment.js',import.meta.url),'utf8'),ctx);
- const rows=await ctx.enrollmentCatalog({},{});assert.deepEqual(Array.from(rows,r=>r.courseId),[600,700,464,13]);assert.equal(rows[0].wordCount,1);
- }finally{await db.close();}
- });
|