This commit is contained in:
2026-08-26 11:10:42 +08:00
parent 15421db421
commit cf5d603a21
35 changed files with 664 additions and 435 deletions
@@ -31,6 +31,9 @@ class AdminPrototypeMenuPermissionSqlContractTest {
assertThat(sql).contains("(" + (5105050 + index) + ",0,'PLATFORM','BUTTON'," + (5105040 + index) + ",'" + FINANCE_EXPORTS[index] + "'");
}
assertThat(sql)
.contains("(5305000,0,'MERCHANT','MENU',5300000,'merchant:finance:statement'")
.contains("(5305010,0,'MERCHANT','BUTTON',5305000,'merchant:finance:statement:list'")
.contains("(5305011,0,'MERCHANT','BUTTON',5305000,'merchant:finance:statement:view'")
.contains("(5305012,0,'MERCHANT','BUTTON',5305000,'merchant:finance:statement:confirm'")
.contains("r.tenant_id=0 AND r.app_code='MERCHANT' AND r.role_code='MERCHANT_OWNER'")
.contains("'platform:finance:fee-source:review' code, 5105041 parent_id")
@@ -60,8 +63,8 @@ class AdminPrototypeMenuPermissionSqlContractTest {
.contains("permission_code LIKE 'platform:finance:%' AND status='ACTIVE' AND deleted=0) <> 32")
.contains("(p.permission_code='platform:finance' OR p.permission_code LIKE 'platform:finance:%')) <> 33")
.contains("Finance 导出和下载中心授权不完整")
.contains("merchant:finance:statement:confirm")
.contains("客户全局管理员缺少对账单确认权限")
.contains("客户全局 Finance 权限模板不完整")
.contains("客户全局管理员 Finance 模板授权不完整")
.satisfies(content -> assertThat(content.indexOf("(5105050,0,'PLATFORM','BUTTON'"))
.isLessThan(content.indexOf("CREATE PROCEDURE assert_finance_permissions()")));
}
@@ -11,25 +11,42 @@ import static org.assertj.core.api.Assertions.assertThat;
class InitialIdentitySeedSqlContractTest {
@Test
void initializesPlatformAndItTestCustomerIdentitiesWithStableIds() throws Exception {
assertIdentitySeed(new ClassPathResource("db/phase1-admin-rbac.sql")
.getContentAsString(StandardCharsets.UTF_8));
assertIdentitySeed(Files.readString(unifiedSql(), StandardCharsets.UTF_8));
void initializesOnlyPlatformIdentityAndGlobalMerchantTemplates() throws Exception {
String identitySeed = new ClassPathResource("db/phase1-admin-rbac.sql")
.getContentAsString(StandardCharsets.UTF_8);
String templateSeed = new ClassPathResource("db/phase1-onboarding.sql")
.getContentAsString(StandardCharsets.UTF_8);
String unified = Files.readString(unifiedSql(), StandardCharsets.UTF_8);
assertPlatformIdentitySeed(identitySeed);
assertPlatformIdentitySeed(unified);
assertGlobalMerchantTemplate(templateSeed);
assertGlobalMerchantTemplate(unified);
}
private static void assertIdentitySeed(String sql) {
private static void assertPlatformIdentitySeed(String sql) {
assertThat(sql)
.contains("(0, 'PLATFORM', '虫虫出海平台'")
.contains("(10001, 'IT_TEST', 'IT 测试客户'")
.contains("(2000001, 1000001, 'INTERNAL', '平台系统管理员'")
.contains("(2000002, 1000002, 'ENTERPRISE', 'IT 测试客户管理员'")
.contains("(3000001, 0, 2000001, 'EMPLOYEE'")
.contains("(3000002, 10001, 2000002, 'OWNER'")
.contains("tenant_code = VALUES(tenant_code)")
.doesNotContain("merchant_admin")
.doesNotContain("IT_TEST")
.doesNotContain("(10001,")
.doesNotContain("(2000002,")
.doesNotContain("(3000002,")
.doesNotContain("4000101, 10001")
.doesNotContain("PHASE1_DEMO")
.doesNotContain("一期演示企业");
}
private static void assertGlobalMerchantTemplate(String sql) {
assertThat(sql)
.contains("4000100, 0, 'MERCHANT', 'MERCHANT_OWNER'")
.contains("5300000, 0, 'MERCHANT', 'MENU'")
.contains("5301024, 0, 'MERCHANT', 'BUTTON'")
.doesNotContain("WHERE tenant_id = 10001 AND app_code = 'MERCHANT'");
}
private static Path unifiedSql() {
Path path = Path.of("deploy", "sql", "头程数据库统一增量-MySQL8.sql");
return Files.exists(path) ? path : Path.of("..", "deploy", "sql", "头程数据库统一增量-MySQL8.sql");
@@ -1,13 +1,17 @@
-- Any returned row represents a failed phase-one seed assertion.
SELECT 'missing_auth_accounts' AS failure
WHERE (SELECT COUNT(*) FROM baiyue_auth.auth_account
WHERE username IN ('platform_admin', 'merchant_admin') AND account_status = 'ACTIVE') <> 2
WHERE username = 'platform_admin' AND account_status = 'ACTIVE') <> 1
UNION ALL
SELECT 'missing_active_identities'
WHERE (SELECT COUNT(*) FROM baiyue_iam.iam_user u
JOIN baiyue_iam.iam_membership m ON m.user_id = u.id
WHERE u.auth_user_id IN (1000001, 1000002)
AND u.status = 'ACTIVE' AND m.status = 'ACTIVE') <> 2
WHERE u.auth_user_id = 1000001
AND u.status = 'ACTIVE' AND m.status = 'ACTIVE') <> 1
UNION ALL
SELECT 'unexpected_fixed_customer_seed'
WHERE EXISTS (SELECT 1 FROM baiyue_iam.iam_tenant WHERE tenant_code = 'IT_TEST')
OR EXISTS (SELECT 1 FROM baiyue_auth.auth_account WHERE username = 'merchant_admin')
UNION ALL
SELECT 'unexpected_permission_type'
WHERE EXISTS (SELECT 1 FROM baiyue_iam.iam_permission
@@ -34,10 +38,6 @@ SELECT 'platform_admin_not_fully_granted'
WHERE (SELECT COUNT(*) FROM baiyue_iam.iam_role_permission WHERE role_id = 4000001)
<> (SELECT COUNT(*) FROM baiyue_iam.iam_permission WHERE tenant_id = 0 AND app_code = 'PLATFORM' AND permission_type IN ('MENU', 'BUTTON'))
UNION ALL
SELECT 'merchant_owner_not_fully_granted'
WHERE (SELECT COUNT(*) FROM baiyue_iam.iam_role_permission WHERE role_id = 4000101)
<> (SELECT COUNT(*) FROM baiyue_iam.iam_permission WHERE tenant_id = 10001 AND app_code = 'MERCHANT' AND permission_type IN ('MENU', 'BUTTON'))
UNION ALL
SELECT 'missing_global_merchant_owner_template'
WHERE NOT EXISTS (
SELECT 1 FROM baiyue_iam.iam_role