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.ReportContextCodec; import cn.iocoder.yudao.module.qcreport.engine.render.RenderOutcome; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfSystemProperty; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.*; /** Explicit local migration harness: renders audited inputs with the real application engine. */ class QcMigrationRenderTest { @Test @EnabledIfSystemProperty(named="qc.migration.input", matches=".+") void renderReviewedMigrationInputs() throws Exception { ObjectMapper mapper = new ObjectMapper(); Path input = Path.of(System.getProperty("qc.migration.input")); List> jobs = mapper.readValue(input.toFile(),new TypeReference<>(){}); List> output = new ArrayList<>(); Path previews = input.getParent().resolve("report-previews"); Files.createDirectories(previews); for (Map job : jobs) { ReportTemplateSchema schema = mapper.convertValue(job.get("schema"), ReportTemplateSchema.class); @SuppressWarnings("unchecked") Map snapshot=(Map)job.get("snapshot"); assertTrue(QualityReportEngine.hasCanvas(schema)); RenderOutcome outcome=QualityReportEngine.render(schema, ReportContextCodec.fromMap(snapshot)); assertFalse(outcome.body().isBlank()); assertFalse(outcome.html().contains("{{"),"Unresolved report binding"); Map row = new LinkedHashMap<>(); row.put("id",job.get("id"));row.put("report_no",job.get("report_no")); row.put("template_version",job.get("template_version")); row.put("snapshot",ReportContextCodec.toMap(outcome.context())); row.put("html",outcome.html());row.put("warnings",outcome.errors()); output.add(row); Files.writeString(previews.resolve("report-"+job.get("id")+".html"), outcome.html()); } mapper.writerWithDefaultPrettyPrinter().writeValue(input.getParent().resolve("report-output.json").toFile(),output); assertEquals(jobs.size(),output.size()); assertEquals(12,output.size()); } }