From cd3d8a7ce1a1c9157c48b735879d6882bfa2e220 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Wed, 22 Apr 2026 12:44:33 +0200 Subject: [PATCH 01/14] Add `AttachmentService` test suite --- .../alfs/services/AttachmentServiceTest.java | 104 ++++++++++++++++++ .../alfs/services/AuthServiceTest.java | 1 - .../alfs/services/TicketServiceTest.java | 1 - 3 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 src/test/java/org/example/alfs/services/AttachmentServiceTest.java diff --git a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java new file mode 100644 index 0000000..b0d1386 --- /dev/null +++ b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java @@ -0,0 +1,104 @@ +package org.example.alfs.services; + +import org.example.alfs.entities.Attachment; +import org.example.alfs.entities.Ticket; +import org.example.alfs.entities.User; +import org.example.alfs.enums.Role; +import org.example.alfs.repositories.AttachmentRepository; +import org.example.alfs.repositories.TicketRepository; +import org.example.alfs.security.SecurityUtils; +import org.example.alfs.services.storage.MinioStorageService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class AttachmentServiceTest { + + @Mock + private MinioStorageService storageService; + @Mock + private AttachmentRepository attachmentRepository; + @Mock + private TicketRepository ticketRepository; + @Mock + private AuditService auditService; + @Mock + private SecurityUtils securityUtils; + + @InjectMocks + private AttachmentService attachmentService; + + private Ticket ticket; + private User admin; + private User investigator; + private User reporter; + private MultipartFile file; + + @BeforeEach + void setUp() { + admin = new User(); + admin.setId(100L); + admin.setRole(Role.ADMIN); + + investigator = new User(); + investigator.setId(200L); + investigator.setRole(Role.INVESTIGATOR); + + reporter = new User(); + reporter.setId(300L); + reporter.setRole(Role.REPORTER); + + ticket = new Ticket(); + ticket.setId(10L); + ticket.setReporter(reporter); + ticket.setInvestigator(investigator); + ticket.setReporterToken("valid-token"); + + file = mock(MultipartFile.class); + } + + @Nested + @DisplayName("uploadToTicket tests") + class UploadToTicketTest { + + @Test + @DisplayName("Authenticated user uploads to valid ticket") + void authenticatedUser_shouldUploadSuccessfully_whenValidTicket() throws Exception { + when(ticketRepository.findById(10L)).thenReturn(Optional.of(ticket)); + when(storageService.upload(file)).thenReturn("s3-key"); + when(file.getOriginalFilename()).thenReturn("report.pdf"); + + Attachment result = attachmentService.uploadToTicket(10L, file, admin, null); + + assertThat(result.getFileName()).isEqualTo("report.pdf"); + assertThat(result.getS3Key()).isEqualTo("s3-key"); + verify(attachmentRepository).save(any(Attachment.class)); + } + + @Test + @DisplayName("Anonymous user uploads to valid ticket") + void anonymousUser_shouldUploadSuccessfully_whenValidToken() throws Exception { + when(ticketRepository.findByReporterToken("valid-token")).thenReturn(Optional.of(ticket)); + when(storageService.upload(file)).thenReturn("s3-key"); + when(file.getOriginalFilename()).thenReturn("evidence.pdf"); + + Attachment result = attachmentService.uploadToTicket(10L, file, null, "valid-token"); + + assertThat(result.getFileName()).isEqualTo("evidence.pdf"); + verify(attachmentRepository).save(any(Attachment.class)); + } + } +} \ No newline at end of file diff --git a/src/test/java/org/example/alfs/services/AuthServiceTest.java b/src/test/java/org/example/alfs/services/AuthServiceTest.java index efa613a..09ca628 100644 --- a/src/test/java/org/example/alfs/services/AuthServiceTest.java +++ b/src/test/java/org/example/alfs/services/AuthServiceTest.java @@ -28,7 +28,6 @@ class AuthServiceTest { @Mock private UserRepository userRepository; - @Mock private PasswordEncoder passwordEncoder; diff --git a/src/test/java/org/example/alfs/services/TicketServiceTest.java b/src/test/java/org/example/alfs/services/TicketServiceTest.java index 8852b86..36b54d4 100644 --- a/src/test/java/org/example/alfs/services/TicketServiceTest.java +++ b/src/test/java/org/example/alfs/services/TicketServiceTest.java @@ -41,7 +41,6 @@ class TicketServiceTest { UserRepository userRepository; @Mock SecurityUtils securityUtils; - @Mock AuditService auditService; From d4765cd4d8a8523006f0b4b229fd4f6f0c176d5e Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Wed, 22 Apr 2026 13:23:13 +0200 Subject: [PATCH 02/14] Add tests for unauthorized token scenarios in `AttachmentServiceTest` --- .../alfs/services/AttachmentServiceTest.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java index b0d1386..094e73c 100644 --- a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java +++ b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java @@ -16,7 +16,9 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.HttpStatus; import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.server.ResponseStatusException; import java.util.Optional; @@ -100,5 +102,25 @@ void anonymousUser_shouldUploadSuccessfully_whenValidToken() throws Exception { assertThat(result.getFileName()).isEqualTo("evidence.pdf"); verify(attachmentRepository).save(any(Attachment.class)); } + + @Test + @DisplayName("Anonymous user with no token should throw Unauthorized") + void anonymousUser_missingToken_throwsUnauthorized() { + ResponseStatusException ex = assertThrows(ResponseStatusException.class, + () -> attachmentService.uploadToTicket(10L, file, null, null)); + + assertThat(ex.getStatusCode()).isEqualTo(HttpStatus.UNAUTHORIZED); + verifyNoInteractions(storageService); + } + + @Test + @DisplayName("Anonymous user with blank token should throw Unauthorized") + void anonymousUser_blankToken_throwsUnauthorized() { + ResponseStatusException ex = assertThrows(ResponseStatusException.class, + () -> attachmentService.uploadToTicket(10L, file, null, " ")); + + assertThat(ex.getStatusCode()).isEqualTo(HttpStatus.UNAUTHORIZED); + verifyNoInteractions(storageService); + } } } \ No newline at end of file From 52b4efea34cc397ea13a340f528b4387002a30cb Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Wed, 22 Apr 2026 13:25:24 +0200 Subject: [PATCH 03/14] Add test for "ticket not found" scenario in `AttachmentServiceTest` --- .../example/alfs/services/AttachmentServiceTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java index 094e73c..34479ae 100644 --- a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java +++ b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java @@ -122,5 +122,16 @@ void anonymousUser_blankToken_throwsUnauthorized() { assertThat(ex.getStatusCode()).isEqualTo(HttpStatus.UNAUTHORIZED); verifyNoInteractions(storageService); } + + @Test + @DisplayName("Ticket not found should throw Not Found") + void ticketNotFound_throwsNotFound() { + when(ticketRepository.findById(11L)).thenReturn(Optional.empty()); + + ResponseStatusException ex = assertThrows(ResponseStatusException.class, + () -> attachmentService.uploadToTicket(11L, file, admin, null)); + + assertThat(ex.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND); + } } } \ No newline at end of file From a992cc9e97722a0af7294ef687af62b3835ddcee Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Wed, 22 Apr 2026 13:28:22 +0200 Subject: [PATCH 04/14] Add test for handling null file name in `AttachmentServiceTest` --- .../example/alfs/services/AttachmentServiceTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java index 34479ae..767f6d9 100644 --- a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java +++ b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java @@ -133,5 +133,17 @@ void ticketNotFound_throwsNotFound() { assertThat(ex.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND); } + + @Test + @DisplayName("Null file name should fall back to default name") + void nullFileName_fallsBackToDefaultName() throws Exception { + when(ticketRepository.findById(10L)).thenReturn(Optional.of(ticket)); + when(storageService.upload(file)).thenReturn("s3-key"); + when(file.getOriginalFilename()).thenReturn(null); + + Attachment result = attachmentService.uploadToTicket(10L, file, admin, null); + + assertThat(result.getFileName()).isEqualTo("file"); + } } } \ No newline at end of file From ccae95f769ae7cf363dbb5789860b20de143c4be Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Wed, 22 Apr 2026 13:34:35 +0200 Subject: [PATCH 05/14] Add test for handling failed save by deleting uploaded object in `AttachmentServiceTest` --- .../alfs/services/AttachmentServiceTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java index 767f6d9..40e495d 100644 --- a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java +++ b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java @@ -145,5 +145,19 @@ void nullFileName_fallsBackToDefaultName() throws Exception { assertThat(result.getFileName()).isEqualTo("file"); } + + @Test + @DisplayName("When save fails uploaded object should be deleted from storage") + void whenSaveFails_deletesUploadedObjectFromStorage() throws Exception { + when(ticketRepository.findById(10L)).thenReturn(Optional.of(ticket)); + when(storageService.upload(file)).thenReturn("s3-key"); + when(file.getOriginalFilename()).thenReturn("doc.pdf"); + doThrow(new RuntimeException("DB down")).when(attachmentRepository).save(any()); + + assertThrows(RuntimeException.class, + () -> attachmentService.uploadToTicket(10L, file, admin, null)); + + verify(storageService).delete("s3-key"); + } } } \ No newline at end of file From e6ed1d77805ca5c45642911d5a082ec41729a569 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Wed, 22 Apr 2026 13:43:32 +0200 Subject: [PATCH 06/14] Add `checkAccess` tests in `AttachmentServiceTest` --- .../alfs/services/AttachmentServiceTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java index 40e495d..d5bd71d 100644 --- a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java +++ b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java @@ -26,6 +26,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; +@DisplayName("AttachmentService Test") @ExtendWith(MockitoExtension.class) class AttachmentServiceTest { @@ -160,4 +161,31 @@ void whenSaveFails_deletesUploadedObjectFromStorage() throws Exception { verify(storageService).delete("s3-key"); } } + + @Nested + @DisplayName("checkAccess tests") + class CheckAccessTest { + + @Test + @DisplayName("Admin always allowed") + void admin_alwaysAllowed() throws Exception { + when(ticketRepository.findById(10L)).thenReturn(Optional.of(ticket)); + when(storageService.upload(file)).thenReturn("s3-key"); + when(file.getOriginalFilename()).thenReturn("file.pdf"); + + assertDoesNotThrow( + () -> attachmentService.uploadToTicket(10L, file, admin, null)); + } + + @Test + @DisplayName("Assigned investigator allowed") + void assignedInvestigator_allowed() throws Exception { + when(ticketRepository.findById(10L)).thenReturn(Optional.of(ticket)); + when(storageService.upload(file)).thenReturn("s3-key"); + when(file.getOriginalFilename()).thenReturn("f.pdf"); + + assertDoesNotThrow(() -> + attachmentService.uploadToTicket(10L, file, investigator, null)); + } + } } \ No newline at end of file From 93394769d0fe4f9443d56d1fd3a72ad053b06871 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Wed, 22 Apr 2026 13:46:24 +0200 Subject: [PATCH 07/14] Add test for "unassigned investigator denied" in `AttachmentServiceTest` --- .../alfs/services/AttachmentServiceTest.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java index d5bd71d..ba7beb3 100644 --- a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java +++ b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java @@ -187,5 +187,20 @@ void assignedInvestigator_allowed() throws Exception { assertDoesNotThrow(() -> attachmentService.uploadToTicket(10L, file, investigator, null)); } + + @Test + @DisplayName("Unassigned investigator denied") + void unassignedInvestigator_throwsForbidden() { + User otherInvestigator = new User(); + otherInvestigator.setId(201L); + otherInvestigator.setRole(Role.INVESTIGATOR); + + when(ticketRepository.findById(10L)).thenReturn(Optional.of(ticket)); + + ResponseStatusException ex = assertThrows(ResponseStatusException.class, + () -> attachmentService.uploadToTicket(10L, file, otherInvestigator, null)); + + assertThat(ex.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN); + } } } \ No newline at end of file From d1ec6379cdb9327933c4689a5c7351d72418161c Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Wed, 22 Apr 2026 14:17:45 +0200 Subject: [PATCH 08/14] Add tests for reporter access scenarios in `AttachmentServiceTest` --- .../alfs/services/AttachmentServiceTest.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java index ba7beb3..3e165a3 100644 --- a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java +++ b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java @@ -202,5 +202,31 @@ void unassignedInvestigator_throwsForbidden() { assertThat(ex.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN); } + + @Test + @DisplayName("Reporter who owns ticket allowed") + void reporterWhoOwnsTicket_allowed() throws Exception { + when(ticketRepository.findById(10L)).thenReturn(Optional.of(ticket)); + when(storageService.upload(file)).thenReturn("s3-key"); + when(file.getOriginalFilename()).thenReturn("f.pdf"); + + assertDoesNotThrow(() -> + attachmentService.uploadToTicket(10L, file, reporter, null)); + } + + @Test + @DisplayName("Reporter who does not own ticket denied") + void reporterWhoDoesNotOwnTicket_throwsForbidden() { + User otherReporter = new User(); + otherReporter.setId(301L); + otherReporter.setRole(Role.REPORTER); + + when(ticketRepository.findById(10L)).thenReturn(Optional.of(ticket)); + + ResponseStatusException ex = assertThrows(ResponseStatusException.class, + () -> attachmentService.uploadToTicket(10L, file, otherReporter, null)); + + assertThat(ex.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN); + } } } \ No newline at end of file From ee125d339b9bdf5bcf3aaa0f16c1eb53c28e91f2 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Wed, 22 Apr 2026 14:24:57 +0200 Subject: [PATCH 09/14] Update `AttachmentServiceTest` to rename test cases and add scenarios for anonymous reporter token validation --- .../alfs/services/AttachmentServiceTest.java | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java index 3e165a3..e3f9f6b 100644 --- a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java +++ b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java @@ -78,8 +78,8 @@ void setUp() { class UploadToTicketTest { @Test - @DisplayName("Authenticated user uploads to valid ticket") - void authenticatedUser_shouldUploadSuccessfully_whenValidTicket() throws Exception { + @DisplayName("Authenticated reporter uploads to valid ticket") + void authenticatedReporter_withValidTicket_shouldUploadSuccessfully() throws Exception { when(ticketRepository.findById(10L)).thenReturn(Optional.of(ticket)); when(storageService.upload(file)).thenReturn("s3-key"); when(file.getOriginalFilename()).thenReturn("report.pdf"); @@ -92,8 +92,8 @@ void authenticatedUser_shouldUploadSuccessfully_whenValidTicket() throws Excepti } @Test - @DisplayName("Anonymous user uploads to valid ticket") - void anonymousUser_shouldUploadSuccessfully_whenValidToken() throws Exception { + @DisplayName("Anonymous reporter uploads to valid ticket") + void anonymousReporter_withValidToken_shouldUploadSuccessfully() throws Exception { when(ticketRepository.findByReporterToken("valid-token")).thenReturn(Optional.of(ticket)); when(storageService.upload(file)).thenReturn("s3-key"); when(file.getOriginalFilename()).thenReturn("evidence.pdf"); @@ -105,8 +105,8 @@ void anonymousUser_shouldUploadSuccessfully_whenValidToken() throws Exception { } @Test - @DisplayName("Anonymous user with no token should throw Unauthorized") - void anonymousUser_missingToken_throwsUnauthorized() { + @DisplayName("Anonymous reporter with no token should throw Unauthorized") + void anonymousReporter_withMissingToken_throwsUnauthorized() { ResponseStatusException ex = assertThrows(ResponseStatusException.class, () -> attachmentService.uploadToTicket(10L, file, null, null)); @@ -115,8 +115,8 @@ void anonymousUser_missingToken_throwsUnauthorized() { } @Test - @DisplayName("Anonymous user with blank token should throw Unauthorized") - void anonymousUser_blankToken_throwsUnauthorized() { + @DisplayName("Anonymous reporter with blank token should throw Unauthorized") + void anonymousReporter_withBlankToken_throwsUnauthorized() { ResponseStatusException ex = assertThrows(ResponseStatusException.class, () -> attachmentService.uploadToTicket(10L, file, null, " ")); @@ -228,5 +228,27 @@ void reporterWhoDoesNotOwnTicket_throwsForbidden() { assertThat(ex.getStatusCode()).isEqualTo(HttpStatus.FORBIDDEN); } + + @Test + @DisplayName("Anonymous reporter with valid token allowed") + void anonymousReporter_withCorrectToken_allowed() throws Exception { + when(ticketRepository.findByReporterToken("valid-token")).thenReturn(Optional.of(ticket)); + when(storageService.upload(file)).thenReturn("s3-key"); + when(file.getOriginalFilename()).thenReturn("f.pdf"); + + assertDoesNotThrow(() -> + attachmentService.uploadToTicket(10L, file, null, "valid-token")); + } + + @Test + @DisplayName("Anonymous reporter with invalid token denied") + void anonymousReporter_withWrongToken_throwsUnauthorized() { + when(ticketRepository.findByReporterToken("wrong-token")).thenReturn(Optional.empty()); + + ResponseStatusException ex = assertThrows(ResponseStatusException.class, + () -> attachmentService.uploadToTicket(10L, file, null, "wrong-token")); + + assertThat(ex.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND); + } } } \ No newline at end of file From 26425c0ddf4c2ce5a149afbd17f292c7daaa7025 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Wed, 22 Apr 2026 14:33:54 +0200 Subject: [PATCH 10/14] Add test for "anonymous reporter with missing token denied" in `AttachmentServiceTest` --- .../org/example/alfs/services/AttachmentServiceTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java index e3f9f6b..da90afc 100644 --- a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java +++ b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java @@ -250,5 +250,14 @@ void anonymousReporter_withWrongToken_throwsUnauthorized() { assertThat(ex.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND); } + + @Test + @DisplayName("Anonymous reporter with no token denied") + void anonymousReporter_withMissingToken_throwsUnauthorized() { + ResponseStatusException ex = assertThrows(ResponseStatusException.class, + () -> attachmentService.uploadToTicket(10L, file, null, null)); + + assertThat(ex.getStatusCode()).isEqualTo(HttpStatus.UNAUTHORIZED); + } } } \ No newline at end of file From aac83f821df137d3a5825ef10b25998a0e6ff6b0 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Wed, 22 Apr 2026 14:35:01 +0200 Subject: [PATCH 11/14] Add TODO comment in `AttachmentService` regarding unused `getCurrentUserOrNull` method --- src/main/java/org/example/alfs/services/AttachmentService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/example/alfs/services/AttachmentService.java b/src/main/java/org/example/alfs/services/AttachmentService.java index dc6cd72..daddb6e 100644 --- a/src/main/java/org/example/alfs/services/AttachmentService.java +++ b/src/main/java/org/example/alfs/services/AttachmentService.java @@ -96,6 +96,7 @@ public Attachment uploadToTicket(Long ticketId, MultipartFile file, User user, S } } + // TODO: Move to a separate service? Or delete? No usages found. private User getCurrentUserOrNull() { try { return securityUtils.getCurrentUser(); From 0a137f0200454ddb869fb560333e649406800c40 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Wed, 22 Apr 2026 14:46:24 +0200 Subject: [PATCH 12/14] Update `AttachmentServiceTest` to validate `uploadedBy` field and adjust test for invalid reporter token to return Not Found --- .../org/example/alfs/services/AttachmentServiceTest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java index da90afc..10d8e91 100644 --- a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java +++ b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java @@ -84,10 +84,11 @@ void authenticatedReporter_withValidTicket_shouldUploadSuccessfully() throws Exc when(storageService.upload(file)).thenReturn("s3-key"); when(file.getOriginalFilename()).thenReturn("report.pdf"); - Attachment result = attachmentService.uploadToTicket(10L, file, admin, null); + Attachment result = attachmentService.uploadToTicket(10L, file, reporter, null); assertThat(result.getFileName()).isEqualTo("report.pdf"); assertThat(result.getS3Key()).isEqualTo("s3-key"); + assertThat(result.getUploadedBy()).isSameAs(reporter); verify(attachmentRepository).save(any(Attachment.class)); } @@ -241,8 +242,8 @@ void anonymousReporter_withCorrectToken_allowed() throws Exception { } @Test - @DisplayName("Anonymous reporter with invalid token denied") - void anonymousReporter_withWrongToken_throwsUnauthorized() { + @DisplayName("Anonymous reporter with invalid token should return Not Found") + void anonymousReporter_withWrongToken_throwsNotFound() { when(ticketRepository.findByReporterToken("wrong-token")).thenReturn(Optional.empty()); ResponseStatusException ex = assertThrows(ResponseStatusException.class, From a09734a9d68f7f0b8caa7c565f48e216b4f8ac76 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Fri, 24 Apr 2026 08:32:03 +0200 Subject: [PATCH 13/14] Add assertions for `s3Key` and repository save in `AttachmentServiceTest` --- .../java/org/example/alfs/services/AttachmentServiceTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java index 10d8e91..4b0233c 100644 --- a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java +++ b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java @@ -145,7 +145,9 @@ void nullFileName_fallsBackToDefaultName() throws Exception { Attachment result = attachmentService.uploadToTicket(10L, file, admin, null); + assertThat(result.getS3Key()).isEqualTo("s3-key"); assertThat(result.getFileName()).isEqualTo("file"); + verify(attachmentRepository).save(any(Attachment.class)); } @Test From 12e31030a8241217c758605531b20f5c51c17de2 Mon Sep 17 00:00:00 2001 From: Simon Forsberg Date: Fri, 24 Apr 2026 08:36:57 +0200 Subject: [PATCH 14/14] Remove redundant test for anonymous reporter missing token in `AttachmentServiceTest` --- .../org/example/alfs/services/AttachmentServiceTest.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java index 4b0233c..d6bbb0c 100644 --- a/src/test/java/org/example/alfs/services/AttachmentServiceTest.java +++ b/src/test/java/org/example/alfs/services/AttachmentServiceTest.java @@ -253,14 +253,5 @@ void anonymousReporter_withWrongToken_throwsNotFound() { assertThat(ex.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND); } - - @Test - @DisplayName("Anonymous reporter with no token denied") - void anonymousReporter_withMissingToken_throwsUnauthorized() { - ResponseStatusException ex = assertThrows(ResponseStatusException.class, - () -> attachmentService.uploadToTicket(10L, file, null, null)); - - assertThat(ex.getStatusCode()).isEqualTo(HttpStatus.UNAUTHORIZED); - } } } \ No newline at end of file