Browse Source

runtime: storage: Add extrinsic.

- add `delete_distribution_bucket` extrinsic
Shamil Gadelshin 3 years ago
parent
commit
f6c71da2bf

+ 36 - 0
runtime-modules/storage/src/lib.rs

@@ -1014,6 +1014,12 @@ decl_event! {
         /// - distribution bucket ID
         /// - new status (accepting new bags)
         DistributionBucketStatusUpdated(DistributionBucketFamilyId, DistributionBucketId, bool),
+
+        /// Emits on deleting distribution bucket.
+        /// Params
+        /// - distribution bucket family ID
+        /// - distribution bucket ID
+        DistributionBucketDeleted(DistributionBucketFamilyId, DistributionBucketId),
     }
 }
 
@@ -1837,6 +1843,36 @@ decl_module! {
             );
         }
 
+        /// Delete distribution bucket. Must be empty.
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn delete_distribution_bucket(
+            origin,
+            family_id: T::DistributionBucketFamilyId,
+            distribution_bucket_id: T::DistributionBucketId,
+        ){
+            T::ensure_distribution_working_group_leader_origin(origin)?;
+
+            let mut family = Self::ensure_distribution_bucket_family_exists(&family_id)?;
+            Self::ensure_distribution_bucket_exists(&family, &distribution_bucket_id)?;
+
+            //TODO: check emptiness
+
+            //TODO: check invitation
+
+            //
+            // == MUTATION SAFE ==
+            //
+
+            family.distribution_buckets.remove(&distribution_bucket_id);
+
+            <DistributionBucketFamilyById<T>>::insert(family_id, family);
+
+            Self::deposit_event(
+                RawEvent::DistributionBucketDeleted(family_id, distribution_bucket_id)
+            );
+        }
+
+
         // ===== Distribution Operator actions =====
 
     }

+ 66 - 7
runtime-modules/storage/src/tests/fixtures.rs

