M4 AP-006 Persistenzkonsistenz und Bootstrap-Scope korrigieren
This commit is contained in:
@@ -12,6 +12,7 @@ import de.gecheckt.pdf.umbenenner.application.port.out.FailureCounters;
|
||||
import de.gecheckt.pdf.umbenenner.application.port.out.PersistenceLookupTechnicalFailure;
|
||||
import de.gecheckt.pdf.umbenenner.application.port.out.ProcessingAttempt;
|
||||
import de.gecheckt.pdf.umbenenner.application.port.out.ProcessingAttemptRepository;
|
||||
import de.gecheckt.pdf.umbenenner.application.port.out.UnitOfWorkPort;
|
||||
import de.gecheckt.pdf.umbenenner.domain.model.BatchRunContext;
|
||||
import de.gecheckt.pdf.umbenenner.domain.model.DocumentFingerprint;
|
||||
import de.gecheckt.pdf.umbenenner.domain.model.DocumentProcessingOutcome;
|
||||
@@ -32,6 +33,7 @@ import org.junit.jupiter.api.Test;
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
@@ -56,6 +58,7 @@ class M4DocumentProcessorTest {
|
||||
|
||||
private CapturingDocumentRecordRepository recordRepo;
|
||||
private CapturingProcessingAttemptRepository attemptRepo;
|
||||
private CapturingUnitOfWorkPort unitOfWorkPort;
|
||||
private M4DocumentProcessor processor;
|
||||
|
||||
private SourceDocumentCandidate candidate;
|
||||
@@ -67,7 +70,8 @@ class M4DocumentProcessorTest {
|
||||
void setUp() {
|
||||
recordRepo = new CapturingDocumentRecordRepository();
|
||||
attemptRepo = new CapturingProcessingAttemptRepository();
|
||||
processor = new M4DocumentProcessor(recordRepo, attemptRepo);
|
||||
unitOfWorkPort = new CapturingUnitOfWorkPort(recordRepo, attemptRepo);
|
||||
processor = new M4DocumentProcessor(recordRepo, attemptRepo, unitOfWorkPort);
|
||||
|
||||
candidate = new SourceDocumentCandidate(
|
||||
"test.pdf", 1024L, new SourceDocumentLocator("/tmp/test.pdf"));
|
||||
@@ -321,8 +325,8 @@ class M4DocumentProcessorTest {
|
||||
@Test
|
||||
void process_persistenceWriteFailure_doesNotThrow_batchContinues() {
|
||||
recordRepo.setLookupResult(new DocumentUnknown());
|
||||
// Make the attempt save throw
|
||||
attemptRepo.failOnSave = true;
|
||||
// Make the unit of work throw
|
||||
unitOfWorkPort.failOnExecute = true;
|
||||
|
||||
DocumentProcessingOutcome m3Outcome = new PreCheckPassed(
|
||||
candidate, new PdfExtractionSuccess("text", new PdfPageCount(1)));
|
||||
@@ -422,4 +426,45 @@ class M4DocumentProcessorTest {
|
||||
return List.copyOf(savedAttempts);
|
||||
}
|
||||
}
|
||||
|
||||
private static class CapturingUnitOfWorkPort implements UnitOfWorkPort {
|
||||
private final CapturingDocumentRecordRepository recordRepo;
|
||||
private final CapturingProcessingAttemptRepository attemptRepo;
|
||||
boolean failOnExecute = false;
|
||||
Consumer<TransactionOperations> lastOperations = null;
|
||||
|
||||
CapturingUnitOfWorkPort(CapturingDocumentRecordRepository recordRepo,
|
||||
CapturingProcessingAttemptRepository attemptRepo) {
|
||||
this.recordRepo = recordRepo;
|
||||
this.attemptRepo = attemptRepo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void executeInTransaction(Consumer<TransactionOperations> operations) {
|
||||
this.lastOperations = operations;
|
||||
if (failOnExecute) {
|
||||
throw new DocumentPersistenceException("Simulated transaction failure");
|
||||
}
|
||||
|
||||
// Execute the operations with mock transaction operations that delegate to repos
|
||||
TransactionOperations mockOps = new TransactionOperations() {
|
||||
@Override
|
||||
public void saveProcessingAttempt(ProcessingAttempt attempt) {
|
||||
attemptRepo.savedAttempts.add(attempt);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createDocumentRecord(DocumentRecord record) {
|
||||
recordRepo.createdRecords.add(record);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateDocumentRecord(DocumentRecord record) {
|
||||
recordRepo.updatedRecords.add(record);
|
||||
}
|
||||
};
|
||||
|
||||
operations.accept(mockOps);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import de.gecheckt.pdf.umbenenner.application.port.out.RunLockPort;
|
||||
import de.gecheckt.pdf.umbenenner.application.port.out.RunLockUnavailableException;
|
||||
import de.gecheckt.pdf.umbenenner.application.port.out.SourceDocumentAccessException;
|
||||
import de.gecheckt.pdf.umbenenner.application.port.out.SourceDocumentCandidatesPort;
|
||||
import de.gecheckt.pdf.umbenenner.application.port.out.UnitOfWorkPort;
|
||||
import de.gecheckt.pdf.umbenenner.application.service.M4DocumentProcessor;
|
||||
import de.gecheckt.pdf.umbenenner.domain.model.BatchRunContext;
|
||||
import de.gecheckt.pdf.umbenenner.domain.model.DocumentFingerprint;
|
||||
@@ -39,6 +40,7 @@ import java.time.Instant;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
@@ -615,7 +617,7 @@ class BatchRunProcessingUseCaseTest {
|
||||
*/
|
||||
private static class NoOpM4DocumentProcessor extends M4DocumentProcessor {
|
||||
NoOpM4DocumentProcessor() {
|
||||
super(new NoOpDocumentRecordRepository(), new NoOpProcessingAttemptRepository());
|
||||
super(new NoOpDocumentRecordRepository(), new NoOpProcessingAttemptRepository(), new NoOpUnitOfWorkPort());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -626,7 +628,7 @@ class BatchRunProcessingUseCaseTest {
|
||||
private int processCallCount = 0;
|
||||
|
||||
TrackingM4DocumentProcessor() {
|
||||
super(new NoOpDocumentRecordRepository(), new NoOpProcessingAttemptRepository());
|
||||
super(new NoOpDocumentRecordRepository(), new NoOpProcessingAttemptRepository(), new NoOpUnitOfWorkPort());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -692,4 +694,28 @@ class BatchRunProcessingUseCaseTest {
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
|
||||
/** No-op UnitOfWorkPort for use in test M4DocumentProcessor instances. */
|
||||
private static class NoOpUnitOfWorkPort implements UnitOfWorkPort {
|
||||
@Override
|
||||
public void executeInTransaction(Consumer<TransactionOperations> operations) {
|
||||
// No-op - just execute the operations directly without transaction
|
||||
operations.accept(new TransactionOperations() {
|
||||
@Override
|
||||
public void saveProcessingAttempt(ProcessingAttempt attempt) {
|
||||
// No-op
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createDocumentRecord(DocumentRecord record) {
|
||||
// No-op
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateDocumentRecord(DocumentRecord record) {
|
||||
// No-op
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user