fix(test): S9 整分支收口修 S6d 台账漂移+V35 跳号登记+S8 导入向导 IT 上下文

- 覆盖台账 p1r-api-coverage.json 与生成器去 S6d 已删 RAGFlow 文件引用,知识域 serviceFiles/testFiles 换 Dify 继任,保 32 market dormant 口径不被重生成摧毁
- ContractFirstGateTest 登记 V35 有意跳号(并行线版本预留,V36/V37 已应用 live 库不可回填)+ stale 守卫
- P1rContentImportWizardCompletedApprovalIT 补 MuseAiProperties @Bean(S8 加 @Resource 依赖后极简上下文缺 bean 致 ApplicationContext 加载失败)
- 独立复跑:local 门 65/0F/0E BUILD SUCCESS;import wizard 真PG IT 2/0F/0E(1 live skip)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
lili 2026-07-08 10:19:11 -07:00
parent 302603d9d9
commit 7a6e46b2fe
5 changed files with 393 additions and 363 deletions

View File

@ -53,4 +53,5 @@
- 新增业务域:在 `docs/api-contracts/<域>/openapi.yaml` 建契约,并把 `<域>` 加入 `ContractFirstGateTest.REQUIRED_API_DOMAINS`(机械要求该域契约长存)。
- DB 结构演进:新增 `V<下一版本>__<描述>.sql`,切勿改历史迁移;门禁自动校验连续与唯一。
- **有意跳号登记(V35)**:`muse-cloud/sql/muse/` 现有 V34、V36、V37 而无 V35,是并行开发线 S6/S7/S8 之间预留版本号造成的跳号(V34=import-parse、V36=瞬态 fulltext、V37=knowledge runtime_batch_id)。V36/V37 已应用到 live 库 `muse_slice_live`,按“迁移只增不改”回填 V35 会破坏 Flyway 校验和、损坏已部署库,故不回填。V35 已在 `ContractFirstGateTest.INTENTIONALLY_SKIPPED_VERSIONS` 登记为有意跳号,连续性门禁豁免它;日后若确有该结构变更需求,新建更高版本号迁移承载,不占用 V35。
- 需要“契约↔实现不漂移”的更强门禁(OpenAPI operationId 与控制器/服务交叉核对)时,与 P0 覆盖台账(`P1rApiCoverageReportTest`)合并设计,避免重复台账。

File diff suppressed because it is too large Load Diff

View File

@ -645,6 +645,14 @@ class P1rContentImportWizardCompletedApprovalIT {
return properties;
}
@Bean
MuseAiProperties museAiProperties() {
// S8 MuseAiImportParseService @Resource 注入 MuseAiProperties muse.ai.import.provider parser
// IT 只装配单个 stub parser(resolveImportLlmParser size==1 直接返回该 parser),provider 值不参与选择,
// 故提供一个默认实例满足必填注入即可;NewApi 外部验收参数仍由 importLlmParser() newApiProperties() 独立构造不复用此 bean
return new MuseAiProperties();
}
@Bean
MuseContentWorkOwnerFacade museContentWorkOwnerFacade() {
return new MuseContentWorkOwnerFacade() {

View File

@ -38,6 +38,15 @@ class ContractFirstGateTest {
/** Flyway 迁移文件名规范:V<版本号>__<下划线描述>.sql(与 Flyway versioned migration 默认命名一致)。 */
private static final Pattern FLYWAY_NAME = Pattern.compile("^V(\\d+)__[A-Za-z0-9_]+\\.sql$");
/**
* 有意跳号的 Flyway 版本白名单(连续性校验时豁免)
*
* <p>V35 由并行开发线 S6/S7/S8 之间预留版本号造成跳号:V34=import-parseV36=瞬态 fulltext
* V37=knowledge runtime_batch_id;V36/V37 已应用到 live muse_slice_live,按契约迁移只增不改
* 回填 V35 会破坏 Flyway 校验和损坏已部署库,故不回填而登记为有意跳号理由与登记见 contract-first.md</p>
*/
private static final Set<Integer> INTENTIONALLY_SKIPPED_VERSIONS = Set.of(35);
/** 必须存在的业务域 API 契约(= 当前 BC 对外契约集;新增 BC 须在此登记其 OpenAPI 契约,见 bc-boundaries.md)。 */
private static final Set<String> REQUIRED_API_DOMAINS = Set.of(
"account", "ai", "content", "events", "knowledge", "market", "meta");
@ -78,9 +87,18 @@ class ContractFirstGateTest {
Set<Integer> unique = new TreeSet<>(versions);
assertEquals(versions.size(), unique.size(), "Flyway 迁移版本号必须唯一(出现重复): " + versions);
// 连续性:1..max 无缺口,缺口通常意味迁移被误删/改名(破坏性变更)
// 有意跳号登记必须名副其实:被登记为跳号的版本不得又出现真实迁移,否则登记项已过期需清理
for (Integer skipped : INTENTIONALLY_SKIPPED_VERSIONS) {
assertFalse(unique.contains(skipped),
"V" + skipped + " 已登记为有意跳号,却存在真实迁移;请从 INTENTIONALLY_SKIPPED_VERSIONS 移除该登记");
}
// 连续性:1..max 无缺口,缺口通常意味迁移被误删/改名(破坏性变更);已登记的有意跳号除外
int max = unique.stream().max(Integer::compareTo).orElse(0);
for (int v = 1; v <= max; v++) {
if (INTENTIONALLY_SKIPPED_VERSIONS.contains(v)) {
continue; // 有意跳号:并行开发线间预留版本号,登记与理由见 contract-first.md
}
assertTrue(unique.contains(v),
"Flyway 迁移版本号必须从 1 连续到 " + max + ",缺失 V" + v
+ "(若为有意跳号,请在本测试与 contract-first.md 登记说明)");

View File

@ -199,9 +199,12 @@ AI_DOMAIN_TEST_FILES = (
"muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rAiRuntimeEndToEndLiveAcceptanceIT.java",
"muse-cloud/muse-module-ai/muse-module-ai-server/src/test/java/cn/iocoder/muse/module/ai/application/muse/facade/P1rNewApiLiveAcceptanceIT.java",
)
# S6d(commit 302603d9)删除 RAGFlow 运行时并以 Dify 转默认装配,原 RAGFlow/runtime live 验收 IT
# (P1rKnowledgeRuntimeEndToEndLiveAcceptanceIT / P1rRagFlowLiveAcceptanceIT)随之删除。
# 覆盖证据改指向其现存继任:Dify 运行时 live 契约 IT(RAGFlow live 的同目录后继)+ knowledge 路由归属测试。
KNOWLEDGE_DOMAIN_TEST_FILES = (
"muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rKnowledgeRuntimeEndToEndLiveAcceptanceIT.java",
"muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/test/java/cn/iocoder/muse/module/knowledge/application/muse/facade/P1rRagFlowLiveAcceptanceIT.java",
"muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/test/java/cn/iocoder/muse/module/knowledge/application/muse/facade/P1rDifyDatasetsContractLiveIT.java",
"muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rKnowledgeRouteOwnershipTest.java",
)
TEST_FILES_BY_OPERATION = {
"events:streamEvents": (