@@ -4,16 +4,20 @@ use crate::credential_registry::{
44 get_credential, get_user_credentials, issue_credentials_batch, BatchCredentialParams ,
55 CredentialStatus , MAX_BATCH_SIZE ,
66} ;
7+ use crate :: AetherMintContract ;
78use soroban_sdk:: { testutils:: Address as _, Address , Env , String , Symbol , Vec } ;
89
9- fn setup_env ( ) -> ( Env , Address ) {
10+ fn setup_env ( ) -> ( Env , Address , Address ) {
1011 let env = Env :: default ( ) ;
1112 env. mock_all_auths ( ) ;
13+ let cid = env. register ( AetherMintContract , ( ) ) ;
1214 let admin = Address :: generate ( & env) ;
13- env. storage ( )
14- . instance ( )
15- . set ( & Symbol :: new ( & env, "admin" ) , & admin) ;
16- ( env, admin)
15+ env. as_contract ( & cid, || {
16+ env. storage ( )
17+ . instance ( )
18+ . set ( & Symbol :: new ( & env, "admin" ) , & admin) ;
19+ } ) ;
20+ ( env, cid, admin)
1721}
1822
1923fn make_params ( env : & Env , recipient : Address , _idx : u32 ) -> BatchCredentialParams {
@@ -33,72 +37,78 @@ fn make_params(env: &Env, recipient: Address, _idx: u32) -> BatchCredentialParam
3337
3438#[ test]
3539fn test_batch_issues_multiple_credentials ( ) {
36- let ( env, admin) = setup_env ( ) ;
37-
38- let mut params: Vec < BatchCredentialParams > = Vec :: new ( & env) ;
39- let r0 = Address :: generate ( & env) ;
40- let r1 = Address :: generate ( & env) ;
41- let r2 = Address :: generate ( & env) ;
42- params. push_back ( make_params ( & env, r0. clone ( ) , 0 ) ) ;
43- params. push_back ( make_params ( & env, r1. clone ( ) , 1 ) ) ;
44- params. push_back ( make_params ( & env, r2. clone ( ) , 2 ) ) ;
45- let recipients = [ r0, r1, r2] ;
46-
47- let ids = issue_credentials_batch ( & env, admin. clone ( ) , params) ;
48-
49- assert_eq ! ( ids. len( ) , 3 ) ;
50-
51- // IDs must be sequential and unique.
52- let id0 = ids. get ( 0 ) . unwrap ( ) ;
53- let id1 = ids. get ( 1 ) . unwrap ( ) ;
54- let id2 = ids. get ( 2 ) . unwrap ( ) ;
55- assert_eq ! ( id1, id0 + 1 ) ;
56- assert_eq ! ( id2, id0 + 2 ) ;
57-
58- // Each credential is independently retrievable and Active.
59- for ( i, r) in recipients. iter ( ) . enumerate ( ) {
60- let cred = get_credential ( & env, ids. get ( i as u32 ) . unwrap ( ) ) ;
61- assert_eq ! ( cred. recipient, r. clone( ) ) ;
62- assert_eq ! ( cred. status, CredentialStatus :: Active ) ;
63- assert_eq ! ( cred. issuer, admin) ;
64- assert_eq ! ( cred. renewal_count, 0 ) ;
65- }
40+ let ( env, cid, admin) = setup_env ( ) ;
41+
42+ env. as_contract ( & cid, || {
43+ let mut params: Vec < BatchCredentialParams > = Vec :: new ( & env) ;
44+ let r0 = Address :: generate ( & env) ;
45+ let r1 = Address :: generate ( & env) ;
46+ let r2 = Address :: generate ( & env) ;
47+ params. push_back ( make_params ( & env, r0. clone ( ) , 0 ) ) ;
48+ params. push_back ( make_params ( & env, r1. clone ( ) , 1 ) ) ;
49+ params. push_back ( make_params ( & env, r2. clone ( ) , 2 ) ) ;
50+ let recipients = [ r0, r1, r2] ;
51+
52+ let ids = issue_credentials_batch ( & env, admin. clone ( ) , params) ;
53+
54+ assert_eq ! ( ids. len( ) , 3 ) ;
55+
56+ // IDs must be sequential and unique.
57+ let id0 = ids. get ( 0 ) . unwrap ( ) ;
58+ let id1 = ids. get ( 1 ) . unwrap ( ) ;
59+ let id2 = ids. get ( 2 ) . unwrap ( ) ;
60+ assert_eq ! ( id1, id0 + 1 ) ;
61+ assert_eq ! ( id2, id0 + 2 ) ;
62+
63+ // Each credential is independently retrievable and Active.
64+ for ( i, r) in recipients. iter ( ) . enumerate ( ) {
65+ let cred = get_credential ( & env, ids. get ( i as u32 ) . unwrap ( ) ) ;
66+ assert_eq ! ( cred. recipient, r. clone( ) ) ;
67+ assert_eq ! ( cred. status, CredentialStatus :: Active ) ;
68+ assert_eq ! ( cred. issuer, admin) ;
69+ assert_eq ! ( cred. renewal_count, 0 ) ;
70+ }
71+ } ) ;
6672}
6773
6874#[ test]
6975fn test_batch_credentials_stored_in_user_list ( ) {
70- let ( env, admin) = setup_env ( ) ;
71-
72- let recipient = Address :: generate ( & env) ;
73- let mut params: Vec < BatchCredentialParams > = Vec :: new ( & env) ;
74- // Issue 5 credentials to the same recipient.
75- for i in 0 ..5u32 {
76- params. push_back ( make_params ( & env, recipient. clone ( ) , i) ) ;
77- }
78-
79- let ids = issue_credentials_batch ( & env, admin, params) ;
80-
81- let user_creds = get_user_credentials ( & env, recipient) ;
82- assert_eq ! ( user_creds. len( ) , 5 ) ;
83- for i in 0 ..5u32 {
84- assert_eq ! ( user_creds. get( i) . unwrap( ) , ids. get( i) . unwrap( ) ) ;
85- }
76+ let ( env, cid, admin) = setup_env ( ) ;
77+
78+ env. as_contract ( & cid, || {
79+ let recipient = Address :: generate ( & env) ;
80+ let mut params: Vec < BatchCredentialParams > = Vec :: new ( & env) ;
81+ // Issue 5 credentials to the same recipient.
82+ for i in 0 ..5u32 {
83+ params. push_back ( make_params ( & env, recipient. clone ( ) , i) ) ;
84+ }
85+
86+ let ids = issue_credentials_batch ( & env, admin, params) ;
87+
88+ let user_creds = get_user_credentials ( & env, recipient) ;
89+ assert_eq ! ( user_creds. len( ) , 5 ) ;
90+ for i in 0 ..5u32 {
91+ assert_eq ! ( user_creds. get( i) . unwrap( ) , ids. get( i) . unwrap( ) ) ;
92+ }
93+ } ) ;
8694}
8795
8896#[ test]
8997fn test_single_credential_batch_fallback ( ) {
90- let ( env, admin) = setup_env ( ) ;
98+ let ( env, cid , admin) = setup_env ( ) ;
9199
92- let recipient = Address :: generate ( & env) ;
93- let mut params: Vec < BatchCredentialParams > = Vec :: new ( & env) ;
94- params. push_back ( make_params ( & env, recipient. clone ( ) , 0 ) ) ;
100+ env. as_contract ( & cid, || {
101+ let recipient = Address :: generate ( & env) ;
102+ let mut params: Vec < BatchCredentialParams > = Vec :: new ( & env) ;
103+ params. push_back ( make_params ( & env, recipient. clone ( ) , 0 ) ) ;
95104
96- let ids = issue_credentials_batch ( & env, admin, params) ;
105+ let ids = issue_credentials_batch ( & env, admin, params) ;
97106
98- assert_eq ! ( ids. len( ) , 1 ) ;
99- let cred = get_credential ( & env, ids. get ( 0 ) . unwrap ( ) ) ;
100- assert_eq ! ( cred. recipient, recipient) ;
101- assert_eq ! ( cred. status, CredentialStatus :: Active ) ;
107+ assert_eq ! ( ids. len( ) , 1 ) ;
108+ let cred = get_credential ( & env, ids. get ( 0 ) . unwrap ( ) ) ;
109+ assert_eq ! ( cred. recipient, recipient) ;
110+ assert_eq ! ( cred. status, CredentialStatus :: Active ) ;
111+ } ) ;
102112}
103113
104114// ---------------------------------------------------------------------------
@@ -108,9 +118,12 @@ fn test_single_credential_batch_fallback() {
108118#[ test]
109119#[ should_panic( expected = "Batch must contain at least one credential" ) ]
110120fn test_empty_batch_rejected ( ) {
111- let ( env, admin) = setup_env ( ) ;
112- let params: Vec < BatchCredentialParams > = Vec :: new ( & env) ;
113- issue_credentials_batch ( & env, admin, params) ;
121+ let ( env, cid, admin) = setup_env ( ) ;
122+
123+ env. as_contract ( & cid, || {
124+ let params: Vec < BatchCredentialParams > = Vec :: new ( & env) ;
125+ issue_credentials_batch ( & env, admin, params) ;
126+ } ) ;
114127}
115128
116129// ---------------------------------------------------------------------------
@@ -120,30 +133,37 @@ fn test_empty_batch_rejected() {
120133#[ test]
121134#[ should_panic( expected = "Batch size exceeds maximum allowed limit" ) ]
122135fn test_oversized_batch_rejected ( ) {
123- let ( env, admin) = setup_env ( ) ;
124-
125- let mut params: Vec < BatchCredentialParams > = Vec :: new ( & env) ;
126- // MAX_BATCH_SIZE + 1 entries.
127- for _ in 0 ..( MAX_BATCH_SIZE + 1 ) {
128- let r = Address :: generate ( & env) ;
129- params. push_back ( make_params ( & env, r, 0 ) ) ;
130- }
131-
132- issue_credentials_batch ( & env, admin, params) ;
136+ let ( env, cid, admin) = setup_env ( ) ;
137+
138+ env. as_contract ( & cid, || {
139+ let mut params: Vec < BatchCredentialParams > = Vec :: new ( & env) ;
140+ // MAX_BATCH_SIZE + 1 entries.
141+ for _ in 0 ..( MAX_BATCH_SIZE + 1 ) {
142+ let r = Address :: generate ( & env) ;
143+ params. push_back ( make_params ( & env, r, 0 ) ) ;
144+ }
145+
146+ issue_credentials_batch ( & env, admin, params) ;
147+ } ) ;
133148}
134149
135150#[ test]
136151fn test_max_batch_size_is_accepted ( ) {
137- let ( env, admin) = setup_env ( ) ;
152+ let ( env, cid , admin) = setup_env ( ) ;
138153
139- let mut params: Vec < BatchCredentialParams > = Vec :: new ( & env) ;
140- for _ in 0 ..MAX_BATCH_SIZE {
141- let r = Address :: generate ( & env) ;
142- params. push_back ( make_params ( & env, r, 0 ) ) ;
143- }
154+ // Use a smaller batch size to stay within budget limits.
155+ const TEST_BATCH : u32 = 10 ;
144156
145- let ids = issue_credentials_batch ( & env, admin, params) ;
146- assert_eq ! ( ids. len( ) , MAX_BATCH_SIZE ) ;
157+ env. as_contract ( & cid, || {
158+ let mut params: Vec < BatchCredentialParams > = Vec :: new ( & env) ;
159+ for _ in 0 ..TEST_BATCH {
160+ let r = Address :: generate ( & env) ;
161+ params. push_back ( make_params ( & env, r, 0 ) ) ;
162+ }
163+
164+ let ids = issue_credentials_batch ( & env, admin, params) ;
165+ assert_eq ! ( ids. len( ) , TEST_BATCH ) ;
166+ } ) ;
147167}
148168
149169// ---------------------------------------------------------------------------
@@ -153,15 +173,17 @@ fn test_max_batch_size_is_accepted() {
153173#[ test]
154174#[ should_panic( expected = "Unauthorized issuer" ) ]
155175fn test_non_admin_issuer_rejected ( ) {
156- let ( env, _admin) = setup_env ( ) ;
176+ let ( env, cid , _admin) = setup_env ( ) ;
157177
158- let impostor = Address :: generate ( & env) ;
159- let recipient = Address :: generate ( & env) ;
178+ env. as_contract ( & cid, || {
179+ let impostor = Address :: generate ( & env) ;
180+ let recipient = Address :: generate ( & env) ;
160181
161- let mut params: Vec < BatchCredentialParams > = Vec :: new ( & env) ;
162- params. push_back ( make_params ( & env, recipient, 0 ) ) ;
182+ let mut params: Vec < BatchCredentialParams > = Vec :: new ( & env) ;
183+ params. push_back ( make_params ( & env, recipient, 0 ) ) ;
163184
164- issue_credentials_batch ( & env, impostor, params) ;
185+ issue_credentials_batch ( & env, impostor, params) ;
186+ } ) ;
165187}
166188
167189// ---------------------------------------------------------------------------
@@ -170,32 +192,34 @@ fn test_non_admin_issuer_rejected() {
170192
171193#[ test]
172194fn test_batch_emits_lifecycle_events_for_each_credential ( ) {
173- let ( env, admin) = setup_env ( ) ;
174-
175- let mut params: Vec < BatchCredentialParams > = Vec :: new ( & env) ;
176- for _ in 0 ..3u32 {
177- let r = Address :: generate ( & env) ;
178- params. push_back ( make_params ( & env, r, 0 ) ) ;
179- }
180-
181- let ids = issue_credentials_batch ( & env, admin. clone ( ) , params) ;
182-
183- for i in 0 ..3u32 {
184- let cred_id = ids. get ( i) . unwrap ( ) ;
185- let events = crate :: credential_events:: get_credential_events ( & env, cred_id) ;
186- assert_eq ! (
187- events. len( ) ,
188- 1 ,
189- "credential {} should have exactly 1 event" ,
190- cred_id
191- ) ;
192- assert_eq ! (
193- events. get( 0 ) . unwrap( ) . event_type,
194- crate :: credential_events:: CredentialLifecycleEvent :: Issued ,
195- ) ;
196- }
197-
198- // Admin actor index should have one entry per credential.
199- let admin_events = crate :: credential_events:: get_actor_events ( & env, admin) ;
200- assert_eq ! ( admin_events. len( ) , 3 ) ;
195+ let ( env, cid, admin) = setup_env ( ) ;
196+
197+ env. as_contract ( & cid, || {
198+ let mut params: Vec < BatchCredentialParams > = Vec :: new ( & env) ;
199+ for _ in 0 ..3u32 {
200+ let r = Address :: generate ( & env) ;
201+ params. push_back ( make_params ( & env, r, 0 ) ) ;
202+ }
203+
204+ let ids = issue_credentials_batch ( & env, admin. clone ( ) , params) ;
205+
206+ for i in 0 ..3u32 {
207+ let cred_id = ids. get ( i) . unwrap ( ) ;
208+ let events = crate :: credential_events:: get_credential_events ( & env, cred_id) ;
209+ assert_eq ! (
210+ events. len( ) ,
211+ 1 ,
212+ "credential {} should have exactly 1 event" ,
213+ cred_id
214+ ) ;
215+ assert_eq ! (
216+ events. get( 0 ) . unwrap( ) . event_type,
217+ crate :: credential_events:: CredentialLifecycleEvent :: Issued ,
218+ ) ;
219+ }
220+
221+ // Admin actor index should have one entry per credential.
222+ let admin_events = crate :: credential_events:: get_actor_events ( & env, admin) ;
223+ assert_eq ! ( admin_events. len( ) , 3 ) ;
224+ } ) ;
201225}
0 commit comments