日志记录提交

This commit is contained in:
2026-08-05 14:20:04 +08:00
parent 264458920b
commit 06f7f9d2f2
83 changed files with 3256 additions and 27 deletions
@@ -0,0 +1,74 @@
package com.baiyue.audit.controller;
import com.baiyue.audit.service.AuditIngestService;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringJUnitConfig(AuditIngestController.class)
@TestPropertySource(properties = "baiyue.security.internal-service-token=0123456789abcdef0123456789abcdef")
class AuditIngestControllerTest {
private static final String TOKEN = "0123456789abcdef0123456789abcdef";
@MockBean
private AuditIngestService service;
@Resource
private AuditIngestController controller;
private MockMvc mockMvc;
@BeforeEach
void setUp() {
mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
}
@Test
void rejectsInvalidInternalToken() throws Exception {
mockMvc.perform(post("/internal/audit/events")
.header("X-Internal-Service-Token", "wrong-token")
.contentType(MediaType.APPLICATION_JSON)
.content(validRequest()))
.andExpect(status().isForbidden())
.andExpect(jsonPath("$.code").value("A0403"));
verify(service, never()).ingest(any());
}
@Test
void acceptsEventWithInternalToken() throws Exception {
mockMvc.perform(post("/internal/audit/events")
.header("X-Internal-Service-Token", TOKEN)
.contentType(MediaType.APPLICATION_JSON)
.content(validRequest()))
.andExpect(status().isAccepted())
.andExpect(jsonPath("$.code").value("200"));
verify(service).ingest(any());
}
private String validRequest() {
return """
{
"eventType":"ROLE_UPDATE",
"resourceType":"ROLE",
"durationMs":0,
"success":true,
"occurredAt":"2026-08-05T00:00:00Z"
}
""";
}
}
@@ -0,0 +1,68 @@
package com.baiyue.audit.controller;
import com.baiyue.audit.dto.AuditLogQuery;
import com.baiyue.audit.dto.AuditLogResponses;
import com.baiyue.audit.service.AuditLogQueryService;
import com.baiyue.common.core.api.PageResult;
import com.baiyue.common.core.exception.BizException;
import com.baiyue.common.security.AuthenticatedUser;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import java.util.List;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
@SpringJUnitConfig(PlatformAuditLogController.class)
class PlatformAuditLogControllerContractTest {
@MockBean
private AuditLogQueryService service;
@Resource
private PlatformAuditLogController controller;
@Test
void platformCanQueryLogList() {
when(service.page(any(AuditLogQuery.class), org.mockito.ArgumentMatchers.eq(1L),
org.mockito.ArgumentMatchers.eq(20L)))
.thenReturn(new PageResult<>(List.of(), 1, 20, 0, 0));
var response = controller.page(user("PLATFORM"), 1, 20, 10001L, 7L, "ROLE_UPDATE", "ROLE", "9",
true, null, null, "管理员");
assertThat(response.successful()).isTrue();
verify(service).page(new AuditLogQuery(10001L, 7L, "ROLE_UPDATE", "ROLE", "9", true,
null, null, "管理员"), 1, 20);
}
@Test
void merchantCannotReadPlatformLogs() {
assertThatThrownBy(() -> controller.page(user("MERCHANT"), 1, 20, null, null, null, null,
null, null, null, null, null)).isInstanceOf(BizException.class)
.hasMessage("仅平台端可查看操作日志");
verifyNoInteractions(service);
}
@Test
void platformCanReadLogDetail() {
AuditLogResponses.Detail detail = new AuditLogResponses.Detail(8L, "audit-1", "ROLE_UPDATE", "ROLE", "9", null,
null, null, null, null, 7L, "管理员", "PLATFORM", "WEB", null, null, null, 1L,
true, null, null, "{}", "{}", "iam-service", null, null);
when(service.detail(8L)).thenReturn(detail);
assertThat(controller.detail(user("PLATFORM"), 8L).data()).isEqualTo(detail);
verify(service).detail(8L);
}
private static AuthenticatedUser user(String appCode) {
return new AuthenticatedUser(7L, 0L, 0L, 1L, "管理员", appCode, "WEB", Set.of("platform:audit:list"));
}
}