test-autotest-parallel-workflow-builder.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #!/usr/bin/env node
  2. import assert from 'assert';
  3. import { WorkflowBuilder } from './src/tools/autotest/workflow-builder.js';
  4. console.log('\n── AutoTest Parallel Workflow Builder ──');
  5. const multiPagePlan = {
  6. appName: 'CampusTaskApp',
  7. appId: 'CampusTaskApp',
  8. homePage: '/TaskList',
  9. pages: [
  10. { path: '/TaskList', name: 'Task List', navPath: [] },
  11. { path: '/TaskPublish', name: 'Task Publish', navPath: ['vlid:publishTab'] },
  12. { path: '/TaskStats', name: 'Task Stats', navPath: ['vlid:statsTab'] },
  13. ],
  14. criticalPaths: [
  15. { name: 'Task filter flow', priority: 'P0' },
  16. { name: 'Task publish flow', priority: 'P0' },
  17. ],
  18. };
  19. const targets = WorkflowBuilder.planCaseGenerationTargets(multiPagePlan, 5);
  20. assert.equal(targets.length, 3, 'multi-page plans should fan out to page targets');
  21. assert.deepEqual(targets.map((target) => target.maxCases), [2, 2, 1], 'maxCases should be distributed across targets');
  22. assert.equal(targets[0].kind, 'page');
  23. const parallel = WorkflowBuilder.buildCaseGenerationWorkflow({
  24. testPlan: multiPagePlan,
  25. baseUrl: 'https://example.test/app',
  26. maxCases: 5,
  27. appId: 'CampusTaskApp',
  28. componentInfo: '- filterBtn (button) id="filterBtn" -> vlid:filterBtn',
  29. });
  30. const forkStep = parallel.wfJson.steps.find((step) => step.id === 'Fork_GenCaseTargets');
  31. assert(forkStep, 'parallel workflow should create a Fork node');
  32. assert.equal(forkStep.children.length, 3, 'fork should contain one branch per target');
  33. assert.equal(parallel.outputVars.length, 3, 'parallel workflow should expose one output var per branch');
  34. assert(parallel.wfJson.steps.some((step) => step.id === 'LLM_GenTestCases_001' && step.next === 'RETURN'), 'parallel child steps should return into the fork');
  35. const singlePagePlan = {
  36. appName: 'SinglePageApp',
  37. appId: 'SinglePageApp',
  38. homePage: '/Home',
  39. pages: [
  40. { path: '/Home', name: 'Home', navPath: [] },
  41. ],
  42. criticalPaths: [
  43. { name: 'Search flow', priority: 'P0' },
  44. ],
  45. };
  46. const serial = WorkflowBuilder.buildCaseGenerationWorkflow({
  47. testPlan: singlePagePlan,
  48. baseUrl: 'https://example.test/app',
  49. maxCases: 4,
  50. appId: 'SinglePageApp',
  51. componentInfo: '',
  52. });
  53. assert.equal(serial.outputVars.length, 1, 'single-page plans should stay serial');
  54. assert.equal(serial.wfJson.steps[0].id, 'LLM_GenTestCases', 'serial workflow should use a single LLM step');
  55. console.log('PASS test-autotest-parallel-workflow-builder.js');