mod.rs 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147
  1. mod mock;
  2. use governance::election_params::ElectionParameters;
  3. use srml_support::traits::Currency;
  4. use srml_support::StorageMap;
  5. use system::RawOrigin;
  6. use crate::*;
  7. use crate::{BalanceOf, Error, ProposalDetails};
  8. use proposal_engine::ProposalParameters;
  9. use roles::actors::RoleParameters;
  10. use srml_support::dispatch::DispatchResult;
  11. use crate::proposal_types::ProposalsConfigParameters;
  12. pub use mock::*;
  13. pub(crate) fn increase_total_balance_issuance(balance: u64) {
  14. increase_total_balance_issuance_using_account_id(999, balance);
  15. }
  16. pub(crate) fn increase_total_balance_issuance_using_account_id(account_id: u64, balance: u64) {
  17. let initial_balance = Balances::total_issuance();
  18. {
  19. let _ = <Test as stake::Trait>::Currency::deposit_creating(&account_id, balance);
  20. }
  21. assert_eq!(Balances::total_issuance(), initial_balance + balance);
  22. }
  23. struct ProposalTestFixture<InsufficientRightsCall, EmptyStakeCall, InvalidStakeCall, SuccessfulCall>
  24. where
  25. InsufficientRightsCall: Fn() -> DispatchResult<crate::Error>,
  26. EmptyStakeCall: Fn() -> DispatchResult<crate::Error>,
  27. InvalidStakeCall: Fn() -> DispatchResult<crate::Error>,
  28. SuccessfulCall: Fn() -> DispatchResult<crate::Error>,
  29. {
  30. insufficient_rights_call: InsufficientRightsCall,
  31. empty_stake_call: EmptyStakeCall,
  32. invalid_stake_call: InvalidStakeCall,
  33. successful_call: SuccessfulCall,
  34. proposal_parameters: ProposalParameters<u64, u64>,
  35. proposal_details: ProposalDetails<u64, u64, u64, u64, u64>,
  36. }
  37. impl<InsufficientRightsCall, EmptyStakeCall, InvalidStakeCall, SuccessfulCall>
  38. ProposalTestFixture<InsufficientRightsCall, EmptyStakeCall, InvalidStakeCall, SuccessfulCall>
  39. where
  40. InsufficientRightsCall: Fn() -> DispatchResult<crate::Error>,
  41. EmptyStakeCall: Fn() -> DispatchResult<crate::Error>,
  42. InvalidStakeCall: Fn() -> DispatchResult<crate::Error>,
  43. SuccessfulCall: Fn() -> DispatchResult<crate::Error>,
  44. {
  45. fn check_for_invalid_stakes(&self) {
  46. assert_eq!((self.empty_stake_call)(), Err(Error::Other("EmptyStake")));
  47. assert_eq!(
  48. (self.invalid_stake_call)(),
  49. Err(Error::Other("StakeDiffersFromRequired"))
  50. );
  51. }
  52. fn check_call_for_insufficient_rights(&self) {
  53. assert_eq!(
  54. (self.insufficient_rights_call)(),
  55. Err(Error::Other("RequireSignedOrigin"))
  56. );
  57. }
  58. fn check_for_successful_call(&self) {
  59. let account_id = 1;
  60. let _imbalance = <Test as stake::Trait>::Currency::deposit_creating(&account_id, 50000);
  61. assert_eq!((self.successful_call)(), Ok(()));
  62. // a discussion was created
  63. let thread_id = <crate::ThreadIdByProposalId<Test>>::get(1);
  64. assert_eq!(thread_id, 1);
  65. let proposal_id = 1;
  66. let proposal = ProposalsEngine::proposals(proposal_id);
  67. // check for correct proposal parameters
  68. assert_eq!(proposal.parameters, self.proposal_parameters);
  69. // proposal details was set
  70. let details = <crate::ProposalDetailsByProposalId<Test>>::get(proposal_id);
  71. assert_eq!(details, self.proposal_details);
  72. }
  73. pub fn check_all(&self) {
  74. self.check_call_for_insufficient_rights();
  75. self.check_for_invalid_stakes();
  76. self.check_for_successful_call();
  77. }
  78. }
  79. #[test]
  80. fn create_text_proposal_common_checks_succeed() {
  81. initial_test_ext().execute_with(|| {
  82. increase_total_balance_issuance(500000);
  83. let proposal_fixture = ProposalTestFixture {
  84. insufficient_rights_call: || {
  85. ProposalCodex::create_text_proposal(
  86. RawOrigin::None.into(),
  87. 1,
  88. b"title".to_vec(),
  89. b"body".to_vec(),
  90. None,
  91. b"text".to_vec(),
  92. )
  93. },
  94. empty_stake_call: || {
  95. ProposalCodex::create_text_proposal(
  96. RawOrigin::Signed(1).into(),
  97. 1,
  98. b"title".to_vec(),
  99. b"body".to_vec(),
  100. None,
  101. b"text".to_vec(),
  102. )
  103. },
  104. invalid_stake_call: || {
  105. ProposalCodex::create_text_proposal(
  106. RawOrigin::Signed(1).into(),
  107. 1,
  108. b"title".to_vec(),
  109. b"body".to_vec(),
  110. Some(<BalanceOf<Test>>::from(5000u32)),
  111. b"text".to_vec(),
  112. )
  113. },
  114. successful_call: || {
  115. ProposalCodex::create_text_proposal(
  116. RawOrigin::Signed(1).into(),
  117. 1,
  118. b"title".to_vec(),
  119. b"body".to_vec(),
  120. Some(<BalanceOf<Test>>::from(25000u32)),
  121. b"text".to_vec(),
  122. )
  123. },
  124. proposal_parameters: crate::proposal_types::parameters::text_proposal::<Test>(),
  125. proposal_details: ProposalDetails::Text(b"text".to_vec()),
  126. };
  127. proposal_fixture.check_all();
  128. });
  129. }
  130. #[test]
  131. fn create_text_proposal_codex_call_fails_with_incorrect_text_size() {
  132. initial_test_ext().execute_with(|| {
  133. let origin = RawOrigin::Signed(1).into();
  134. let long_text = [0u8; 30000].to_vec();
  135. assert_eq!(
  136. ProposalCodex::create_text_proposal(
  137. origin,
  138. 1,
  139. b"title".to_vec(),
  140. b"body".to_vec(),
  141. None,
  142. long_text,
  143. ),
  144. Err(Error::TextProposalSizeExceeded)
  145. );
  146. assert_eq!(
  147. ProposalCodex::create_text_proposal(
  148. RawOrigin::Signed(1).into(),
  149. 1,
  150. b"title".to_vec(),
  151. b"body".to_vec(),
  152. None,
  153. Vec::new(),
  154. ),
  155. Err(Error::TextProposalIsEmpty)
  156. );
  157. });
  158. }
  159. #[test]
  160. fn create_runtime_upgrade_common_checks_succeed() {
  161. initial_test_ext().execute_with(|| {
  162. increase_total_balance_issuance_using_account_id(1, 5000000);
  163. let proposal_fixture = ProposalTestFixture {
  164. insufficient_rights_call: || {
  165. ProposalCodex::create_runtime_upgrade_proposal(
  166. RawOrigin::None.into(),
  167. 1,
  168. b"title".to_vec(),
  169. b"body".to_vec(),
  170. None,
  171. b"wasm".to_vec(),
  172. )
  173. },
  174. empty_stake_call: || {
  175. ProposalCodex::create_runtime_upgrade_proposal(
  176. RawOrigin::Signed(1).into(),
  177. 1,
  178. b"title".to_vec(),
  179. b"body".to_vec(),
  180. None,
  181. b"wasm".to_vec(),
  182. )
  183. },
  184. invalid_stake_call: || {
  185. ProposalCodex::create_runtime_upgrade_proposal(
  186. RawOrigin::Signed(1).into(),
  187. 1,
  188. b"title".to_vec(),
  189. b"body".to_vec(),
  190. Some(<BalanceOf<Test>>::from(500u32)),
  191. b"wasm".to_vec(),
  192. )
  193. },
  194. successful_call: || {
  195. ProposalCodex::create_runtime_upgrade_proposal(
  196. RawOrigin::Signed(1).into(),
  197. 1,
  198. b"title".to_vec(),
  199. b"body".to_vec(),
  200. Some(<BalanceOf<Test>>::from(1_000_000_u32)),
  201. b"wasm".to_vec(),
  202. )
  203. },
  204. proposal_parameters: crate::proposal_types::parameters::runtime_upgrade_proposal::<Test>(),
  205. proposal_details: ProposalDetails::RuntimeUpgrade(b"wasm".to_vec()),
  206. };
  207. proposal_fixture.check_all();
  208. });
  209. }
  210. #[test]
  211. fn create_upgrade_runtime_proposal_codex_call_fails_with_incorrect_wasm_size() {
  212. initial_test_ext().execute_with(|| {
  213. let origin = RawOrigin::Signed(1).into();
  214. let long_wasm = [0u8; 30000].to_vec();
  215. assert_eq!(
  216. ProposalCodex::create_runtime_upgrade_proposal(
  217. origin,
  218. 1,
  219. b"title".to_vec(),
  220. b"body".to_vec(),
  221. None,
  222. long_wasm,
  223. ),
  224. Err(Error::RuntimeProposalSizeExceeded)
  225. );
  226. assert_eq!(
  227. ProposalCodex::create_runtime_upgrade_proposal(
  228. RawOrigin::Signed(1).into(),
  229. 1,
  230. b"title".to_vec(),
  231. b"body".to_vec(),
  232. None,
  233. Vec::new(),
  234. ),
  235. Err(Error::RuntimeProposalIsEmpty)
  236. );
  237. });
  238. }
  239. #[test]
  240. fn create_set_election_parameters_proposal_common_checks_succeed() {
  241. initial_test_ext().execute_with(|| {
  242. increase_total_balance_issuance_using_account_id(1, 500000);
  243. let proposal_fixture = ProposalTestFixture {
  244. insufficient_rights_call: || {
  245. ProposalCodex::create_set_election_parameters_proposal(
  246. RawOrigin::None.into(),
  247. 1,
  248. b"title".to_vec(),
  249. b"body".to_vec(),
  250. None,
  251. get_valid_election_parameters(),
  252. )
  253. },
  254. empty_stake_call: || {
  255. ProposalCodex::create_set_election_parameters_proposal(
  256. RawOrigin::Signed(1).into(),
  257. 1,
  258. b"title".to_vec(),
  259. b"body".to_vec(),
  260. None,
  261. get_valid_election_parameters(),
  262. )
  263. },
  264. invalid_stake_call: || {
  265. ProposalCodex::create_set_election_parameters_proposal(
  266. RawOrigin::Signed(1).into(),
  267. 1,
  268. b"title".to_vec(),
  269. b"body".to_vec(),
  270. Some(<BalanceOf<Test>>::from(50000u32)),
  271. get_valid_election_parameters(),
  272. )
  273. },
  274. successful_call: || {
  275. ProposalCodex::create_set_election_parameters_proposal(
  276. RawOrigin::Signed(1).into(),
  277. 1,
  278. b"title".to_vec(),
  279. b"body".to_vec(),
  280. Some(<BalanceOf<Test>>::from(200_000_u32)),
  281. get_valid_election_parameters(),
  282. )
  283. },
  284. proposal_parameters:
  285. crate::proposal_types::parameters::set_election_parameters_proposal::<Test>(),
  286. proposal_details: ProposalDetails::SetElectionParameters(
  287. get_valid_election_parameters(),
  288. ),
  289. };
  290. proposal_fixture.check_all();
  291. });
  292. }
  293. fn assert_failed_election_parameters_call(
  294. election_parameters: ElectionParameters<u64, u64>,
  295. error: Error,
  296. ) {
  297. assert_eq!(
  298. ProposalCodex::create_set_election_parameters_proposal(
  299. RawOrigin::Signed(1).into(),
  300. 1,
  301. b"title".to_vec(),
  302. b"body".to_vec(),
  303. Some(<BalanceOf<Test>>::from(3750u32)),
  304. election_parameters,
  305. ),
  306. Err(error)
  307. );
  308. }
  309. fn get_valid_election_parameters() -> ElectionParameters<u64, u64> {
  310. ElectionParameters {
  311. announcing_period: 14400,
  312. voting_period: 14400,
  313. revealing_period: 14400,
  314. council_size: 4,
  315. candidacy_limit: 25,
  316. new_term_duration: 14400,
  317. min_council_stake: 1,
  318. min_voting_stake: 1,
  319. }
  320. }
  321. #[test]
  322. fn create_set_election_parameters_call_fails_with_incorrect_parameters() {
  323. initial_test_ext().execute_with(|| {
  324. increase_total_balance_issuance_using_account_id(1, 500000);
  325. let mut election_parameters = get_valid_election_parameters();
  326. election_parameters.council_size = 2;
  327. assert_failed_election_parameters_call(
  328. election_parameters,
  329. Error::InvalidCouncilElectionParameterCouncilSize,
  330. );
  331. election_parameters.council_size = 21;
  332. assert_failed_election_parameters_call(
  333. election_parameters,
  334. Error::InvalidCouncilElectionParameterCouncilSize,
  335. );
  336. election_parameters = get_valid_election_parameters();
  337. election_parameters.candidacy_limit = 22;
  338. assert_failed_election_parameters_call(
  339. election_parameters,
  340. Error::InvalidCouncilElectionParameterCandidacyLimit,
  341. );
  342. election_parameters = get_valid_election_parameters();
  343. election_parameters.candidacy_limit = 122;
  344. assert_failed_election_parameters_call(
  345. election_parameters,
  346. Error::InvalidCouncilElectionParameterCandidacyLimit,
  347. );
  348. election_parameters = get_valid_election_parameters();
  349. election_parameters.min_voting_stake = 0;
  350. assert_failed_election_parameters_call(
  351. election_parameters,
  352. Error::InvalidCouncilElectionParameterMinVotingStake,
  353. );
  354. election_parameters = get_valid_election_parameters();
  355. election_parameters.min_voting_stake = 200000;
  356. assert_failed_election_parameters_call(
  357. election_parameters,
  358. Error::InvalidCouncilElectionParameterMinVotingStake,
  359. );
  360. election_parameters = get_valid_election_parameters();
  361. election_parameters.new_term_duration = 10000;
  362. assert_failed_election_parameters_call(
  363. election_parameters,
  364. Error::InvalidCouncilElectionParameterNewTermDuration,
  365. );
  366. election_parameters = get_valid_election_parameters();
  367. election_parameters.new_term_duration = 500000;
  368. assert_failed_election_parameters_call(
  369. election_parameters,
  370. Error::InvalidCouncilElectionParameterNewTermDuration,
  371. );
  372. election_parameters = get_valid_election_parameters();
  373. election_parameters.min_council_stake = 0;
  374. assert_failed_election_parameters_call(
  375. election_parameters,
  376. Error::InvalidCouncilElectionParameterMinCouncilStake,
  377. );
  378. election_parameters = get_valid_election_parameters();
  379. election_parameters.min_council_stake = 200000;
  380. assert_failed_election_parameters_call(
  381. election_parameters,
  382. Error::InvalidCouncilElectionParameterMinCouncilStake,
  383. );
  384. election_parameters = get_valid_election_parameters();
  385. election_parameters.voting_period = 10000;
  386. assert_failed_election_parameters_call(
  387. election_parameters,
  388. Error::InvalidCouncilElectionParameterVotingPeriod,
  389. );
  390. election_parameters = get_valid_election_parameters();
  391. election_parameters.voting_period = 50000;
  392. assert_failed_election_parameters_call(
  393. election_parameters,
  394. Error::InvalidCouncilElectionParameterVotingPeriod,
  395. );
  396. election_parameters = get_valid_election_parameters();
  397. election_parameters.revealing_period = 10000;
  398. assert_failed_election_parameters_call(
  399. election_parameters,
  400. Error::InvalidCouncilElectionParameterRevealingPeriod,
  401. );
  402. election_parameters = get_valid_election_parameters();
  403. election_parameters.revealing_period = 50000;
  404. assert_failed_election_parameters_call(
  405. election_parameters,
  406. Error::InvalidCouncilElectionParameterRevealingPeriod,
  407. );
  408. election_parameters = get_valid_election_parameters();
  409. election_parameters.announcing_period = 10000;
  410. assert_failed_election_parameters_call(
  411. election_parameters,
  412. Error::InvalidCouncilElectionParameterAnnouncingPeriod,
  413. );
  414. election_parameters = get_valid_election_parameters();
  415. election_parameters.announcing_period = 50000;
  416. assert_failed_election_parameters_call(
  417. election_parameters,
  418. Error::InvalidCouncilElectionParameterAnnouncingPeriod,
  419. );
  420. });
  421. }
  422. #[test]
  423. fn create_working_group_mint_capacity_proposal_fails_with_invalid_parameters() {
  424. initial_test_ext().execute_with(|| {
  425. increase_total_balance_issuance_using_account_id(1, 500000);
  426. assert_eq!(
  427. ProposalCodex::create_set_content_working_group_mint_capacity_proposal(
  428. RawOrigin::Signed(1).into(),
  429. 1,
  430. b"title".to_vec(),
  431. b"body".to_vec(),
  432. Some(<BalanceOf<Test>>::from(50000u32)),
  433. (crate::CONTENT_WORKING_GROUP_MINT_CAPACITY_MAX_VALUE + 1) as u64,
  434. ),
  435. Err(Error::InvalidStorageWorkingGroupMintCapacity)
  436. );
  437. });
  438. }
  439. #[test]
  440. fn create_set_content_working_group_mint_capacity_proposal_common_checks_succeed() {
  441. initial_test_ext().execute_with(|| {
  442. increase_total_balance_issuance(500000);
  443. let proposal_fixture = ProposalTestFixture {
  444. insufficient_rights_call: || {
  445. ProposalCodex::create_set_content_working_group_mint_capacity_proposal(
  446. RawOrigin::None.into(),
  447. 1,
  448. b"title".to_vec(),
  449. b"body".to_vec(),
  450. None,
  451. 0,
  452. )
  453. },
  454. empty_stake_call: || {
  455. ProposalCodex::create_set_content_working_group_mint_capacity_proposal(
  456. RawOrigin::Signed(1).into(),
  457. 1,
  458. b"title".to_vec(),
  459. b"body".to_vec(),
  460. None,
  461. 0,
  462. )
  463. },
  464. invalid_stake_call: || {
  465. ProposalCodex::create_set_content_working_group_mint_capacity_proposal(
  466. RawOrigin::Signed(1).into(),
  467. 1,
  468. b"title".to_vec(),
  469. b"body".to_vec(),
  470. Some(<BalanceOf<Test>>::from(5000u32)),
  471. 0,
  472. )
  473. },
  474. successful_call: || {
  475. ProposalCodex::create_set_content_working_group_mint_capacity_proposal(
  476. RawOrigin::Signed(1).into(),
  477. 1,
  478. b"title".to_vec(),
  479. b"body".to_vec(),
  480. Some(<BalanceOf<Test>>::from(50000u32)),
  481. 10,
  482. )
  483. },
  484. proposal_parameters: crate::proposal_types::parameters::set_content_working_group_mint_capacity_proposal::<Test>(),
  485. proposal_details: ProposalDetails::SetContentWorkingGroupMintCapacity(10),
  486. };
  487. proposal_fixture.check_all();
  488. });
  489. }
  490. #[test]
  491. fn create_spending_proposal_common_checks_succeed() {
  492. initial_test_ext().execute_with(|| {
  493. increase_total_balance_issuance(500000);
  494. let proposal_fixture = ProposalTestFixture {
  495. insufficient_rights_call: || {
  496. ProposalCodex::create_spending_proposal(
  497. RawOrigin::None.into(),
  498. 1,
  499. b"title".to_vec(),
  500. b"body".to_vec(),
  501. None,
  502. 20,
  503. 10,
  504. )
  505. },
  506. empty_stake_call: || {
  507. ProposalCodex::create_spending_proposal(
  508. RawOrigin::Signed(1).into(),
  509. 1,
  510. b"title".to_vec(),
  511. b"body".to_vec(),
  512. None,
  513. 20,
  514. 10,
  515. )
  516. },
  517. invalid_stake_call: || {
  518. ProposalCodex::create_spending_proposal(
  519. RawOrigin::Signed(1).into(),
  520. 1,
  521. b"title".to_vec(),
  522. b"body".to_vec(),
  523. Some(<BalanceOf<Test>>::from(5000u32)),
  524. 20,
  525. 10,
  526. )
  527. },
  528. successful_call: || {
  529. ProposalCodex::create_spending_proposal(
  530. RawOrigin::Signed(1).into(),
  531. 1,
  532. b"title".to_vec(),
  533. b"body".to_vec(),
  534. Some(<BalanceOf<Test>>::from(25000u32)),
  535. 100,
  536. 2,
  537. )
  538. },
  539. proposal_parameters: crate::proposal_types::parameters::spending_proposal::<Test>(),
  540. proposal_details: ProposalDetails::Spending(100, 2),
  541. };
  542. proposal_fixture.check_all();
  543. });
  544. }
  545. #[test]
  546. fn create_spending_proposal_call_fails_with_incorrect_balance() {
  547. initial_test_ext().execute_with(|| {
  548. increase_total_balance_issuance_using_account_id(500000, 1);
  549. assert_eq!(
  550. ProposalCodex::create_spending_proposal(
  551. RawOrigin::Signed(1).into(),
  552. 1,
  553. b"title".to_vec(),
  554. b"body".to_vec(),
  555. Some(<BalanceOf<Test>>::from(1250u32)),
  556. 0,
  557. 2,
  558. ),
  559. Err(Error::InvalidSpendingProposalBalance)
  560. );
  561. assert_eq!(
  562. ProposalCodex::create_spending_proposal(
  563. RawOrigin::Signed(1).into(),
  564. 1,
  565. b"title".to_vec(),
  566. b"body".to_vec(),
  567. Some(<BalanceOf<Test>>::from(1250u32)),
  568. 2000001,
  569. 2,
  570. ),
  571. Err(Error::InvalidSpendingProposalBalance)
  572. );
  573. });
  574. }
  575. #[test]
  576. fn create_set_lead_proposal_fails_with_proposed_councilor() {
  577. initial_test_ext().execute_with(|| {
  578. increase_total_balance_issuance_using_account_id(1, 500000);
  579. let lead_account_id = 20;
  580. <governance::council::Module<Test>>::set_council(
  581. RawOrigin::Root.into(),
  582. vec![lead_account_id],
  583. )
  584. .unwrap();
  585. assert_eq!(
  586. ProposalCodex::create_set_lead_proposal(
  587. RawOrigin::Signed(1).into(),
  588. 1,
  589. b"title".to_vec(),
  590. b"body".to_vec(),
  591. Some(<BalanceOf<Test>>::from(1250u32)),
  592. Some((20, lead_account_id)),
  593. ),
  594. Err(Error::InvalidSetLeadParameterCannotBeCouncilor)
  595. );
  596. });
  597. }
  598. #[test]
  599. fn create_set_lead_proposal_common_checks_succeed() {
  600. initial_test_ext().execute_with(|| {
  601. increase_total_balance_issuance(500000);
  602. let proposal_fixture = ProposalTestFixture {
  603. insufficient_rights_call: || {
  604. ProposalCodex::create_set_lead_proposal(
  605. RawOrigin::None.into(),
  606. 1,
  607. b"title".to_vec(),
  608. b"body".to_vec(),
  609. None,
  610. Some((20, 10)),
  611. )
  612. },
  613. empty_stake_call: || {
  614. ProposalCodex::create_set_lead_proposal(
  615. RawOrigin::Signed(1).into(),
  616. 1,
  617. b"title".to_vec(),
  618. b"body".to_vec(),
  619. None,
  620. Some((20, 10)),
  621. )
  622. },
  623. invalid_stake_call: || {
  624. ProposalCodex::create_set_lead_proposal(
  625. RawOrigin::Signed(1).into(),
  626. 1,
  627. b"title".to_vec(),
  628. b"body".to_vec(),
  629. Some(<BalanceOf<Test>>::from(5000u32)),
  630. Some((20, 10)),
  631. )
  632. },
  633. successful_call: || {
  634. ProposalCodex::create_set_lead_proposal(
  635. RawOrigin::Signed(1).into(),
  636. 1,
  637. b"title".to_vec(),
  638. b"body".to_vec(),
  639. Some(<BalanceOf<Test>>::from(50000u32)),
  640. Some((20, 10)),
  641. )
  642. },
  643. proposal_parameters: crate::proposal_types::parameters::set_lead_proposal::<Test>(),
  644. proposal_details: ProposalDetails::SetLead(Some((20, 10))),
  645. };
  646. proposal_fixture.check_all();
  647. });
  648. }
  649. #[test]
  650. fn create_evict_storage_provider_proposal_common_checks_succeed() {
  651. initial_test_ext().execute_with(|| {
  652. increase_total_balance_issuance(500000);
  653. let proposal_fixture = ProposalTestFixture {
  654. insufficient_rights_call: || {
  655. ProposalCodex::create_evict_storage_provider_proposal(
  656. RawOrigin::None.into(),
  657. 1,
  658. b"title".to_vec(),
  659. b"body".to_vec(),
  660. None,
  661. 1,
  662. )
  663. },
  664. empty_stake_call: || {
  665. ProposalCodex::create_evict_storage_provider_proposal(
  666. RawOrigin::Signed(1).into(),
  667. 1,
  668. b"title".to_vec(),
  669. b"body".to_vec(),
  670. None,
  671. 1,
  672. )
  673. },
  674. invalid_stake_call: || {
  675. ProposalCodex::create_evict_storage_provider_proposal(
  676. RawOrigin::Signed(1).into(),
  677. 1,
  678. b"title".to_vec(),
  679. b"body".to_vec(),
  680. Some(<BalanceOf<Test>>::from(5000u32)),
  681. 1,
  682. )
  683. },
  684. successful_call: || {
  685. ProposalCodex::create_evict_storage_provider_proposal(
  686. RawOrigin::Signed(1).into(),
  687. 1,
  688. b"title".to_vec(),
  689. b"body".to_vec(),
  690. Some(<BalanceOf<Test>>::from(25000u32)),
  691. 1,
  692. )
  693. },
  694. proposal_parameters: crate::proposal_types::parameters::evict_storage_provider_proposal::<Test>(),
  695. proposal_details: ProposalDetails::EvictStorageProvider(1),
  696. };
  697. proposal_fixture.check_all();
  698. });
  699. }
  700. #[test]
  701. fn create_set_validator_count_proposal_common_checks_succeed() {
  702. initial_test_ext().execute_with(|| {
  703. increase_total_balance_issuance_using_account_id(1, 500000);
  704. let proposal_fixture = ProposalTestFixture {
  705. insufficient_rights_call: || {
  706. ProposalCodex::create_set_validator_count_proposal(
  707. RawOrigin::None.into(),
  708. 1,
  709. b"title".to_vec(),
  710. b"body".to_vec(),
  711. None,
  712. 4,
  713. )
  714. },
  715. empty_stake_call: || {
  716. ProposalCodex::create_set_validator_count_proposal(
  717. RawOrigin::Signed(1).into(),
  718. 1,
  719. b"title".to_vec(),
  720. b"body".to_vec(),
  721. None,
  722. 4,
  723. )
  724. },
  725. invalid_stake_call: || {
  726. ProposalCodex::create_set_validator_count_proposal(
  727. RawOrigin::Signed(1).into(),
  728. 1,
  729. b"title".to_vec(),
  730. b"body".to_vec(),
  731. Some(<BalanceOf<Test>>::from(5000u32)),
  732. 4,
  733. )
  734. },
  735. successful_call: || {
  736. ProposalCodex::create_set_validator_count_proposal(
  737. RawOrigin::Signed(1).into(),
  738. 1,
  739. b"title".to_vec(),
  740. b"body".to_vec(),
  741. Some(<BalanceOf<Test>>::from(100_000_u32)),
  742. 4,
  743. )
  744. },
  745. proposal_parameters: crate::proposal_types::parameters::set_validator_count_proposal::<
  746. Test,
  747. >(),
  748. proposal_details: ProposalDetails::SetValidatorCount(4),
  749. };
  750. proposal_fixture.check_all();
  751. });
  752. }
  753. #[test]
  754. fn create_set_validator_count_proposal_failed_with_invalid_validator_count() {
  755. initial_test_ext().execute_with(|| {
  756. assert_eq!(
  757. ProposalCodex::create_set_validator_count_proposal(
  758. RawOrigin::Signed(1).into(),
  759. 1,
  760. b"title".to_vec(),
  761. b"body".to_vec(),
  762. Some(<BalanceOf<Test>>::from(500u32)),
  763. 3,
  764. ),
  765. Err(Error::InvalidValidatorCount)
  766. );
  767. assert_eq!(
  768. ProposalCodex::create_set_validator_count_proposal(
  769. RawOrigin::Signed(1).into(),
  770. 1,
  771. b"title".to_vec(),
  772. b"body".to_vec(),
  773. Some(<BalanceOf<Test>>::from(1001u32)),
  774. 3,
  775. ),
  776. Err(Error::InvalidValidatorCount)
  777. );
  778. });
  779. }
  780. #[test]
  781. fn create_set_storage_role_parameters_proposal_common_checks_succeed() {
  782. initial_test_ext().execute_with(|| {
  783. increase_total_balance_issuance_using_account_id(1, 500000);
  784. let role_parameters = RoleParameters {
  785. min_actors: 1,
  786. ..RoleParameters::default()
  787. };
  788. let proposal_fixture = ProposalTestFixture {
  789. insufficient_rights_call: || {
  790. ProposalCodex::create_set_storage_role_parameters_proposal(
  791. RawOrigin::None.into(),
  792. 1,
  793. b"title".to_vec(),
  794. b"body".to_vec(),
  795. None,
  796. role_parameters.clone(),
  797. )
  798. },
  799. empty_stake_call: || {
  800. ProposalCodex::create_set_storage_role_parameters_proposal(
  801. RawOrigin::Signed(1).into(),
  802. 1,
  803. b"title".to_vec(),
  804. b"body".to_vec(),
  805. None,
  806. role_parameters.clone(),
  807. )
  808. },
  809. invalid_stake_call: || {
  810. ProposalCodex::create_set_storage_role_parameters_proposal(
  811. RawOrigin::Signed(1).into(),
  812. 1,
  813. b"title".to_vec(),
  814. b"body".to_vec(),
  815. Some(<BalanceOf<Test>>::from(5000u32)),
  816. role_parameters.clone(),
  817. )
  818. },
  819. successful_call: || {
  820. ProposalCodex::create_set_storage_role_parameters_proposal(
  821. RawOrigin::Signed(1).into(),
  822. 1,
  823. b"title".to_vec(),
  824. b"body".to_vec(),
  825. Some(<BalanceOf<Test>>::from(100_000_u32)),
  826. role_parameters.clone(),
  827. )
  828. },
  829. proposal_parameters:
  830. crate::proposal_types::parameters::set_storage_role_parameters_proposal::<Test>(),
  831. proposal_details: ProposalDetails::SetStorageRoleParameters(role_parameters),
  832. };
  833. proposal_fixture.check_all();
  834. });
  835. }
  836. fn assert_failed_set_storage_parameters_call(
  837. role_parameters: RoleParameters<u64, u64>,
  838. error: Error,
  839. ) {
  840. assert_eq!(
  841. ProposalCodex::create_set_storage_role_parameters_proposal(
  842. RawOrigin::Signed(1).into(),
  843. 1,
  844. b"title".to_vec(),
  845. b"body".to_vec(),
  846. Some(<BalanceOf<Test>>::from(100_000_u32)),
  847. role_parameters,
  848. ),
  849. Err(error)
  850. );
  851. }
  852. #[test]
  853. fn create_set_storage_role_parameters_proposal_fails_with_invalid_parameters() {
  854. initial_test_ext().execute_with(|| {
  855. increase_total_balance_issuance_using_account_id(1, 500000);
  856. let working_role_parameters = RoleParameters {
  857. min_actors: 1,
  858. ..RoleParameters::default()
  859. };
  860. let mut role_parameters = working_role_parameters.clone();
  861. role_parameters.min_actors = 2;
  862. assert_failed_set_storage_parameters_call(
  863. role_parameters,
  864. Error::InvalidStorageRoleParameterMinActors,
  865. );
  866. role_parameters = working_role_parameters.clone();
  867. role_parameters.max_actors = 1;
  868. assert_failed_set_storage_parameters_call(
  869. role_parameters,
  870. Error::InvalidStorageRoleParameterMaxActors,
  871. );
  872. role_parameters = working_role_parameters.clone();
  873. role_parameters.max_actors = 100;
  874. assert_failed_set_storage_parameters_call(
  875. role_parameters,
  876. Error::InvalidStorageRoleParameterMaxActors,
  877. );
  878. role_parameters = working_role_parameters.clone();
  879. role_parameters.reward_period = 599;
  880. assert_failed_set_storage_parameters_call(
  881. role_parameters,
  882. Error::InvalidStorageRoleParameterRewardPeriod,
  883. );
  884. role_parameters.reward_period = 28801;
  885. assert_failed_set_storage_parameters_call(
  886. role_parameters,
  887. Error::InvalidStorageRoleParameterRewardPeriod,
  888. );
  889. role_parameters = working_role_parameters.clone();
  890. role_parameters.bonding_period = 599;
  891. assert_failed_set_storage_parameters_call(
  892. role_parameters,
  893. Error::InvalidStorageRoleParameterBondingPeriod,
  894. );
  895. role_parameters = working_role_parameters.clone();
  896. role_parameters.bonding_period = 28801;
  897. assert_failed_set_storage_parameters_call(
  898. role_parameters,
  899. Error::InvalidStorageRoleParameterBondingPeriod,
  900. );
  901. role_parameters = working_role_parameters.clone();
  902. role_parameters.unbonding_period = 599;
  903. assert_failed_set_storage_parameters_call(
  904. role_parameters,
  905. Error::InvalidStorageRoleParameterUnbondingPeriod,
  906. );
  907. role_parameters = working_role_parameters.clone();
  908. role_parameters.unbonding_period = 28801;
  909. assert_failed_set_storage_parameters_call(
  910. role_parameters,
  911. Error::InvalidStorageRoleParameterUnbondingPeriod,
  912. );
  913. role_parameters = working_role_parameters.clone();
  914. role_parameters.min_service_period = 599;
  915. assert_failed_set_storage_parameters_call(
  916. role_parameters,
  917. Error::InvalidStorageRoleParameterMinServicePeriod,
  918. );
  919. role_parameters = working_role_parameters.clone();
  920. role_parameters.min_service_period = 28801;
  921. assert_failed_set_storage_parameters_call(
  922. role_parameters,
  923. Error::InvalidStorageRoleParameterMinServicePeriod,
  924. );
  925. role_parameters = working_role_parameters.clone();
  926. role_parameters.startup_grace_period = 599;
  927. assert_failed_set_storage_parameters_call(
  928. role_parameters,
  929. Error::InvalidStorageRoleParameterStartupGracePeriod,
  930. );
  931. role_parameters = working_role_parameters.clone();
  932. role_parameters.startup_grace_period = 28801;
  933. assert_failed_set_storage_parameters_call(
  934. role_parameters,
  935. Error::InvalidStorageRoleParameterStartupGracePeriod,
  936. );
  937. role_parameters = working_role_parameters.clone();
  938. role_parameters.min_stake = 0;
  939. assert_failed_set_storage_parameters_call(
  940. role_parameters,
  941. Error::InvalidStorageRoleParameterMinStake,
  942. );
  943. role_parameters = working_role_parameters.clone();
  944. role_parameters.min_stake = 10000001;
  945. assert_failed_set_storage_parameters_call(
  946. role_parameters,
  947. Error::InvalidStorageRoleParameterMinStake,
  948. );
  949. role_parameters = working_role_parameters.clone();
  950. role_parameters.entry_request_fee = 0;
  951. assert_failed_set_storage_parameters_call(
  952. role_parameters,
  953. Error::InvalidStorageRoleParameterEntryRequestFee,
  954. );
  955. role_parameters = working_role_parameters.clone();
  956. role_parameters.entry_request_fee = 100001;
  957. assert_failed_set_storage_parameters_call(
  958. role_parameters,
  959. Error::InvalidStorageRoleParameterEntryRequestFee,
  960. );
  961. role_parameters = working_role_parameters.clone();
  962. role_parameters.reward = 0;
  963. assert_failed_set_storage_parameters_call(
  964. role_parameters,
  965. Error::InvalidStorageRoleParameterReward,
  966. );
  967. role_parameters = working_role_parameters;
  968. role_parameters.reward = 100_000;
  969. assert_failed_set_storage_parameters_call(
  970. role_parameters,
  971. Error::InvalidStorageRoleParameterReward,
  972. );
  973. });
  974. }
  975. #[test]
  976. fn set_default_proposal_parameters_succeeded() {
  977. initial_test_ext().execute_with(|| {
  978. let p = ProposalsConfigParameters::default();
  979. // nothing is set
  980. assert_eq!(<SetValidatorCountProposalVotingPeriod<Test>>::get(), 0);
  981. ProposalCodex::set_default_config_values();
  982. assert_eq!(
  983. <SetValidatorCountProposalVotingPeriod<Test>>::get(),
  984. p.set_validator_count_proposal_voting_period as u64
  985. );
  986. assert_eq!(
  987. <SetValidatorCountProposalGracePeriod<Test>>::get(),
  988. p.set_validator_count_proposal_grace_period as u64
  989. );
  990. assert_eq!(
  991. <RuntimeUpgradeProposalVotingPeriod<Test>>::get(),
  992. p.runtime_upgrade_proposal_voting_period as u64
  993. );
  994. assert_eq!(
  995. <RuntimeUpgradeProposalGracePeriod<Test>>::get(),
  996. p.runtime_upgrade_proposal_grace_period as u64
  997. );
  998. assert_eq!(
  999. <TextProposalVotingPeriod<Test>>::get(),
  1000. p.text_proposal_voting_period as u64
  1001. );
  1002. assert_eq!(
  1003. <TextProposalGracePeriod<Test>>::get(),
  1004. p.text_proposal_grace_period as u64
  1005. );
  1006. assert_eq!(
  1007. <SetElectionParametersProposalVotingPeriod<Test>>::get(),
  1008. p.set_election_parameters_proposal_voting_period as u64
  1009. );
  1010. assert_eq!(
  1011. <SetElectionParametersProposalGracePeriod<Test>>::get(),
  1012. p.set_election_parameters_proposal_grace_period as u64
  1013. );
  1014. assert_eq!(
  1015. <SetContentWorkingGroupMintCapacityProposalVotingPeriod<Test>>::get(),
  1016. p.set_content_working_group_mint_capacity_proposal_voting_period as u64
  1017. );
  1018. assert_eq!(
  1019. <SetContentWorkingGroupMintCapacityProposalGracePeriod<Test>>::get(),
  1020. p.set_content_working_group_mint_capacity_proposal_grace_period as u64
  1021. );
  1022. assert_eq!(
  1023. <SetLeadProposalVotingPeriod<Test>>::get(),
  1024. p.set_lead_proposal_voting_period as u64
  1025. );
  1026. assert_eq!(
  1027. <SetLeadProposalGracePeriod<Test>>::get(),
  1028. p.set_lead_proposal_grace_period as u64
  1029. );
  1030. assert_eq!(
  1031. <SpendingProposalVotingPeriod<Test>>::get(),
  1032. p.spending_proposal_voting_period as u64
  1033. );
  1034. assert_eq!(
  1035. <SpendingProposalGracePeriod<Test>>::get(),
  1036. p.spending_proposal_grace_period as u64
  1037. );
  1038. assert_eq!(
  1039. <EvictStorageProviderProposalVotingPeriod<Test>>::get(),
  1040. p.evict_storage_provider_proposal_voting_period as u64
  1041. );
  1042. assert_eq!(
  1043. <EvictStorageProviderProposalGracePeriod<Test>>::get(),
  1044. p.evict_storage_provider_proposal_grace_period as u64
  1045. );
  1046. assert_eq!(
  1047. <SetStorageRoleParametersProposalVotingPeriod<Test>>::get(),
  1048. p.set_storage_role_parameters_proposal_voting_period as u64
  1049. );
  1050. assert_eq!(
  1051. <SetStorageRoleParametersProposalGracePeriod<Test>>::get(),
  1052. p.set_storage_role_parameters_proposal_grace_period as u64
  1053. );
  1054. });
  1055. }