From 3506787d57eab5cab9bb98db7f2e34f73ee7c918 Mon Sep 17 00:00:00 2001 From: Satish11012007 Date: Tue, 10 Mar 2026 08:30:04 +0530 Subject: [PATCH] FINERACT-1556: treat template runreports as parameter metadata --- .../api/RunreportsApiResource.java | 5 ++ .../api/RunreportsApiResourceTest.java | 85 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 fineract-provider/src/test/java/org/apache/fineract/infrastructure/dataqueries/api/RunreportsApiResourceTest.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/RunreportsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/RunreportsApiResource.java index 5b50d471778..4833c554bdb 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/RunreportsApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/RunreportsApiResource.java @@ -136,6 +136,11 @@ private Response processReportRequest(final String reportName, final UriInfo uri MultivaluedMap queryParams = new MultivaluedStringMap(); queryParams.putAll(uriInfo.getQueryParameters()); + final boolean template = ApiParameterHelper.template(queryParams); + if (template && queryParams.getFirst(ReportParameters.getParameterType()) == null) { + queryParams.putSingle(ReportParameters.getParameterType(), Boolean.TRUE.toString()); + } + final boolean parameterTypeValue = ApiParameterHelper.parameterType(queryParams); checkUserPermissionForReport(reportName, parameterTypeValue); diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/dataqueries/api/RunreportsApiResourceTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/dataqueries/api/RunreportsApiResourceTest.java new file mode 100644 index 00000000000..cdd27438854 --- /dev/null +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/dataqueries/api/RunreportsApiResourceTest.java @@ -0,0 +1,85 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.infrastructure.dataqueries.api; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; + +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; +import org.apache.fineract.infrastructure.dataqueries.service.ReadReportingService; +import org.apache.fineract.infrastructure.report.provider.ReportingProcessServiceProvider; +import org.apache.fineract.infrastructure.report.service.ReportingProcessService; +import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; +import org.glassfish.jersey.internal.util.collection.MultivaluedStringMap; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class RunreportsApiResourceTest { + + @Mock + private PlatformSecurityContext platformSecurityContext; + + @Mock + private ReadReportingService readReportingService; + + @Mock + private ReportingProcessServiceProvider reportingProcessServiceProvider; + + @Mock + private ReportingProcessService reportingProcessService; + + @Mock + private UriInfo uriInfo; + + @InjectMocks + private RunreportsApiResource runreportsApiResource; + + @Test + void templateQueryParamIsTreatedAsParameterTypeRequest() { + // given + String reportName = "Active Loans - Details"; + MultivaluedStringMap params = new MultivaluedStringMap(); + params.putSingle("template", "true"); + given(uriInfo.getQueryParameters()).willReturn(params); + + // Reporting process service wiring + given(readReportingService.getReportType(reportName, false, true)).willReturn("Table"); + given(reportingProcessServiceProvider.findReportingProcessService("Table")).willReturn(reportingProcessService); + given(reportingProcessService.processRequest(any(), any())).willReturn(Response.ok().build()); + + // when + Response response = runreportsApiResource.runReport(reportName, uriInfo, false); + + // then + assertThat(response.getStatus()).isEqualTo(Response.Status.OK.getStatusCode()); + + // and the downstream services receive parameterType propagated from template + ArgumentCaptor> captor = ArgumentCaptor.forClass(jakarta.ws.rs.core.MultivaluedMap.class); + verify(reportingProcessService).processRequest(any(), captor.capture()); + assertThat(captor.getValue().getFirst("parameterType")).isEqualTo("true"); + } +}