designed-asset-runner.test.mjs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import test from "node:test";
  2. import assert from "node:assert/strict";
  3. import { access, mkdtemp, readFile, rm } from "node:fs/promises";
  4. import { join } from "node:path";
  5. import { tmpdir } from "node:os";
  6. import sharp from "sharp";
  7. import { runDesignedAsset } from "./designed-asset-runner.mjs";
  8. test("runner creates three deterministic designed pages without a paid call", async () => {
  9. const root = await mkdtemp(join(tmpdir(), "fmode-designed-"));
  10. try {
  11. const reference = join(root, "reference.png");
  12. await sharp({ create: { width: 500, height: 600, channels: 3, background: "#f4f2ed" } })
  13. .composite([{ input: Buffer.from('<svg width="500" height="600"><rect x="110" y="80" width="280" height="440" rx="55" fill="#68794e"/><rect x="205" y="410" width="90" height="55" fill="#151515"/></svg>') }])
  14. .png().toFile(reference);
  15. const result = await runDesignedAsset({
  16. reference,
  17. outputDirectory: join(root, "out"),
  18. productUnderstanding: {
  19. category: "通用商品",
  20. product_name: { value: "TEST PRODUCT" },
  21. visible_selling_points: [
  22. { value: "绿色主体轮廓", basis_refs: ["visible_fact:1"] },
  23. { value: "正面黑色标记", basis_refs: ["visible_fact:2"] },
  24. ],
  25. verified_visible_facts: ["商品具有绿色主体轮廓", "商品正面可见黑色标记"],
  26. },
  27. externalCalls: { vision_understanding: 1, fact_audit: 1, asset_upload: 1 },
  28. });
  29. assert.equal(result.status, "complete");
  30. assert.equal(result.paid_external_calls, 0);
  31. assert.equal(result.files.length, 3);
  32. assert.ok(result.files.every((file) => file.width === 1200 && file.height === 1200));
  33. assert.equal(result.page_spec.copy.heroTitle, "TEST PRODUCT");
  34. assert.equal(result.design_ir.schema_version, "1.1");
  35. assert.ok(result.design_ir.layout_plan.recipe_set.style);
  36. assert.equal(result.external_calls.vision_understanding, 1);
  37. assert.equal(result.external_calls.paid_image_generation, 0);
  38. assert.ok(result.product_layer.edgeCleanup);
  39. assert.equal(result.control_plane.release_status, "review_required");
  40. assert.equal(result.control_plane.quality_status, "review_required");
  41. assert.deepEqual(Object.keys(result.control_files).sort(), ["benchmark_result", "delivery_profile", "design_ir", "prompt_contracts", "quality_report", "repair_plan", "view_coverage"]);
  42. await Promise.all(Object.values(result.control_files).map((file) => access(file)));
  43. const benchmark = JSON.parse(await readFile(result.control_files.benchmark_result, "utf8"));
  44. assert.equal(benchmark.release_status, "review_required");
  45. } finally {
  46. await rm(root, { recursive: true, force: true });
  47. }
  48. });