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.junit.jupiter.api.extension.ExtendWith;
7   import org.mockito.InjectMocks;
8   import org.mockito.Mock;
9   import org.mockito.junit.jupiter.MockitoExtension;
10  import org.springframework.mock.web.MockMultipartFile;
11  import org.springframework.test.util.ReflectionTestUtils;
12  import org.springframework.web.servlet.ModelAndView;
13  
14  import java.io.IOException;
15  import java.nio.file.Path;
16  import java.util.Collections;
17  import java.util.List;
18  
19  import static org.junit.jupiter.api.Assertions.assertEquals;
20  import static org.junit.jupiter.api.Assertions.assertTrue;
21  import static org.mockito.ArgumentMatchers.any;
22  import static org.mockito.ArgumentMatchers.eq;
23  import static org.mockito.Mockito.times;
24  import static org.mockito.Mockito.verify;
25  import static org.mockito.Mockito.verifyNoInteractions;
26  import static org.mockito.Mockito.when;
27  
28  @ExtendWith(MockitoExtension.class)
29  class UploadControllerTest {
30  
31      @Mock
32      private UploadAnalysisService uploadAnalysisService;
33      @Mock
34      private SourceService sourceService;
35  
36      @InjectMocks
37      private UploadController uploadController;
38  
39      @BeforeEach
40      void setUp() {
41          // Set tempDir manually (since @Value is not injected in unit tests)
42          ReflectionTestUtils.setField(uploadController, "tempDir", System.getProperty("java.io.tmpdir"));
43          when(sourceService.getSources()).thenReturn(List.of("Ausgaben", "Einnahmen"));
44          ReflectionTestUtils.setField(uploadController, "sourceService", sourceService);
45      }
46  
47      @Test
48      void testUploadPage() {
49          ModelAndView mav = uploadController.upload();
50  
51          assertEquals("upload", mav.getViewName());
52          assertTrue(mav.getModel().containsKey("worksheets"));
53          assertEquals("Ausgaben", mav.getModel().get("selectedWorksheet"));
54      }
55  
56      @Test
57      void testHandleFileUpload_success() throws Exception {
58          MockMultipartFile file = new MockMultipartFile(
59                  "file",
60                  "test.ods",
61                  "application/vnd.oasis.opendocument.spreadsheet",
62                  "dummy content".getBytes()
63          );
64  
65          when(uploadAnalysisService.processFile(eq("Ausgaben"), any(Path.class))).thenReturn(new BilanzRowParserResult(1, 42, Collections.emptyList()));
66  
67          ModelAndView mav = uploadController.handleFileUpload(file, "Ausgaben");
68  
69          assertEquals("upload", mav.getViewName());
70          assertTrue(mav.getModel().containsKey("sucmessage"));
71          assertTrue(((String) mav.getModel().get("sucmessage")).contains("42"));
72          assertTrue(mav.getModel().containsKey("statistic"));
73  
74          verify(uploadAnalysisService, times(1)).processFile(eq("Ausgaben"), any(Path.class));
75      }
76  
77      @Test
78      void testHandleFileUpload_invalidWorksheet() {
79          MockMultipartFile file = new MockMultipartFile(
80                  "file",
81                  "test.ods",
82                  "application/vnd.oasis.opendocument.spreadsheet",
83                  "dummy content".getBytes()
84          );
85  
86          ModelAndView mav = uploadController.handleFileUpload(file, "INVALID");
87  
88          assertEquals("upload", mav.getViewName());
89          assertEquals("Invalid worksheet selected", mav.getModel().get("message"));
90  
91          verifyNoInteractions(uploadAnalysisService);
92      }
93  
94      @Test
95      void testHandleFileUpload_emptyFile() {
96          MockMultipartFile file = new MockMultipartFile(
97                  "file",
98                  "test.ods",
99                  "application/vnd.oasis.opendocument.spreadsheet",
100                 new byte[0]
101         );
102 
103         ModelAndView mav = uploadController.handleFileUpload(file, "Ausgaben");
104 
105         assertEquals("Please select a file to upload", mav.getModel().get("message"));
106         verifyNoInteractions(uploadAnalysisService);
107     }
108 
109     @Test
110     void testHandleFileUpload_invalidContentType() {
111         MockMultipartFile file = new MockMultipartFile(
112                 "file",
113                 "test.txt",
114                 "text/plain",
115                 "dummy content".getBytes()
116         );
117 
118         ModelAndView mav = uploadController.handleFileUpload(file, "Ausgaben");
119 
120         assertEquals("Only ODS spreadsheet files allowed", mav.getModel().get("message"));
121         verifyNoInteractions(uploadAnalysisService);
122     }
123 
124     @Test
125     void testHandleFileUpload_exceptionHandling() throws Exception {
126         MockMultipartFile file = new MockMultipartFile(
127                 "file",
128                 "test.ods",
129                 "application/vnd.oasis.opendocument.spreadsheet",
130                 "dummy content".getBytes()
131         );
132 
133         when(uploadAnalysisService.processFile(eq("Ausgaben"), any(Path.class)))
134                 .thenThrow(new IOException("Processing error"));
135 
136         ModelAndView mav = uploadController.handleFileUpload(file, "Ausgaben");
137 
138         assertTrue(((String) mav.getModel().get("message")).contains("Upload failed"));
139         verify(uploadAnalysisService, times(1)).processFile(eq("Ausgaben"), any(Path.class));
140     }
141 }