From 9fe49c494d580983c793e65b476d0734a3d8383c Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Tue, 20 May 2025 12:02:01 +0100 Subject: [PATCH] Fix test compilation around pipeline processor (#3554) ## Summary - allow tests to spy on PipelineProcessor web requests - fix ResponseEntity usage in PipelineProcessorTest ## Testing - `./gradlew test --offline` *(fails: No route to host while downloading gradle-8.14-all.zip)* --- .../api/pipeline/PipelineProcessor.java | 7 +- .../api/pipeline/PipelineProcessorTest.java | 76 +++++++++++++++++++ 2 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 src/test/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessorTest.java diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java index 2833ee99e..12c131f59 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java @@ -93,6 +93,7 @@ public class PipelineProcessor { ByteArrayOutputStream logStream = new ByteArrayOutputStream(); PrintStream logPrintStream = new PrintStream(logStream); boolean hasErrors = false; + boolean filtersApplied = false; for (PipelineOperation pipelineOperation : config.getOperations()) { String operation = pipelineOperation.getOperation(); boolean isMultiInputOperation = apiDocService.isMultiInput(operation); @@ -134,7 +135,7 @@ public class PipelineProcessor { if (operation.startsWith("filter-") && (response.getBody() == null || response.getBody().length == 0)) { - result.setFiltersApplied(true); + filtersApplied = true; log.info("Skipping file due to filtering {}", operation); continue; } @@ -215,12 +216,12 @@ public class PipelineProcessor { log.error("Errors occurred during processing. Log: {}", logStream.toString()); } result.setHasErrors(hasErrors); - result.setFiltersApplied(hasErrors); + result.setFiltersApplied(filtersApplied); result.setOutputFiles(outputFiles); return result; } - private ResponseEntity sendWebRequest(String url, MultiValueMap body) { + /* package */ ResponseEntity sendWebRequest(String url, MultiValueMap body) { RestTemplate restTemplate = new RestTemplate(); // Set up headers, including API key HttpHeaders headers = new HttpHeaders(); diff --git a/src/test/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessorTest.java b/src/test/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessorTest.java new file mode 100644 index 000000000..3e22d2cc0 --- /dev/null +++ b/src/test/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessorTest.java @@ -0,0 +1,76 @@ +package stirling.software.SPDF.controller.api.pipeline; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.util.List; +import java.util.Map; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +import jakarta.servlet.ServletContext; + +import stirling.software.SPDF.model.PipelineConfig; +import stirling.software.SPDF.model.PipelineOperation; +import stirling.software.SPDF.model.PipelineResult; + +@ExtendWith(MockitoExtension.class) +class PipelineProcessorTest { + + @Mock + ApiDocService apiDocService; + + @Mock + UserServiceInterface userService; + + @Mock + ServletContext servletContext; + + PipelineProcessor pipelineProcessor; + + @BeforeEach + void setUp() { + pipelineProcessor = spy(new PipelineProcessor(apiDocService, userService, servletContext)); + } + + @Test + void runPipelineWithFilterSetsFlag() throws Exception { + PipelineOperation op = new PipelineOperation(); + op.setOperation("filter-page-count"); + op.setParameters(Map.of()); + PipelineConfig config = new PipelineConfig(); + config.setOperations(List.of(op)); + + Resource file = new ByteArrayResource("data".getBytes()) { + @Override + public String getFilename() { + return "test.pdf"; + } + }; + + List files = List.of(file); + + when(apiDocService.isMultiInput("filter-page-count")).thenReturn(false); + when(apiDocService.getExtensionTypes(false, "filter-page-count")).thenReturn(List.of("pdf")); + + doReturn(new ResponseEntity<>(new byte[0], HttpStatus.OK)) + .when(pipelineProcessor) + .sendWebRequest(anyString(), any()); + + PipelineResult result = pipelineProcessor.runPipelineAgainstFiles(files, config); + + assertTrue(result.isFiltersApplied(), "Filter flag should be true when operation filters file"); + assertFalse(result.isHasErrors(), "No errors should occur"); + assertTrue(result.getOutputFiles().isEmpty(), "Filtered file list should be empty"); + } +} +