Newer
Older
//! Unit tests for the non-fungible-token module.
#![cfg(test)]
use super::*;
use frame_support::{assert_noop, assert_ok};
use mock::{
ExtBuilder, NonFungibleTokenModule, Runtime, ALICE, BOB, CLASS_ID, CLASS_ID_NOT_EXIST, TOKEN_ID, TOKEN_ID_NOT_EXIST,
};
#[test]
fn create_class_should_work() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(NonFungibleTokenModule::create_class(&ALICE, vec![1], ()));
});
}
#[test]
fn create_class_should_fail() {
ExtBuilder::default().build().execute_with(|| {
NextClassId::<Runtime>::mutate(|id| *id = <Runtime as Trait>::ClassId::max_value());
assert_noop!(
NonFungibleTokenModule::create_class(&ALICE, vec![1], ()),
Error::<Runtime>::NoAvailableClassId
);
});
}
#[test]
fn mint_should_work() {
ExtBuilder::default().build().execute_with(|| {
let next_class_id = NonFungibleTokenModule::next_class_id();
assert_eq!(next_class_id, CLASS_ID);
assert_ok!(NonFungibleTokenModule::create_class(&ALICE, vec![1], ()));
assert_eq!(NonFungibleTokenModule::next_token_id(CLASS_ID), 0);
assert_ok!(NonFungibleTokenModule::mint(&BOB, CLASS_ID, vec![1], ()));
assert_eq!(NonFungibleTokenModule::next_token_id(CLASS_ID), 1);
assert_ok!(NonFungibleTokenModule::mint(&BOB, CLASS_ID, vec![1], ()));
assert_eq!(NonFungibleTokenModule::next_token_id(CLASS_ID), 2);
let next_class_id = NonFungibleTokenModule::next_class_id();
assert_ok!(NonFungibleTokenModule::create_class(&ALICE, vec![1], ()));
assert_eq!(NonFungibleTokenModule::next_token_id(next_class_id), 0);
assert_ok!(NonFungibleTokenModule::mint(&BOB, next_class_id, vec![1], ()));
assert_eq!(NonFungibleTokenModule::next_token_id(next_class_id), 1);
assert_eq!(NonFungibleTokenModule::next_token_id(CLASS_ID), 2);
});
}
#[test]
fn mint_should_fail() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(NonFungibleTokenModule::create_class(&ALICE, vec![1], ()));
Classes::<Runtime>::mutate(CLASS_ID, |class_info| {
class_info.as_mut().unwrap().total_issuance = <Runtime as Trait>::TokenId::max_value();
});
assert_noop!(
NonFungibleTokenModule::mint(&BOB, CLASS_ID, vec![1], ()),
Error::<Runtime>::NumOverflow
);
NextTokenId::<Runtime>::mutate(CLASS_ID, |id| *id = <Runtime as Trait>::TokenId::max_value());
assert_noop!(
NonFungibleTokenModule::mint(&BOB, CLASS_ID, vec![1], ()),
Error::<Runtime>::NoAvailableTokenId
);
});
}
#[test]
fn transfer_should_work() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(NonFungibleTokenModule::create_class(&ALICE, vec![1], ()));
assert_ok!(NonFungibleTokenModule::mint(&BOB, CLASS_ID, vec![1], ()));
assert_ok!(NonFungibleTokenModule::transfer(&BOB, &BOB, (CLASS_ID, TOKEN_ID)));
assert_ok!(NonFungibleTokenModule::transfer(&BOB, &ALICE, (CLASS_ID, TOKEN_ID)));
assert_ok!(NonFungibleTokenModule::transfer(&ALICE, &BOB, (CLASS_ID, TOKEN_ID)));
assert!(NonFungibleTokenModule::is_owner(&BOB, (CLASS_ID, TOKEN_ID)));
});
}
#[test]
fn transfer_should_fail() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(NonFungibleTokenModule::create_class(&ALICE, vec![1], ()));
assert_ok!(NonFungibleTokenModule::mint(&BOB, CLASS_ID, vec![1], ()));
assert_noop!(
NonFungibleTokenModule::transfer(&BOB, &ALICE, (CLASS_ID, TOKEN_ID_NOT_EXIST)),
);
assert_noop!(
NonFungibleTokenModule::transfer(&ALICE, &BOB, (CLASS_ID, TOKEN_ID)),
Error::<Runtime>::NoPermission
);
assert_noop!(
NonFungibleTokenModule::mint(&BOB, CLASS_ID_NOT_EXIST, vec![1], ()),
Error::<Runtime>::ClassNotFound
);
assert_noop!(
NonFungibleTokenModule::transfer(&ALICE, &ALICE, (CLASS_ID, TOKEN_ID)),
Error::<Runtime>::NoPermission
);
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
});
}
#[test]
fn burn_should_work() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(NonFungibleTokenModule::create_class(&ALICE, vec![1], ()));
assert_ok!(NonFungibleTokenModule::mint(&BOB, CLASS_ID, vec![1], ()));
assert_ok!(NonFungibleTokenModule::burn(&BOB, (CLASS_ID, TOKEN_ID)));
});
}
#[test]
fn burn_should_fail() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(NonFungibleTokenModule::create_class(&ALICE, vec![1], ()));
assert_ok!(NonFungibleTokenModule::mint(&BOB, CLASS_ID, vec![1], ()));
assert_noop!(
NonFungibleTokenModule::burn(&BOB, (CLASS_ID, TOKEN_ID_NOT_EXIST)),
Error::<Runtime>::TokenNotFound
);
assert_noop!(
NonFungibleTokenModule::burn(&ALICE, (CLASS_ID, TOKEN_ID)),
Error::<Runtime>::NoPermission
);
});
ExtBuilder::default().build().execute_with(|| {
assert_ok!(NonFungibleTokenModule::create_class(&ALICE, vec![1], ()));
assert_ok!(NonFungibleTokenModule::mint(&BOB, CLASS_ID, vec![1], ()));
Classes::<Runtime>::mutate(CLASS_ID, |class_info| {
class_info.as_mut().unwrap().total_issuance = 0;
});
assert_noop!(
NonFungibleTokenModule::burn(&BOB, (CLASS_ID, TOKEN_ID)),
Error::<Runtime>::NumOverflow
);
});
}
#[test]
fn destroy_class_should_work() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(NonFungibleTokenModule::create_class(&ALICE, vec![1], ()));
assert_ok!(NonFungibleTokenModule::mint(&BOB, CLASS_ID, vec![1], ()));
assert_ok!(NonFungibleTokenModule::burn(&BOB, (CLASS_ID, TOKEN_ID)));
assert_ok!(NonFungibleTokenModule::destroy_class(&ALICE, CLASS_ID));
assert_eq!(Classes::<Runtime>::contains_key(CLASS_ID), false);
assert_eq!(NextTokenId::<Runtime>::contains_key(CLASS_ID), false);
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
});
}
#[test]
fn destroy_class_should_fail() {
ExtBuilder::default().build().execute_with(|| {
assert_ok!(NonFungibleTokenModule::create_class(&ALICE, vec![1], ()));
assert_ok!(NonFungibleTokenModule::mint(&BOB, CLASS_ID, vec![1], ()));
assert_noop!(
NonFungibleTokenModule::destroy_class(&ALICE, CLASS_ID_NOT_EXIST),
Error::<Runtime>::ClassNotFound
);
assert_noop!(
NonFungibleTokenModule::destroy_class(&BOB, CLASS_ID),
Error::<Runtime>::NoPermission
);
assert_noop!(
NonFungibleTokenModule::destroy_class(&ALICE, CLASS_ID),
Error::<Runtime>::CannotDestroyClass
);
assert_ok!(NonFungibleTokenModule::burn(&BOB, (CLASS_ID, TOKEN_ID)));
assert_ok!(NonFungibleTokenModule::destroy_class(&ALICE, CLASS_ID));
assert_eq!(Classes::<Runtime>::contains_key(CLASS_ID), false);
});
}