package cn.iocoder.yudao.module.qcreport.engine; import cn.iocoder.yudao.module.qcreport.dal.dataobject.version.ReportTemplateSchema; import cn.iocoder.yudao.module.qcreport.engine.context.InspectionItem; import cn.iocoder.yudao.module.qcreport.engine.context.ReportContext; import cn.iocoder.yudao.module.qcreport.engine.render.RenderOutcome; import cn.iocoder.yudao.module.qcreport.engine.report.EvaluationOutcome; import cn.iocoder.yudao.module.qcreport.engine.report.ReportEvaluator; import cn.iocoder.yudao.module.qcreport.engine.rule.QualityRuleDefinition; import cn.iocoder.yudao.module.qcreport.engine.rule.RuleEngine; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; /** * 与前端引擎的一致性测试。 *
* 渲染引擎与规则引擎在前端({@code src/components/quality/engine})各有一套实现, * 设计器预览用前端那套、服务端生成报告用这套,两边结果不一致就等于「预览与出件不符」, * 那是比少个功能更难查的问题。所以这里用同一份 fixture 跑两边,逐字比对产物。 *
* fixture 与期望产物都在 {@code src/test/resources/qcreport/}:
* schema.json / context.json 是输入,expected-html.html 与 expected-rules.json 是前端引擎的产物。
* 期望产物由前端引擎跑 {@code mom-pro2-before/.qc-conformance/render-ts.ts} 生成后冻结;
* 改动任何一侧的引擎后要重新生成,再让这个测试把差异顶出来。
*/
class FrontendConformanceTest {
private static final ObjectMapper MAPPER = new ObjectMapper();
private static final String FIXTURE = "qcreport/";
@Test
@DisplayName("渲染产物与前端引擎逐字一致")
void renderMatchesFrontendEngine() throws IOException {
ReportTemplateSchema schema = readSchema();
ReportContext context = readContext();
RenderOutcome outcome = QualityReportEngine.render(schema, context);
assertEquals(readFixture("expected-html.html"), outcome.html(),
"服务端渲染的 HTML 与前端引擎不一致,预览和出件会对不上");
assertEquals(readErrors(), outcome.errors(), "数据缺口清单与前端引擎不一致");
}
@Test
@DisplayName("判定结果与前端引擎一致")
void evaluationMatchesFrontendEngine() throws IOException {
ReportTemplateSchema schema = readSchema();
ReportContext context = readContext();
EvaluationOutcome evaluated = ReportEvaluator.evaluate(context, QualityReportEngine.rulesOf(schema));
assertEquals("FAIL", evaluated.context().getReport().getResult());
assertEquals("不合格", evaluated.context().getReport().getResultText());
assertEquals(3, evaluated.context().getReport().getTotal());
assertEquals(1, evaluated.context().getReport().getPassCount());
assertEquals(2, evaluated.context().getReport().getFailCount());
assertEquals("33.33%", evaluated.context().getReport().getPassRate());
List