@layerzerolabs/common-utils-stellar-contracts 0.2.122

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,179 @@
1
+ extern crate std;
2
+
3
+ use crate::auth::{enforce_auth, require_auth, Auth};
4
+ use crate::tests::test_helper::mock_auth;
5
+ use soroban_sdk::{contract, contractimpl, testutils::Address as _, Address, Env, Symbol};
6
+
7
+ // ============================================
8
+ // Test Contract for auth helpers
9
+ // ============================================
10
+
11
+ #[contract]
12
+ pub struct AuthTestContract;
13
+
14
+ fn authorizer_key(env: &Env) -> Symbol {
15
+ Symbol::new(env, "authorizer")
16
+ }
17
+
18
+ #[contractimpl]
19
+ impl AuthTestContract {
20
+ pub fn __constructor(env: &Env, authorizer: &Address) {
21
+ env.storage().instance().set(&authorizer_key(env), authorizer);
22
+ }
23
+
24
+ /// Test-only helper to update the authorizer in instance storage.
25
+ ///
26
+ /// NOTE: This is intentionally *not* protected by auth, since it's only used in unit tests.
27
+ pub fn set_authorizer(env: &Env, authorizer: &Address) {
28
+ env.storage().instance().set(&authorizer_key(env), authorizer);
29
+ }
30
+
31
+ pub fn enforce_auth_for_test(env: &Env) -> Address {
32
+ enforce_auth::<Self>(env)
33
+ }
34
+
35
+ pub fn require_auth_for_test(env: &Env) {
36
+ require_auth::<Self>(env);
37
+ }
38
+ }
39
+
40
+ /// `Auth` implementation for the test contract - uses a stored address as the authorizer.
41
+ impl Auth for AuthTestContract {
42
+ fn authorizer(env: &Env) -> Option<Address> {
43
+ env.storage().instance().get(&authorizer_key(env))
44
+ }
45
+ }
46
+
47
+ // ============================================
48
+ // enforce_auth
49
+ // ============================================
50
+
51
+ #[test]
52
+ fn test_enforce_auth_returns_authorizer_on_success() {
53
+ let env = Env::default();
54
+ let authorizer = Address::generate(&env);
55
+
56
+ let contract_id = env.register(AuthTestContract, (&authorizer,));
57
+ let client = AuthTestContractClient::new(&env, &contract_id);
58
+
59
+ mock_auth(&env, &contract_id, &authorizer, "enforce_auth_for_test", ());
60
+
61
+ let got = client.enforce_auth_for_test();
62
+ assert_eq!(got, authorizer);
63
+ }
64
+
65
+ #[test]
66
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
67
+ fn test_enforce_auth_panics_without_auth() {
68
+ let env = Env::default();
69
+ let authorizer = Address::generate(&env);
70
+
71
+ let contract_id = env.register(AuthTestContract, (&authorizer,));
72
+ let client = AuthTestContractClient::new(&env, &contract_id);
73
+
74
+ // No `mock_auths` provided -> authorizer.require_auth() must fail.
75
+ client.enforce_auth_for_test();
76
+ }
77
+
78
+ #[test]
79
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
80
+ fn test_enforce_auth_panics_with_wrong_address_auth() {
81
+ let env = Env::default();
82
+ let authorizer = Address::generate(&env);
83
+ let wrong_address = Address::generate(&env);
84
+
85
+ let contract_id = env.register(AuthTestContract, (&authorizer,));
86
+ let client = AuthTestContractClient::new(&env, &contract_id);
87
+
88
+ // Provide auth for the wrong address -> must still fail because authorizer is different.
89
+ mock_auth(&env, &contract_id, &wrong_address, "enforce_auth_for_test", ());
90
+ client.enforce_auth_for_test();
91
+ }
92
+
93
+ // ============================================
94
+ // require_auth
95
+ // ============================================
96
+
97
+ #[test]
98
+ fn test_require_auth_succeeds_when_authorizer_auths() {
99
+ let env = Env::default();
100
+ let authorizer = Address::generate(&env);
101
+
102
+ let contract_id = env.register(AuthTestContract, (&authorizer,));
103
+ let client = AuthTestContractClient::new(&env, &contract_id);
104
+
105
+ mock_auth(&env, &contract_id, &authorizer, "require_auth_for_test", ());
106
+
107
+ client.require_auth_for_test();
108
+ }
109
+
110
+ #[test]
111
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
112
+ fn test_require_auth_panics_without_auth() {
113
+ let env = Env::default();
114
+ let authorizer = Address::generate(&env);
115
+
116
+ let contract_id = env.register(AuthTestContract, (&authorizer,));
117
+ let client = AuthTestContractClient::new(&env, &contract_id);
118
+
119
+ // No `mock_auths` provided -> authorizer.require_auth() must fail.
120
+ client.require_auth_for_test();
121
+ }
122
+
123
+ #[test]
124
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
125
+ fn test_require_auth_panics_with_wrong_address_auth() {
126
+ let env = Env::default();
127
+ let authorizer = Address::generate(&env);
128
+ let wrong_address = Address::generate(&env);
129
+
130
+ let contract_id = env.register(AuthTestContract, (&authorizer,));
131
+ let client = AuthTestContractClient::new(&env, &contract_id);
132
+
133
+ // Provide auth for the wrong address -> must still fail because authorizer is different.
134
+ mock_auth(&env, &contract_id, &wrong_address, "require_auth_for_test", ());
135
+ client.require_auth_for_test();
136
+ }
137
+
138
+ // ============================================
139
+ // behavior: authorizer changes
140
+ // ============================================
141
+
142
+ #[test]
143
+ fn test_enforce_auth_uses_current_authorizer_after_change() {
144
+ let env = Env::default();
145
+ let old_authorizer = Address::generate(&env);
146
+ let new_authorizer = Address::generate(&env);
147
+
148
+ let contract_id = env.register(AuthTestContract, (&old_authorizer,));
149
+ let client = AuthTestContractClient::new(&env, &contract_id);
150
+
151
+ // Update authorizer to `new_authorizer`.
152
+ client.set_authorizer(&new_authorizer);
153
+
154
+ // New authorizer can call, and enforce_auth returns the current authorizer.
155
+ mock_auth(&env, &contract_id, &new_authorizer, "require_auth_for_test", ());
156
+ client.require_auth_for_test();
157
+
158
+ mock_auth(&env, &contract_id, &new_authorizer, "enforce_auth_for_test", ());
159
+ let got = client.enforce_auth_for_test();
160
+ assert_eq!(got, new_authorizer);
161
+ }
162
+
163
+ #[test]
164
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
165
+ fn test_require_auth_fails_with_stale_auth_after_authorizer_change() {
166
+ let env = Env::default();
167
+ let old_authorizer = Address::generate(&env);
168
+ let new_authorizer = Address::generate(&env);
169
+
170
+ let contract_id = env.register(AuthTestContract, (&old_authorizer,));
171
+ let client = AuthTestContractClient::new(&env, &contract_id);
172
+
173
+ // Change to a new authorizer, but only provide auth for the old one.
174
+ client.set_authorizer(&new_authorizer);
175
+ mock_auth(&env, &contract_id, &old_authorizer, "require_auth_for_test", ());
176
+
177
+ // Must fail because current authorizer is now `new_authorizer`.
178
+ client.require_auth_for_test();
179
+ }