Skip to content
Snippets Groups Projects
tests.rs 6.25 KiB
// Copyright 2021 Axiom-Team
//
// This file is part of Duniter-v2S.
//
// Duniter-v2S is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, version 3 of the License.
//
// Duniter-v2S is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>.

use crate::mock::*;
use crate::{Error, Event};
use frame_support::assert_ok;
use maplit::btreemap;
use sp_membership::traits::*;
use sp_membership::MembershipData;
use sp_runtime::traits::IsMember;

fn default_gen_conf() -> DefaultMembershipConfig {
    DefaultMembershipConfig {
        memberships: btreemap![
            0 => MembershipData {
                expire_on: 3,
            }
        ],
    }
}

#[test]
fn test_genesis_build() {
    new_test_ext(default_gen_conf()).execute_with(|| {
        run_to_block(1);
        // Verify state
        assert_eq!(
            DefaultMembership::membership(0),
            Some(MembershipData { expire_on: 3 })
        );
        assert_eq!(DefaultMembership::members_count(), 1);
    });
}

#[test]
fn test_membership_already_acquired() {
    new_test_ext(default_gen_conf()).execute_with(|| {
        run_to_block(1);
        // Merbership 0 cannot be reclaimed
        assert_eq!(
            DefaultMembership::claim_membership(RuntimeOrigin::signed(0), None),
            Err(Error::<Test, _>::MembershipAlreadyAcquired.into())
        );
    });
}

#[test]
fn test_membership_request_not_found() {
    new_test_ext(default_gen_conf()).execute_with(|| {
        run_to_block(1);
        // Merbership 0 cannot be reclaimed
        assert_eq!(
            DefaultMembership::claim_membership(RuntimeOrigin::signed(1), None),
            Err(Error::<Test, _>::MembershipRequestNotFound.into())
        );
    });
}

#[test]
fn test_membership_renewal() {
    new_test_ext(default_gen_conf()).execute_with(|| {
        run_to_block(2);
        // Merbership 0 can be renewable on block #2
        assert_ok!(DefaultMembership::renew_membership(
            RuntimeOrigin::signed(0),
            None
        ),);
        assert_eq!(
            System::events()[0].event,
            RuntimeEvent::DefaultMembership(Event::MembershipRenewed(0))
        );
    });
}

#[test]
fn test_membership_expiration() {
    new_test_ext(default_gen_conf()).execute_with(|| {
        // Merbership 0 should not expired on block #2
        run_to_block(2);
        assert!(DefaultMembership::is_member(&0),);
        // Merbership 0 should expire on block #3
        run_to_block(3);
        assert!(!DefaultMembership::is_member(&0),);
        assert_eq!(
            System::events()[0].event,
            RuntimeEvent::DefaultMembership(Event::MembershipExpired(0))
        );
    });
}

#[test]
fn test_membership_revocation() {
    new_test_ext(default_gen_conf()).execute_with(|| {
        run_to_block(1);
        // Merbership 0 can be revocable on block #1
        assert_ok!(DefaultMembership::revoke_membership(
            RuntimeOrigin::signed(0),
            None
        ),);
        assert_eq!(
            System::events()[0].event,
            RuntimeEvent::DefaultMembership(Event::MembershipRevoked(0))
        );

        // Membership 0 can re-request membership
        run_to_block(5);
        assert_ok!(DefaultMembership::request_membership(
            RuntimeOrigin::signed(0),
            ()
        ),);
        assert_eq!(
            System::events()[0].event,
            RuntimeEvent::DefaultMembership(Event::MembershipRequested(0))
        );
    });
}

#[test]
fn test_pending_membership_expiration() {
    new_test_ext(Default::default()).execute_with(|| {
        // Idty 0 request membership
        run_to_block(1);
        assert_ok!(DefaultMembership::request_membership(
            RuntimeOrigin::signed(0),
            ()
        ),);
        assert_eq!(
            System::events()[0].event,
            RuntimeEvent::DefaultMembership(Event::MembershipRequested(0))
        );

        // Then, idty 0 shold still in pending memberships until PendingMembershipPeriod ended
        run_to_block(PendingMembershipPeriod::get());
        assert!(DefaultMembership::is_in_pending_memberships(0),);

        // Then, idty 0 request should expire after PendingMembershipPeriod
        run_to_block(1 + PendingMembershipPeriod::get());
        assert!(!DefaultMembership::is_in_pending_memberships(0),);
        assert_eq!(
            System::events()[0].event,
            RuntimeEvent::DefaultMembership(Event::PendingMembershipExpired(0))
        );
    })
}

#[test]
fn test_membership_workflow() {
    new_test_ext(Default::default()).execute_with(|| {
        // Idty 0 request membership
        run_to_block(1);
        assert_ok!(DefaultMembership::request_membership(
            RuntimeOrigin::signed(0),
            ()
        ),);
        assert_eq!(
            System::events()[0].event,
            RuntimeEvent::DefaultMembership(Event::MembershipRequested(0))
        );

        // Then, idty 0 claim membership
        run_to_block(2);
        assert_ok!(DefaultMembership::claim_membership(
            RuntimeOrigin::signed(0),
            None
        ),);
        assert_eq!(
            System::events()[0].event,
            RuntimeEvent::DefaultMembership(Event::MembershipAcquired(0))
        );

        // Then, idty 0 claim renewal, should success
        run_to_block(2);
        assert_ok!(DefaultMembership::renew_membership(
            RuntimeOrigin::signed(0),
            None
        ),);

        // Then, idty 0 shoul still member until membership period ended
        run_to_block(2 + MembershipPeriod::get() - 1);
        assert!(DefaultMembership::is_member(&0));

        // Then, idty 0 shoul expire after membership period
        run_to_block(2 + MembershipPeriod::get());
        assert!(!DefaultMembership::is_member(&0),);
        assert_eq!(
            System::events()[0].event,
            RuntimeEvent::DefaultMembership(Event::MembershipExpired(0))
        );
    });
}