@@ -1046,6 +1046,87 @@ async def test_decommission_registry_new_backup_creation_fails(self, mock_handle
10461046 assert len (result ) == 2
10471047 assert result [0 ].tags ["state" ] == RevRegDefState .STATE_DECOMMISSIONED
10481048
1049+ @mock .patch .object (AskarAnonCredsProfileSession , "handle" )
1050+ async def test_decommission_registry_duplicate_store_handled (self , mock_handle ):
1051+ """When event chain already stored the registry, duplicate is handled gracefully."""
1052+ mock_handle .fetch_all = mock .CoroutineMock (
1053+ side_effect = [
1054+ [
1055+ MockEntry (
1056+ name = "backup-reg-reg" ,
1057+ tags = {
1058+ "cred_def_id" : "test-rev-reg-def-id" ,
1059+ "state" : RevRegDefState .STATE_FINISHED ,
1060+ "active" : "false" ,
1061+ },
1062+ ),
1063+ ],
1064+ [
1065+ MockEntry (
1066+ name = "active-reg-reg" ,
1067+ tags = {
1068+ "cred_def_id" : "test-rev-reg-def-id" ,
1069+ "state" : RevRegDefState .STATE_FINISHED ,
1070+ "active" : "true" ,
1071+ },
1072+ ),
1073+ MockEntry (
1074+ name = "backup-reg-reg" ,
1075+ tags = {
1076+ "cred_def_id" : "test-rev-reg-def-id" ,
1077+ "state" : RevRegDefState .STATE_FINISHED ,
1078+ "active" : "false" ,
1079+ },
1080+ ),
1081+ MockEntry (
1082+ name = "new-rev-reg" ,
1083+ tags = {
1084+ "cred_def_id" : "test-rev-reg-def-id" ,
1085+ "state" : RevRegDefState .STATE_FINISHED ,
1086+ "active" : "false" ,
1087+ },
1088+ ),
1089+ ],
1090+ ]
1091+ )
1092+ self .revocation .get_or_create_active_registry = mock .CoroutineMock (
1093+ return_value = RevRegDefResult (
1094+ job_id = "test-job-id" ,
1095+ revocation_registry_definition_state = RevRegDefState (
1096+ state = RevRegDefState .STATE_FINISHED ,
1097+ revocation_registry_definition_id = "active-reg-reg" ,
1098+ revocation_registry_definition = rev_reg_def ,
1099+ ),
1100+ registration_metadata = {},
1101+ revocation_registry_definition_metadata = {},
1102+ )
1103+ )
1104+ self .revocation .create_and_register_revocation_registry_definition = (
1105+ mock .CoroutineMock (
1106+ return_value = RevRegDefResult (
1107+ job_id = "test-job-id" ,
1108+ revocation_registry_definition_state = RevRegDefState (
1109+ state = RevRegDefState .STATE_ACTION ,
1110+ revocation_registry_definition_id = "new-rev-reg" ,
1111+ revocation_registry_definition = rev_reg_def ,
1112+ ),
1113+ registration_metadata = {},
1114+ revocation_registry_definition_metadata = {},
1115+ )
1116+ )
1117+ )
1118+ self .revocation .store_revocation_registry_definition = mock .CoroutineMock (
1119+ side_effect = test_module .AnonCredsRevocationError ("Duplicate entry" )
1120+ )
1121+ self .revocation .set_active_registry = mock .CoroutineMock (return_value = None )
1122+ mock_handle .replace = mock .CoroutineMock (return_value = None )
1123+
1124+ result = await self .revocation .decommission_registry ("test-rev-reg-def-id" )
1125+
1126+ assert isinstance (result , list )
1127+ self .revocation .store_revocation_registry_definition .assert_called_once ()
1128+ self .revocation .set_active_registry .assert_called_once_with ("backup-reg-reg" )
1129+
10491130 @mock .patch .object (AskarAnonCredsProfileSession , "handle" )
10501131 async def test_get_backup_registry_id_raises_when_no_backup (self , mock_handle ):
10511132 """_get_backup_registry_id raises when no finished backup exists."""
0 commit comments