Newer
Older
use frame_support::{assert_noop, assert_ok};
fn should_feed_values_from_member() {
System::set_block_number(1);
let account_id: AccountId = 1;
assert_noop!(
ModuleOracle::feed_values(Origin::signed(5), vec![(50, 1000), (51, 900), (52, 800)]),
Error::<Test, _>::NoPermission,
);
assert_eq!(
ModuleOracle::feed_values(Origin::signed(account_id), vec![(50, 1000), (51, 900), (52, 800)])
.unwrap()
.pays_fee,
Pays::No
);
System::assert_last_event(Event::oracle(crate::Event::NewFeedData(
1,
vec![(50, 1000), (51, 900), (52, 800)],
)));
ModuleOracle::raw_values(&account_id, &50),
Some(TimestampedValue {
value: 1000,
timestamp: 12345,
})
);
assert_eq!(
ModuleOracle::raw_values(&account_id, &51),
Some(TimestampedValue {
value: 900,
timestamp: 12345,
})
);
assert_eq!(
ModuleOracle::raw_values(&account_id, &52),
Some(TimestampedValue {
value: 800,
timestamp: 12345,
})
);
});
}
#[test]
fn should_feed_values_from_root() {
new_test_ext().execute_with(|| {
let root_feeder: AccountId = RootOperatorAccountId::get();
vec![(50, 1000), (51, 900), (52, 800)]
ModuleOracle::raw_values(&root_feeder, &50),
Some(TimestampedValue {
value: 1000,
timestamp: 12345,
})
);
assert_eq!(
ModuleOracle::raw_values(&root_feeder, &51),
Some(TimestampedValue {
value: 900,
timestamp: 12345,
})
);
assert_eq!(
ModuleOracle::raw_values(&root_feeder, &52),
Some(TimestampedValue {
value: 800,
timestamp: 12345,
})
);
});
}
let key: u32 = 50;
assert_eq!(ModuleOracle::is_updated(key), false);
assert_ok!(ModuleOracle::feed_values(Origin::signed(1), vec![(key, 1000)]));
assert_ok!(ModuleOracle::feed_values(Origin::signed(2), vec![(key, 1000)]));
assert_ok!(ModuleOracle::feed_values(Origin::signed(3), vec![(key, 1000)]));
assert_eq!(ModuleOracle::is_updated(key), false);
assert_eq!(
ModuleOracle::get(&key).unwrap(),
TimestampedValue {
value: 1000,
timestamp: 12345
}
);
assert_eq!(ModuleOracle::is_updated(key), true);
ModuleOracle::on_finalize(1);
assert_ok!(ModuleOracle::feed_values(Origin::signed(1), vec![(key, 1000)]));
let raw_values = ModuleOracle::read_raw_values(&key);
assert_eq!(raw_values, vec![]);
assert_ok!(ModuleOracle::feed_values(Origin::signed(1), vec![(key, 1000)]));
assert_ok!(ModuleOracle::feed_values(Origin::signed(2), vec![(key, 1200)]));
let raw_values = ModuleOracle::read_raw_values(&key);
assert_eq!(
raw_values,
vec![
TimestampedValue {
value: 1000,
timestamp: 12345,
},
TimestampedValue {
value: 1200,
timestamp: 12345,
},
]
);
assert_ok!(ModuleOracle::feed_values(Origin::signed(1), vec![(key, 1300)]));
assert_ok!(ModuleOracle::feed_values(Origin::signed(2), vec![(key, 1000)]));
assert_ok!(ModuleOracle::feed_values(Origin::signed(3), vec![(key, 1200)]));
let expected = Some(TimestampedValue {
value: 1200,
timestamp: 12345,
});
assert_eq!(ModuleOracle::get(&key), expected);
Timestamp::set_timestamp(23456);
assert_eq!(ModuleOracle::get(&key), expected);
});
}
#[test]
});
}
#[test]
fn multiple_calls_should_fail() {
new_test_ext().execute_with(|| {
assert_ok!(ModuleOracle::feed_values(Origin::signed(1), vec![(50, 1300)]));
ModuleOracle::feed_values(Origin::signed(1), vec![(50, 1300)]),
Error::<Test, _>::AlreadyFeeded,
assert_ok!(ModuleOracle::feed_values(Origin::signed(1), vec![(50, 1300)]));
#[test]
fn get_all_values_should_work() {
new_test_ext().execute_with(|| {
let eur: u32 = 1;
let jpy: u32 = 2;
assert_eq!(ModuleOracle::get_all_values(), vec![]);
// feed eur & jpy
assert_ok!(ModuleOracle::feed_values(Origin::signed(1), vec![(eur, 1300)]));
assert_ok!(ModuleOracle::feed_values(Origin::signed(2), vec![(eur, 1000)]));
assert_ok!(ModuleOracle::feed_values(Origin::signed(3), vec![(jpy, 9000)]));
// not enough eur & jpy prices
assert_eq!(ModuleOracle::get(&eur), None);
assert_eq!(ModuleOracle::get(&jpy), None);
assert_eq!(ModuleOracle::get_all_values(), vec![]);
// finalize block
assert_ok!(ModuleOracle::feed_values(Origin::signed(3), vec![(eur, 1200)]));
assert_ok!(ModuleOracle::feed_values(Origin::signed(1), vec![(jpy, 8000)]));
// enough eur prices
let eur_price = Some(TimestampedValue {
value: 1200,
timestamp: 12345,
});
assert_eq!(ModuleOracle::get(&eur), eur_price);
// not enough jpy prices
assert_eq!(ModuleOracle::get(&jpy), None);
assert_eq!(ModuleOracle::get_all_values(), vec![(eur, eur_price)]);
// feed jpy
assert_ok!(ModuleOracle::feed_values(Origin::signed(2), vec![(jpy, 7000)]));
// enough jpy prices
let jpy_price = Some(TimestampedValue {
value: 8000,
timestamp: 12345,
});
assert_eq!(ModuleOracle::get(&jpy), jpy_price);
assert_eq!(ModuleOracle::get_all_values(), vec![(eur, eur_price), (jpy, jpy_price)]);
});
}
#[test]
fn change_member_should_work() {
new_test_ext().execute_with(|| {
OracleMembers::set(vec![2, 3, 4]);
<ModuleOracle as ChangeMembers<AccountId>>::change_members_sorted(&[4], &[1], &[2, 3, 4]);
ModuleOracle::feed_values(Origin::signed(1), vec![(50, 1000)]),
Error::<Test, _>::NoPermission,
assert_ok!(ModuleOracle::feed_values(Origin::signed(2), vec![(50, 1000)]));
assert_ok!(ModuleOracle::feed_values(Origin::signed(4), vec![(50, 1000)]));
});
}
#[test]
fn should_clear_is_updated_on_change_member() {
new_test_ext().execute_with(|| {
assert_ok!(ModuleOracle::feed_values(Origin::signed(1), vec![(50, 1000)]));
assert_ok!(ModuleOracle::feed_values(Origin::signed(2), vec![(50, 1000)]));
assert_ok!(ModuleOracle::feed_values(Origin::signed(3), vec![(50, 1000)]));
assert_eq!(
ModuleOracle::get(&50).unwrap(),
TimestampedValue {
value: 1000,
timestamp: 12345
}
);
assert_eq!(ModuleOracle::is_updated(50), true);
ModuleOracle::change_members_sorted(&[4], &[1], &[2, 3, 4]);
assert_eq!(ModuleOracle::is_updated(50), false);
});
}
#[test]
fn should_clear_data_for_removed_members() {
new_test_ext().execute_with(|| {
assert_ok!(ModuleOracle::feed_values(Origin::signed(1), vec![(50, 1000)]));
assert_ok!(ModuleOracle::feed_values(Origin::signed(2), vec![(50, 1000)]));
ModuleOracle::change_members_sorted(&[4], &[1], &[2, 3, 4]);
assert_eq!(ModuleOracle::raw_values(&1, 50), None);
});
}