package com.yau.digitalrmb.security; import com.yau.digitalrmb.identity.application.LocalSsoAccountService; import com.yau.digitalrmb.platformintegration.application.VerifiedPlatformToken; import com.yau.digitalrmb.security.application.JwtTokenService; import com.yau.digitalrmb.security.application.RefreshTokenService; import java.util.Collections; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 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; @SpringBootTest @AutoConfigureMockMvc @ActiveProfiles("test") class CurrentUserAndLogoutTest { @Autowired private MockMvc mvc; @Autowired private LocalSsoAccountService localSsoAccountService; @Autowired private JwtTokenService jwtTokenService; @Autowired private RefreshTokenService refreshTokenService; private String teacherJwt; private String refreshToken; @BeforeEach void setUp() { localSsoAccountService.synchronize(new VerifiedPlatformToken(101L, "t001", "Teacher User", "password", 3L, "TEACHER", "610000", "Yan'an University", "100", "Computer College", "101", "Software Engineering", "202401", "Class 1", "20240001")); teacherJwt = jwtTokenService.issueFor(101L, "t001", Collections.singleton("TEACHER")).accessToken(); refreshToken = refreshTokenService.issue(101L); } @Test void currentUserIsReadonlyTeacherAndLogoutRevokesOwnRefreshToken() throws Exception { mvc.perform(get("/api/v1/auth/me").header("Authorization", "Bearer " + teacherJwt)) .andExpect(status().isOk()) .andExpect(jsonPath("$.data.userId").value(101)) .andExpect(jsonPath("$.data.username").value("t001")) .andExpect(jsonPath("$.data.name").value("Teacher User")) .andExpect(jsonPath("$.data.schoolId").value("610000")) .andExpect(jsonPath("$.data.schoolName").value("Yan'an University")) .andExpect(jsonPath("$.data.collegeId").value("100")) .andExpect(jsonPath("$.data.collegeName").value("Computer College")) .andExpect(jsonPath("$.data.majorId").value("101")) .andExpect(jsonPath("$.data.majorName").value("Software Engineering")) .andExpect(jsonPath("$.data.roleid").value(3)) .andExpect(jsonPath("$.data.classId").value("202401")) .andExpect(jsonPath("$.data.className").value("Class 1")) .andExpect(jsonPath("$.data.studentid").value("20240001")); mvc.perform(post("/api/v1/auth/logout").header("Authorization", "Bearer " + teacherJwt) .contentType(MediaType.APPLICATION_JSON).content("{\"refreshToken\":\"" + refreshToken + "\"}")) .andExpect(status().isOk()); mvc.perform(post("/api/v1/users")).andExpect(status().is4xxClientError()); } }