package com.dalab.autoarchival.controller; import com.dalab.autoarchival.dto.ArchivalConfigDTO; import com.dalab.autoarchival.service.IArchivalConfigService; import com.fasterxml.jackson.databind.ObjectMapper; 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.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.web.servlet.MockMvc; import java.util.HashMap; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @WebMvcTest(ArchivalConfigController.class) class ArchivalConfigControllerTest { @Autowired private MockMvc mockMvc; @MockBean private IArchivalConfigService archivalConfigService; @Autowired private ObjectMapper objectMapper; private ArchivalConfigDTO sampleConfigDTO; @BeforeEach void setUp() { sampleConfigDTO = ArchivalConfigDTO.builder() .enabled(true) .defaultArchivalTier("S3_GLACIER") .defaultRetentionDays(365L) .requireApprovalForArchival(true) .requireApprovalForRestore(false) .providerConfigs(new HashMap<>()) .build(); } @Test @WithMockUser(authorities = "ROLE_ADMIN") void getArchivalConfiguration_AsAdmin_ShouldReturnConfig() throws Exception { when(archivalConfigService.getArchivalConfig()).thenReturn(sampleConfigDTO); mockMvc.perform(get("/api/v1/archival/config")) .andExpect(status().isOk()) .andExpect(jsonPath("$.enabled").value(true)) .andExpect(jsonPath("$.defaultArchivalTier").value("S3_GLACIER")); } @Test @WithMockUser(authorities = "ROLE_DATA_STEWARD") void getArchivalConfiguration_AsDataSteward_ShouldReturnConfig() throws Exception { when(archivalConfigService.getArchivalConfig()).thenReturn(sampleConfigDTO); mockMvc.perform(get("/api/v1/archival/config")) .andExpect(status().isOk()); } @Test @WithMockUser(authorities = "ROLE_USER") void getArchivalConfiguration_AsUser_ShouldBeForbidden() throws Exception { mockMvc.perform(get("/api/v1/archival/config")) .andExpect(status().isForbidden()); } @Test @WithMockUser(authorities = "ROLE_ADMIN") void updateArchivalConfiguration_AsAdmin_ShouldReturnOk() throws Exception { doNothing().when(archivalConfigService).updateArchivalConfig(any(ArchivalConfigDTO.class)); mockMvc.perform(put("/api/v1/archival/config") .with(csrf()) // Add CSRF token for PUT if Spring Security CSRF is enabled .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(sampleConfigDTO))) .andExpect(status().isOk()); verify(archivalConfigService, times(1)).updateArchivalConfig(any(ArchivalConfigDTO.class)); } @Test @WithMockUser(authorities = "ROLE_DATA_STEWARD") void updateArchivalConfiguration_AsDataSteward_ShouldBeForbidden() throws Exception { mockMvc.perform(put("/api/v1/archival/config") .with(csrf()) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(sampleConfigDTO))) .andExpect(status().isForbidden()); } }