File size: 3,971 Bytes
1c19d33
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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());
    }
}