View Javadoc
1   package de.aikiit.bilanzanalyser.upload;
2   
3   import de.aikiit.bilanzanalyser.reader.BilanzRowParserResult;
4   import org.junit.jupiter.api.BeforeEach;
5   import org.junit.jupiter.api.Test;
6   import org.springframework.beans.factory.annotation.Autowired;
7   import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
8   import org.springframework.mock.web.MockMultipartFile;
9   import org.springframework.test.context.bean.override.mockito.MockitoBean;
10  import org.springframework.test.util.ReflectionTestUtils;
11  import org.springframework.test.web.servlet.MockMvc;
12  
13  import java.io.IOException;
14  import java.nio.file.Path;
15  import java.util.Collections;
16  import java.util.List;
17  
18  import static org.mockito.ArgumentMatchers.any;
19  import static org.mockito.ArgumentMatchers.eq;
20  import static org.mockito.Mockito.times;
21  import static org.mockito.Mockito.verify;
22  import static org.mockito.Mockito.verifyNoInteractions;
23  import static org.mockito.Mockito.when;
24  import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
25  import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart;
26  import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
27  import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
28  import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
29  
30  @WebMvcTest(UploadController.class)
31  class UploadControllerITest {
32  
33      @Autowired
34      private MockMvc mockMvc;
35  
36      @MockitoBean
37      private UploadAnalysisService uploadAnalysisService;
38  
39      @MockitoBean
40      private SourceService sourceService;
41  
42      @Autowired
43      private UploadController uploadController;
44  
45      @BeforeEach
46      void setSourcesInController() {
47          when(sourceService.getSources()).thenReturn(List.of("Ausgaben", "Einnahmen"));
48          ReflectionTestUtils.setField(uploadController, "sourceService", sourceService);
49      }
50  
51      @Test
52      void testGetUploadPage() throws Exception {
53          mockMvc.perform(get("/upload")).andExpect(status().isOk()).andExpect(view().name("upload")).andExpect(model().attributeExists("worksheets")).andExpect(model().attribute("selectedWorksheet", "Ausgaben"));
54      }
55  
56      @Test
57      void testHandleFileUpload_success() throws Exception {
58          ReflectionTestUtils.setField(uploadController, "tempDir", System.getProperty("java.io.tmpdir"));
59  
60          MockMultipartFile file = new MockMultipartFile("file", "test.ods", "application/vnd.oasis.opendocument.spreadsheet", "dummy content".getBytes());
61  
62          when(uploadAnalysisService.processFile(eq("Ausgaben"), any(Path.class))).thenReturn(new BilanzRowParserResult(1, 2, Collections.emptyList()));
63  
64          mockMvc.perform(multipart("/upload").file(file).param("selectedWorksheet", "Ausgaben")).andExpect(status().isOk()).andExpect(view().name("upload")).andExpect(model().attributeExists("sucmessage")).andExpect(model().attributeExists("statistic")).andExpect(model().attributeExists("worksheets")).andExpect(model().attribute("selectedWorksheet", "Ausgaben"));
65  
66          verify(uploadAnalysisService, times(1)).processFile(eq("Ausgaben"), any(Path.class));
67      }
68  
69      @Test
70      void testHandleFileUpload_invalidWorksheet() throws Exception {
71          MockMultipartFile file = new MockMultipartFile("file", "test.ods", "application/vnd.oasis.opendocument.spreadsheet", "dummy content".getBytes());
72  
73          mockMvc.perform(multipart("/upload").file(file).param("selectedWorksheet", "INVALID")).andExpect(status().isOk()).andExpect(model().attribute("message", "Invalid worksheet selected"));
74  
75          verifyNoInteractions(uploadAnalysisService);
76      }
77  
78      @Test
79      void testHandleFileUpload_emptyFile() throws Exception {
80          MockMultipartFile file = new MockMultipartFile("file", "test.ods", "application/vnd.oasis.opendocument.spreadsheet", new byte[0]);
81  
82          mockMvc.perform(multipart("/upload").file(file).param("selectedWorksheet", "Ausgaben")).andExpect(status().isOk()).andExpect(model().attribute("message", "Please select a file to upload"));
83  
84          verifyNoInteractions(uploadAnalysisService);
85      }
86  
87      @Test
88      void testHandleFileUpload_invalidContentType() throws Exception {
89          MockMultipartFile file = new MockMultipartFile("file", "test.txt", "text/plain", "dummy content".getBytes());
90  
91          mockMvc.perform(multipart("/upload").file(file).param("selectedWorksheet", "Ausgaben")).andExpect(status().isOk()).andExpect(model().attribute("message", "Only ODS spreadsheet files allowed"));
92  
93          verifyNoInteractions(uploadAnalysisService);
94      }
95  
96      @Test
97      void testHandleFileUpload_exceptionHandling() throws Exception {
98          ReflectionTestUtils.setField(uploadController, "tempDir", System.getProperty("java.io.tmpdir"));
99  
100         MockMultipartFile file = new MockMultipartFile("file", "test.ods", "application/vnd.oasis.opendocument.spreadsheet", "dummy content".getBytes());
101 
102         when(uploadAnalysisService.processFile(eq("Ausgaben"), any(Path.class))).thenThrow(new IOException("Processing error"));
103 
104         mockMvc.perform(multipart("/upload").file(file).param("selectedWorksheet", "Ausgaben")).andExpect(status().isOk()).andExpect(model().attributeExists("message")).andExpect(model().attribute("message", org.hamcrest.Matchers.containsString("Upload failed")));
105 
106         verify(uploadAnalysisService, times(1)).processFile(eq("Ausgaben"), any(Path.class));
107     }
108 }