@@ -1238,13 +1238,17 @@ pub struct DeleteDistributionBucketFamilyFixture {
 }
 
 impl DeleteDistributionBucketFamilyFixture {
-    pub fn default(family_id: u64) -> Self {
+    pub fn default() -> Self {
         Self {
             origin: RawOrigin::Signed(DEFAULT_ACCOUNT_ID),
-            family_id,
+            family_id: Default::default(),
         }
     }
 
+    pub fn with_family_id(self, family_id: u64) -> Self {
+        Self { family_id, ..self }
+    }
+
     pub fn with_origin(self, origin: RawOrigin<u64>) -> Self {
         Self { origin, ..self }
     }
@@ -1277,14 +1281,18 @@ pub struct CreateDistributionBucketFixture {
 }
 
 impl CreateDistributionBucketFixture {
-    pub fn default(family_id: u64) -> Self {
+    pub fn default() -> Self {
         Self {
             origin: RawOrigin::Signed(DEFAULT_ACCOUNT_ID),
-            family_id,
+            family_id: Default::default(),
             accept_new_bags: false,
         }
     }
 
+    pub fn with_family_id(self, family_id: u64) -> Self {
+        Self { family_id, ..self }
+    }
+
     pub fn with_origin(self, origin: RawOrigin<u64>) -> Self {
         Self { origin, ..self }
     }
@@ -1339,14 +1347,24 @@ pub struct UpdateDistributionBucketStatusFixture {
 }
 
 impl UpdateDistributionBucketStatusFixture {
-    pub fn default(family_id: u64, bucket_id: u64) -> Self {
+    pub fn default() -> Self {
         Self {
             origin: RawOrigin::Signed(DEFAULT_MEMBER_ACCOUNT_ID),
-            family_id,
-            distribution_bucket_id: bucket_id,
+            family_id: Default::default(),
+            distribution_bucket_id: Default::default(),
             new_status: false,
         }
     }
+    pub fn with_bucket_id(self, bucket_id: u64) -> Self {
+        Self {
+            distribution_bucket_id: bucket_id,
+            ..self
+        }
+    }
+
+    pub fn with_family_id(self, family_id: u64) -> Self {
+        Self { family_id, ..self }
+    }
 
     pub fn with_origin(self, origin: RawOrigin<u64>) -> Self {
         Self { origin, ..self }
@@ -1367,3 +1385,44 @@ impl UpdateDistributionBucketStatusFixture {
         assert_eq!(actual_result, expected_result);
     }
 }
+
+pub struct DeleteDistributionBucketFixture {
+    origin: RawOrigin<u64>,
+    family_id: u64,
+    distribution_bucket_id: u64,
+}
+
+impl DeleteDistributionBucketFixture {
+    pub fn default() -> Self {
+        Self {
+            origin: RawOrigin::Signed(DEFAULT_MEMBER_ACCOUNT_ID),
+            family_id: Default::default(),
+            distribution_bucket_id: Default::default(),
+        }
+    }
+
+    pub fn with_bucket_id(self, bucket_id: u64) -> Self {
+        Self {
+            distribution_bucket_id: bucket_id,
+            ..self
+        }
+    }
+
+    pub fn with_family_id(self, family_id: u64) -> Self {
+        Self { family_id, ..self }
+    }
+
+    pub fn with_origin(self, origin: RawOrigin<u64>) -> Self {
+        Self { origin, ..self }
+    }
+
+    pub fn call_and_assert(&self, expected_result: DispatchResult) {
+        let actual_result = Storage::delete_distribution_bucket(
+            self.origin.clone().into(),
+            self.family_id,
+            self.distribution_bucket_id,
+        );
+
+        assert_eq!(actual_result, expected_result);
+    }
+}

+ 99 - 23
runtime-modules/storage/src/tests/mod.rs

@@ -3539,7 +3539,8 @@ fn delete_distribution_bucket_family_succeeded() {
             .call_and_assert(Ok(()))
             .unwrap();
 
-        DeleteDistributionBucketFamilyFixture::default(family_id)
+        DeleteDistributionBucketFamilyFixture::default()
+            .with_family_id(family_id)
             .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
             .call_and_assert(Ok(()));
 
@@ -3550,8 +3551,7 @@ fn delete_distribution_bucket_family_succeeded() {
 #[test]
 fn delete_distribution_bucket_family_fails_with_non_signed_origin() {
     build_test_externalities().execute_with(|| {
-        let invalid_family_id = 100;
-        DeleteDistributionBucketFamilyFixture::default(invalid_family_id)
+        DeleteDistributionBucketFamilyFixture::default()
             .with_origin(RawOrigin::None)
             .call_and_assert(Err(DispatchError::BadOrigin));
     });
@@ -3560,8 +3560,7 @@ fn delete_distribution_bucket_family_fails_with_non_signed_origin() {
 #[test]
 fn delete_distribution_bucket_family_fails_with_non_existing_family() {
     build_test_externalities().execute_with(|| {
-        let invalid_family_id = 100;
-        DeleteDistributionBucketFamilyFixture::default(invalid_family_id)
+        DeleteDistributionBucketFamilyFixture::default()
             .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
             .call_and_assert(Err(
                 Error::<Test>::DistributionBucketFamilyDoesntExist.into()
@@ -3582,12 +3581,17 @@ fn create_distribution_bucket_succeeded() {
             .call_and_assert(Ok(()))
             .unwrap();
 
-        let bucket_id = CreateDistributionBucketFixture::default(family_id)
+        let bucket_id = CreateDistributionBucketFixture::default()
+            .with_family_id(family_id)
             .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
             .with_accept_new_bags(accept_new_bags)
             .call_and_assert(Ok(()))
             .unwrap();
 
+        assert!(Storage::distribution_bucket_family_by_id(family_id)
+            .distribution_buckets
+            .contains_key(&bucket_id));
+
         EventFixture::assert_last_crate_event(RawEvent::DistributionBucketCreated(
             family_id,
             accept_new_bags,
@@ -3599,8 +3603,7 @@ fn create_distribution_bucket_succeeded() {
 #[test]
 fn create_distribution_bucket_fails_with_non_signed_origin() {
     build_test_externalities().execute_with(|| {
-        let invalid_family_id = 100;
-        CreateDistributionBucketFixture::default(invalid_family_id)
+        CreateDistributionBucketFixture::default()
             .with_origin(RawOrigin::None)
             .call_and_assert(Err(DispatchError::BadOrigin));
     });
@@ -3609,8 +3612,7 @@ fn create_distribution_bucket_fails_with_non_signed_origin() {
 #[test]
 fn create_distribution_bucket_fails_with_non_existing_family() {
     build_test_externalities().execute_with(|| {
-        let invalid_family_id = 100;
-        CreateDistributionBucketFixture::default(invalid_family_id)
+        CreateDistributionBucketFixture::default()
             .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
             .call_and_assert(Err(
                 Error::<Test>::DistributionBucketFamilyDoesntExist.into()
@@ -3626,11 +3628,13 @@ fn create_distribution_bucket_fails_with_exceeding_max_bucket_number() {
             .call_and_assert(Ok(()))
             .unwrap();
 
-        CreateDistributionBucketFixture::default(family_id)
+        CreateDistributionBucketFixture::default()
+            .with_family_id(family_id)
             .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
             .call_and_assert(Ok(()));
 
-        CreateDistributionBucketFixture::default(family_id)
+        CreateDistributionBucketFixture::default()
+            .with_family_id(family_id)
             .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
             .call_and_assert(Err(
                 Error::<Test>::MaxDistributionBucketNumberPerFamilyLimitExceeded.into(),
@@ -3649,17 +3653,29 @@ fn update_distribution_bucket_status_succeeded() {
             .call_and_assert(Ok(()))
             .unwrap();
 
-        let bucket_id = CreateDistributionBucketFixture::default(family_id)
+        let bucket_id = CreateDistributionBucketFixture::default()
+            .with_family_id(family_id)
             .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
             .call_and_assert(Ok(()))
             .unwrap();
 
         let new_status = true;
-        UpdateDistributionBucketStatusFixture::default(family_id, bucket_id)
+        UpdateDistributionBucketStatusFixture::default()
+            .with_family_id(family_id)
+            .with_bucket_id(bucket_id)
             .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
             .with_new_status(new_status)
             .call_and_assert(Ok(()));
 
+        assert_eq!(
+            Storage::distribution_bucket_family_by_id(family_id)
+                .distribution_buckets
+                .get(&bucket_id)
+                .unwrap()
+                .accepting_new_bags,
+            new_status
+        );
+
         EventFixture::assert_last_crate_event(RawEvent::DistributionBucketStatusUpdated(
             family_id, bucket_id, new_status,
         ));
@@ -3669,10 +3685,7 @@ fn update_distribution_bucket_status_succeeded() {
 #[test]
 fn update_distribution_bucket_status_fails_with_invalid_origin() {
     build_test_externalities().execute_with(|| {
-        let invalid_family_id = 111;
-        let invalid_bucket_id = 111;
-
-        UpdateDistributionBucketStatusFixture::default(invalid_family_id, invalid_bucket_id)
+        UpdateDistributionBucketStatusFixture::default()
             .with_origin(RawOrigin::Root)
             .call_and_assert(Err(DispatchError::BadOrigin));
     });
@@ -3685,9 +3698,9 @@ fn update_distribution_bucket_status_fails_with_invalid_distribution_bucket() {
             .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
             .call_and_assert(Ok(()))
             .unwrap();
-        let invalid_bucket_id = 111;
 
-        UpdateDistributionBucketStatusFixture::default(family_id, invalid_bucket_id)
+        UpdateDistributionBucketStatusFixture::default()
+            .with_family_id(family_id)
             .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
             .call_and_assert(Err(Error::<Test>::DistributionBucketDoesntExist.into()));
     });
@@ -3696,10 +3709,73 @@ fn update_distribution_bucket_status_fails_with_invalid_distribution_bucket() {
 #[test]
 fn update_distribution_bucket_status_fails_with_invalid_distribution_bucket_family() {
     build_test_externalities().execute_with(|| {
-        let invalid_family_id = 111;
-        let invalid_bucket_id = 111;
+        UpdateDistributionBucketStatusFixture::default()
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Err(
+                Error::<Test>::DistributionBucketFamilyDoesntExist.into()
+            ));
+    });
+}
+
+#[test]
+fn delete_distribution_bucket_succeeded() {
+    build_test_externalities().execute_with(|| {
+        let starting_block = 1;
+        run_to_block(starting_block);
+
+        let family_id = CreateDistributionBucketFamilyFixture::default()
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Ok(()))
+            .unwrap();
+
+        let bucket_id = CreateDistributionBucketFixture::default()
+            .with_family_id(family_id)
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Ok(()))
+            .unwrap();
+
+        DeleteDistributionBucketFixture::default()
+            .with_bucket_id(bucket_id)
+            .with_family_id(family_id)
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Ok(()));
+
+        EventFixture::assert_last_crate_event(RawEvent::DistributionBucketDeleted(
+            family_id, bucket_id,
+        ));
+    });
+}
+
+#[test]
+fn delete_distribution_bucket_fails_with_non_leader_origin() {
+    build_test_externalities().execute_with(|| {
+        let non_leader_id = 1111;
 
-        UpdateDistributionBucketStatusFixture::default(invalid_family_id, invalid_bucket_id)
+        DeleteDistributionBucketFixture::default()
+            .with_origin(RawOrigin::Signed(non_leader_id))
+            .call_and_assert(Err(DispatchError::BadOrigin));
+    });
+}
+
+#[test]
+fn delete_distribution_bucket_fails_with_non_existing_distribution_bucket() {
+    build_test_externalities().execute_with(|| {
+        let family_id = CreateDistributionBucketFamilyFixture::default()
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Ok(()))
+            .unwrap();
+
+        DeleteDistributionBucketFixture::default()
+            .with_family_id(family_id)
+            .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
+            .call_and_assert(Err(Error::<Test>::DistributionBucketDoesntExist.into()));
+    });
+}
+
+#[test]
+fn delete_distribution_bucket_fails_with_non_existing_distribution_bucket_family() {
+    build_test_externalities().execute_with(|| {
+        DeleteDistributionBucketFixture::default()
             .with_origin(RawOrigin::Signed(DISTRIBUTION_WG_LEADER_ACCOUNT_ID))
             .call_and_assert(Err(
                 Error::<Test>::DistributionBucketFamilyDoesntExist.into()