Procházet zdrojové kódy

working_group proposals integration coverage initial work

iorveth před 4 roky
rodič
revize
5062696c2f

+ 24 - 2
Cargo.lock

@@ -2117,6 +2117,7 @@ dependencies = [
  "sp-std",
  "sp-transaction-pool",
  "sp-version",
+ "strum 0.19.2",
  "substrate-wasm-builder-runner",
 ]
 
@@ -3301,6 +3302,8 @@ dependencies = [
  "parity-scale-codec",
  "serde",
  "sp-runtime",
+ "strum 0.19.2",
+ "strum_macros 0.19.2",
 ]
 
 [[package]]
@@ -3549,6 +3552,7 @@ dependencies = [
  "sp-runtime",
  "sp-staking",
  "sp-std",
+ "strum 0.19.2",
 ]
 
 [[package]]
@@ -6456,7 +6460,7 @@ dependencies = [
  "lazy_static",
  "sp-core",
  "sp-runtime",
- "strum",
+ "strum 0.16.0",
 ]
 
 [[package]]
@@ -6799,9 +6803,15 @@ version = "0.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6138f8f88a16d90134763314e3fc76fa3ed6a7db4725d6acf9a3ef95a3188d22"
 dependencies = [
- "strum_macros",
+ "strum_macros 0.16.0",
 ]
 
+[[package]]
+name = "strum"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3924a58d165da3b7b2922c667ab0673c7b5fd52b5c19ea3442747bcb3cd15abe"
+
 [[package]]
 name = "strum_macros"
 version = "0.16.0"
@@ -6814,6 +6824,18 @@ dependencies = [
  "syn 1.0.17",
 ]
 
+[[package]]
+name = "strum_macros"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d2ab682ecdcae7f5f45ae85cd7c1e6c8e68ea42c8a612d47fedf831c037146a"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote 1.0.7",
+ "syn 1.0.17",
+]
+
 [[package]]
 name = "substrate-bip39"
 version = "0.4.1"

+ 4 - 0
runtime-modules/common/Cargo.toml

@@ -6,6 +6,8 @@ edition = '2018'
 
 [dependencies]
 serde = { version = "1.0.101", optional = true, features = ["derive"] }
