create_entity.rs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. use super::*;
  2. #[test]
  3. fn create_entity_success() {
  4. with_test_externalities(|| {
  5. // Create simple class with default permissions
  6. assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
  7. // Update class permissions to force any member be available to create entities
  8. assert_ok!(update_class_permissions(
  9. LEAD_ORIGIN,
  10. FIRST_CLASS_ID,
  11. Some(true),
  12. None,
  13. None,
  14. None
  15. ));
  16. // Runtime state before tested call
  17. assert_eq!(next_entity_id(), FIRST_ENTITY_ID);
  18. assert!(!entity_exists(FIRST_ENTITY_ID));
  19. // Events number before tested call
  20. let number_of_events_before_call = System::events().len();
  21. let actor = Actor::Member(FIRST_MEMBER_ID);
  22. // Create entity
  23. assert_ok!(create_entity(
  24. FIRST_MEMBER_ORIGIN,
  25. FIRST_CLASS_ID,
  26. actor.clone()
  27. ));
  28. // Runtime tested state after call
  29. // Ensure Class `current_number_of_entities` value updated succesfully
  30. let mut class = create_class_with_default_permissions();
  31. class.get_permissions_mut().set_any_member_status(true);
  32. class.increment_entities_count();
  33. assert_eq!(class_by_id(FIRST_CLASS_ID), class);
  34. // Ensure entity creation voucher with `default_entity_creation_voucher_upper_bound` for given entity controller created succesfully.
  35. let mut entity_voucher =
  36. EntityCreationVoucher::new(class.get_default_entity_creation_voucher_upper_bound());
  37. entity_voucher.increment_created_entities_count();
  38. let entity_controller = EntityController::<MemberId>::from_actor::<Runtime>(&actor);
  39. assert_eq!(
  40. entity_creation_vouchers(FIRST_CLASS_ID, &entity_controller),
  41. entity_voucher,
  42. );
  43. // Ensure new entity created
  44. let entity = Entity::<ClassId, MemberId, Hashed, EntityId, Nonce>::new(
  45. entity_controller,
  46. FIRST_CLASS_ID,
  47. BTreeSet::new(),
  48. BTreeMap::new(),
  49. );
  50. assert_eq!(entity_by_id(FIRST_ENTITY_ID), entity);
  51. // Ensure `NextEntityId` storage value updated
  52. assert_eq!(next_entity_id(), SECOND_ENTITY_ID);
  53. let entity_created_event =
  54. get_test_event(RawEvent::EntityCreated(actor, next_entity_id() - 1));
  55. // Last event checked
  56. assert_event(entity_created_event, number_of_events_before_call + 1);
  57. })
  58. }
  59. #[test]
  60. fn create_entity_of_non_existent_class() {
  61. with_test_externalities(|| {
  62. // Create simple class with default permissions
  63. assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
  64. // Runtime state before tested call
  65. // Events number before tested call
  66. let number_of_events_before_call = System::events().len();
  67. let actor = Actor::Lead;
  68. // Make an attempt to create Entity of non existent Class
  69. let create_entity_result = create_entity(LEAD_ORIGIN, UNKNOWN_CLASS_ID, actor);
  70. // Failure checked
  71. assert_failure(
  72. create_entity_result,
  73. Error::<Runtime>::ClassNotFound,
  74. number_of_events_before_call,
  75. );
  76. })
  77. }
  78. #[test]
  79. fn create_entity_creation_limit_reached() {
  80. with_test_externalities(|| {
  81. // Create simple class with default permissions
  82. assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
  83. // Update class permissions to force any member be available to create entities
  84. assert_ok!(update_class_permissions(
  85. LEAD_ORIGIN,
  86. FIRST_CLASS_ID,
  87. Some(true),
  88. None,
  89. None,
  90. None
  91. ));
  92. // Runtime state before tested call
  93. // Events number before tested call
  94. let number_of_events_before_call = System::events().len();
  95. let mut number_of_entities_created = 0;
  96. // Create entities of the same Class entities limit per class reached
  97. let create_entity_result = loop {
  98. let create_entity_result = create_entity(
  99. number_of_entities_created,
  100. FIRST_CLASS_ID,
  101. Actor::Member(number_of_entities_created),
  102. );
  103. if create_entity_result.is_err() {
  104. break create_entity_result;
  105. } else {
  106. number_of_entities_created += 1;
  107. }
  108. };
  109. // Runtime tested state after call
  110. // Ensure number of entities created is equal to MaxNumberOfEntitiesPerClass runtime constraint.
  111. assert_eq!(
  112. number_of_entities_created,
  113. MaxNumberOfEntitiesPerClass::get()
  114. );
  115. // Failure checked
  116. assert_failure(
  117. create_entity_result,
  118. Error::<Runtime>::NumberOfEntitiesPerClassLimitReached,
  119. number_of_events_before_call + number_of_entities_created as usize,
  120. );
  121. })
  122. }
  123. #[test]
  124. fn create_entity_creation_blocked_on_class_level() {
  125. with_test_externalities(|| {
  126. // Create simple class with default permissions
  127. assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
  128. // Update class permissions to block entity creation on class level
  129. assert_ok!(update_class_permissions(
  130. LEAD_ORIGIN,
  131. FIRST_CLASS_ID,
  132. None,
  133. Some(true),
  134. None,
  135. None
  136. ));
  137. // Runtime state before tested call
  138. // Events number before tested call
  139. let number_of_events_before_call = System::events().len();
  140. let actor = Actor::Lead;
  141. // Make an attempt to create Entity, when entiti creation was previously blocked on class level
  142. let create_entity_result = create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor);
  143. // Runtime tested state after call
  144. // Failure checked
  145. assert_failure(
  146. create_entity_result,
  147. Error::<Runtime>::EntitiesCreationBlocked,
  148. number_of_events_before_call,
  149. );
  150. })
  151. }
  152. #[test]
  153. fn create_entity_lead_auth_failed() {
  154. with_test_externalities(|| {
  155. // Create simple class with default permissions
  156. assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
  157. // Runtime state before tested call
  158. // Events number before tested call
  159. let number_of_events_before_call = System::events().len();
  160. let actor = Actor::Lead;
  161. // Make an attempt to authorize as Lead under non lead origin
  162. let create_entity_result = create_entity(FIRST_MEMBER_ORIGIN, FIRST_CLASS_ID, actor);
  163. // Failure checked
  164. assert_failure(
  165. create_entity_result,
  166. Error::<Runtime>::LeadAuthFailed,
  167. number_of_events_before_call,
  168. );
  169. })
  170. }
  171. #[test]
  172. fn create_entity_member_auth_failed() {
  173. with_test_externalities(|| {
  174. // Create simple class with default permissions
  175. assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
  176. // Update class permissions to force any member be available to create entities
  177. assert_ok!(update_class_permissions(
  178. LEAD_ORIGIN,
  179. FIRST_CLASS_ID,
  180. Some(true),
  181. None,
  182. None,
  183. None
  184. ));
  185. // Runtime state before tested call
  186. // Events number before tested call
  187. let number_of_events_before_call = System::events().len();
  188. let actor = Actor::Member(UNKNOWN_MEMBER_ID);
  189. // Make an attempt to authorize under non existent member id
  190. let create_entity_result = create_entity(UNKNOWN_ORIGIN, FIRST_CLASS_ID, actor);
  191. // Failure checked
  192. assert_failure(
  193. create_entity_result,
  194. Error::<Runtime>::MemberAuthFailed,
  195. number_of_events_before_call,
  196. );
  197. })
  198. }
  199. #[test]
  200. fn create_entity_actor_can_not_create_entities() {
  201. with_test_externalities(|| {
  202. // Create simple class with default permissions
  203. assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
  204. // Runtime state before tested call
  205. // Events number before tested call
  206. let number_of_events_before_call = System::events().len();
  207. let actor = Actor::Member(UNKNOWN_MEMBER_ID);
  208. // Make an attempt to create entity, authorizing as member in case, when members are not permitted to create entities on class level
  209. let create_entity_result = create_entity(UNKNOWN_ORIGIN, FIRST_CLASS_ID, actor);
  210. // Failure checked
  211. assert_failure(
  212. create_entity_result,
  213. Error::<Runtime>::ActorCanNotCreateEntities,
  214. number_of_events_before_call,
  215. );
  216. })
  217. }
  218. #[test]
  219. fn create_entity_unknown_curator_id() {
  220. with_test_externalities(|| {
  221. // Create simple class with default permissions
  222. assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
  223. // Add curator group
  224. assert_ok!(add_curator_group(LEAD_ORIGIN));
  225. // Make curator group active
  226. assert_ok!(set_curator_group_status(
  227. LEAD_ORIGIN,
  228. FIRST_CURATOR_GROUP_ID,
  229. true
  230. ));
  231. // Add curator group as class maintainer
  232. assert_ok!(add_maintainer_to_class(
  233. LEAD_ORIGIN,
  234. FIRST_CLASS_ID,
  235. FIRST_CURATOR_GROUP_ID
  236. ));
  237. // Runtime state before tested call
  238. // Events number before tested call
  239. let number_of_events_before_call = System::events().len();
  240. let actor = Actor::Curator(FIRST_CURATOR_GROUP_ID, UNKNOWN_CURATOR_ID);
  241. // Make an attempt to create entity, authorizing as curator in group,
  242. // in case, when provided curator id wasn`t added to respective curator group set
  243. let create_entity_result = create_entity(FIRST_CURATOR_ORIGIN, FIRST_CLASS_ID, actor);
  244. // Failure checked
  245. assert_failure(
  246. create_entity_result,
  247. Error::<Runtime>::CuratorAuthFailed,
  248. number_of_events_before_call,
  249. );
  250. })
  251. }
  252. #[test]
  253. fn create_entity_curator_group_is_not_active() {
  254. with_test_externalities(|| {
  255. // Create simple class with default permissions
  256. assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
  257. // Add curator group
  258. assert_ok!(add_curator_group(LEAD_ORIGIN));
  259. // Add curator to group
  260. assert_ok!(add_curator_to_group(
  261. LEAD_ORIGIN,
  262. FIRST_CURATOR_GROUP_ID,
  263. FIRST_CURATOR_ID,
  264. ));
  265. // Add curator group as class maintainer
  266. assert_ok!(add_maintainer_to_class(
  267. LEAD_ORIGIN,
  268. FIRST_CLASS_ID,
  269. FIRST_CURATOR_GROUP_ID
  270. ));
  271. // Runtime state before tested call
  272. // Events number before tested call
  273. let number_of_events_before_call = System::events().len();
  274. let actor = Actor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID);
  275. // Make an attempt to create entity, authorizing as curator in group, in case, when
  276. // corresponding curator group is not active. (default status of curator group right after creation)
  277. let create_entity_result = create_entity(FIRST_CURATOR_ORIGIN, FIRST_CLASS_ID, actor);
  278. // Failure checked
  279. assert_failure(
  280. create_entity_result,
  281. Error::<Runtime>::CuratorGroupIsNotActive,
  282. number_of_events_before_call,
  283. );
  284. })
  285. }
  286. #[test]
  287. fn create_entity_curator_not_found_in_curator_group() {
  288. with_test_externalities(|| {
  289. // Create simple class with default permissions
  290. assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
  291. // Add curator group
  292. assert_ok!(add_curator_group(LEAD_ORIGIN));
  293. // Make curator group active
  294. assert_ok!(set_curator_group_status(
  295. LEAD_ORIGIN,
  296. FIRST_CURATOR_GROUP_ID,
  297. true
  298. ));
  299. // Add curator group as class maintainer
  300. assert_ok!(add_maintainer_to_class(
  301. LEAD_ORIGIN,
  302. FIRST_CLASS_ID,
  303. FIRST_CURATOR_GROUP_ID
  304. ));
  305. // Runtime state before tested call
  306. // Events number before tested call
  307. let number_of_events_before_call = System::events().len();
  308. let actor = Actor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID);
  309. // Make an attempt to create entity, authorizing as curator in group, in case, when
  310. // curator was not added to corresponding curator group.
  311. let create_entity_result = create_entity(FIRST_CURATOR_ORIGIN, FIRST_CLASS_ID, actor);
  312. // Failure checked
  313. assert_failure(
  314. create_entity_result,
  315. Error::<Runtime>::CuratorIsNotAMemberOfGivenCuratorGroup,
  316. number_of_events_before_call,
  317. );
  318. })
  319. }
  320. #[test]
  321. fn create_entity_voucher_limit_reached() {
  322. with_test_externalities(|| {
  323. // Create simple class with default permissions
  324. assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
  325. // Runtime state before tested call
  326. // Events number before tested call
  327. let number_of_events_before_call = System::events().len();
  328. let actor = Actor::Lead;
  329. let mut number_of_entities_created = 0;
  330. // Create entities until individual creation limit reached
  331. let create_entity_result = loop {
  332. let create_entity_result = create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone());
  333. if create_entity_result.is_err() {
  334. break create_entity_result;
  335. } else {
  336. number_of_entities_created += 1;
  337. }
  338. };
  339. // Ensure number of entities created is equal to IndividualEntitiesCreationLimit runtime constraint.
  340. assert_eq!(
  341. number_of_entities_created,
  342. IndividualEntitiesCreationLimit::get()
  343. );
  344. // Failure checked
  345. assert_failure(
  346. create_entity_result,
  347. Error::<Runtime>::VoucherLimitReached,
  348. number_of_events_before_call + number_of_entities_created as usize,
  349. );
  350. })
  351. }