您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

55 行
3.1 KiB

  1. import fs from 'node:fs';
  2. import path from 'node:path';
  3. import crypto from 'node:crypto';
  4. import assert from 'node:assert/strict';
  5. import { call, login, fixture, writeFixture, report } from './model-editor-closure-live.mjs';
  6. const data = fixture();
  7. const session = await login('root');
  8. const result = { time: new Date().toISOString(), status: 'PENDING', originals: [], projects: [] };
  9. try {
  10. const me = await call('auth/v1/auth/me', session.accessToken);
  11. assert.equal(me.status, 200);
  12. for (const original of Object.values(data.originals)) {
  13. const current = await call(`tran/v1/content/projects/${original.id}`, session.accessToken);
  14. assert.equal(current.status, 200);
  15. const hash = crypto.createHash('sha256').update(JSON.stringify(current.data)).digest('hex');
  16. assert.equal(hash, original.hash, `Original ${original.id} full document must be unchanged`);
  17. result.originals.push({ id: original.id, name: original.name, version: current.data.project.version, unchanged: true });
  18. }
  19. const originals = new Set(Object.values(data.originals).map(item => String(item.id)));
  20. const ids = [...new Set([...Object.values(data.models).map(item => item.id), ...data.extraProjectIds].map(String))];
  21. for (const id of ids) {
  22. assert.ok(!originals.has(id), 'Never delete original reference projects');
  23. const current = await call(`tran/v1/content/projects/${id}`, session.accessToken);
  24. if (current.status === 404) { result.projects.push({ id, alreadyAbsent: true }); continue; }
  25. assert.equal(current.status, 200);
  26. let p = current.data.project;
  27. assert.ok(/^闭环(?:验收|新建|补充|工具补充)-/.test(p.name) || p.name === `闭环导航名称-${id}`,
  28. 'Only names created or renamed by this review may be removed');
  29. assert.equal(String(p.ownerUserId), String(me.data.id));
  30. assert.ok(p.addTime >= Math.floor(Date.parse(data.createdAt) / 1000));
  31. let withdrawn = false;
  32. if (p.status === 'PUBLISHED' || p.statusCode === 'PUBLISHED') {
  33. const withdrawal = await call(`tran/v1/content/projects/${id}/review`, session.accessToken, {
  34. action: 'REVOKE', version: p.version, comment: '装备模型编辑闭环验收结束,清理本次隔离测试副本',
  35. });
  36. assert.equal(withdrawal.status, 200, `Withdraw isolated project ${id}`);
  37. p = withdrawal.data.project;
  38. withdrawn = true;
  39. }
  40. const removed = await call(`tran/v1/content/projects/${id}?version=${p.version}`, session.accessToken, undefined, 'DELETE');
  41. assert.equal(removed.status, 200, `Remove isolated project ${id}: ${removed.message}`);
  42. result.projects.push({ id, name: p.name, withdrawn, removed: true });
  43. }
  44. result.status = 'PASS';
  45. data.cleanedAt = result.time; writeFixture(data);
  46. console.log(JSON.stringify({ status: result.status, unchangedOriginals: result.originals.length, cleanedProjects: result.projects.length }));
  47. } catch (error) {
  48. result.status = 'FAIL'; result.error = error.message; process.exitCode = 1;
  49. console.error(error.message);
  50. } finally {
  51. fs.writeFileSync(path.join(report, 'cleanup.json'), JSON.stringify(result, null, 2));
  52. await call('auth/v1/auth/logout', session.accessToken, {}).catch(() => {});
  53. }