12345678910111213141516171819202122232425262728293031323334353637use super::*;38use crate as pallet_identity;3940use codec::{Decode, Encode};41use frame_support::{42 assert_noop, assert_ok, ord_parameter_types, parameter_types,43 traits::{ConstU32, ConstU64, EitherOfDiverse},44 BoundedVec,45};46use frame_system::{EnsureRoot, EnsureSignedBy};47use sp_core::H256;48use sp_runtime::{49 testing::Header,50 traits::{BadOrigin, BlakeTwo256, IdentityLookup},51};5253type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;54type Block = frame_system::mocking::MockBlock<Test>;5556frame_support::construct_runtime!(57 pub enum Test where58 Block = Block,59 NodeBlock = Block,60 UncheckedExtrinsic = UncheckedExtrinsic,61 {62 System: frame_system::{Pallet, Call, Config, Storage, Event<T>},63 Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>},64 Identity: pallet_identity::{Pallet, Call, Storage, Event<T>},65 }66);6768parameter_types! {69 pub BlockWeights: frame_system::limits::BlockWeights =70 frame_system::limits::BlockWeights::simple_max(frame_support::weights::Weight::from_ref_time(1024));71}72impl frame_system::Config for Test {73 type BaseCallFilter = frame_support::traits::Everything;74 type BlockWeights = ();75 type BlockLength = ();76 type RuntimeOrigin = RuntimeOrigin;77 type Index = u64;78 type BlockNumber = u64;79 type Hash = H256;80 type RuntimeCall = RuntimeCall;81 type Hashing = BlakeTwo256;82 type AccountId = u64;83 type Lookup = IdentityLookup<Self::AccountId>;84 type Header = Header;85 type RuntimeEvent = RuntimeEvent;86 type BlockHashCount = ConstU64<250>;87 type DbWeight = ();88 type Version = ();89 type PalletInfo = PalletInfo;90 type AccountData = pallet_balances::AccountData<u64>;91 type OnNewAccount = ();92 type OnKilledAccount = ();93 type SystemWeightInfo = ();94 type SS58Prefix = ();95 type OnSetCode = ();96 type MaxConsumers = ConstU32<16>;97}9899impl pallet_balances::Config for Test {100 type Balance = u64;101 type RuntimeEvent = RuntimeEvent;102 type DustRemoval = ();103 type ExistentialDeposit = ConstU64<1>;104 type AccountStore = System;105 type MaxLocks = ();106 type MaxReserves = ();107 type ReserveIdentifier = [u8; 8];108 type WeightInfo = ();109}110111parameter_types! {112 pub const MaxAdditionalFields: u32 = 2;113 pub const MaxRegistrars: u32 = 20;114}115116ord_parameter_types! {117 pub const One: u64 = 1;118 pub const Two: u64 = 2;119}120type EnsureOneOrRoot = EitherOfDiverse<EnsureRoot<u64>, EnsureSignedBy<One, u64>>;121type EnsureTwoOrRoot = EitherOfDiverse<EnsureRoot<u64>, EnsureSignedBy<Two, u64>>;122impl pallet_identity::Config for Test {123 type RuntimeEvent = RuntimeEvent;124 type Currency = Balances;125 type Slashed = ();126 type BasicDeposit = ConstU64<10>;127 type FieldDeposit = ConstU64<10>;128 type SubAccountDeposit = ConstU64<10>;129 type MaxSubAccounts = ConstU32<2>;130 type MaxAdditionalFields = MaxAdditionalFields;131 type MaxRegistrars = MaxRegistrars;132 type RegistrarOrigin = EnsureOneOrRoot;133 type ForceOrigin = EnsureTwoOrRoot;134 type WeightInfo = ();135}136137pub fn new_test_ext() -> sp_io::TestExternalities {138 let mut t = frame_system::GenesisConfig::default().build_storage::<Test>().unwrap();139 pallet_balances::GenesisConfig::<Test> {140 balances: vec![(1, 10), (2, 10), (3, 10), (10, 100), (20, 100), (30, 100)],141 }142 .assimilate_storage(&mut t)143 .unwrap();144 t.into()145}146147fn ten() -> IdentityInfo<MaxAdditionalFields> {148 IdentityInfo {149 display: Data::Raw(b"ten".to_vec().try_into().unwrap()),150 legal: Data::Raw(b"The Right Ordinal Ten, Esq.".to_vec().try_into().unwrap()),151 ..Default::default()152 }153}154155fn twenty() -> IdentityInfo<MaxAdditionalFields> {156 IdentityInfo {157 display: Data::Raw(b"twenty".to_vec().try_into().unwrap()),158 legal: Data::Raw(b"The Right Ordinal Twenty, Esq.".to_vec().try_into().unwrap()),159 ..Default::default()160 }161}162163#[test]164fn editing_subaccounts_should_work() {165 new_test_ext().execute_with(|| {166 let data = |x| Data::Raw(vec![x; 1].try_into().unwrap());167168 assert_noop!(169 Identity::add_sub(RuntimeOrigin::signed(10), 20, data(1)),170 Error::<Test>::NoIdentity171 );172173 assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten())));174175 176 assert_ok!(Identity::add_sub(RuntimeOrigin::signed(10), 1, data(1)));177 assert_eq!(SuperOf::<Test>::get(1), Some((10, data(1))));178 assert_eq!(Balances::free_balance(10), 80);179180 181 assert_ok!(Identity::add_sub(RuntimeOrigin::signed(10), 2, data(2)));182 assert_eq!(SuperOf::<Test>::get(1), Some((10, data(1))));183 assert_eq!(SuperOf::<Test>::get(2), Some((10, data(2))));184 assert_eq!(Balances::free_balance(10), 70);185186 187 assert_noop!(188 Identity::add_sub(RuntimeOrigin::signed(10), 3, data(3)),189 Error::<Test>::TooManySubAccounts190 );191192 193 assert_ok!(Identity::rename_sub(RuntimeOrigin::signed(10), 1, data(11)));194 assert_eq!(SuperOf::<Test>::get(1), Some((10, data(11))));195 assert_eq!(SuperOf::<Test>::get(2), Some((10, data(2))));196 assert_eq!(Balances::free_balance(10), 70);197198 199 assert_ok!(Identity::remove_sub(RuntimeOrigin::signed(10), 1));200 assert_eq!(SuperOf::<Test>::get(1), None);201 assert_eq!(SuperOf::<Test>::get(2), Some((10, data(2))));202 assert_eq!(Balances::free_balance(10), 80);203204 205 assert_ok!(Identity::add_sub(RuntimeOrigin::signed(10), 3, data(3)));206 assert_eq!(SuperOf::<Test>::get(1), None);207 assert_eq!(SuperOf::<Test>::get(2), Some((10, data(2))));208 assert_eq!(SuperOf::<Test>::get(3), Some((10, data(3))));209 assert_eq!(Balances::free_balance(10), 70);210 });211}212213#[test]214fn resolving_subaccount_ownership_works() {215 new_test_ext().execute_with(|| {216 let data = |x| Data::Raw(vec![x; 1].try_into().unwrap());217218 assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten())));219 assert_ok!(Identity::set_identity(RuntimeOrigin::signed(20), Box::new(twenty())));220221 222 assert_ok!(Identity::add_sub(RuntimeOrigin::signed(10), 1, data(1)));223 assert_eq!(Balances::free_balance(1), 10);224 assert_eq!(Balances::free_balance(10), 80);225 assert_eq!(Balances::reserved_balance(10), 20);226 227 assert_noop!(228 Identity::add_sub(RuntimeOrigin::signed(20), 1, data(1)),229 Error::<Test>::AlreadyClaimed230 );231 232 assert_ok!(Identity::quit_sub(RuntimeOrigin::signed(1)));233 234 assert_eq!(Balances::free_balance(1), 20);235 assert_eq!(Balances::free_balance(10), 80);236 assert_eq!(Balances::reserved_balance(10), 10);237 238 assert_ok!(Identity::add_sub(RuntimeOrigin::signed(20), 1, data(1)));239 });240}241242#[test]243fn trailing_zeros_decodes_into_default_data() {244 let encoded = Data::Raw(b"Hello".to_vec().try_into().unwrap()).encode();245 assert!(<(Data, Data)>::decode(&mut &encoded[..]).is_err());246 let input = &mut &encoded[..];247 let (a, b) = <(Data, Data)>::decode(&mut AppendZerosInput::new(input)).unwrap();248 assert_eq!(a, Data::Raw(b"Hello".to_vec().try_into().unwrap()));249 assert_eq!(b, Data::None);250}251252#[test]253fn adding_registrar_should_work() {254 new_test_ext().execute_with(|| {255 assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3));256 assert_ok!(Identity::set_fee(RuntimeOrigin::signed(3), 0, 10));257 let fields = IdentityFields(IdentityField::Display | IdentityField::Legal);258 assert_ok!(Identity::set_fields(RuntimeOrigin::signed(3), 0, fields));259 assert_eq!(260 Identity::registrars(),261 vec![Some(RegistrarInfo { account: 3, fee: 10, fields })]262 );263 });264}265266#[test]267fn amount_of_registrars_is_limited() {268 new_test_ext().execute_with(|| {269 for i in 1..MaxRegistrars::get() + 1 {270 assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), i as u64));271 }272 let last_registrar = MaxRegistrars::get() as u64 + 1;273 assert_noop!(274 Identity::add_registrar(RuntimeOrigin::signed(1), last_registrar),275 Error::<Test>::TooManyRegistrars276 );277 });278}279280#[test]281fn registration_should_work() {282 new_test_ext().execute_with(|| {283 assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3));284 assert_ok!(Identity::set_fee(RuntimeOrigin::signed(3), 0, 10));285 let mut three_fields = ten();286 three_fields.additional.try_push(Default::default()).unwrap();287 three_fields.additional.try_push(Default::default()).unwrap();288 assert!(three_fields.additional.try_push(Default::default()).is_err());289 assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten())));290 assert_eq!(Identity::identity(10).unwrap().info, ten());291 assert_eq!(Balances::free_balance(10), 90);292 assert_ok!(Identity::clear_identity(RuntimeOrigin::signed(10)));293 assert_eq!(Balances::free_balance(10), 100);294 assert_noop!(Identity::clear_identity(RuntimeOrigin::signed(10)), Error::<Test>::NotNamed);295 });296}297298#[test]299fn uninvited_judgement_should_work() {300 new_test_ext().execute_with(|| {301 assert_noop!(302 Identity::provide_judgement(303 RuntimeOrigin::signed(3),304 0,305 10,306 Judgement::Reasonable,307 H256::random()308 ),309 Error::<Test>::InvalidIndex310 );311312 assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3));313 assert_noop!(314 Identity::provide_judgement(315 RuntimeOrigin::signed(3),316 0,317 10,318 Judgement::Reasonable,319 H256::random()320 ),321 Error::<Test>::InvalidTarget322 );323324 assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten())));325 assert_noop!(326 Identity::provide_judgement(327 RuntimeOrigin::signed(3),328 0,329 10,330 Judgement::Reasonable,331 H256::random()332 ),333 Error::<Test>::JudgementForDifferentIdentity334 );335336 let identity_hash = BlakeTwo256::hash_of(&ten());337338 assert_noop!(339 Identity::provide_judgement(340 RuntimeOrigin::signed(10),341 0,342 10,343 Judgement::Reasonable,344 identity_hash345 ),346 Error::<Test>::InvalidIndex347 );348 assert_noop!(349 Identity::provide_judgement(350 RuntimeOrigin::signed(3),351 0,352 10,353 Judgement::FeePaid(1),354 identity_hash355 ),356 Error::<Test>::InvalidJudgement357 );358359 assert_ok!(Identity::provide_judgement(360 RuntimeOrigin::signed(3),361 0,362 10,363 Judgement::Reasonable,364 identity_hash365 ));366 assert_eq!(Identity::identity(10).unwrap().judgements, vec![(0, Judgement::Reasonable)]);367 });368}369370#[test]371fn clearing_judgement_should_work() {372 new_test_ext().execute_with(|| {373 assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3));374 assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten())));375 assert_ok!(Identity::provide_judgement(376 RuntimeOrigin::signed(3),377 0,378 10,379 Judgement::Reasonable,380 BlakeTwo256::hash_of(&ten())381 ));382 assert_ok!(Identity::clear_identity(RuntimeOrigin::signed(10)));383 assert_eq!(Identity::identity(10), None);384 });385}386387#[test]388fn killing_slashing_should_work() {389 new_test_ext().execute_with(|| {390 assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten())));391 assert_noop!(Identity::kill_identity(RuntimeOrigin::signed(1), 10), BadOrigin);392 assert_ok!(Identity::kill_identity(RuntimeOrigin::signed(2), 10));393 assert_eq!(Identity::identity(10), None);394 assert_eq!(Balances::free_balance(10), 90);395 assert_noop!(396 Identity::kill_identity(RuntimeOrigin::signed(2), 10),397 Error::<Test>::NotNamed398 );399 });400}401402#[test]403fn setting_subaccounts_should_work() {404 new_test_ext().execute_with(|| {405 let mut subs = vec![(20, Data::Raw(vec![40; 1].try_into().unwrap()))];406 assert_noop!(407 Identity::set_subs(RuntimeOrigin::signed(10), subs.clone()),408 Error::<Test>::NotFound409 );410411 assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten())));412 assert_ok!(Identity::set_subs(RuntimeOrigin::signed(10), subs.clone()));413 assert_eq!(Balances::free_balance(10), 80);414 assert_eq!(Identity::subs_of(10), (10, vec![20].try_into().unwrap()));415 assert_eq!(Identity::super_of(20), Some((10, Data::Raw(vec![40; 1].try_into().unwrap()))));416417 418 subs.push((30, Data::Raw(vec![50; 1].try_into().unwrap())));419 assert_ok!(Identity::set_subs(RuntimeOrigin::signed(10), subs.clone()));420 assert_eq!(Balances::free_balance(10), 70);421 assert_eq!(Identity::subs_of(10), (20, vec![20, 30].try_into().unwrap()));422 assert_eq!(Identity::super_of(20), Some((10, Data::Raw(vec![40; 1].try_into().unwrap()))));423 assert_eq!(Identity::super_of(30), Some((10, Data::Raw(vec![50; 1].try_into().unwrap()))));424425 426 subs[0] = (40, Data::Raw(vec![60; 1].try_into().unwrap()));427 assert_ok!(Identity::set_subs(RuntimeOrigin::signed(10), subs.clone()));428 assert_eq!(Balances::free_balance(10), 70); 429 assert_eq!(Identity::subs_of(10), (20, vec![40, 30].try_into().unwrap()));430 assert_eq!(Identity::super_of(20), None);431 assert_eq!(Identity::super_of(30), Some((10, Data::Raw(vec![50; 1].try_into().unwrap()))));432 assert_eq!(Identity::super_of(40), Some((10, Data::Raw(vec![60; 1].try_into().unwrap()))));433434 435 assert_ok!(Identity::set_subs(RuntimeOrigin::signed(10), vec![]));436 assert_eq!(Balances::free_balance(10), 90);437 assert_eq!(Identity::subs_of(10), (0, BoundedVec::default()));438 assert_eq!(Identity::super_of(30), None);439 assert_eq!(Identity::super_of(40), None);440441 subs.push((20, Data::Raw(vec![40; 1].try_into().unwrap())));442 assert_noop!(443 Identity::set_subs(RuntimeOrigin::signed(10), subs.clone()),444 Error::<Test>::TooManySubAccounts445 );446 });447}448449#[test]450fn clearing_account_should_remove_subaccounts_and_refund() {451 new_test_ext().execute_with(|| {452 assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten())));453 assert_ok!(Identity::set_subs(454 RuntimeOrigin::signed(10),455 vec![(20, Data::Raw(vec![40; 1].try_into().unwrap()))]456 ));457 assert_ok!(Identity::clear_identity(RuntimeOrigin::signed(10)));458 assert_eq!(Balances::free_balance(10), 100);459 assert!(Identity::super_of(20).is_none());460 });461}462463#[test]464fn killing_account_should_remove_subaccounts_and_not_refund() {465 new_test_ext().execute_with(|| {466 assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten())));467 assert_ok!(Identity::set_subs(468 RuntimeOrigin::signed(10),469 vec![(20, Data::Raw(vec![40; 1].try_into().unwrap()))]470 ));471 assert_ok!(Identity::kill_identity(RuntimeOrigin::signed(2), 10));472 assert_eq!(Balances::free_balance(10), 80);473 assert!(Identity::super_of(20).is_none());474 });475}476477#[test]478fn cancelling_requested_judgement_should_work() {479 new_test_ext().execute_with(|| {480 assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3));481 assert_ok!(Identity::set_fee(RuntimeOrigin::signed(3), 0, 10));482 assert_noop!(483 Identity::cancel_request(RuntimeOrigin::signed(10), 0),484 Error::<Test>::NoIdentity485 );486 assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten())));487 assert_ok!(Identity::request_judgement(RuntimeOrigin::signed(10), 0, 10));488 assert_ok!(Identity::cancel_request(RuntimeOrigin::signed(10), 0));489 assert_eq!(Balances::free_balance(10), 90);490 assert_noop!(491 Identity::cancel_request(RuntimeOrigin::signed(10), 0),492 Error::<Test>::NotFound493 );494495 assert_ok!(Identity::provide_judgement(496 RuntimeOrigin::signed(3),497 0,498 10,499 Judgement::Reasonable,500 BlakeTwo256::hash_of(&ten())501 ));502 assert_noop!(503 Identity::cancel_request(RuntimeOrigin::signed(10), 0),504 Error::<Test>::JudgementGiven505 );506 });507}508509#[test]510fn requesting_judgement_should_work() {511 new_test_ext().execute_with(|| {512 assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3));513 assert_ok!(Identity::set_fee(RuntimeOrigin::signed(3), 0, 10));514 assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten())));515 assert_noop!(516 Identity::request_judgement(RuntimeOrigin::signed(10), 0, 9),517 Error::<Test>::FeeChanged518 );519 assert_ok!(Identity::request_judgement(RuntimeOrigin::signed(10), 0, 10));520 521 assert_eq!(Balances::free_balance(10), 80);522523 524 assert_noop!(525 Identity::request_judgement(RuntimeOrigin::signed(10), 0, 10),526 Error::<Test>::StickyJudgement527 );528 assert_ok!(Identity::provide_judgement(529 RuntimeOrigin::signed(3),530 0,531 10,532 Judgement::Erroneous,533 BlakeTwo256::hash_of(&ten())534 ));535 536 assert_eq!(Balances::free_balance(3), 20);537538 539 assert_noop!(540 Identity::request_judgement(RuntimeOrigin::signed(10), 0, 10),541 Error::<Test>::StickyJudgement542 );543544 545 assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 4));546 assert_ok!(Identity::request_judgement(RuntimeOrigin::signed(10), 1, 10));547548 549 assert_ok!(Identity::provide_judgement(550 RuntimeOrigin::signed(3),551 0,552 10,553 Judgement::OutOfDate,554 BlakeTwo256::hash_of(&ten())555 ));556 assert_ok!(Identity::request_judgement(RuntimeOrigin::signed(10), 0, 10));557 });558}559560#[test]561fn provide_judgement_should_return_judgement_payment_failed_error() {562 new_test_ext().execute_with(|| {563 assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3));564 assert_ok!(Identity::set_fee(RuntimeOrigin::signed(3), 0, 10));565 assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten())));566 assert_ok!(Identity::request_judgement(RuntimeOrigin::signed(10), 0, 10));567 568 assert_eq!(Balances::free_balance(10), 80);569570 571 Balances::make_free_balance_be(&3, 0);572 assert_noop!(573 Identity::provide_judgement(574 RuntimeOrigin::signed(3),575 0,576 10,577 Judgement::Erroneous,578 BlakeTwo256::hash_of(&ten())579 ),580 Error::<Test>::JudgementPaymentFailed581 );582 });583}584585#[test]586fn field_deposit_should_work() {587 new_test_ext().execute_with(|| {588 assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3));589 assert_ok!(Identity::set_fee(RuntimeOrigin::signed(3), 0, 10));590 assert_ok!(Identity::set_identity(591 RuntimeOrigin::signed(10),592 Box::new(IdentityInfo {593 additional: vec![594 (595 Data::Raw(b"number".to_vec().try_into().unwrap()),596 Data::Raw(10u32.encode().try_into().unwrap())597 ),598 (599 Data::Raw(b"text".to_vec().try_into().unwrap()),600 Data::Raw(b"10".to_vec().try_into().unwrap())601 ),602 ]603 .try_into()604 .unwrap(),605 ..Default::default()606 })607 ));608 assert_eq!(Balances::free_balance(10), 70);609 });610}611612#[test]613fn setting_account_id_should_work() {614 new_test_ext().execute_with(|| {615 assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3));616 617 assert_noop!(618 Identity::set_account_id(RuntimeOrigin::signed(4), 0, 3),619 Error::<Test>::InvalidIndex620 );621 622 assert_ok!(Identity::set_account_id(RuntimeOrigin::signed(3), 0, 4));623 624 assert_ok!(Identity::set_account_id(RuntimeOrigin::signed(4), 0, 3));625 });626}627628#[test]629fn test_has_identity() {630 new_test_ext().execute_with(|| {631 assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten())));632 assert!(Identity::has_identity(&10, IdentityField::Display as u64));633 assert!(Identity::has_identity(&10, IdentityField::Legal as u64));634 assert!(Identity::has_identity(635 &10,636 IdentityField::Display as u64 | IdentityField::Legal as u64637 ));638 assert!(!Identity::has_identity(639 &10,640 IdentityField::Display as u64 | IdentityField::Legal as u64 | IdentityField::Web as u64641 ));642 });643}