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
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 }