use super::*;
use frame_support::assert_ok;
#[test]
fn try_state_works_with_uninitialized_pallet() {
sp_io::TestExternalities::default().execute_with(|| {
assert!(ActiveEra::<Test>::get().is_none());
assert!(CurrentEra::<Test>::get().is_none());
assert_eq!(Bonded::<Test>::iter().count(), 0);
assert_eq!(Ledger::<Test>::iter().count(), 0);
assert_eq!(Validators::<Test>::iter().count(), 0);
assert_eq!(Nominators::<Test>::iter().count(), 0);
assert_ok!(Staking::do_try_state(System::block_number()));
});
}
#[test]
fn try_state_detects_inconsistent_active_current_era() {
ExtBuilder::default().has_stakers(false).build_and_execute(|| {
ActiveEra::<Test>::put(ActiveEraInfo { index: 1, start: None });
CurrentEra::<Test>::kill();
assert!(Staking::do_try_state(System::block_number()).is_err());
ActiveEra::<Test>::kill();
CurrentEra::<Test>::put(1);
assert!(Staking::do_try_state(System::block_number()).is_err());
ActiveEra::<Test>::kill();
CurrentEra::<Test>::kill();
assert_ok!(Staking::do_try_state(System::block_number()));
ActiveEra::<Test>::put(ActiveEraInfo { index: 1, start: None });
CurrentEra::<Test>::put(1);
use frame_support::BoundedVec;
let bonded_eras: BoundedVec<(u32, u32), _> =
BoundedVec::try_from(vec![(0, 0), (1, 0)]).unwrap();
BondedEras::<Test>::put(bonded_eras);
assert_ok!(Staking::do_try_state(System::block_number()));
});
}
#[test]
fn try_state_bad_exposure() {
ExtBuilder::default().try_state(false).build_and_execute(|| {
Session::roll_until_active_era(2);
assert!(Staking::do_try_state(System::block_number()).is_ok());
let (validator, mut metadata) = ErasStakersOverview::<T>::iter()
.take(1)
.map(|(_era, validator, metadata)| (validator, metadata))
.collect::<Vec<_>>()
.pop()
.unwrap();
metadata.total += 1;
ErasStakersOverview::<T>::insert(2, validator, metadata);
assert!(Staking::do_try_state(System::block_number()).is_err());
});
}
#[test]
fn last_validator_era_can_be_one_greater_than_active_era() {
ExtBuilder::default().try_state(false).build_and_execute(|| {
Session::roll_until_active_era(1);
let era = active_era();
for (validator, _) in ErasStakersOverview::<T>::iter_prefix(era) {
assert_eq!(LastValidatorEra::<T>::get(&validator), Some(era));
}
while ErasStakersOverview::<T>::iter_prefix(era + 1).next().is_none() {
Session::roll_to_next_session();
}
assert_eq!(active_era(), 1);
assert_eq!(current_era(), 2);
for (validator, _) in ErasStakersOverview::<T>::iter_prefix(era) {
assert_eq!(LastValidatorEra::<T>::get(&validator), Some(era + 1));
}
});
}
#[test]
fn try_state_bad_eras_total_stake() {
ExtBuilder::default().try_state(false).build_and_execute(|| {
Session::roll_until_active_era(2);
assert!(Staking::do_try_state(System::block_number()).is_ok());
ErasTotalStake::<T>::mutate(2, |s| *s -= 1);
assert!(Staking::do_try_state(System::block_number()).is_err());
});
}
#[test]
fn try_state_detects_incentive_weight_mismatch() {
ExtBuilder::default().build_and_execute(|| {
setup_incentive_with_budget(45, 5);
Session::roll_until_active_era(2);
let era = 2;
let stored_total = ErasSumValidatorIncentiveWeight::<Test>::get(era);
assert!(stored_total > 0);
ErasSumValidatorIncentiveWeight::<Test>::insert(era, stored_total + 999);
assert!(Staking::do_try_state(System::block_number()).is_err());
ErasSumValidatorIncentiveWeight::<Test>::insert(era, stored_total);
});
}