From e0ed29f8ff597c9392b1a318b6712c7a981aa7a9 Mon Sep 17 00:00:00 2001 From: Raghav Agrawal Date: Wed, 10 Jun 2026 00:28:08 +0530 Subject: [PATCH] MX-290 Strengthen BIRT Report Execution Regression Test Coverage --- .../BirtReportingProcessServiceImplTest.java | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/src/test/java/org/apache/fineract/infrastructure/report/service/BirtReportingProcessServiceImplTest.java b/src/test/java/org/apache/fineract/infrastructure/report/service/BirtReportingProcessServiceImplTest.java index 05c3b2e..ea080b0 100644 --- a/src/test/java/org/apache/fineract/infrastructure/report/service/BirtReportingProcessServiceImplTest.java +++ b/src/test/java/org/apache/fineract/infrastructure/report/service/BirtReportingProcessServiceImplTest.java @@ -14,6 +14,7 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -213,6 +214,96 @@ void shouldCloseTaskAfterRendering() throws Exception { verify(task).close(); } + @Test + @DisplayName("Should default to HTML when output type is missing") + void shouldDefaultToHtmlWhenOutputTypeIsMissing() throws Exception { + + IReportRunnable design = mock(IReportRunnable.class); + ReportDesignHandle designHandle = mock(ReportDesignHandle.class); + IRunAndRenderTask task = mock(IRunAndRenderTask.class); + + when(reportExecutionFactory.createExecutionRunnable(anyString(), any())).thenReturn(design); + + when(design.getDesignHandle()).thenReturn(designHandle); + + when(reportEngine.createRunAndRenderTask(design)).thenReturn(task); + + when(htmlRenderer.render(any(), anyString())) + .thenReturn(Response.ok().type("text/html").build()); + + MultivaluedMap params = new MultivaluedHashMap<>(); + + Response response = service.processRequest("sample", params); + + assertEquals(200, response.getStatus()); + + verify(htmlRenderer).render(eq(task), eq("sample")); + } + + @Test + @DisplayName("Should ignore blank report parameters") + void shouldIgnoreBlankReportParameters() { + + MultivaluedMap params = new MultivaluedHashMap<>(); + + params.add("R_clientId", ""); + params.add("R_officeId", "1"); + + Map result = service.getReportParams(params); + + assertEquals(1, result.size()); + assertEquals("1", result.get("officeId")); + } + + @Test + @DisplayName("Should close task when renderer throws exception") + void shouldCloseTaskWhenRendererThrowsException() throws Exception { + + IReportRunnable design = mock(IReportRunnable.class); + ReportDesignHandle designHandle = mock(ReportDesignHandle.class); + IRunAndRenderTask task = mock(IRunAndRenderTask.class); + + when(reportExecutionFactory.createExecutionRunnable(anyString(), any())).thenReturn(design); + + when(design.getDesignHandle()).thenReturn(designHandle); + + when(reportEngine.createRunAndRenderTask(design)).thenReturn(task); + + when(pdfRenderer.render(any(), anyString())) + .thenThrow(new RuntimeException("Renderer failure")); + + assertThrows( + PlatformDataIntegrityException.class, + () -> service.processRequest("sample", queryParams("PDF"))); + + verify(task).close(); + } + + @Test + @DisplayName("Should propagate datasource configuration failures") + void shouldPropagateDatasourceConfigurationFailures() { + + IReportRunnable design = mock(IReportRunnable.class); + ReportDesignHandle designHandle = mock(ReportDesignHandle.class); + + when(reportExecutionFactory.createExecutionRunnable(anyString(), any())).thenReturn(design); + + when(design.getDesignHandle()).thenReturn(designHandle); + + doThrow( + new PlatformDataIntegrityException( + "error.msg.datasource", "Datasource configuration failed")) + .when(dataSourceConfigurer) + .configureAll(designHandle); + + PlatformDataIntegrityException exception = + assertThrows( + PlatformDataIntegrityException.class, + () -> service.processRequest("sample", queryParams("PDF"))); + + assertEquals("error.msg.reporting.error", exception.getGlobalisationMessageCode()); + } + private BirtRenderer getRendererForType(String outputType) { return switch (outputType.toUpperCase()) { case "PDF" -> pdfRenderer;