+strum = {version = "0.19", optional = true}
+strum_macros = {version = "0.19", optional = true}
 codec = { package = 'parity-scale-codec', version = '1.3.1', default-features = false, features = ['derive'] }
 sp-runtime = { package = 'sp-runtime', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
 frame-support = { package = 'frame-support', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
@@ -16,6 +18,8 @@ pallet-timestamp = { package = 'pallet-timestamp', default-features = false, git
 default = ['std']
 std = [
 	'serde',
+	'strum',
+	'strum_macros',
 	'codec/std',
 	'sp-runtime/std',
 	'frame-support/std',

+ 3 - 1
runtime-modules/common/src/working_group.rs

@@ -1,9 +1,11 @@
 use codec::{Decode, Encode};
 #[cfg(feature = "std")]
 use serde::{Deserialize, Serialize};
+#[cfg(feature = "std")]
+use strum_macros::EnumIter;
 
 /// Defines well-known working groups.
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize, EnumIter))]
 #[derive(Encode, Decode, Clone, PartialEq, Eq, Copy, Debug)]
 pub enum WorkingGroup {
     /* Reserved

+ 1 - 1
runtime-modules/governance/src/mock.rs

@@ -71,7 +71,7 @@ impl election::Trait for Test {
 }
 impl membership::Trait for Test {
     type Event = ();
-    type MemberId = u32;
+    type MemberId = u64;
     type SubscriptionId = u32;
     type PaidTermId = u32;
     type ActorId = u32;

+ 1 - 0
runtime-modules/hiring/src/lib.rs

@@ -57,6 +57,7 @@ pub trait Trait: system::Trait + stake::Trait + Sized {
         + Default
         + Copy
         + MaybeSerialize
+        + From<u64>
         + PartialEq;
 
     /// ApplicationId type

+ 4 - 2
runtime-modules/membership/src/lib.rs

@@ -35,7 +35,8 @@ pub trait Trait: system::Trait + GovernanceCurrency + pallet_timestamp::Trait {
         + Default
         + Copy
         + MaybeSerialize
-        + PartialEq;
+        + PartialEq
+        + From<u64>;
 
     type PaidTermId: Parameter
         + Member
@@ -64,7 +65,8 @@ pub trait Trait: system::Trait + GovernanceCurrency + pallet_timestamp::Trait {
         + Copy
         + MaybeSerialize
         + PartialEq
-        + Ord;
+        + Ord
+        + Into<u64>;
 }
 
 const FIRST_PAID_TERMS_ID: u8 = 1;

+ 1 - 1
runtime-modules/membership/src/mock.rs

@@ -80,7 +80,7 @@ impl GovernanceCurrency for Test {
 
 impl Trait for Test {
     type Event = ();
-    type MemberId = u32;
+    type MemberId = u64;
     type PaidTermId = u32;
     type SubscriptionId = u32;
     type ActorId = u32;

+ 1 - 1
runtime-modules/membership/src/tests.rs

@@ -5,7 +5,7 @@ use super::mock::*;
 
 use frame_support::*;
 
-fn get_membership_by_id(member_id: u32) -> crate::Membership<Test> {
+fn get_membership_by_id(member_id: u64) -> crate::Membership<Test> {
     if <crate::MembershipById<Test>>::contains_key(member_id) {
         Members::membership(member_id)
     } else {

+ 1 - 0
runtime-modules/proposals/codex/Cargo.toml

@@ -31,6 +31,7 @@ sp-core = { package = 'sp-core', default-features = false, git = 'https://github
 sp-staking = { package = 'sp-staking', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
 pallet-staking-reward-curve = { package = 'pallet-staking-reward-curve', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
 recurring-rewards = { package = 'pallet-recurring-reward', default-features = false, path = '../../recurring-reward'}
+strum = {version = "0.19", default-features = false}
 
 [features]
 default = ['std']

+ 8 - 0
runtime-modules/proposals/codex/src/tests/mock.rs

@@ -157,6 +157,9 @@ impl governance::election::Trait for Test {
 // The content directory working group instance alias.
 pub type ContentDirectoryWorkingGroupInstance = working_group::Instance3;
 
+// The storage working group instance alias.
+pub type StorageWorkingGroupInstance = working_group::Instance2;
+
 parameter_types! {
     pub const MaxWorkerNumberLimit: u32 = 100;
 }
@@ -166,6 +169,11 @@ impl working_group::Trait<ContentDirectoryWorkingGroupInstance> for Test {
     type MaxWorkerNumberLimit = MaxWorkerNumberLimit;
 }
 
+impl working_group::Trait<StorageWorkingGroupInstance> for Test {
+    type Event = ();
+    type MaxWorkerNumberLimit = MaxWorkerNumberLimit;
+}
+
 impl recurring_rewards::Trait for Test {
     type PayoutStatusHandler = ();
     type RecipientId = u64;

+ 130 - 38
runtime-modules/proposals/codex/src/tests/mod.rs

@@ -16,6 +16,8 @@ use crate::*;
 use crate::{BalanceOf, Error, ProposalDetails};
 pub use mock::*;
 
+use strum::IntoEnumIterator;
+
 pub(crate) fn increase_total_balance_issuance(balance: u64) {
     increase_total_balance_issuance_using_account_id(999, balance);
 }
@@ -764,12 +766,21 @@ fn set_default_proposal_parameters_succeeded() {
 
 #[test]
 fn create_add_working_group_leader_opening_proposal_common_checks_succeed() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_create_add_working_group_leader_opening_proposal_common_checks_succeed(group);
+    }
+}
+
+fn run_create_add_working_group_leader_opening_proposal_common_checks_succeed(
+    working_group: WorkingGroup,
+) {
     initial_test_ext().execute_with(|| {
         let add_opening_parameters = AddOpeningParameters {
             activate_at: ActivateOpeningAt::CurrentBlock,
             commitment: OpeningPolicyCommitment::default(),
             human_readable_text: b"some text".to_vec(),
-            working_group: WorkingGroup::Content,
+            working_group,
         };
 
         increase_total_balance_issuance_using_account_id(1, 500000);
@@ -826,6 +837,17 @@ fn create_add_working_group_leader_opening_proposal_common_checks_succeed() {
 
 #[test]
 fn create_begin_review_working_group_leader_applications_proposal_common_checks_succeed() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_create_begin_review_working_group_leader_applications_proposal_common_checks_succeed(
+            group,
+        );
+    }
+}
+
+fn run_create_begin_review_working_group_leader_applications_proposal_common_checks_succeed(
+    working_group: WorkingGroup,
+) {
     initial_test_ext().execute_with(|| {
         let opening_id = 1; // random opening id.
 
@@ -840,7 +862,7 @@ fn create_begin_review_working_group_leader_applications_proposal_common_checks_
                     b"body".to_vec(),
                     None,
                     opening_id,
-                    WorkingGroup::Content
+                    working_group
                 )
             },
             empty_stake_call: || {
@@ -851,7 +873,7 @@ fn create_begin_review_working_group_leader_applications_proposal_common_checks_
                     b"body".to_vec(),
                     None,
                     opening_id,
-                    WorkingGroup::Content
+                    working_group
                 )
             },
             invalid_stake_call: || {
@@ -862,7 +884,7 @@ fn create_begin_review_working_group_leader_applications_proposal_common_checks_
                     b"body".to_vec(),
                     Some(<BalanceOf<Test>>::from(5000u32)),
                     opening_id,
-                    WorkingGroup::Content
+                    working_group
                 )
             },
             successful_call: || {
@@ -873,14 +895,14 @@ fn create_begin_review_working_group_leader_applications_proposal_common_checks_
                     b"body".to_vec(),
                     Some(<BalanceOf<Test>>::from(25000u32)),
                     opening_id,
-                    WorkingGroup::Content
+                    working_group
                 )
             },
             proposal_parameters: crate::proposal_types::parameters::begin_review_working_group_leader_applications_proposal::<
                 Test,
             >(),
             proposal_details: ProposalDetails::BeginReviewWorkingGroupLeaderApplications(opening_id,
-                WorkingGroup::Content),
+                working_group),
         };
         proposal_fixture.check_all();
     });
@@ -888,6 +910,15 @@ fn create_begin_review_working_group_leader_applications_proposal_common_checks_
 
 #[test]
 fn create_fill_working_group_leader_opening_proposal_common_checks_succeed() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_create_fill_working_group_leader_opening_proposal_common_checks_succeed(group);
+    }
+}
+
+fn run_create_fill_working_group_leader_opening_proposal_common_checks_succeed(
+    working_group: WorkingGroup,
+) {
     initial_test_ext().execute_with(|| {
         let opening_id = 1; // random opening id.
 
@@ -895,7 +926,7 @@ fn create_fill_working_group_leader_opening_proposal_common_checks_succeed() {
             opening_id,
             successful_application_id: 1,
             reward_policy: None,
-            working_group: WorkingGroup::Content,
+            working_group,
         };
 
         increase_total_balance_issuance_using_account_id(1, 500000);
@@ -952,6 +983,15 @@ fn create_fill_working_group_leader_opening_proposal_common_checks_succeed() {
 
 #[test]
 fn create_working_group_mint_capacity_proposal_fails_with_invalid_parameters() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_create_working_group_mint_capacity_proposal_fails_with_invalid_parameters(group);
+    }
+}
+
+fn run_create_working_group_mint_capacity_proposal_fails_with_invalid_parameters(
+    working_group: WorkingGroup,
+) {
     initial_test_ext().execute_with(|| {
         increase_total_balance_issuance_using_account_id(1, 500000);
 
@@ -963,7 +1003,7 @@ fn create_working_group_mint_capacity_proposal_fails_with_invalid_parameters() {
                 b"body".to_vec(),
                 Some(<BalanceOf<Test>>::from(50000u32)),
                 (crate::WORKING_GROUP_MINT_CAPACITY_MAX_VALUE + 1) as u64,
-                WorkingGroup::Content,
+                working_group,
             ),
             Err(Error::<Test>::InvalidWorkingGroupMintCapacity.into())
         );
@@ -972,6 +1012,15 @@ fn create_working_group_mint_capacity_proposal_fails_with_invalid_parameters() {
 
 #[test]
 fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_create_set_working_group_mint_capacity_proposal_common_checks_succeed(group);
+    }
+}
+
+fn run_create_set_working_group_mint_capacity_proposal_common_checks_succeed(
+    working_group: WorkingGroup,
+) {
     initial_test_ext().execute_with(|| {
         increase_total_balance_issuance(500000);
 
@@ -984,7 +1033,7 @@ fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() {
                     b"body".to_vec(),
                     None,
                     0,
-                    WorkingGroup::Content,
+                    working_group,
                 )
             },
             empty_stake_call: || {
@@ -995,7 +1044,7 @@ fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() {
                     b"body".to_vec(),
                     None,
                     0,
-                    WorkingGroup::Content,
+                    working_group,
                 )
             },
             invalid_stake_call: || {
@@ -1006,7 +1055,7 @@ fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() {
                     b"body".to_vec(),
                     Some(<BalanceOf<Test>>::from(5000u32)),
                     0,
-                    WorkingGroup::Content,
+                    working_group,
                 )
             },
             successful_call: || {
@@ -1017,16 +1066,13 @@ fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() {
                     b"body".to_vec(),
                     Some(<BalanceOf<Test>>::from(50000u32)),
                     10,
-                    WorkingGroup::Content,
+                    working_group,
                 )
             },
             proposal_parameters:
                 crate::proposal_types::parameters::set_working_group_mint_capacity_proposal::<Test>(
                 ),
-            proposal_details: ProposalDetails::SetWorkingGroupMintCapacity(
-                10,
-                WorkingGroup::Content,
-            ),
+            proposal_details: ProposalDetails::SetWorkingGroupMintCapacity(10, working_group),
         };
         proposal_fixture.check_all();
     });
@@ -1034,6 +1080,15 @@ fn create_set_working_group_mint_capacity_proposal_common_checks_succeed() {
 
 #[test]
 fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_create_decrease_working_group_leader_stake_proposal_common_checks_succeed(group);
+    }
+}
+
+fn run_create_decrease_working_group_leader_stake_proposal_common_checks_succeed(
+    working_group: WorkingGroup,
+) {
     initial_test_ext().execute_with(|| {
         increase_total_balance_issuance(500000);
 
@@ -1047,7 +1102,7 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() {
                     None,
                     0,
                     10,
-                    WorkingGroup::Content,
+                    working_group,
                 )
             },
             empty_stake_call: || {
@@ -1059,7 +1114,7 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() {
                     None,
                     0,
                     10,
-                    WorkingGroup::Content,
+                    working_group,
                 )
             },
             invalid_stake_call: || {
@@ -1071,7 +1126,7 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() {
                     Some(<BalanceOf<Test>>::from(5000u32)),
                     0,
                     10,
-                    WorkingGroup::Content,
+                    working_group,
                 )
             },
             successful_call: || {
@@ -1083,7 +1138,7 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() {
                     Some(<BalanceOf<Test>>::from(50000u32)),
                     10,
                     10,
-                    WorkingGroup::Content,
+                    working_group,
                 )
             },
             proposal_parameters:
@@ -1093,7 +1148,7 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() {
             proposal_details: ProposalDetails::DecreaseWorkingGroupLeaderStake(
                 10,
                 10,
-                WorkingGroup::Content,
+                working_group,
             ),
         };
         proposal_fixture.check_all();
@@ -1102,6 +1157,15 @@ fn create_decrease_working_group_leader_stake_proposal_common_checks_succeed() {
 
 #[test]
 fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_create_slash_working_group_leader_stake_proposal_common_checks_succeed(group);
+    }
+}
+
+fn run_create_slash_working_group_leader_stake_proposal_common_checks_succeed(
+    working_group: WorkingGroup,
+) {
     initial_test_ext().execute_with(|| {
         increase_total_balance_issuance(500000);
 
@@ -1115,7 +1179,7 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() {
                     None,
                     0,
                     10,
-                    WorkingGroup::Content,
+                    working_group,
                 )
             },
             empty_stake_call: || {
@@ -1127,7 +1191,7 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() {
                     None,
                     0,
                     10,
-                    WorkingGroup::Content,
+                    working_group,
                 )
             },
             invalid_stake_call: || {
@@ -1139,7 +1203,7 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() {
                     Some(<BalanceOf<Test>>::from(5000u32)),
                     0,
                     10,
-                    WorkingGroup::Content,
+                    working_group,
                 )
             },
             successful_call: || {
@@ -1151,7 +1215,7 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() {
                     Some(<BalanceOf<Test>>::from(50000u32)),
                     10,
                     10,
-                    WorkingGroup::Content,
+                    working_group,
                 )
             },
             proposal_parameters:
@@ -1161,7 +1225,7 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() {
             proposal_details: ProposalDetails::SlashWorkingGroupLeaderStake(
                 10,
                 10,
-                WorkingGroup::Content,
+                working_group,
             ),
         };
         proposal_fixture.check_all();
@@ -1170,6 +1234,13 @@ fn create_slash_working_group_leader_stake_proposal_common_checks_succeed() {
 
 #[test]
 fn slash_stake_with_zero_staking_balance_fails() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_slash_stake_with_zero_staking_balance_fails(group);
+    }
+}
+
+fn run_slash_stake_with_zero_staking_balance_fails(working_group: WorkingGroup) {
     initial_test_ext().execute_with(|| {
         increase_total_balance_issuance_using_account_id(1, 500000);
 
@@ -1189,7 +1260,7 @@ fn slash_stake_with_zero_staking_balance_fails() {
                 Some(<BalanceOf<Test>>::from(50000u32)),
                 10,
                 0,
-                WorkingGroup::Content,
+                working_group,
             ),
             Err(Error::<Test>::SlashingStakeIsZero.into())
         );
@@ -1198,6 +1269,13 @@ fn slash_stake_with_zero_staking_balance_fails() {
 
 #[test]
 fn decrease_stake_with_zero_staking_balance_fails() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_decrease_stake_with_zero_staking_balance_fails(group);
+    }
+}
+
+fn run_decrease_stake_with_zero_staking_balance_fails(working_group: WorkingGroup) {
     initial_test_ext().execute_with(|| {
         increase_total_balance_issuance_using_account_id(1, 500000);
 
@@ -1217,7 +1295,7 @@ fn decrease_stake_with_zero_staking_balance_fails() {
                 Some(<BalanceOf<Test>>::from(50000u32)),
                 10,
                 0,
-                WorkingGroup::Content,
+                working_group,
             ),
             Err(Error::<Test>::DecreasingStakeIsZero.into())
         );
@@ -1226,6 +1304,15 @@ fn decrease_stake_with_zero_staking_balance_fails() {
 
 #[test]
 fn create_set_working_group_leader_reward_proposal_common_checks_succeed() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_create_set_working_group_leader_reward_proposal_common_checks_succeed(group);
+    }
+}
+
+fn run_create_set_working_group_leader_reward_proposal_common_checks_succeed(
+    working_group: WorkingGroup,
+) {
     initial_test_ext().execute_with(|| {
         let proposal_fixture = ProposalTestFixture {
             insufficient_rights_call: || {
@@ -1237,7 +1324,7 @@ fn create_set_working_group_leader_reward_proposal_common_checks_succeed() {
                     None,
                     0,
                     10,
-                    WorkingGroup::Content,
+                    working_group,
                 )
             },
             empty_stake_call: || {
@@ -1249,7 +1336,7 @@ fn create_set_working_group_leader_reward_proposal_common_checks_succeed() {
                     None,
                     0,
                     10,
-                    WorkingGroup::Content,
+                    working_group,
                 )
             },
             invalid_stake_call: || {
@@ -1261,7 +1348,7 @@ fn create_set_working_group_leader_reward_proposal_common_checks_succeed() {
                     Some(<BalanceOf<Test>>::from(5000u32)),
                     0,
                     10,
-                    WorkingGroup::Content,
+                    working_group,
                 )
             },
             successful_call: || {
@@ -1273,17 +1360,13 @@ fn create_set_working_group_leader_reward_proposal_common_checks_succeed() {
                     Some(<BalanceOf<Test>>::from(50000u32)),
                     10,
                     10,
-                    WorkingGroup::Content,
+                    working_group,
                 )
             },
             proposal_parameters:
                 crate::proposal_types::parameters::set_working_group_leader_reward_proposal::<Test>(
                 ),
-            proposal_details: ProposalDetails::SetWorkingGroupLeaderReward(
-                10,
-                10,
-                WorkingGroup::Content,
-            ),
+            proposal_details: ProposalDetails::SetWorkingGroupLeaderReward(10, 10, working_group),
         };
         proposal_fixture.check_all();
     });
@@ -1291,6 +1374,15 @@ fn create_set_working_group_leader_reward_proposal_common_checks_succeed() {
 
 #[test]
 fn create_terminate_working_group_leader_role_proposal_common_checks_succeed() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_create_terminate_working_group_leader_role_proposal_common_checks_succeed(group);
+    }
+}
+
+fn run_create_terminate_working_group_leader_role_proposal_common_checks_succeed(
+    working_group: WorkingGroup,
+) {
     initial_test_ext().execute_with(|| {
         increase_total_balance_issuance(500000);
 
@@ -1298,7 +1390,7 @@ fn create_terminate_working_group_leader_role_proposal_common_checks_succeed() {
             worker_id: 10,
             rationale: Vec::new(),
             slash: false,
-            working_group: WorkingGroup::Content,
+            working_group,
         };
 
         let proposal_fixture = ProposalTestFixture {

+ 1 - 1
runtime/Cargo.toml

@@ -82,7 +82,7 @@ content-directory = { package = 'pallet-content-directory', default-features = f
 
 [dev-dependencies]
 sp-io = { package = 'sp-io', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
-
+strum = {version = "0.19", default-features = false}
 [build-dependencies]
 wasm-builder-runner = { package = "substrate-wasm-builder-runner", git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4' }
 

+ 1 - 0
runtime/src/integration/mod.rs

@@ -1,6 +1,7 @@
 pub mod content_directory;
 pub mod content_working_group;
 pub mod forum;
+#[macro_use]
 pub mod proposals;
 pub mod storage;
 pub mod transactions;

+ 1 - 0
runtime/src/integration/proposals/mod.rs

@@ -3,6 +3,7 @@
 mod council_elected_handler;
 mod council_origin_validator;
 mod membership_origin_validator;
+#[macro_use]
 mod proposal_encoder;
 mod staking_events_handler;
 

+ 1 - 0
runtime/src/integration/proposals/proposal_encoder.rs

@@ -15,6 +15,7 @@ use sp_std::vec::Vec;
 //Params:
 // - $working_group: expression returning the 'common::working_group::WorkingGroup' enum
 // - $working_group_instance_call: expression returning the exact working group instance extrinsic call
+#[macro_use]
 macro_rules! wrap_working_group_call {
     ($working_group:expr, $working_group_instance_call:expr) => {{
         match $working_group {

+ 1 - 2
runtime/src/lib.rs

@@ -14,6 +14,7 @@
 include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
 
 mod constants;
+#[macro_use]
 mod integration;
 pub mod primitives;
 mod runtime_api;
@@ -509,8 +510,6 @@ impl storage::data_object_storage_registry::Trait for Runtime {
     type ContentIdExists = DataDirectory;
 }
 
-pub type MemberId = u64;
-
 impl membership::Trait for Runtime {
     type Event = Event;
     type MemberId = MemberId;

+ 3 - 0
runtime/src/primitives.rs

@@ -63,6 +63,9 @@ pub type PostId = u64;
 /// Represent an actor in membership group, which is the same in the working groups.
 pub type ActorId = u64;
 
+/// Represent an member in membership group, which is the same in the working groups.
+pub type MemberId = u64;
+
 /// App-specific crypto used for reporting equivocation/misbehavior in BABE and
 /// GRANDPA. Any rewards for misbehavior reporting will be paid out to this
 /// account.

+ 1 - 0
runtime/src/tests/mod.rs

@@ -1,6 +1,7 @@
 //! The Joystream Substrate Node runtime integration tests.
 
 #![cfg(test)]
+#[macro_use]
 
 mod proposals_integration;
 mod storage_integration;

+ 1 - 0
runtime/src/tests/proposals_integration/mod.rs

@@ -1,6 +1,7 @@
 //! Proposals integration tests - with stake, membership, governance modules.
 
 #![cfg(test)]
+#[macro_use]
 
 mod working_group_proposals;
 

+ 301 - 150
runtime/src/tests/proposals_integration/working_group_proposals.rs

@@ -9,27 +9,46 @@ use working_group::{OpeningPolicyCommitment, RewardPolicy};
 
 use crate::{
     Balance, BlockNumber, ContentDirectoryWorkingGroup, ContentDirectoryWorkingGroupInstance,
+    StorageWorkingGroup, StorageWorkingGroupInstance,
 };
 use sp_std::collections::btree_set::BTreeSet;
 
+use strum::IntoEnumIterator;
+use crate::primitives::{AccountId, ActorId, MemberId};
+
+type WorkingGroupInstance<T, I> = working_group::Module<T, I>;
+
 type Hiring = hiring::Module<Runtime>;
 
 fn add_opening(
-    member_id: u8,
+    member_id: MemberId,
     account_id: [u8; 32],
     activate_at: hiring::ActivateOpeningAt<BlockNumber>,
     opening_policy_commitment: Option<OpeningPolicyCommitment<BlockNumber, u128>>,
     sequence_number: u32, // action sequence number to align with other actions
+    working_group: WorkingGroup,
 ) -> u64 {
     let expected_proposal_id = sequence_number;
     let run_to_block = sequence_number * 2;
 
-    let opening_id = ContentDirectoryWorkingGroup::next_opening_id();
-
-    assert!(!<working_group::OpeningById<
-        Runtime,
-        ContentDirectoryWorkingGroupInstance,
-    >>::contains_key(opening_id));
+    let opening_id = match working_group {
+        WorkingGroup::Content => {
+            let opening_id = ContentDirectoryWorkingGroup::next_opening_id();
+            assert!(!<working_group::OpeningById<
+                Runtime,
+                ContentDirectoryWorkingGroupInstance,
+            >>::contains_key(opening_id));
+            opening_id
+        }
+        WorkingGroup::Storage => {
+            let opening_id = StorageWorkingGroup::next_opening_id();
+            assert!(!<working_group::OpeningById<
+                Runtime,
+                StorageWorkingGroupInstance,
+            >>::contains_key(opening_id));
+            opening_id
+        }
+    };
 
     let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| {
         ProposalCodex::create_add_working_group_leader_opening_proposal(
@@ -44,7 +63,7 @@ fn add_opening(
                     .clone()
                     .unwrap_or(OpeningPolicyCommitment::default()),
                 human_readable_text: Vec::new(),
-                working_group: WorkingGroup::Content,
+                working_group,
             },
         )
     })
@@ -57,10 +76,11 @@ fn add_opening(
 }
 
 fn begin_review_applications(
-    member_id: u8,
+    member_id: MemberId,
     account_id: [u8; 32],
     opening_id: u64,
     sequence_number: u32, // action sequence number to align with other actions
+    working_group: WorkingGroup,
 ) {
     let expected_proposal_id = sequence_number;
     let run_to_block = sequence_number * 2;
@@ -68,12 +88,12 @@ fn begin_review_applications(
     let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| {
         ProposalCodex::create_begin_review_working_group_leader_applications_proposal(
             RawOrigin::Signed(account_id.clone().into()).into(),
-            member_id as u64,
+            member_id,
             b"title".to_vec(),
             b"body".to_vec(),
             Some(<BalanceOf<Runtime>>::from(25_000_u32)),
             opening_id,
-            WorkingGroup::Content,
+            working_group,
         )
     })
     .disable_setup_enviroment()
@@ -84,12 +104,13 @@ fn begin_review_applications(
 }
 
 fn fill_opening(
-    member_id: u8,
+    member_id: MemberId,
     account_id: [u8; 32],
     opening_id: u64,
     successful_application_id: u64,
     reward_policy: Option<RewardPolicy<Balance, BlockNumber>>,
     sequence_number: u32, // action sequence number to align with other actions
+    working_group: WorkingGroup,
 ) {
     let expected_proposal_id = sequence_number;
     let run_to_block = sequence_number * 2;
@@ -97,7 +118,7 @@ fn fill_opening(
     let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| {
         ProposalCodex::create_fill_working_group_leader_opening_proposal(
             RawOrigin::Signed(account_id.clone().into()).into(),
-            member_id as u64,
+            member_id,
             b"title".to_vec(),
             b"body".to_vec(),
             Some(<BalanceOf<Runtime>>::from(50_000_u32)),
@@ -105,7 +126,7 @@ fn fill_opening(
                 opening_id,
                 successful_application_id,
                 reward_policy: reward_policy.clone(),
-                working_group: WorkingGroup::Content,
+                working_group,
             },
         )
     })
@@ -130,6 +151,7 @@ fn decrease_stake(
     leader_worker_id: u64,
     stake_amount: Balance,
     sequence_number: u32, // action sequence number to align with other actions
+    working_group: WorkingGroup,
 ) {
     let expected_proposal_id = sequence_number;
     let run_to_block = sequence_number * 2;
@@ -143,7 +165,7 @@ fn decrease_stake(
             Some(<BalanceOf<Runtime>>::from(50_000_u32)),
             leader_worker_id,
             stake_amount,
-            WorkingGroup::Content,
+            working_group,
         )
     })
     .disable_setup_enviroment()
@@ -154,11 +176,12 @@ fn decrease_stake(
 }
 
 fn slash_stake(
-    member_id: u8,
+    member_id: u64,
     account_id: [u8; 32],
-    leader_worker_id: u64,
+    leader_worker_id: ActorId,
     stake_amount: Balance,
     sequence_number: u32, // action sequence number to align with other actions
+    working_group: WorkingGroup,
 ) {
     let expected_proposal_id = sequence_number;
     let run_to_block = sequence_number * 2;
@@ -166,13 +189,13 @@ fn slash_stake(
     let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| {
         ProposalCodex::create_slash_working_group_leader_stake_proposal(
             RawOrigin::Signed(account_id.clone().into()).into(),
-            member_id as u64,
+            member_id,
             b"title".to_vec(),
             b"body".to_vec(),
             Some(<BalanceOf<Runtime>>::from(50_000_u32)),
             leader_worker_id,
             stake_amount,
-            WorkingGroup::Content,
+            working_group,
         )
     })
     .disable_setup_enviroment()
@@ -183,11 +206,12 @@ fn slash_stake(
 }
 
 fn set_reward(
-    member_id: u8,
+    member_id: MemberId,
     account_id: [u8; 32],
     leader_worker_id: u64,
     reward_amount: Balance,
     sequence_number: u32, // action sequence number to align with other actions
+    working_group: WorkingGroup,
 ) {
     let expected_proposal_id = sequence_number;
     let run_to_block = sequence_number * 2;
@@ -201,7 +225,7 @@ fn set_reward(
             Some(<BalanceOf<Runtime>>::from(50_000_u32)),
             leader_worker_id,
             reward_amount,
-            WorkingGroup::Content,
+            working_group,
         )
     })
     .disable_setup_enviroment()
@@ -212,11 +236,12 @@ fn set_reward(
 }
 
 fn set_mint_capacity(
-    member_id: u8,
+    member_id: MemberId,
     account_id: [u8; 32],
     mint_capacity: Balance,
     sequence_number: u32, // action sequence number to align with other actions
     setup_environment: bool,
+    working_group: WorkingGroup,
 ) {
     let expected_proposal_id = sequence_number;
     let run_to_block = sequence_number * 2;
@@ -235,7 +260,7 @@ fn set_mint_capacity(
             b"body".to_vec(),
             Some(<BalanceOf<Runtime>>::from(50_000_u32)),
             mint_capacity,
-            WorkingGroup::Content,
+            working_group,
         )
     })
     .with_setup_enviroment(setup_environment)
@@ -246,11 +271,12 @@ fn set_mint_capacity(
 }
 
 fn terminate_role(
-    member_id: u8,
+    member_id: MemberId,
     account_id: [u8; 32],
     leader_worker_id: u64,
     slash: bool,
     sequence_number: u32, // action sequence number to align with other actions
+    working_group: WorkingGroup,
 ) {
     let expected_proposal_id = sequence_number;
     let run_to_block = sequence_number * 2;
@@ -258,7 +284,7 @@ fn terminate_role(
     let codex_extrinsic_test_fixture = CodexProposalTestFixture::default_for_call(|| {
         ProposalCodex::create_terminate_working_group_leader_role_proposal(
             RawOrigin::Signed(account_id.clone().into()).into(),
-            member_id as u64,
+            member_id,
             b"title".to_vec(),
             b"body".to_vec(),
             Some(<BalanceOf<Runtime>>::from(100_000_u32)),
@@ -266,7 +292,7 @@ fn terminate_role(
                 worker_id: leader_worker_id,
                 rationale: Vec::new(),
                 slash,
-                working_group: WorkingGroup::Content,
+                working_group,
             },
         )
     })
@@ -279,9 +305,18 @@ fn terminate_role(
 
 #[test]
 fn create_add_working_group_leader_opening_proposal_execution_succeeds() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_create_add_working_group_leader_opening_proposal_execution_succeeds(group);
+    }
+}
+
+fn run_create_add_working_group_leader_opening_proposal_execution_succeeds(
+    working_group: WorkingGroup,
+) {
     initial_test_ext().execute_with(|| {
-        let member_id = 1;
-        let account_id: [u8; 32] = [member_id; 32];
+        let member_id: MemberId = 1;
+        let account_id: [u8; 32] = [0; 32];
 
         let next_opening_id = ContentDirectoryWorkingGroup::next_opening_id();
 
@@ -296,6 +331,7 @@ fn create_add_working_group_leader_opening_proposal_execution_succeeds() {
             ActivateOpeningAt::CurrentBlock,
             None,
             1,
+            working_group,
         );
 
         // Check for expected opening id.
@@ -311,9 +347,20 @@ fn create_add_working_group_leader_opening_proposal_execution_succeeds() {
 
 #[test]
 fn create_begin_review_working_group_leader_applications_proposal_execution_succeeds() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_create_begin_review_working_group_leader_applications_proposal_execution_succeeds(
+            group,
+        );
+    }
+}
+
+fn run_create_begin_review_working_group_leader_applications_proposal_execution_succeeds(
+    working_group: WorkingGroup,
+) {
     initial_test_ext().execute_with(|| {
-        let member_id = 1;
-        let account_id: [u8; 32] = [member_id; 32];
+        let member_id: MemberId = 1;
+        let account_id: [u8; 32] = [0; 32];
 
         let opening_id = add_opening(
             member_id,
@@ -321,6 +368,7 @@ fn create_begin_review_working_group_leader_applications_proposal_execution_succ
             ActivateOpeningAt::CurrentBlock,
             None,
             1,
+            working_group,
         );
 
         let opening = ContentDirectoryWorkingGroup::opening_by_id(opening_id);
@@ -339,7 +387,7 @@ fn create_begin_review_working_group_leader_applications_proposal_execution_succ
             }
         );
 
-        begin_review_applications(member_id, account_id, opening_id, 2);
+        begin_review_applications(member_id, account_id, opening_id, 2, working_group);
 
         let hiring_opening = Hiring::opening_by_id(opening.hiring_opening_id);
         assert_eq!(
@@ -360,9 +408,18 @@ fn create_begin_review_working_group_leader_applications_proposal_execution_succ
 
 #[test]
 fn create_fill_working_group_leader_opening_proposal_execution_succeeds() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_create_fill_working_group_leader_opening_proposal_execution_succeeds(group);
+    }
+}
+
+fn run_create_fill_working_group_leader_opening_proposal_execution_succeeds(
+    working_group: WorkingGroup,
+) {
     initial_test_ext().execute_with(|| {
-        let member_id = 1;
-        let account_id: [u8; 32] = [member_id; 32];
+        let member_id: MemberId = 1;
+        let account_id: [u8; 32] = [0; 32];
 
         let opening_id = add_opening(
             member_id,
@@ -370,6 +427,7 @@ fn create_fill_working_group_leader_opening_proposal_execution_succeeds() {
             ActivateOpeningAt::CurrentBlock,
             None,
             1,
+            working_group,
         );
 
         let apply_result = ContentDirectoryWorkingGroup::apply_on_opening(
@@ -386,7 +444,7 @@ fn create_fill_working_group_leader_opening_proposal_execution_succeeds() {
 
         let expected_application_id = 0;
 
-        begin_review_applications(member_id, account_id, opening_id, 2);
+        begin_review_applications(member_id, account_id, opening_id, 2, working_group);
 
         let lead = ContentDirectoryWorkingGroup::current_lead();
         assert!(lead.is_none());
@@ -398,6 +456,7 @@ fn create_fill_working_group_leader_opening_proposal_execution_succeeds() {
             expected_application_id,
             None,
             3,
+            working_group,
         );
 
         let lead = ContentDirectoryWorkingGroup::current_lead();
@@ -405,92 +464,127 @@ fn create_fill_working_group_leader_opening_proposal_execution_succeeds() {
     });
 }
 
-#[test]
-fn create_decrease_group_leader_stake_proposal_execution_succeeds() {
-    initial_test_ext().execute_with(|| {
-        let member_id = 1;
-        let account_id: [u8; 32] = [member_id; 32];
-        let stake_amount = 100;
-
-        let opening_policy_commitment = OpeningPolicyCommitment {
-            role_staking_policy: Some(hiring::StakingPolicy {
-                amount: 100,
-                amount_mode: hiring::StakingAmountLimitMode::AtLeast,
-                crowded_out_unstaking_period_length: None,
-                review_period_expired_unstaking_period_length: None,
-            }),
-            ..OpeningPolicyCommitment::default()
-        };
-
-        let opening_id = add_opening(
-            member_id,
-            account_id.clone(),
-            ActivateOpeningAt::CurrentBlock,
-            Some(opening_policy_commitment),
-            1,
-        );
-
-        let apply_result = ContentDirectoryWorkingGroup::apply_on_opening(
-            RawOrigin::Signed(account_id.clone().into()).into(),
-            member_id as u64,
-            opening_id,
-            account_id.clone().into(),
-            Some(stake_amount),
-            None,
-            Vec::new(),
-        );
-
-        assert_eq!(apply_result, Ok(()));
-
-        let expected_application_id = 0;
-
-        begin_review_applications(member_id, account_id, opening_id, 2);
-
-        let lead = ContentDirectoryWorkingGroup::current_lead();
-        assert!(lead.is_none());
-
-        fill_opening(
-            member_id,
-            account_id,
-            opening_id,
-            expected_application_id,
-            None,
-            3,
-        );
-
-        let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap();
-
-        let stake_id = 1;
-        let old_balance = Balances::free_balance(&account_id.into());
-        let old_stake = <stake::Module<Runtime>>::stakes(stake_id);
-
-        assert_eq!(get_stake_balance(old_stake), stake_amount);
-
-        let decreasing_stake_amount = 30;
-        decrease_stake(
-            member_id,
-            account_id,
-            leader_worker_id,
-            decreasing_stake_amount,
-            4,
-        );
-
-        let new_balance = Balances::free_balance(&account_id.into());
-        let new_stake = <stake::Module<Runtime>>::stakes(stake_id);
-
-        assert_eq!(
-            get_stake_balance(new_stake),
-            stake_amount - decreasing_stake_amount
-        );
-        assert_eq!(new_balance, old_balance + decreasing_stake_amount);
-    });
-}
+// #[test]
+// fn create_decrease_group_leader_stake_proposal_execution_succeeds() {
+//     // This uses strum crate for enum iteration
+//     for group in WorkingGroup::iter() {
+//         run_create_decrease_group_leader_stake_proposal_execution_succeeds(group);
+//     }
+// }
+
+// fn run_create_decrease_group_leader_stake_proposal_execution_succeeds(working_group: WorkingGroup) {
+//     initial_test_ext().execute_with(|| {
+//         let member_id: MemberId = 1;
+//         let account_id: AccountId = AccountId::default();
+//         let stake_amount: Balance = 100;
+
+//         let opening_policy_commitment = OpeningPolicyCommitment {
+//             role_staking_policy: Some(hiring::StakingPolicy {
+//                 amount: 100,
+//                 amount_mode: hiring::StakingAmountLimitMode::AtLeast,
+//                 crowded_out_unstaking_period_length: None,
+//                 review_period_expired_unstaking_period_length: None,
+//             }),
+//             ..OpeningPolicyCommitment::default()
+//         };
+
+//         let opening_id = add_opening(
+//             member_id,
+//             account_id.clone(),
+//             ActivateOpeningAt::CurrentBlock,
+//             Some(opening_policy_commitment),
+//             1,
+//             working_group,
+//         );
+
+//         let apply_result = ContentDirectoryWorkingGroup::apply_on_opening(
+//             RawOrigin::Signed(account_id.clone().into()).into(),
+//             member_id as u64,
+//             opening_id,
+//             account_id.clone().into(),
+//             Some(stake_amount),
+//             None,
+//             Vec::new(),
+//         );
+
+//         assert_eq!(apply_result, Ok(()));
+
+//         let expected_application_id = 0;
+
+//         begin_review_applications(member_id, account_id, opening_id, 2, working_group);
+
+//         let lead = ContentDirectoryWorkingGroup::current_lead();
+//         assert!(lead.is_none());
+
+//         fill_opening(
+//             member_id,
+//             account_id,
+//             opening_id,
+//             expected_application_id,
+//             None,
+//             3,
+//             working_group,
+//         );
+
+//         let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap();
+
+//         let stake_id = 1;
+//         let old_balance = Balances::free_balance(&account_id.into());
+//         let old_stake = <stake::Module<Runtime>>::stakes(stake_id);
+
+//         assert_eq!(get_stake_balance(old_stake), stake_amount);
+
+//         let decreasing_stake_amount = 30;
+//         decrease_stake(
+//             member_id,
+//             account_id,
+//             leader_worker_id,
+//             decreasing_stake_amount,
+//             4,
+//             working_group,
+//         );
+
+//         let new_balance = Balances::free_balance(&account_id.into());
+//         let new_stake = <stake::Module<Runtime>>::stakes(stake_id);
+
+//         assert_eq!(
+//             get_stake_balance(new_stake),
+//             stake_amount - decreasing_stake_amount
+//         );
+//         assert_eq!(new_balance, old_balance + decreasing_stake_amount);
+//     });
+// }
 
 #[test]
 fn create_slash_group_leader_stake_proposal_execution_succeeds() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        match group {
+            WorkingGroup::Content => {
+                run_create_slash_group_leader_stake_proposal_execution_succeeds::<
+                    Runtime,
+                    ContentDirectoryWorkingGroupInstance,
+                >(group)
+            }
+            WorkingGroup::Storage => {
+                run_create_slash_group_leader_stake_proposal_execution_succeeds::<
+                    Runtime,
+                    StorageWorkingGroupInstance,
+                >(group)
+            }
+        }
+    }
+}
+
+fn run_create_slash_group_leader_stake_proposal_execution_succeeds<
+    T: working_group::Trait<I> + system::Trait + stake::Trait,
+    I: working_group::Instance,
+>(
+    working_group: WorkingGroup,
+) {
     initial_test_ext().execute_with(|| {
-        let member_id = 1;
-        let account_id: [u8; 32] = [member_id; 32];
+        let member_id: MemberId = 1;
+        let account_id: [u8; 32] = [0; 32];
         let stake_amount = 100;
 
         let opening_policy_commitment = OpeningPolicyCommitment {
@@ -509,14 +603,15 @@ fn create_slash_group_leader_stake_proposal_execution_succeeds() {
             ActivateOpeningAt::CurrentBlock,
             Some(opening_policy_commitment),
             1,
+            working_group,
         );
 
-        let apply_result = ContentDirectoryWorkingGroup::apply_on_opening(
-            RawOrigin::Signed(account_id.clone().into()).into(),
-            member_id as u64,
-            opening_id,
-            account_id.clone().into(),
-            Some(stake_amount),
+        let apply_result = WorkingGroupInstance::<T, I>::apply_on_opening(
+            RawOrigin::Signed(T::AccountId::default()).into(),
+            member_id.into(),
+            opening_id.into(),
+            T::AccountId::default(),
+            Some(stake_amount.into()),
             None,
             Vec::new(),
         );
@@ -525,9 +620,10 @@ fn create_slash_group_leader_stake_proposal_execution_succeeds() {
 
         let expected_application_id = 0;
 
-        begin_review_applications(member_id, account_id, opening_id, 2);
+        begin_review_applications(member_id, account_id, opening_id, 2, working_group);
+
+        let lead = WorkingGroupInstance::<T, I>::current_lead();
 
-        let lead = ContentDirectoryWorkingGroup::current_lead();
         assert!(lead.is_none());
 
         fill_opening(
@@ -537,23 +633,25 @@ fn create_slash_group_leader_stake_proposal_execution_succeeds() {
             expected_application_id,
             None,
             3,
+            working_group,
         );
 
-        let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap();
+        let leader_worker_id = WorkingGroupInstance::<T, I>::current_lead().unwrap();
 
         let stake_id = 1;
         let old_balance = Balances::free_balance(&account_id.into());
         let old_stake = <stake::Module<Runtime>>::stakes(stake_id);
 
-        assert_eq!(get_stake_balance(old_stake), stake_amount);
+        assert_eq!(get_stake_balance(old_stake), stake_amount as Balance);
 
         let slashing_stake_amount = 30;
         slash_stake(
             member_id,
             account_id,
-            leader_worker_id,
+            leader_worker_id.into(),
             slashing_stake_amount,
             4,
+            working_group,
         );
 
         let new_balance = Balances::free_balance(&account_id.into());
@@ -561,7 +659,7 @@ fn create_slash_group_leader_stake_proposal_execution_succeeds() {
 
         assert_eq!(
             get_stake_balance(new_stake),
-            stake_amount - slashing_stake_amount
+            stake_amount as u128 - slashing_stake_amount
         );
         assert_eq!(new_balance, old_balance);
     });
@@ -569,14 +667,23 @@ fn create_slash_group_leader_stake_proposal_execution_succeeds() {
 
 #[test]
 fn create_set_working_group_mint_capacity_proposal_execution_succeeds() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_create_set_working_group_mint_capacity_proposal_execution_succeeds(group);
+    }
+}
+
+fn run_create_set_working_group_mint_capacity_proposal_execution_succeeds(
+    working_group: WorkingGroup,
+) {
     initial_test_ext().execute_with(|| {
-        let member_id = 1;
-        let account_id: [u8; 32] = [member_id; 32];
+        let member_id: MemberId = 1;
+        let account_id: [u8; 32] = [0; 32];
 
         assert_eq!(ContentDirectoryWorkingGroup::mint(), 0);
 
         let mint_capacity = 999999;
-        set_mint_capacity(member_id, account_id, mint_capacity, 1, true);
+        set_mint_capacity(member_id, account_id, mint_capacity, 1, true, working_group);
 
         let mint_id = ContentDirectoryWorkingGroup::mint();
         let mint = <minting::Module<Runtime>>::mints(mint_id);
@@ -587,9 +694,16 @@ fn create_set_working_group_mint_capacity_proposal_execution_succeeds() {
 
 #[test]
 fn create_set_group_leader_reward_proposal_execution_succeeds() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_create_set_group_leader_reward_proposal_execution_succeeds(group);
+    }
+}
+
+fn run_create_set_group_leader_reward_proposal_execution_succeeds(working_group: WorkingGroup) {
     initial_test_ext().execute_with(|| {
-        let member_id = 1;
-        let account_id: [u8; 32] = [member_id; 32];
+        let member_id: MemberId = 1;
+        let account_id: [u8; 32] = [0; 32];
         let stake_amount = 100;
 
         let opening_policy_commitment = OpeningPolicyCommitment {
@@ -608,6 +722,7 @@ fn create_set_group_leader_reward_proposal_execution_succeeds() {
             ActivateOpeningAt::CurrentBlock,
             Some(opening_policy_commitment),
             1,
+            working_group,
         );
 
         let apply_result = ContentDirectoryWorkingGroup::apply_on_opening(
@@ -624,7 +739,7 @@ fn create_set_group_leader_reward_proposal_execution_succeeds() {
 
         let expected_application_id = 0;
 
-        begin_review_applications(member_id, account_id, opening_id, 2);
+        begin_review_applications(member_id, account_id, opening_id, 2, working_group);
 
         let lead = ContentDirectoryWorkingGroup::current_lead();
         assert!(lead.is_none());
@@ -636,7 +751,7 @@ fn create_set_group_leader_reward_proposal_execution_succeeds() {
             payout_interval: None,
         });
 
-        set_mint_capacity(member_id, account_id, 999999, 3, false);
+        set_mint_capacity(member_id, account_id, 999999, 3, false, working_group);
 
         fill_opening(
             member_id,
@@ -645,6 +760,7 @@ fn create_set_group_leader_reward_proposal_execution_succeeds() {
             expected_application_id,
             reward_policy,
             4,
+            working_group,
         );
 
         let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap();
@@ -662,6 +778,7 @@ fn create_set_group_leader_reward_proposal_execution_succeeds() {
             leader_worker_id,
             new_reward_amount,
             5,
+            working_group,
         );
 
         let relationship = recurring_rewards::RewardRelationships::<Runtime>::get(relationship_id);
@@ -671,9 +788,16 @@ fn create_set_group_leader_reward_proposal_execution_succeeds() {
 
 #[test]
 fn create_terminate_group_leader_role_proposal_execution_succeeds() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_create_terminate_group_leader_role_proposal_execution_succeeds(group);
+    }
+}
+
+fn run_create_terminate_group_leader_role_proposal_execution_succeeds(working_group: WorkingGroup) {
     initial_test_ext().execute_with(|| {
-        let member_id = 1;
-        let account_id: [u8; 32] = [member_id; 32];
+        let member_id: MemberId = 1;
+        let account_id: [u8; 32] = [0; 32];
         let stake_amount = 100;
 
         let opening_policy_commitment = OpeningPolicyCommitment {
@@ -692,6 +816,7 @@ fn create_terminate_group_leader_role_proposal_execution_succeeds() {
             ActivateOpeningAt::CurrentBlock,
             Some(opening_policy_commitment),
             1,
+            working_group,
         );
 
         let apply_result = ContentDirectoryWorkingGroup::apply_on_opening(
@@ -708,7 +833,7 @@ fn create_terminate_group_leader_role_proposal_execution_succeeds() {
 
         let expected_application_id = 0;
 
-        begin_review_applications(member_id, account_id, opening_id, 2);
+        begin_review_applications(member_id, account_id, opening_id, 2, working_group);
 
         let lead = ContentDirectoryWorkingGroup::current_lead();
         assert!(lead.is_none());
@@ -720,7 +845,7 @@ fn create_terminate_group_leader_role_proposal_execution_succeeds() {
             payout_interval: None,
         });
 
-        set_mint_capacity(member_id, account_id, 999999, 3, false);
+        set_mint_capacity(member_id, account_id, 999999, 3, false, working_group);
 
         fill_opening(
             member_id,
@@ -729,17 +854,25 @@ fn create_terminate_group_leader_role_proposal_execution_succeeds() {
             expected_application_id,
             reward_policy,
             4,
+            working_group,
         );
 
-        let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap();
-
         let stake_id = 1;
         let old_balance = Balances::free_balance(&account_id.into());
         let old_stake = <stake::Module<Runtime>>::stakes(stake_id);
 
         assert_eq!(get_stake_balance(old_stake), stake_amount);
 
-        terminate_role(member_id, account_id, leader_worker_id, false, 5);
+        let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap();
+
+        terminate_role(
+            member_id,
+            account_id,
+            leader_worker_id,
+            false,
+            5,
+            working_group,
+        );
 
         assert!(ContentDirectoryWorkingGroup::current_lead().is_none());
 
@@ -753,9 +886,18 @@ fn create_terminate_group_leader_role_proposal_execution_succeeds() {
 
 #[test]
 fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds() {
+    // This uses strum crate for enum iteration
+    for group in WorkingGroup::iter() {
+        run_create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds(group);
+    }
+}
+
+fn run_create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds(
+    working_group: WorkingGroup,
+) {
     initial_test_ext().execute_with(|| {
-        let member_id = 1;
-        let account_id: [u8; 32] = [member_id; 32];
+        let member_id: MemberId = 1;
+        let account_id: [u8; 32] = [0; 32];
         let stake_amount = 100;
 
         let opening_policy_commitment = OpeningPolicyCommitment {
@@ -774,11 +916,12 @@ fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds(
             ActivateOpeningAt::CurrentBlock,
             Some(opening_policy_commitment),
             1,
+            working_group,
         );
 
         let apply_result = ContentDirectoryWorkingGroup::apply_on_opening(
             RawOrigin::Signed(account_id.clone().into()).into(),
-            member_id as u64,
+            member_id,
             opening_id,
             account_id.clone().into(),
             Some(stake_amount),
@@ -790,7 +933,7 @@ fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds(
 
         let expected_application_id = 0;
 
-        begin_review_applications(member_id, account_id, opening_id, 2);
+        begin_review_applications(member_id, account_id, opening_id, 2, working_group);
 
         let lead = ContentDirectoryWorkingGroup::current_lead();
         assert!(lead.is_none());
@@ -802,7 +945,7 @@ fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds(
             payout_interval: None,
         });
 
-        set_mint_capacity(member_id, account_id, 999999, 3, false);
+        set_mint_capacity(member_id, account_id, 999999, 3, false, working_group);
 
         fill_opening(
             member_id,
@@ -811,17 +954,25 @@ fn create_terminate_group_leader_role_proposal_with_slashing_execution_succeeds(
             expected_application_id,
             reward_policy,
             4,
+            working_group,
         );
 
-        let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap();
-
         let stake_id = 1;
         let old_balance = Balances::free_balance(&account_id.into());
         let old_stake = <stake::Module<Runtime>>::stakes(stake_id);
 
         assert_eq!(get_stake_balance(old_stake), stake_amount);
 
-        terminate_role(member_id, account_id, leader_worker_id, true, 5);
+        let leader_worker_id = ContentDirectoryWorkingGroup::current_lead().unwrap();
+
+        terminate_role(
+            member_id,
+            account_id,
+            leader_worker_id,
+            true,
+            5,
+            working_group,
+        );
 
         assert!(ContentDirectoryWorkingGroup::current_lead().is_none());