From 05686021637bb7d1f25c4cd32109f528bb14b03b Mon Sep 17 00:00:00 2001 From: Ludy Date: Thu, 13 Mar 2025 11:20:55 +0100 Subject: [PATCH] Add: Validation for rotation angle and create unit tests for RotationController (#3162) # Description of Changes Please provide a summary of the changes, including: - What was changed - Why the change was made - Any challenges encountered Closes #(issue_number) --- ## Checklist ### General - [x] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [x] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [x] I have performed a self-review of my own code - [x] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [x] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. --- .github/labeler-config.yml | 3 +- .../controller/api/RotationController.java | 6 ++ .../api/RotationControllerTest.java | 74 +++++++++++++++++++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 src/test/java/stirling/software/SPDF/controller/api/RotationControllerTest.java diff --git a/.github/labeler-config.yml b/.github/labeler-config.yml index 73f92aaa3..a0a634840 100644 --- a/.github/labeler-config.yml +++ b/.github/labeler-config.yml @@ -72,7 +72,8 @@ Devtools: Test: - changed-files: - any-glob-to-any-file: 'cucumber/**/*' - - any-glob-to-any-file: 'src/test**/*' + - any-glob-to-any-file: 'src/test/**/*' + - any-glob-to-any-file: 'src/testing/**/*' - any-glob-to-any-file: '.pre-commit-config' - any-glob-to-any-file: '.github/workflows/pre_commit.yml' - any-glob-to-any-file: '.github/workflows/scorecards.yml' diff --git a/src/main/java/stirling/software/SPDF/controller/api/RotationController.java b/src/main/java/stirling/software/SPDF/controller/api/RotationController.java index 41891c7f5..b029450ef 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/RotationController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/RotationController.java @@ -43,6 +43,12 @@ public class RotationController { throws IOException { MultipartFile pdfFile = request.getFileInput(); Integer angle = request.getAngle(); + + // Validate the angle is a multiple of 90 + if (angle % 90 != 0) { + throw new IllegalArgumentException("Angle must be a multiple of 90"); + } + // Load the PDF document PDDocument document = pdfDocumentFactory.load(request); diff --git a/src/test/java/stirling/software/SPDF/controller/api/RotationControllerTest.java b/src/test/java/stirling/software/SPDF/controller/api/RotationControllerTest.java new file mode 100644 index 000000000..edd9cada1 --- /dev/null +++ b/src/test/java/stirling/software/SPDF/controller/api/RotationControllerTest.java @@ -0,0 +1,74 @@ +package stirling.software.SPDF.controller.api; + +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import java.io.IOException; +import org.apache.pdfbox.pdmodel.PDPageTree; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.ResponseEntity; +import org.springframework.mock.web.MockMultipartFile; +import stirling.software.SPDF.service.CustomPDFDocumentFactory; +import stirling.software.SPDF.model.api.general.RotatePDFRequest; + +@ExtendWith(MockitoExtension.class) +public class RotationControllerTest { + + @Mock private CustomPDFDocumentFactory pdfDocumentFactory; + + @InjectMocks private RotationController rotationController; + + @Test + public void testRotatePDF() throws IOException { + // Create a mock file + MockMultipartFile mockFile = + new MockMultipartFile("file", "test.pdf", "application/pdf", new byte[] {1, 2, 3}); + RotatePDFRequest request = new RotatePDFRequest(); + request.setFileInput(mockFile); + request.setAngle(90); + + PDDocument mockDocument = mock(PDDocument.class); + PDPageTree mockPages = mock(PDPageTree.class); + PDPage mockPage = mock(PDPage.class); + + when(pdfDocumentFactory.load(request)).thenReturn(mockDocument); + when(mockDocument.getPages()).thenReturn(mockPages); + when(mockPages.iterator()) + .thenReturn(java.util.Collections.singletonList(mockPage).iterator()); + when(mockPage.getRotation()).thenReturn(0); + + // Act + ResponseEntity response = rotationController.rotatePDF(request); + + // Assert + verify(mockPage).setRotation(90); + assertNotNull(response); + assertEquals(200, response.getStatusCode().value()); + } + + @Test + public void testRotatePDFInvalidAngle() throws IOException { + // Create a mock file + MockMultipartFile mockFile = + new MockMultipartFile("file", "test.pdf", "application/pdf", new byte[] {1, 2, 3}); + RotatePDFRequest request = new RotatePDFRequest(); + request.setFileInput(mockFile); + request.setAngle(45); // Invalid angle + + // Act & Assert: Controller direkt aufrufen und Exception erwarten + IllegalArgumentException exception = + assertThrows( + IllegalArgumentException.class, + () -> rotationController.rotatePDF(request)); + assertEquals("Angle must be a multiple of 90", exception.getMessage()); + } +}