Skip to content

Commit 4d89588

Browse files
committed
feat: flamingock test support AuditSequenceStrictValidator changes after code review
1 parent 087445a commit 4d89588

File tree

2 files changed

+67
-19
lines changed

2 files changed

+67
-19
lines changed

core/flamingock-test-support/src/main/java/io/flamingock/support/validation/impl/AuditSequenceStrictValidator.java

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
import io.flamingock.support.domain.AuditEntryDefinition;
2121
import io.flamingock.support.validation.SimpleValidator;
2222
import io.flamingock.support.validation.error.CountMismatchError;
23+
import io.flamingock.support.validation.error.FieldMismatchError;
24+
import io.flamingock.support.validation.error.MissingEntryError;
25+
import io.flamingock.support.validation.error.UnexpectedEntryError;
2326
import io.flamingock.support.validation.error.ValidationError;
2427
import io.flamingock.support.validation.error.ValidationResult;
2528

@@ -68,33 +71,50 @@ public AuditSequenceStrictValidator(AuditStore<?> auditStore, AuditEntryDefiniti
6871

6972
@Override
7073
public ValidationResult validate() {
71-
// Check count
72-
if (expectedExpectations.size() != actualEntries.size()) {
73-
return ValidationResult.failure(VALIDATOR_NAME,
74-
new CountMismatchError(getExpectedChangeIds(), getActualChangeIds()));
74+
List<ValidationError> allErrors = new ArrayList<>();
75+
76+
int expectedSize = expectedExpectations.size();
77+
int actualSize = actualEntries.size();
78+
79+
if (expectedSize != actualSize) {
80+
allErrors.add(new CountMismatchError(getExpectedChangeIds(), getActualChangeIds()));
81+
}
82+
83+
allErrors.addAll(getValidationErrors(expectedExpectations, actualEntries));
84+
85+
if (expectedSize > actualSize) {
86+
for (int i = actualSize; i < expectedSize; i++) {
87+
AuditEntryDefinition def = expectedExpectations.get(i).getDefinition();
88+
allErrors.add(new MissingEntryError(i, def.getChangeId(), def.getState()));
89+
}
7590
}
7691

77-
// Validate each entry in sequence
78-
List<ValidationError> allErrors = getValidationErrors(expectedExpectations, actualEntries);
92+
if (expectedSize < actualSize) {
93+
for (int i = expectedSize; i < actualSize; i++) {
94+
AuditEntry actual = actualEntries.get(i);
95+
allErrors.add(new UnexpectedEntryError(i, actual.getTaskId(), actual.getState()));
96+
}
97+
}
7998

8099
if (allErrors.isEmpty()) {
81100
return ValidationResult.success(VALIDATOR_NAME);
82101
}
83102

84-
return ValidationResult.failure(VALIDATOR_NAME, allErrors.toArray(
85-
new io.flamingock.support.validation.error.ValidationError[0]));
103+
return ValidationResult.failure(VALIDATOR_NAME, allErrors.toArray(new ValidationError[0]));
86104
}
87105

88-
private static List<ValidationError> getValidationErrors(List<AuditEntryExpectation> expectedExpectations, List<AuditEntry> actualEntries) {
106+
private static List<ValidationError> getValidationErrors(List<AuditEntryExpectation> expectedEntries, List<AuditEntry> actualEntries) {
89107
List<ValidationError> allErrors = new ArrayList<>();
90-
for (int i = 0; i < expectedExpectations.size(); i++) {
91-
AuditEntryExpectation expected = expectedExpectations.get(i);
108+
if (expectedEntries == null || expectedEntries.isEmpty()) {
109+
return allErrors;
110+
}
111+
int actualSize = actualEntries != null ? actualEntries.size() : 0;
112+
int limit = Math.min(expectedEntries.size(), actualSize);
113+
for (int i = 0; i < limit; i++) {
114+
AuditEntryExpectation expected = expectedEntries.get(i);
92115
AuditEntry actual = actualEntries.get(i);
93-
94-
List<io.flamingock.support.validation.error.FieldMismatchError> entryErrors = expected.compareWith(actual);
95-
if (!entryErrors.isEmpty()) {
96-
allErrors.addAll(entryErrors);
97-
}
116+
List<FieldMismatchError> entryErrors = expected.compareWith(actual);
117+
allErrors.addAll(entryErrors);
98118
}
99119
return allErrors;
100120
}

core/flamingock-test-support/src/test/java/io/flamingock/support/validation/impl/AuditSequenceStrictValidatorTest.java

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@
1919
import io.flamingock.support.domain.AuditEntryDefinition;
2020
import io.flamingock.support.validation.error.CountMismatchError;
2121
import io.flamingock.support.validation.error.FieldMismatchError;
22+
import io.flamingock.support.validation.error.MissingEntryError;
23+
import io.flamingock.support.validation.error.UnexpectedEntryError;
2224
import io.flamingock.support.validation.error.ValidationResult;
2325
import org.junit.jupiter.api.BeforeEach;
26+
import org.junit.jupiter.api.DisplayName;
2427
import org.junit.jupiter.api.Test;
2528

2629
import java.time.LocalDateTime;
@@ -32,6 +35,7 @@
3235
import static io.flamingock.internal.common.core.audit.AuditEntry.Status.APPLIED;
3336
import static io.flamingock.internal.common.core.audit.AuditEntry.Status.FAILED;
3437
import static io.flamingock.support.domain.AuditEntryDefinition.APPLIED;
38+
import static io.flamingock.support.domain.AuditEntryDefinition.FAILED;
3539
import static org.junit.jupiter.api.Assertions.*;
3640

3741
class AuditSequenceStrictValidatorTest {
@@ -48,11 +52,12 @@ void setUp() {
4852
}
4953

5054
@Test
55+
@DisplayName("AuditSequenceStrictValidator passes when entries match exactly")
5156
void shouldPassValidation_whenEntriesMatchExactly() {
5257
List<AuditEntryDefinition> expectedDefinitions = Arrays.asList(
5358
APPLIED("change-1"),
5459
APPLIED("change-2"),
55-
AuditEntryDefinition.FAILED("change-3")
60+
FAILED("change-3")
5661
);
5762

5863
AuditSequenceStrictValidator validator = new AuditSequenceStrictValidator(expectedDefinitions, actualEntries);
@@ -62,6 +67,7 @@ void shouldPassValidation_whenEntriesMatchExactly() {
6267
}
6368

6469
@Test
70+
@DisplayName("AuditSequenceStrictValidator fails when counts mismatch")
6571
void shouldFailValidation_whenCountMismatch() {
6672
List<AuditEntryDefinition> expectedDefinitions = Arrays.asList(
6773
APPLIED("change-1"),
@@ -72,11 +78,14 @@ void shouldFailValidation_whenCountMismatch() {
7278
ValidationResult result = validator.validate();
7379

7480
assertFalse(result.isSuccess());
75-
assertEquals(1, result.getErrors().size());
76-
assertInstanceOf(CountMismatchError.class, result.getErrors().get(0));
81+
assertEquals(2, result.getErrors().size());
82+
assertTrue(result.getErrors().stream().anyMatch(e -> e instanceof CountMismatchError));
83+
assertTrue(result.getErrors().stream().anyMatch(e -> e instanceof UnexpectedEntryError));
7784
}
7885

86+
7987
@Test
88+
@DisplayName("AuditSequenceStrictValidator fails when a field status mismatches")
8089
void shouldFailValidation_whenStatusMismatch() {
8190
List<AuditEntryDefinition> expectedDefinitions = Arrays.asList(
8291
APPLIED("change-1"),
@@ -96,6 +105,7 @@ void shouldFailValidation_whenStatusMismatch() {
96105
}
97106

98107
@Test
108+
@DisplayName("AuditSequenceStrictValidator fails when changeId mismatches")
99109
void shouldFailValidation_whenChangeIdMismatch() {
100110
List<AuditEntryDefinition> expectedDefinitions = Arrays.asList(
101111
APPLIED("change-1"),
@@ -115,6 +125,7 @@ void shouldFailValidation_whenChangeIdMismatch() {
115125
}
116126

117127
@Test
128+
@DisplayName("AuditSequenceStrictValidator fails when an expected entry is missing (count + missing entry error)")
118129
void shouldFailValidation_whenMissingEntry() {
119130
List<AuditEntry> actualEntriesSubset = Arrays.asList(
120131
createAuditEntry("change-1", APPLIED),
@@ -132,9 +143,17 @@ void shouldFailValidation_whenMissingEntry() {
132143

133144
assertFalse(result.isSuccess());
134145
assertTrue(result.getErrors().stream().anyMatch(e -> e instanceof CountMismatchError));
146+
assertTrue(result.getErrors().stream().anyMatch(e -> e instanceof MissingEntryError));
147+
MissingEntryError missing = (MissingEntryError) result.getErrors().stream()
148+
.filter(e -> e instanceof MissingEntryError)
149+
.findFirst()
150+
.orElseThrow(() -> new AssertionError("Expected a MissingEntryError but none was found"));
151+
assertEquals(2, missing.getExpectedIndex());
152+
assertEquals("change-3", missing.getExpectedChangeId());
135153
}
136154

137155
@Test
156+
@DisplayName("AuditSequenceStrictValidator fails when there is an unexpected actual entry (count + unexpected entry error)")
138157
void shouldFailValidation_whenUnexpectedEntry() {
139158
List<AuditEntry> actualEntriesExtra = Arrays.asList(
140159
createAuditEntry("change-1", APPLIED),
@@ -154,9 +173,17 @@ void shouldFailValidation_whenUnexpectedEntry() {
154173

155174
assertFalse(result.isSuccess());
156175
assertTrue(result.getErrors().stream().anyMatch(e -> e instanceof CountMismatchError));
176+
assertTrue(result.getErrors().stream().anyMatch(e -> e instanceof UnexpectedEntryError));
177+
UnexpectedEntryError unexpected = (UnexpectedEntryError) result.getErrors().stream()
178+
.filter(e -> e instanceof UnexpectedEntryError)
179+
.findFirst()
180+
.orElseThrow(() -> new AssertionError("Expected an UnexpectedEntryError but none was found"));
181+
assertEquals(3, unexpected.getIndex());
182+
assertEquals("change-4", unexpected.getActualChangeId());
157183
}
158184

159185
@Test
186+
@DisplayName("AuditSequenceStrictValidator passes when optional fields match")
160187
void shouldPassValidation_whenOptionalFieldsMatch() {
161188
AuditEntry actualWithOptionalFields = new AuditEntry(
162189
"exec-1",
@@ -199,6 +226,7 @@ void shouldPassValidation_whenOptionalFieldsMatch() {
199226
}
200227

201228
@Test
229+
@DisplayName("AuditSequenceStrictValidator fails when an optional field mismatches")
202230
void shouldFailValidation_whenOptionalFieldMismatch() {
203231
AuditEntry actualEntry = new AuditEntry(
204232
"exec-1",

0 commit comments

Comments
 (0)