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 }