sling_nft_back.rs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #![cfg(test)]
  2. use crate::tests::mock::*;
  3. use crate::*;
  4. use frame_support::{assert_err, assert_ok};
  5. #[test]
  6. fn sling_nft_back() {
  7. with_default_mock_builder(|| {
  8. // Run to block one to see emitted events
  9. run_to_block(1);
  10. let video_id = NextVideoId::<Test>::get();
  11. create_simple_channel_and_video(FIRST_MEMBER_ORIGIN, FIRST_MEMBER_ID);
  12. // Issue nft
  13. assert_ok!(Content::issue_nft(
  14. Origin::signed(FIRST_MEMBER_ORIGIN),
  15. ContentActor::Member(FIRST_MEMBER_ID),
  16. video_id,
  17. None,
  18. b"metablob".to_vec(),
  19. Some(SECOND_MEMBER_ID),
  20. ));
  21. // Runtime tested state before call
  22. assert!(matches!(
  23. Content::video_by_id(video_id).nft_status,
  24. Some(OwnedNFT {
  25. owner: NFTOwner::Member(SECOND_MEMBER_ID),
  26. ..
  27. })
  28. ));
  29. // Events number before tested calls
  30. let number_of_events_before_call = System::events().len();
  31. // Sling nft back to the original artist
  32. assert_ok!(Content::sling_nft_back(
  33. Origin::signed(SECOND_MEMBER_ORIGIN),
  34. video_id,
  35. ContentActor::Member(SECOND_MEMBER_ID),
  36. ));
  37. // Runtime tested state after call
  38. // Ensure nft slinged back successfully
  39. assert!(matches!(
  40. Content::video_by_id(video_id).nft_status,
  41. Some(OwnedNFT {
  42. owner: NFTOwner::ChannelOwner,
  43. ..
  44. })
  45. ));
  46. let offer_started_event = get_test_event(RawEvent::NftSlingedBackToTheOriginalArtist(
  47. video_id,
  48. ContentActor::Member(SECOND_MEMBER_ID),
  49. ));
  50. // Last event checked
  51. assert_event(offer_started_event, number_of_events_before_call + 1);
  52. })
  53. }
  54. #[test]
  55. fn sling_nft_back_video_does_not_exist() {
  56. with_default_mock_builder(|| {
  57. // Run to block one to see emitted events
  58. run_to_block(1);
  59. let video_id = NextVideoId::<Test>::get();
  60. // Make an attempt to sling nft back which corresponding video does not exist
  61. let sling_nft_back_result = Content::sling_nft_back(
  62. Origin::signed(FIRST_MEMBER_ORIGIN),
  63. video_id,
  64. ContentActor::Member(FIRST_MEMBER_ID),
  65. );
  66. // Failure checked
  67. assert_err!(sling_nft_back_result, Error::<Test>::VideoDoesNotExist);
  68. })
  69. }
  70. #[test]
  71. fn sling_nft_back_not_issued() {
  72. with_default_mock_builder(|| {
  73. // Run to block one to see emitted events
  74. run_to_block(1);
  75. let video_id = NextVideoId::<Test>::get();
  76. create_simple_channel_and_video(FIRST_MEMBER_ORIGIN, FIRST_MEMBER_ID);
  77. // Make an attempt to sling nft back which is not issued yet
  78. let sling_nft_back_result = Content::sling_nft_back(
  79. Origin::signed(FIRST_MEMBER_ORIGIN),
  80. video_id,
  81. ContentActor::Member(FIRST_MEMBER_ID),
  82. );
  83. // Failure checked
  84. assert_err!(sling_nft_back_result, Error::<Test>::NFTDoesNotExist);
  85. })
  86. }
  87. #[test]
  88. fn sling_nft_back_auth_failed() {
  89. with_default_mock_builder(|| {
  90. // Run to block one to see emitted events
  91. run_to_block(1);
  92. let video_id = NextVideoId::<Test>::get();
  93. create_simple_channel_and_video(FIRST_MEMBER_ORIGIN, FIRST_MEMBER_ID);
  94. // Issue nft
  95. assert_ok!(Content::issue_nft(
  96. Origin::signed(FIRST_MEMBER_ORIGIN),
  97. ContentActor::Member(FIRST_MEMBER_ID),
  98. video_id,
  99. None,
  100. b"metablob".to_vec(),
  101. None
  102. ));
  103. // Make an attempt to sling nft back with wrong credentials
  104. let sling_nft_back_result = Content::sling_nft_back(
  105. Origin::signed(FIRST_MEMBER_ORIGIN),
  106. video_id,
  107. ContentActor::Member(UNKNOWN_ID),
  108. );
  109. // Failure checked
  110. assert_err!(sling_nft_back_result, Error::<Test>::MemberAuthFailed);
  111. })
  112. }
  113. #[test]
  114. fn sling_nft_back_not_authorized() {
  115. with_default_mock_builder(|| {
  116. // Run to block one to see emitted events
  117. run_to_block(1);
  118. let video_id = NextVideoId::<Test>::get();
  119. create_simple_channel_and_video(FIRST_MEMBER_ORIGIN, FIRST_MEMBER_ID);
  120. // Issue nft
  121. assert_ok!(Content::issue_nft(
  122. Origin::signed(FIRST_MEMBER_ORIGIN),
  123. ContentActor::Member(FIRST_MEMBER_ID),
  124. video_id,
  125. None,
  126. b"metablob".to_vec(),
  127. None
  128. ));
  129. // Make an attempt to sling nft back if actor is not authorized
  130. let sling_nft_back_result = Content::sling_nft_back(
  131. Origin::signed(FIRST_MEMBER_ORIGIN),
  132. video_id,
  133. ContentActor::Member(SECOND_MEMBER_ID),
  134. );
  135. // Failure checked
  136. assert_err!(sling_nft_back_result, Error::<Test>::ActorNotAuthorized);
  137. })
  138. }
  139. #[test]
  140. fn sling_nft_back_transactional_status_is_not_idle() {
  141. with_default_mock_builder(|| {
  142. // Run to block one to see emitted events
  143. run_to_block(1);
  144. let video_id = NextVideoId::<Test>::get();
  145. create_simple_channel_and_video(FIRST_MEMBER_ORIGIN, FIRST_MEMBER_ID);
  146. // Issue nft
  147. assert_ok!(Content::issue_nft(
  148. Origin::signed(FIRST_MEMBER_ORIGIN),
  149. ContentActor::Member(FIRST_MEMBER_ID),
  150. video_id,
  151. None,
  152. b"metablob".to_vec(),
  153. None
  154. ));
  155. // Offer nft
  156. assert_ok!(Content::offer_nft(
  157. Origin::signed(FIRST_MEMBER_ORIGIN),
  158. video_id,
  159. ContentActor::Member(FIRST_MEMBER_ID),
  160. SECOND_MEMBER_ID,
  161. None,
  162. ));
  163. // Make an attempt to sling nft back when it is already offered
  164. let sling_nft_back_result = Content::sling_nft_back(
  165. Origin::signed(FIRST_MEMBER_ORIGIN),
  166. video_id,
  167. ContentActor::Member(FIRST_MEMBER_ID),
  168. );
  169. // Failure checked
  170. assert_err!(sling_nft_back_result, Error::<Test>::NftIsNotIdle);
  171. })
  172. }