From c598d8850661426a1631356afa1b1dc69e7547de Mon Sep 17 00:00:00 2001 From: "weicw1996@qq.com" Date: Thu, 24 Sep 2026 03:51:49 +0800 Subject: [PATCH] =?UTF-8?q?test(ai):=20=E8=A1=A5=E7=AB=AF=E5=88=B0?= =?UTF-8?q?=E7=AB=AF=E5=BD=A2=E7=8A=B6=E5=A5=91=E7=BA=A6=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 把 buildCreativeAssistantResult 在失败态下的**真实产出**打成一行 JSON, 供 .scratch/ai-assistant/verify-frontend-e2e.js 当输入喂给前端真实渲染函数, 验证的是「后端真实产出 → 前端真实渲染」整条链路,而非两侧各自自测。 实测产出为 {"status":"failed","answer":"生成失败,请稍后重试"}, 不含 raw / workflow_id / req_id / 上游错误栈。 Refs: .scratch/ai-assistant/issues/01-creative-assistant-raw-json-bubble.md --- .../AiCreativeFailureShapeContractTest.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/test/java/com/gxwebsoft/ai/controller/AiCreativeFailureShapeContractTest.java diff --git a/src/test/java/com/gxwebsoft/ai/controller/AiCreativeFailureShapeContractTest.java b/src/test/java/com/gxwebsoft/ai/controller/AiCreativeFailureShapeContractTest.java new file mode 100644 index 0000000..fa94090 --- /dev/null +++ b/src/test/java/com/gxwebsoft/ai/controller/AiCreativeFailureShapeContractTest.java @@ -0,0 +1,41 @@ +package com.gxwebsoft.ai.controller; + +import com.gxwebsoft.common.core.utils.JSONUtil; +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Method; +import java.util.Map; + +/** + * 端到端形状契约:把后端失败态的**真实产出**打成一行 JSON, + * 供前端验证脚本当作输入,确认前端拿到它时渲染的是可读文案而非原始报文。 + * + *

输出被 `.scratch/ai-assistant/verify-frontend-e2e.js` 读取; + * 断言放在那个脚本里(前端侧),这里只负责产出真实形状。 + */ +class AiCreativeFailureShapeContractTest { + + @Test + void 打印失败态真实返回形状() throws Exception { + String failureEvent = "{" + + "\"event\":\"workflow_finished\"," + + "\"workflow_run_id\":\"b2e18332-68bd-49e6-90e2-bd9d16d428ff\"," + + "\"task_id\":\"0b1fdd88-cc6f-45b8-989d-be4f85bcff74\"," + + "\"data\":{\"status\":\"failed\",\"outputs\":{}," + + "\"error\":\"req_id: dc688258de PluginInvokeError: Model disabled.\"}" + + "}"; + + Map responseData = JSONUtil.parseObject(failureEvent, Map.class); + AiController controller = new AiController(); + Method method = AiController.class.getDeclaredMethod( + "buildCreativeAssistantResult", Map.class, String.class); + method.setAccessible(true); + @SuppressWarnings("unchecked") + Map result = (Map) method.invoke( + controller, responseData, failureEvent); + + // ApiResult 只包一层 {code,message,data},apiRequest 在前端会拆出 data, + // 所以这里打印的正是前端 formatCreativeResult 的入参。 + System.out.println("__E2E_SHAPE__" + JSONUtil.toJSONString(result)); + } +}