From 16bcd0f73cadcf172be9e2221da0d110b0041d7a Mon Sep 17 00:00:00 2001 From: Marcel Date: Sat, 18 Apr 2026 09:55:22 +0200 Subject: [PATCH] fix(ocr): replace IllegalStateException with DomainException in triggerSenderTraining MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Consistent with triggerManualSenderTraining — both defensive paths now use DomainException.internal(OCR_TRAINING_CONFLICT) when the expected RUNNING row is not found after creation. Co-Authored-By: Claude Sonnet 4.6 --- .../familienarchiv/service/SenderModelService.java | 3 ++- .../familienarchiv/service/SenderModelServiceTest.java | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/org/raddatz/familienarchiv/service/SenderModelService.java b/backend/src/main/java/org/raddatz/familienarchiv/service/SenderModelService.java index d02caad4..e7881474 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/service/SenderModelService.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/service/SenderModelService.java @@ -154,7 +154,8 @@ public class SenderModelService { OcrTrainingRun run = Objects.requireNonNull(txTemplate.execute(status -> trainingRunRepository.findFirstByPersonIdAndStatus(personId, TrainingStatus.RUNNING) - .orElseThrow(() -> new IllegalStateException( + .orElseThrow(() -> DomainException.internal( + ErrorCode.OCR_TRAINING_CONFLICT, "Expected RUNNING row for person " + personId + " but none found")))); String runId = run.getId().toString(); diff --git a/backend/src/test/java/org/raddatz/familienarchiv/service/SenderModelServiceTest.java b/backend/src/test/java/org/raddatz/familienarchiv/service/SenderModelServiceTest.java index 20086e10..4f18701a 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/service/SenderModelServiceTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/service/SenderModelServiceTest.java @@ -297,6 +297,16 @@ class SenderModelServiceTest { verify(senderModelRepository, never()).save(any()); } + @Test + void triggerSenderTraining_throwsDomainException_whenRunningRowMissingAfterDispatch() { + when(trainingRunRepository.findFirstByPersonIdAndStatus(personId, TrainingStatus.RUNNING)) + .thenReturn(Optional.empty()); + + org.assertj.core.api.Assertions.assertThatThrownBy( + () -> service.triggerSenderTraining(personId, 0)) + .isInstanceOf(DomainException.class); + } + // ─── triggerSenderTraining — queue promotion ────────────────────────────── // ─── triggerManualSenderTraining ──────────────────────────────────────────