@@ -451,10 +451,10 @@ fn initial_supersession_authenticates_predecessor_immediately_before_archive() {
451451 "hetz" ,
452452 "hetz.worker" ,
453453 "gh-ci" ,
454- "passed" ,
454+ "initial- passed" ,
455455 Some ( "pr-1" ) ,
456- Some ( "passed" ) ,
457- "passed" ,
456+ Some ( "initial passed" ) ,
457+ "initial passed" ,
458458 true ,
459459 )
460460 . unwrap_err ( ) ;
@@ -470,7 +470,7 @@ fn initial_supersession_authenticates_predecessor_immediately_before_archive() {
470470 message:: list_inbox( & inbox)
471471 . unwrap( )
472472 . iter( )
473- . any( |message| { message. event_id. as_deref( ) == Some ( "passed" ) } )
473+ . any( |message| { message. event_id. as_deref( ) == Some ( "initial- passed" ) } )
474474 ) ;
475475}
476476
@@ -869,6 +869,92 @@ fn pending_supersession_authenticates_its_predecessor_before_archive() {
869869 ) ;
870870}
871871
872+ #[ test]
873+ fn pending_supersession_accepts_an_authenticated_archive_only_predecessor ( ) {
874+ let _fail_env = EVENT_FAIL_ENV . lock ( ) . unwrap ( ) ;
875+ let catalog = tempfile:: tempdir ( ) . unwrap ( ) ;
876+ let agent = declare_agent ( catalog. path ( ) , "\" running\" " , " stream \" gh-ci\" {}\n " ) ;
877+ let predecessor = emit ( catalog. path ( ) , "running" , Some ( "pr-1" ) , false ) ;
878+ unsafe { std:: env:: set_var ( "ST2_TEST_EVENT_FAIL_AT" , "passed:materialized" ) } ;
879+ let _ = event:: emit (
880+ catalog. path ( ) ,
881+ "hetz" ,
882+ "hetz.worker" ,
883+ "gh-ci" ,
884+ "passed" ,
885+ Some ( "pr-1" ) ,
886+ Some ( "passed" ) ,
887+ "passed" ,
888+ true ,
889+ )
890+ . unwrap_err ( ) ;
891+ unsafe { std:: env:: remove_var ( "ST2_TEST_EVENT_FAIL_AT" ) } ;
892+ let inbox = message:: inbox_dir ( & agent) ;
893+ let archive = message:: archive_dir ( & agent) ;
894+ message:: archive_msg ( & inbox, & archive, & predecessor. filename ) . unwrap ( ) ;
895+
896+ let next = emit ( catalog. path ( ) , "unrelated" , Some ( "pr-2" ) , false ) ;
897+
898+ assert_eq ! ( next. status, EventReceiptStatus :: Created ) ;
899+ assert ! ( archive. join( & predecessor. filename) . is_file( ) ) ;
900+ assert ! (
901+ message:: list_inbox( & inbox)
902+ . unwrap( )
903+ . iter( )
904+ . any( |message| { message. event_id. as_deref( ) == Some ( "passed" ) } )
905+ ) ;
906+ }
907+
908+ #[ test]
909+ fn pending_supersession_fails_closed_when_predecessor_has_no_receipt ( ) {
910+ let _fail_env = EVENT_FAIL_ENV . lock ( ) . unwrap ( ) ;
911+ let catalog = tempfile:: tempdir ( ) . unwrap ( ) ;
912+ let agent = declare_agent ( catalog. path ( ) , "\" running\" " , " stream \" gh-ci\" {}\n " ) ;
913+ let predecessor = emit ( catalog. path ( ) , "running" , Some ( "pr-1" ) , false ) ;
914+ unsafe { std:: env:: set_var ( "ST2_TEST_EVENT_FAIL_AT" , "passed:materialized" ) } ;
915+ let _ = event:: emit (
916+ catalog. path ( ) ,
917+ "hetz" ,
918+ "hetz.worker" ,
919+ "gh-ci" ,
920+ "passed" ,
921+ Some ( "pr-1" ) ,
922+ Some ( "passed" ) ,
923+ "passed" ,
924+ true ,
925+ )
926+ . unwrap_err ( ) ;
927+ unsafe { std:: env:: remove_var ( "ST2_TEST_EVENT_FAIL_AT" ) } ;
928+ let inbox = message:: inbox_dir ( & agent) ;
929+ fs:: remove_file ( inbox. join ( & predecessor. filename ) ) . unwrap ( ) ;
930+
931+ let error = event:: emit (
932+ catalog. path ( ) ,
933+ "hetz" ,
934+ "hetz.worker" ,
935+ "gh-ci" ,
936+ "unrelated" ,
937+ None ,
938+ None ,
939+ "unrelated" ,
940+ false ,
941+ )
942+ . unwrap_err ( ) ;
943+
944+ assert ! (
945+ error
946+ . to_string( )
947+ . contains( "has no inbox file or archive receipt" ) ,
948+ "{error:#}"
949+ ) ;
950+ assert ! (
951+ message:: list_inbox( & inbox)
952+ . unwrap( )
953+ . iter( )
954+ . all( |message| { message. event_id. as_deref( ) != Some ( "unrelated" ) } )
955+ ) ;
956+ }
957+
872958#[ test]
873959fn keyless_supersede_replaces_the_stream_wide_head ( ) {
874960 let catalog = tempfile:: tempdir ( ) . unwrap ( ) ;
0 commit comments