Skip to content

Commit c9da03a

Browse files
authored
test: reset manager and team (#788)
Tests currently failing (fix TBD in another PR): - [ ] Team cannot be reset when pool is not live (fixed by #786)
1 parent b2c71b2 commit c9da03a

File tree

5 files changed

+292
-10
lines changed

5 files changed

+292
-10
lines changed

pallets/pallet-bonded-coins/src/mock.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ pub type AccountId = <AccountPublic as IdentifyAccount>::AccountId;
3636
// accounts
3737
pub(crate) const ACCOUNT_00: AccountId = AccountId::new([0u8; 32]);
3838
pub(crate) const ACCOUNT_01: AccountId = AccountId::new([1u8; 32]);
39-
const ACCOUNT_99: AccountId = AccountId::new([99u8; 32]);
39+
pub(crate) const ACCOUNT_99: AccountId = AccountId::new([99u8; 32]);
4040
// assets
4141
pub(crate) const DEFAULT_BONDED_CURRENCY_ID: AssetId = 1;
4242
pub(crate) const DEFAULT_COLLATERAL_CURRENCY_ID: AssetId = 0;

pallets/pallet-bonded-coins/src/tests/transactions/create_pool.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use frame_support::{
66
};
77
use frame_system::{pallet_prelude::OriginFor, RawOrigin};
88
use pallet_assets::Error as AssetsPalletErrors;
9+
use sp_core::bounded_vec;
910
use sp_runtime::{ArithmeticError, BoundedVec};
1011
use sp_std::ops::Sub;
1112

@@ -38,7 +39,7 @@ fn single_currency() {
3839
origin,
3940
curve,
4041
DEFAULT_COLLATERAL_CURRENCY_ID,
41-
BoundedVec::truncate_from(vec![bonded_token]),
42+
bounded_vec![bonded_token],
4243
DEFAULT_BONDED_DENOMINATION,
4344
true
4445
));
@@ -118,15 +119,15 @@ fn multi_currency() {
118119
min_balance: 1,
119120
};
120121

121-
let bonded_tokens = vec![bonded_token; 3];
122+
let bonded_tokens = bounded_vec![bonded_token; 3];
122123

123124
let next_asset_id = NextAssetId::<Test>::get();
124125

125126
assert_ok!(BondingPallet::create_pool(
126127
origin,
127128
curve,
128129
DEFAULT_COLLATERAL_CURRENCY_ID,
129-
BoundedVec::truncate_from(bonded_tokens),
130+
bonded_tokens,
130131
DEFAULT_BONDED_DENOMINATION,
131132
true
132133
));
@@ -179,7 +180,7 @@ fn can_create_identical_pools() {
179180
origin.clone(),
180181
curve.clone(),
181182
DEFAULT_COLLATERAL_CURRENCY_ID,
182-
BoundedVec::truncate_from(vec![bonded_token.clone()]),
183+
bounded_vec![bonded_token.clone()],
183184
DEFAULT_BONDED_DENOMINATION,
184185
true
185186
));
@@ -188,7 +189,7 @@ fn can_create_identical_pools() {
188189
origin,
189190
curve,
190191
DEFAULT_COLLATERAL_CURRENCY_ID,
191-
BoundedVec::truncate_from(vec![bonded_token]),
192+
bounded_vec![bonded_token],
192193
DEFAULT_BONDED_DENOMINATION,
193194
true
194195
));
@@ -226,7 +227,7 @@ fn fails_if_collateral_not_exists() {
226227
origin,
227228
curve,
228229
100,
229-
BoundedVec::truncate_from(vec![bonded_token]),
230+
bounded_vec![bonded_token],
230231
DEFAULT_BONDED_DENOMINATION,
231232
true
232233
),
@@ -258,7 +259,7 @@ fn cannot_create_circular_pool() {
258259
curve,
259260
// try specifying the id of the currency to be created as collateral
260261
next_asset_id,
261-
BoundedVec::truncate_from(vec![bonded_token]),
262+
bounded_vec![bonded_token],
262263
DEFAULT_BONDED_DENOMINATION,
263264
true
264265
),
@@ -291,8 +292,8 @@ fn handles_asset_id_overflow() {
291292
origin,
292293
curve,
293294
0,
294-
BoundedVec::truncate_from(vec![bonded_token; 2]),
295-
10,
295+
bounded_vec![bonded_token; 2],
296+
DEFAULT_BONDED_DENOMINATION,
296297
true
297298
),
298299
ArithmeticError::Overflow
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
mod burn_into;
22
mod create_pool;
33
mod mint_into;
4+
mod reset_manager;
5+
mod reset_team;
46
mod set_lock;
57
mod swap_into;
68
mod unlock;
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
use frame_support::{assert_err, assert_ok};
2+
use frame_system::RawOrigin;
3+
4+
use crate::{
5+
mock::{runtime::*, *},
6+
types::PoolStatus,
7+
Error as BondingPalletErrors, Event as BondingPalletEvents, Pools,
8+
};
9+
10+
#[test]
11+
fn changes_manager() {
12+
let curve = get_linear_bonding_curve();
13+
14+
let pool_details = generate_pool_details(
15+
vec![DEFAULT_BONDED_CURRENCY_ID],
16+
curve,
17+
false,
18+
Some(PoolStatus::Active),
19+
Some(ACCOUNT_00),
20+
None,
21+
None,
22+
);
23+
let pool_id = calculate_pool_id(&[DEFAULT_BONDED_CURRENCY_ID]);
24+
ExtBuilder::default()
25+
.with_pools(vec![(pool_id.clone(), pool_details.clone())])
26+
.build()
27+
.execute_with(|| {
28+
let origin = RawOrigin::Signed(ACCOUNT_00).into();
29+
assert_ok!(BondingPallet::reset_manager(origin, pool_id.clone(), Some(ACCOUNT_01)));
30+
31+
System::assert_has_event(
32+
BondingPalletEvents::ManagerUpdated {
33+
id: pool_id.clone(),
34+
manager: Some(ACCOUNT_01),
35+
}
36+
.into(),
37+
);
38+
39+
let new_details = Pools::<Test>::get(&pool_id).unwrap();
40+
assert_eq!(new_details.manager, Some(ACCOUNT_01));
41+
assert_eq!(new_details.owner, pool_details.owner)
42+
})
43+
}
44+
45+
#[test]
46+
fn only_manager_can_change_manager() {
47+
let curve = get_linear_bonding_curve();
48+
49+
let manager = AccountId::new([10u8; 32]);
50+
let pool_details = generate_pool_details(
51+
vec![DEFAULT_BONDED_CURRENCY_ID],
52+
curve,
53+
false,
54+
Some(PoolStatus::Active),
55+
Some(manager.clone()),
56+
None,
57+
Some(ACCOUNT_00),
58+
);
59+
let pool_id = calculate_pool_id(&[DEFAULT_BONDED_CURRENCY_ID]);
60+
ExtBuilder::default()
61+
.with_pools(vec![(pool_id.clone(), pool_details.clone())])
62+
.build()
63+
.execute_with(|| {
64+
let owner_origin = RawOrigin::Signed(ACCOUNT_00).into();
65+
let other_origin = RawOrigin::Signed(ACCOUNT_01).into();
66+
67+
assert_err!(
68+
BondingPallet::reset_manager(owner_origin, pool_id.clone(), Some(ACCOUNT_00)),
69+
BondingPalletErrors::<Test>::NoPermission
70+
);
71+
72+
assert_err!(
73+
BondingPallet::reset_manager(other_origin, pool_id.clone(), Some(ACCOUNT_00)),
74+
BondingPalletErrors::<Test>::NoPermission
75+
);
76+
77+
let new_details = Pools::<Test>::get(&pool_id).unwrap();
78+
assert_eq!(new_details.manager, Some(manager));
79+
})
80+
}
81+
82+
#[test]
83+
fn cant_change_manager_if_pool_nonexistent() {
84+
let pool_id = calculate_pool_id(&[DEFAULT_BONDED_CURRENCY_ID]);
85+
ExtBuilder::default().build().execute_with(|| {
86+
let origin = RawOrigin::Signed(ACCOUNT_00).into();
87+
88+
assert!(Pools::<Test>::get(&pool_id).is_none());
89+
90+
assert_err!(
91+
BondingPallet::reset_manager(origin, pool_id.clone(), Some(ACCOUNT_00)),
92+
BondingPalletErrors::<Test>::PoolUnknown
93+
);
94+
})
95+
}
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
use frame_support::{assert_err, assert_ok, traits::fungibles::roles::Inspect};
2+
use frame_system::RawOrigin;
3+
4+
use crate::{
5+
mock::{runtime::*, *},
6+
types::{PoolManagingTeam, PoolStatus},
7+
Error as BondingPalletErrors,
8+
};
9+
10+
#[test]
11+
fn resets_team() {
12+
let pool_details = generate_pool_details(
13+
vec![DEFAULT_BONDED_CURRENCY_ID],
14+
get_linear_bonding_curve(),
15+
false,
16+
Some(PoolStatus::Active),
17+
Some(ACCOUNT_00),
18+
None,
19+
None,
20+
);
21+
let pool_id = calculate_pool_id(&[DEFAULT_BONDED_CURRENCY_ID]);
22+
23+
ExtBuilder::default()
24+
.with_pools(vec![(pool_id.clone(), pool_details.clone())])
25+
.build()
26+
.execute_with(|| {
27+
let manager_origin = RawOrigin::Signed(ACCOUNT_00).into();
28+
29+
assert_ok!(BondingPallet::reset_team(
30+
manager_origin,
31+
pool_id.clone(),
32+
PoolManagingTeam {
33+
admin: ACCOUNT_00,
34+
freezer: ACCOUNT_01,
35+
},
36+
0
37+
));
38+
39+
assert_eq!(
40+
<Test as crate::Config>::Fungibles::admin(DEFAULT_BONDED_CURRENCY_ID),
41+
Some(ACCOUNT_00)
42+
);
43+
assert_eq!(
44+
<Test as crate::Config>::Fungibles::freezer(DEFAULT_BONDED_CURRENCY_ID),
45+
Some(ACCOUNT_01)
46+
);
47+
assert_eq!(
48+
<Test as crate::Config>::Fungibles::owner(DEFAULT_BONDED_CURRENCY_ID),
49+
Some(pool_id.clone())
50+
);
51+
assert_eq!(
52+
<Test as crate::Config>::Fungibles::issuer(DEFAULT_BONDED_CURRENCY_ID),
53+
Some(pool_id)
54+
);
55+
})
56+
}
57+
58+
#[test]
59+
fn does_not_change_team_when_not_live() {
60+
let pool_details = generate_pool_details(
61+
vec![DEFAULT_BONDED_CURRENCY_ID],
62+
get_linear_bonding_curve(),
63+
false,
64+
Some(PoolStatus::Refunding),
65+
Some(ACCOUNT_00),
66+
None,
67+
None,
68+
);
69+
let pool_id = calculate_pool_id(&[DEFAULT_BONDED_CURRENCY_ID]);
70+
71+
ExtBuilder::default()
72+
.with_pools(vec![(pool_id.clone(), pool_details.clone())])
73+
.build()
74+
.execute_with(|| {
75+
let manager_origin = RawOrigin::Signed(ACCOUNT_00).into();
76+
77+
assert_err!(
78+
BondingPallet::reset_team(
79+
manager_origin,
80+
pool_id.clone(),
81+
PoolManagingTeam {
82+
admin: ACCOUNT_00,
83+
freezer: ACCOUNT_00,
84+
},
85+
0
86+
),
87+
BondingPalletErrors::<Test>::PoolNotLive
88+
);
89+
90+
assert_eq!(
91+
<Test as crate::Config>::Fungibles::admin(DEFAULT_BONDED_CURRENCY_ID),
92+
Some(pool_id)
93+
);
94+
})
95+
}
96+
97+
#[test]
98+
fn only_manager_can_change_team() {
99+
let curve = get_linear_bonding_curve();
100+
101+
let manager = AccountId::new([10u8; 32]);
102+
let pool_details = generate_pool_details(
103+
vec![DEFAULT_BONDED_CURRENCY_ID],
104+
curve,
105+
false,
106+
Some(PoolStatus::Active),
107+
Some(manager.clone()),
108+
None,
109+
Some(ACCOUNT_00),
110+
);
111+
let pool_id = calculate_pool_id(&[DEFAULT_BONDED_CURRENCY_ID]);
112+
ExtBuilder::default()
113+
.with_pools(vec![(pool_id.clone(), pool_details.clone())])
114+
.build()
115+
.execute_with(|| {
116+
let owner_origin = RawOrigin::Signed(ACCOUNT_00).into();
117+
let other_origin = RawOrigin::Signed(ACCOUNT_01).into();
118+
119+
assert_err!(
120+
BondingPallet::reset_team(
121+
owner_origin,
122+
pool_id.clone(),
123+
PoolManagingTeam {
124+
admin: ACCOUNT_00,
125+
freezer: ACCOUNT_00,
126+
},
127+
0
128+
),
129+
BondingPalletErrors::<Test>::NoPermission
130+
);
131+
132+
assert_err!(
133+
BondingPallet::reset_team(
134+
other_origin,
135+
pool_id.clone(),
136+
PoolManagingTeam {
137+
admin: ACCOUNT_00,
138+
freezer: ACCOUNT_00,
139+
},
140+
0
141+
),
142+
BondingPalletErrors::<Test>::NoPermission
143+
);
144+
145+
assert_eq!(
146+
<Test as crate::Config>::Fungibles::admin(DEFAULT_BONDED_CURRENCY_ID),
147+
Some(pool_id)
148+
);
149+
})
150+
}
151+
152+
#[test]
153+
fn handles_currency_idx_out_of_bounds() {
154+
let pool_details = generate_pool_details(
155+
vec![DEFAULT_BONDED_CURRENCY_ID],
156+
get_linear_bonding_curve(),
157+
false,
158+
Some(PoolStatus::Active),
159+
Some(ACCOUNT_00),
160+
None,
161+
None,
162+
);
163+
let pool_id = calculate_pool_id(&[DEFAULT_BONDED_CURRENCY_ID]);
164+
165+
ExtBuilder::default()
166+
.with_pools(vec![(pool_id.clone(), pool_details.clone())])
167+
.build()
168+
.execute_with(|| {
169+
let manager_origin = RawOrigin::Signed(ACCOUNT_00).into();
170+
171+
assert_err!(
172+
BondingPallet::reset_team(
173+
manager_origin,
174+
pool_id.clone(),
175+
PoolManagingTeam {
176+
admin: ACCOUNT_00,
177+
freezer: ACCOUNT_00,
178+
},
179+
2
180+
),
181+
BondingPalletErrors::<Test>::IndexOutOfBounds
182+
);
183+
})
184+
}

0 commit comments

Comments
 (0)