From 6842b40132d25a79a2f05de3cd6daed921db1188 Mon Sep 17 00:00:00 2001 From: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com> Date: Sat, 10 Oct 2026 14:28:57 +0800 Subject: [PATCH] test(auth): persist initial grant audit in PostgreSQL Signed-off-by: XiaoSeS <87064762+XiaoSeS@users.noreply.github.com> --- .../changes/configure-auth-and-initial-roles/tasks.md | 2 +- .../repository/SystemAuthSettingsPostgresTest.java | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/openspec/changes/configure-auth-and-initial-roles/tasks.md b/openspec/changes/configure-auth-and-initial-roles/tasks.md index 9aa1b958..4d4cb18b 100644 --- a/openspec/changes/configure-auth-and-initial-roles/tasks.md +++ b/openspec/changes/configure-auth-and-initial-roles/tasks.md @@ -22,4 +22,4 @@ - [x] 验证两个开关的四种组合、直接 API 绕过尝试、已有会话、DB 故障与多实例设置可见性(本地 Compose HTTP 实测;DB 故障与两个服务实例读取使用 `LocalAuthSettingsServiceTest`)。 - [x] 验证首次登录授权、准入优先、已有账号不补授权、同邮箱独立账号、邮箱验证、规则停用、角色人工修改和并发首次登录(OAuth/授权单测与 PostgreSQL 真实事务测试;本地 Compose 未接入真实外部 IdP)。 -- [x] 验证一次性部署初始化、角色规则删除后重启、非超管越权、审计记录和浏览器页面流程(初始化单测、Compose 权限与审计实测、Playwright 浏览器操作;常驻 smoke 覆盖公开能力与后台配置读取)。 +- [x] 验证一次性部署初始化、角色规则删除后重启、非超管越权、审计记录和浏览器页面流程(初始化单测、Compose 权限与审计实测、PostgreSQL 自动授权审计断言、Playwright 浏览器操作;常驻 smoke 覆盖公开能力与后台配置读取)。 diff --git a/server/skillhub-app/src/test/java/com/iflytek/skillhub/repository/SystemAuthSettingsPostgresTest.java b/server/skillhub-app/src/test/java/com/iflytek/skillhub/repository/SystemAuthSettingsPostgresTest.java index c7afd138..cc7cdb4c 100644 --- a/server/skillhub-app/src/test/java/com/iflytek/skillhub/repository/SystemAuthSettingsPostgresTest.java +++ b/server/skillhub-app/src/test/java/com/iflytek/skillhub/repository/SystemAuthSettingsPostgresTest.java @@ -18,7 +18,9 @@ import com.iflytek.skillhub.domain.namespace.GlobalNamespaceMembershipService; import com.iflytek.skillhub.domain.user.UserAccount; import com.iflytek.skillhub.domain.user.UserAccountRepository; import com.iflytek.skillhub.domain.user.UserStatus; +import com.iflytek.skillhub.infra.jpa.AuditLogJpaRepository; import jakarta.persistence.EntityManager; +import java.time.Clock; import java.util.Map; import java.util.UUID; import java.util.concurrent.CountDownLatch; @@ -69,6 +71,7 @@ class SystemAuthSettingsPostgresTest { @Autowired private IdentityBindingRepository identities; @Autowired private UserRoleBindingRepository userRoles; @Autowired private PlatformTransactionManager transactionManager; + @Autowired private AuditLogJpaRepository auditLogs; @Autowired private EntityManager entityManager; @Autowired private JdbcTemplate jdbc; @@ -193,6 +196,11 @@ class SystemAuthSettingsPostgresTest { assertThat(consumed.getMatchedSubject()).isIn(firstClaims.subject(), secondClaims.subject()); assertThat(userRoles.findByUserId(firstPrincipal.userId()).size() + userRoles.findByUserId(secondPrincipal.userId()).size()).isEqualTo(1); + assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM audit_log WHERE action = ? AND target_id = ?", + Long.class, "INITIAL_ROLE_GRANTED", ruleId)).isEqualTo(1L); + assertThat(jdbc.queryForObject("SELECT detail_json ->> 'userId' FROM audit_log " + + "WHERE action = ? AND target_id = ?", String.class, "INITIAL_ROLE_GRANTED", ruleId)) + .isEqualTo(consumed.getGrantedUserId()); } } @@ -200,7 +208,7 @@ class SystemAuthSettingsPostgresTest { return new IdentityBindingService(identities, users, userRoles, mock(GlobalNamespaceMembershipService.class), mock(ApplicationEventPublisher.class), transactionManager, new InitialExternalRoleGrantService( - rules, userRoles, mock(AuditLogService.class))); + rules, userRoles, new AuditLogService(auditLogs, Clock.systemUTC()))); } private static PlatformPrincipal firstLogin(IdentityBindingService service, OAuthClaims claims,