1919import io .flamingock .support .domain .AuditEntryDefinition ;
2020import io .flamingock .support .validation .error .CountMismatchError ;
2121import io .flamingock .support .validation .error .FieldMismatchError ;
22+ import io .flamingock .support .validation .error .MissingEntryError ;
23+ import io .flamingock .support .validation .error .UnexpectedEntryError ;
2224import io .flamingock .support .validation .error .ValidationResult ;
2325import org .junit .jupiter .api .BeforeEach ;
26+ import org .junit .jupiter .api .DisplayName ;
2427import org .junit .jupiter .api .Test ;
2528
2629import java .time .LocalDateTime ;
3235import static io .flamingock .internal .common .core .audit .AuditEntry .Status .APPLIED ;
3336import static io .flamingock .internal .common .core .audit .AuditEntry .Status .FAILED ;
3437import static io .flamingock .support .domain .AuditEntryDefinition .APPLIED ;
38+ import static io .flamingock .support .domain .AuditEntryDefinition .FAILED ;
3539import static org .junit .jupiter .api .Assertions .*;
3640
3741class 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