issue_nft.rs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. #![cfg(test)]
  2. use crate::tests::fixtures::{
  3. create_default_member_owned_channel_with_video, create_initial_storage_buckets_helper,
  4. increase_account_balance_helper,
  5. };
  6. use crate::tests::mock::*;
  7. use crate::*;
  8. use frame_support::{assert_err, assert_ok};
  9. #[test]
  10. fn issue_nft() {
  11. with_default_mock_builder(|| {
  12. // Run to block one to see emitted events
  13. run_to_block(1);
  14. let video_id = NextVideoId::<Test>::get();
  15. create_initial_storage_buckets_helper();
  16. increase_account_balance_helper(DEFAULT_MEMBER_ACCOUNT_ID, INITIAL_BALANCE);
  17. create_default_member_owned_channel_with_video();
  18. // Video does not have an nft
  19. assert_eq!(None, Content::video_by_id(video_id).nft_status);
  20. // Runtime tested state before call
  21. // Events number before tested calls
  22. let number_of_events_before_call = System::events().len();
  23. // Issue nft
  24. assert_ok!(Content::issue_nft(
  25. Origin::signed(DEFAULT_MEMBER_ACCOUNT_ID),
  26. ContentActor::Member(DEFAULT_MEMBER_ID),
  27. video_id,
  28. NftIssuanceParameters::<Test>::default(),
  29. ));
  30. // Runtime tested state after call
  31. // Ensure nft created succesfully
  32. let nft_status = Some(OwnedNft::new(
  33. NftOwner::ChannelOwner,
  34. None,
  35. TransactionalStatus::<Test>::Idle,
  36. ));
  37. assert_eq!(nft_status, Content::video_by_id(video_id).nft_status);
  38. // Last event checked
  39. let nft_issue_params = NftIssuanceParameters::<Test>::default();
  40. assert_event(
  41. MetaEvent::content(RawEvent::NftIssued(
  42. ContentActor::Member(DEFAULT_MEMBER_ID),
  43. video_id,
  44. nft_issue_params,
  45. )),
  46. number_of_events_before_call + 1,
  47. );
  48. })
  49. }
  50. #[test]
  51. fn issue_nft_video_does_not_exist() {
  52. with_default_mock_builder(|| {
  53. // Run to block one to see emitted events
  54. run_to_block(1);
  55. let video_id = NextVideoId::<Test>::get();
  56. // Make an attempt to issue nft for non existent video
  57. let issue_nft_result = Content::issue_nft(
  58. Origin::signed(DEFAULT_MEMBER_ACCOUNT_ID),
  59. ContentActor::Member(DEFAULT_MEMBER_ID),
  60. video_id,
  61. NftIssuanceParameters::<Test>::default(),
  62. );
  63. // Failure checked
  64. assert_err!(issue_nft_result, Error::<Test>::VideoDoesNotExist);
  65. })
  66. }
  67. #[test]
  68. fn issue_nft_already_issued() {
  69. with_default_mock_builder(|| {
  70. // Run to block one to see emitted events
  71. run_to_block(1);
  72. let video_id = NextVideoId::<Test>::get();
  73. create_initial_storage_buckets_helper();
  74. increase_account_balance_helper(DEFAULT_MEMBER_ACCOUNT_ID, INITIAL_BALANCE);
  75. create_default_member_owned_channel_with_video();
  76. // Issue nft
  77. assert_ok!(Content::issue_nft(
  78. Origin::signed(DEFAULT_MEMBER_ACCOUNT_ID),
  79. ContentActor::Member(DEFAULT_MEMBER_ID),
  80. video_id,
  81. NftIssuanceParameters::<Test>::default(),
  82. ));
  83. // Make an attempt to issue nft once again for the same video
  84. let issue_nft_result = Content::issue_nft(
  85. Origin::signed(DEFAULT_MEMBER_ACCOUNT_ID),
  86. ContentActor::Member(DEFAULT_MEMBER_ID),
  87. video_id,
  88. NftIssuanceParameters::<Test>::default(),
  89. );
  90. // Failure checked
  91. assert_err!(issue_nft_result, Error::<Test>::NftAlreadyExists);
  92. })
  93. }
  94. #[test]
  95. fn issue_nft_auth_failed() {
  96. with_default_mock_builder(|| {
  97. // Run to block one to see emitted events
  98. run_to_block(1);
  99. let video_id = NextVideoId::<Test>::get();
  100. create_initial_storage_buckets_helper();
  101. increase_account_balance_helper(DEFAULT_MEMBER_ACCOUNT_ID, INITIAL_BALANCE);
  102. create_default_member_owned_channel_with_video();
  103. // Make an attempt to issue nft with wrong credentials
  104. let issue_nft_result = Content::issue_nft(
  105. Origin::signed(UNAUTHORIZED_MEMBER_ACCOUNT_ID),
  106. ContentActor::Member(DEFAULT_MEMBER_ID),
  107. video_id,
  108. NftIssuanceParameters::<Test>::default(),
  109. );
  110. // Failure checked
  111. assert_err!(issue_nft_result, Error::<Test>::MemberAuthFailed);
  112. })
  113. }
  114. #[test]
  115. fn issue_nft_actor_not_authorized() {
  116. with_default_mock_builder(|| {
  117. // Run to block one to see emitted events
  118. run_to_block(1);
  119. let video_id = NextVideoId::<Test>::get();
  120. create_initial_storage_buckets_helper();
  121. increase_account_balance_helper(DEFAULT_MEMBER_ACCOUNT_ID, INITIAL_BALANCE);
  122. create_default_member_owned_channel_with_video();
  123. // Make an attempt to issue nft if actor is not authorized
  124. let issue_nft_result = Content::issue_nft(
  125. Origin::signed(UNAUTHORIZED_MEMBER_ACCOUNT_ID),
  126. ContentActor::Member(UNAUTHORIZED_MEMBER_ID),
  127. video_id,
  128. NftIssuanceParameters::<Test>::default(),
  129. );
  130. // Failure checked
  131. assert_err!(issue_nft_result, Error::<Test>::ActorNotAuthorized);
  132. })
  133. }
  134. #[test]
  135. fn issue_nft_royalty_bounds_violated() {
  136. with_default_mock_builder(|| {
  137. // Run to block one to see emitted events
  138. run_to_block(1);
  139. let video_id = NextVideoId::<Test>::get();
  140. create_initial_storage_buckets_helper();
  141. increase_account_balance_helper(DEFAULT_MEMBER_ACCOUNT_ID, INITIAL_BALANCE);
  142. create_default_member_owned_channel_with_video();
  143. // Make an attempt to issue nft with wrong credentials
  144. let issue_nft_result = Content::issue_nft(
  145. Origin::signed(DEFAULT_MEMBER_ACCOUNT_ID),
  146. ContentActor::Member(DEFAULT_MEMBER_ID),
  147. video_id,
  148. NftIssuanceParameters::<Test> {
  149. royalty: Some(Perbill::one()),
  150. ..NftIssuanceParameters::<Test>::default()
  151. },
  152. );
  153. // Failure checked
  154. assert_err!(issue_nft_result, Error::<Test>::RoyaltyUpperBoundExceeded);
  155. // Make an attempt to issue nft with wrong credentials
  156. let issue_nft_result = Content::issue_nft(
  157. Origin::signed(DEFAULT_MEMBER_ACCOUNT_ID),
  158. ContentActor::Member(DEFAULT_MEMBER_ID),
  159. video_id,
  160. NftIssuanceParameters::<Test> {
  161. royalty: Some(Perbill::from_perthousand(1)),
  162. ..NftIssuanceParameters::<Test>::default()
  163. },
  164. );
  165. // Failure checked
  166. assert_err!(issue_nft_result, Error::<Test>::RoyaltyLowerBoundExceeded);
  167. })
  168. }
  169. #[test]
  170. fn issue_nft_fails_with_invalid_auction_parameters() {
  171. with_default_mock_builder(|| {
  172. // Run to block one to see emitted events
  173. run_to_block(1);
  174. let video_id = NextVideoId::<Test>::get();
  175. create_initial_storage_buckets_helper();
  176. increase_account_balance_helper(DEFAULT_MEMBER_ACCOUNT_ID, INITIAL_BALANCE);
  177. create_default_member_owned_channel_with_video();
  178. let auction_params = AuctionParams {
  179. starting_price: Content::min_starting_price() - 1,
  180. buy_now_price: None,
  181. auction_type: AuctionType::Open(OpenAuctionDetails {
  182. bid_lock_duration: Content::min_bid_lock_duration(),
  183. }),
  184. minimal_bid_step: Content::min_bid_step(),
  185. starts_at: None,
  186. whitelist: BTreeSet::new(),
  187. };
  188. // Make an attempt to issue nft with wrong credentials
  189. let issue_nft_result = Content::issue_nft(
  190. Origin::signed(DEFAULT_MEMBER_ACCOUNT_ID),
  191. ContentActor::Member(DEFAULT_MEMBER_ID),
  192. video_id,
  193. NftIssuanceParameters::<Test> {
  194. init_transactional_status: InitTransactionalStatus::<Test>::Auction(auction_params),
  195. ..NftIssuanceParameters::<Test>::default()
  196. },
  197. );
  198. // Failure checked
  199. assert_err!(
  200. issue_nft_result,
  201. Error::<Test>::StartingPriceLowerBoundExceeded
  202. );
  203. })
  204. }