channels.rs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653
  1. #![cfg(test)]
  2. use super::curators;
  3. use super::mock::*;
  4. use crate::sp_api_hidden_includes_decl_storage::hidden_include::traits::Currency;
  5. use crate::*;
  6. use frame_support::{assert_err, assert_ok};
  7. #[test]
  8. fn successful_channel_deletion() {
  9. with_default_mock_builder(|| {
  10. // Run to block one to see emitted events
  11. run_to_block(1);
  12. // create an account with enought balance
  13. let _ = balances::Module::<Test>::deposit_creating(
  14. &FIRST_MEMBER_ORIGIN,
  15. <Test as balances::Trait>::Balance::from(100u32),
  16. );
  17. // 3 assets
  18. let assets = NewAssets::<Test>::Upload(CreationUploadParameters {
  19. object_creation_list: vec![
  20. DataObjectCreationParameters {
  21. size: 3,
  22. ipfs_content_id: b"first".to_vec(),
  23. },
  24. DataObjectCreationParameters {
  25. size: 3,
  26. ipfs_content_id: b"second".to_vec(),
  27. },
  28. DataObjectCreationParameters {
  29. size: 3,
  30. ipfs_content_id: b"third".to_vec(),
  31. },
  32. ],
  33. expected_data_size_fee: storage::DataObjectPerMegabyteFee::<Test>::get(),
  34. });
  35. let channel_id = NextChannelId::<Test>::get();
  36. // create channel
  37. create_channel_mock(
  38. FIRST_MEMBER_ORIGIN,
  39. ContentActor::Member(FIRST_MEMBER_ID),
  40. ChannelCreationParametersRecord {
  41. assets: assets,
  42. meta: vec![],
  43. reward_account: None,
  44. },
  45. Ok(()),
  46. );
  47. // attempt to delete channel with non zero assets
  48. delete_channel_mock(
  49. FIRST_MEMBER_ORIGIN,
  50. ContentActor::Member(FIRST_MEMBER_ID),
  51. channel_id,
  52. Err(Error::<Test>::ChannelContainsAssets.into()),
  53. );
  54. // delete assets
  55. let assets_to_delete = [0u64, 1u64, 2u64]
  56. .iter()
  57. .map(|&x| x)
  58. .collect::<BTreeSet<_>>();
  59. // delete channel assets
  60. delete_channel_assets_mock(
  61. FIRST_MEMBER_ORIGIN,
  62. ContentActor::Member(FIRST_MEMBER_ID),
  63. channel_id,
  64. assets_to_delete,
  65. Ok(()),
  66. );
  67. // successful deletion
  68. delete_channel_mock(
  69. FIRST_MEMBER_ORIGIN,
  70. ContentActor::Member(FIRST_MEMBER_ID),
  71. channel_id,
  72. Ok(()),
  73. );
  74. })
  75. }
  76. #[test]
  77. fn successful_channel_assets_deletion() {
  78. with_default_mock_builder(|| {
  79. // Run to block one to see emitted events
  80. run_to_block(1);
  81. // create an account with enought balance
  82. let _ = balances::Module::<Test>::deposit_creating(
  83. &FIRST_MEMBER_ORIGIN,
  84. <Test as balances::Trait>::Balance::from(100u32),
  85. );
  86. // 3 assets
  87. let assets = NewAssets::<Test>::Upload(CreationUploadParameters {
  88. object_creation_list: vec![
  89. DataObjectCreationParameters {
  90. size: 3,
  91. ipfs_content_id: b"first".to_vec(),
  92. },
  93. DataObjectCreationParameters {
  94. size: 3,
  95. ipfs_content_id: b"second".to_vec(),
  96. },
  97. DataObjectCreationParameters {
  98. size: 3,
  99. ipfs_content_id: b"third".to_vec(),
  100. },
  101. ],
  102. expected_data_size_fee: storage::DataObjectPerMegabyteFee::<Test>::get(),
  103. });
  104. let channel_id = NextChannelId::<Test>::get();
  105. // create channel
  106. create_channel_mock(
  107. FIRST_MEMBER_ORIGIN,
  108. ContentActor::Member(FIRST_MEMBER_ID),
  109. ChannelCreationParametersRecord {
  110. assets: assets,
  111. meta: vec![],
  112. reward_account: None,
  113. },
  114. Ok(()),
  115. );
  116. // delete assets
  117. let assets_to_delete = [0u64, 1u64].iter().map(|&x| x).collect::<BTreeSet<_>>();
  118. // delete channel assets
  119. delete_channel_assets_mock(
  120. FIRST_MEMBER_ORIGIN,
  121. ContentActor::Member(FIRST_MEMBER_ID),
  122. channel_id,
  123. assets_to_delete,
  124. Ok(()),
  125. );
  126. })
  127. }
  128. #[test]
  129. fn succesful_channel_update() {
  130. with_default_mock_builder(|| {
  131. // Run to block one to see emitted events
  132. run_to_block(1);
  133. // create an account with enought balance
  134. let _ = balances::Module::<Test>::deposit_creating(
  135. &FIRST_MEMBER_ORIGIN,
  136. <Test as balances::Trait>::Balance::from(100u32),
  137. );
  138. // 2 + 1 assets to be uploaded
  139. let assets = NewAssets::<Test>::Upload(CreationUploadParameters {
  140. object_creation_list: vec![
  141. DataObjectCreationParameters {
  142. size: 3,
  143. ipfs_content_id: b"first".to_vec(),
  144. },
  145. DataObjectCreationParameters {
  146. size: 3,
  147. ipfs_content_id: b"second".to_vec(),
  148. },
  149. ],
  150. expected_data_size_fee: storage::DataObjectPerMegabyteFee::<Test>::get(),
  151. });
  152. let new_assets = NewAssets::<Test>::Upload(CreationUploadParameters {
  153. object_creation_list: vec![
  154. DataObjectCreationParameters {
  155. size: 3,
  156. ipfs_content_id: b"first".to_vec(),
  157. },
  158. DataObjectCreationParameters {
  159. size: 3,
  160. ipfs_content_id: b"second".to_vec(),
  161. },
  162. ],
  163. expected_data_size_fee: storage::DataObjectPerMegabyteFee::<Test>::get(),
  164. });
  165. let channel_id = NextChannelId::<Test>::get();
  166. // create channel
  167. create_channel_mock(
  168. FIRST_MEMBER_ORIGIN,
  169. ContentActor::Member(FIRST_MEMBER_ID),
  170. ChannelCreationParametersRecord {
  171. assets: assets,
  172. meta: vec![],
  173. reward_account: None,
  174. },
  175. Ok(()),
  176. );
  177. // update channel
  178. update_channel_mock(
  179. FIRST_MEMBER_ORIGIN,
  180. ContentActor::Member(FIRST_MEMBER_ID),
  181. channel_id,
  182. ChannelUpdateParametersRecord {
  183. assets: Some(new_assets),
  184. new_meta: None,
  185. reward_account: None,
  186. },
  187. Ok(()),
  188. );
  189. // update with 0 assets
  190. update_channel_mock(
  191. FIRST_MEMBER_ORIGIN,
  192. ContentActor::Member(FIRST_MEMBER_ID),
  193. channel_id,
  194. ChannelUpdateParametersRecord {
  195. assets: None,
  196. new_meta: None,
  197. reward_account: None,
  198. },
  199. Ok(()),
  200. );
  201. })
  202. }
  203. #[test]
  204. fn succesful_channel_creation() {
  205. with_default_mock_builder(|| {
  206. // Run to block one to see emitted events
  207. run_to_block(1);
  208. // create an account with enought balance
  209. let _ = balances::Module::<Test>::deposit_creating(
  210. &FIRST_MEMBER_ORIGIN,
  211. <Test as balances::Trait>::Balance::from(100u32),
  212. );
  213. // 3 assets to be uploaded
  214. let assets = NewAssets::<Test>::Upload(CreationUploadParameters {
  215. object_creation_list: vec![
  216. DataObjectCreationParameters {
  217. size: 3,
  218. ipfs_content_id: b"first".to_vec(),
  219. },
  220. DataObjectCreationParameters {
  221. size: 3,
  222. ipfs_content_id: b"second".to_vec(),
  223. },
  224. DataObjectCreationParameters {
  225. size: 3,
  226. ipfs_content_id: b"third".to_vec(),
  227. },
  228. ],
  229. expected_data_size_fee: storage::DataObjectPerMegabyteFee::<Test>::get(),
  230. });
  231. // create channel
  232. create_channel_mock(
  233. FIRST_MEMBER_ORIGIN,
  234. ContentActor::Member(FIRST_MEMBER_ID),
  235. ChannelCreationParametersRecord {
  236. assets: assets,
  237. meta: vec![],
  238. reward_account: None,
  239. },
  240. Ok(()),
  241. );
  242. })
  243. }
  244. #[test]
  245. fn lead_cannot_create_channel() {
  246. with_default_mock_builder(|| {
  247. assert_err!(
  248. Content::create_channel(
  249. Origin::signed(LEAD_ORIGIN),
  250. ContentActor::Lead,
  251. ChannelCreationParametersRecord {
  252. assets: NewAssets::<Test>::Urls(vec![]),
  253. meta: vec![],
  254. reward_account: None,
  255. }
  256. ),
  257. Error::<Test>::ActorCannotOwnChannel
  258. );
  259. })
  260. }
  261. #[test]
  262. fn curator_owned_channels() {
  263. with_default_mock_builder(|| {
  264. // Run to block one to see emitted events
  265. run_to_block(1);
  266. // Curator group doesn't exist yet
  267. assert_err!(
  268. Content::create_channel(
  269. Origin::signed(FIRST_CURATOR_ORIGIN),
  270. ContentActor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID),
  271. ChannelCreationParametersRecord {
  272. assets: NewAssets::<Test>::Urls(vec![]),
  273. meta: vec![],
  274. reward_account: None,
  275. }
  276. ),
  277. Error::<Test>::CuratorGroupIsNotActive
  278. );
  279. let group_id = curators::add_curator_to_new_group(FIRST_CURATOR_ID);
  280. assert_eq!(FIRST_CURATOR_GROUP_ID, group_id);
  281. // Curator from wrong group
  282. assert_err!(
  283. Content::create_channel(
  284. Origin::signed(SECOND_CURATOR_ORIGIN),
  285. ContentActor::Curator(FIRST_CURATOR_GROUP_ID, SECOND_CURATOR_ID),
  286. ChannelCreationParametersRecord {
  287. assets: NewAssets::<Test>::Urls(vec![]),
  288. meta: vec![],
  289. reward_account: None,
  290. }
  291. ),
  292. Error::<Test>::CuratorIsNotAMemberOfGivenCuratorGroup
  293. );
  294. // Curator in correct active group, but wrong origin
  295. assert_err!(
  296. Content::create_channel(
  297. Origin::signed(SECOND_CURATOR_ORIGIN),
  298. ContentActor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID),
  299. ChannelCreationParametersRecord {
  300. assets: NewAssets::<Test>::Urls(vec![]),
  301. meta: vec![],
  302. reward_account: None,
  303. }
  304. ),
  305. Error::<Test>::CuratorAuthFailed
  306. );
  307. let channel_id = Content::next_channel_id();
  308. // Curator in correct active group, with correct origin
  309. assert_ok!(Content::create_channel(
  310. Origin::signed(FIRST_CURATOR_ORIGIN),
  311. ContentActor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID),
  312. ChannelCreationParametersRecord {
  313. assets: NewAssets::<Test>::Urls(vec![]),
  314. meta: vec![],
  315. reward_account: None,
  316. }
  317. ));
  318. assert_eq!(
  319. System::events().last().unwrap().event,
  320. MetaEvent::content(RawEvent::ChannelCreated(
  321. ContentActor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID),
  322. channel_id,
  323. ChannelRecord {
  324. owner: ChannelOwner::CuratorGroup(FIRST_CURATOR_GROUP_ID),
  325. is_censored: false,
  326. reward_account: None,
  327. deletion_prize_source_account_id: FIRST_CURATOR_ORIGIN,
  328. num_assets: 0,
  329. num_videos: 0,
  330. },
  331. ChannelCreationParametersRecord {
  332. assets: NewAssets::<Test>::Urls(vec![]),
  333. meta: vec![],
  334. reward_account: None,
  335. }
  336. ))
  337. );
  338. // Curator can update channel
  339. assert_ok!(Content::update_channel(
  340. Origin::signed(FIRST_CURATOR_ORIGIN),
  341. ContentActor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID),
  342. channel_id,
  343. ChannelUpdateParametersRecord {
  344. assets: None,
  345. new_meta: None,
  346. reward_account: None,
  347. }
  348. ));
  349. // Lead can update curator owned channels
  350. assert_ok!(Content::update_channel(
  351. Origin::signed(LEAD_ORIGIN),
  352. ContentActor::Lead,
  353. channel_id,
  354. ChannelUpdateParametersRecord {
  355. assets: None,
  356. new_meta: None,
  357. reward_account: None,
  358. }
  359. ));
  360. })
  361. }
  362. #[test]
  363. fn member_owned_channels() {
  364. with_default_mock_builder(|| {
  365. // Run to block one to see emitted events
  366. run_to_block(1);
  367. // Not a member
  368. assert_err!(
  369. Content::create_channel(
  370. Origin::signed(UNKNOWN_ORIGIN),
  371. ContentActor::Member(MEMBERS_COUNT + 1),
  372. ChannelCreationParametersRecord {
  373. assets: NewAssets::<Test>::Urls(vec![]),
  374. meta: vec![],
  375. reward_account: None,
  376. }
  377. ),
  378. Error::<Test>::MemberAuthFailed
  379. );
  380. let channel_id_1 = Content::next_channel_id();
  381. // Member can create the channel
  382. assert_ok!(Content::create_channel(
  383. Origin::signed(FIRST_MEMBER_ORIGIN),
  384. ContentActor::Member(FIRST_MEMBER_ID),
  385. ChannelCreationParametersRecord {
  386. assets: NewAssets::<Test>::Urls(vec![]),
  387. meta: vec![],
  388. reward_account: None,
  389. }
  390. ));
  391. assert_eq!(
  392. System::events().last().unwrap().event,
  393. MetaEvent::content(RawEvent::ChannelCreated(
  394. ContentActor::Member(FIRST_MEMBER_ID),
  395. channel_id_1,
  396. ChannelRecord {
  397. owner: ChannelOwner::Member(FIRST_MEMBER_ID),
  398. is_censored: false,
  399. reward_account: None,
  400. deletion_prize_source_account_id: FIRST_MEMBER_ORIGIN,
  401. num_assets: 0,
  402. num_videos: 0,
  403. },
  404. ChannelCreationParametersRecord {
  405. assets: NewAssets::<Test>::Urls(vec![]),
  406. meta: vec![],
  407. reward_account: None,
  408. }
  409. ))
  410. );
  411. let channel_id_2 = Content::next_channel_id();
  412. // Member can create the channel
  413. assert_ok!(Content::create_channel(
  414. Origin::signed(SECOND_MEMBER_ORIGIN),
  415. ContentActor::Member(SECOND_MEMBER_ID),
  416. ChannelCreationParametersRecord {
  417. assets: NewAssets::<Test>::Urls(vec![]),
  418. meta: vec![],
  419. reward_account: None,
  420. }
  421. ));
  422. assert_eq!(
  423. System::events().last().unwrap().event,
  424. MetaEvent::content(RawEvent::ChannelCreated(
  425. ContentActor::Member(SECOND_MEMBER_ID),
  426. channel_id_2,
  427. ChannelRecord {
  428. owner: ChannelOwner::Member(SECOND_MEMBER_ID),
  429. is_censored: false,
  430. reward_account: None,
  431. deletion_prize_source_account_id: SECOND_MEMBER_ORIGIN,
  432. num_assets: 0,
  433. num_videos: 0,
  434. },
  435. ChannelCreationParametersRecord {
  436. assets: NewAssets::<Test>::Urls(vec![]),
  437. meta: vec![],
  438. reward_account: None,
  439. }
  440. ))
  441. );
  442. // Update channel
  443. assert_ok!(Content::update_channel(
  444. Origin::signed(FIRST_MEMBER_ORIGIN),
  445. ContentActor::Member(FIRST_MEMBER_ID),
  446. channel_id_1,
  447. ChannelUpdateParametersRecord {
  448. assets: None,
  449. new_meta: None,
  450. reward_account: None,
  451. }
  452. ));
  453. assert_eq!(
  454. System::events().last().unwrap().event,
  455. MetaEvent::content(RawEvent::ChannelUpdated(
  456. ContentActor::Member(FIRST_MEMBER_ID),
  457. channel_id_1,
  458. ChannelRecord {
  459. owner: ChannelOwner::Member(FIRST_MEMBER_ID),
  460. is_censored: false,
  461. reward_account: None,
  462. deletion_prize_source_account_id: FIRST_MEMBER_ORIGIN,
  463. num_assets: 0,
  464. num_videos: 0,
  465. },
  466. ChannelUpdateParametersRecord {
  467. assets: None,
  468. new_meta: None,
  469. reward_account: None,
  470. }
  471. ))
  472. );
  473. // Member cannot update a channel they do not own
  474. assert_err!(
  475. Content::update_channel(
  476. Origin::signed(FIRST_MEMBER_ORIGIN),
  477. ContentActor::Member(FIRST_MEMBER_ID),
  478. channel_id_2,
  479. ChannelUpdateParametersRecord {
  480. assets: None,
  481. new_meta: None,
  482. reward_account: None,
  483. }
  484. ),
  485. Error::<Test>::ActorNotAuthorized
  486. );
  487. })
  488. }
  489. #[test]
  490. fn channel_censoring() {
  491. with_default_mock_builder(|| {
  492. // Run to block one to see emitted events
  493. run_to_block(1);
  494. let channel_id = Content::next_channel_id();
  495. assert_ok!(Content::create_channel(
  496. Origin::signed(FIRST_MEMBER_ORIGIN),
  497. ContentActor::Member(FIRST_MEMBER_ID),
  498. ChannelCreationParametersRecord {
  499. assets: NewAssets::<Test>::Urls(vec![]),
  500. meta: vec![],
  501. reward_account: None,
  502. }
  503. ));
  504. let group_id = curators::add_curator_to_new_group(FIRST_CURATOR_ID);
  505. // Curator can censor channels
  506. let is_censored = true;
  507. assert_ok!(Content::update_channel_censorship_status(
  508. Origin::signed(FIRST_CURATOR_ORIGIN),
  509. ContentActor::Curator(group_id, FIRST_CURATOR_ID),
  510. channel_id,
  511. is_censored,
  512. vec![]
  513. ));
  514. assert_eq!(
  515. System::events().last().unwrap().event,
  516. MetaEvent::content(RawEvent::ChannelCensorshipStatusUpdated(
  517. ContentActor::Curator(group_id, FIRST_CURATOR_ID),
  518. channel_id,
  519. is_censored,
  520. vec![]
  521. ))
  522. );
  523. let channel = Content::channel_by_id(channel_id);
  524. assert!(channel.is_censored);
  525. // Curator can un-censor channels
  526. let is_censored = false;
  527. assert_ok!(Content::update_channel_censorship_status(
  528. Origin::signed(FIRST_CURATOR_ORIGIN),
  529. ContentActor::Curator(group_id, FIRST_CURATOR_ID),
  530. channel_id,
  531. is_censored,
  532. vec![]
  533. ));
  534. assert_eq!(
  535. System::events().last().unwrap().event,
  536. MetaEvent::content(RawEvent::ChannelCensorshipStatusUpdated(
  537. ContentActor::Curator(group_id, FIRST_CURATOR_ID),
  538. channel_id,
  539. is_censored,
  540. vec![]
  541. ))
  542. );
  543. let channel = Content::channel_by_id(channel_id);
  544. assert!(!channel.is_censored);
  545. // Member cannot censor channels
  546. let is_censored = true;
  547. assert_err!(
  548. Content::update_channel_censorship_status(
  549. Origin::signed(FIRST_MEMBER_ORIGIN),
  550. ContentActor::Member(FIRST_MEMBER_ID),
  551. channel_id,
  552. is_censored,
  553. vec![]
  554. ),
  555. Error::<Test>::ActorNotAuthorized
  556. );
  557. let curator_channel_id = Content::next_channel_id();
  558. // create curator channel
  559. assert_ok!(Content::create_channel(
  560. Origin::signed(FIRST_CURATOR_ORIGIN),
  561. ContentActor::Curator(group_id, FIRST_CURATOR_ID),
  562. ChannelCreationParametersRecord {
  563. assets: NewAssets::<Test>::Urls(vec![]),
  564. meta: vec![],
  565. reward_account: None,
  566. }
  567. ));
  568. // Curator cannot censor curator group channels
  569. assert_err!(
  570. Content::update_channel_censorship_status(
  571. Origin::signed(FIRST_CURATOR_ORIGIN),
  572. ContentActor::Curator(group_id, FIRST_CURATOR_ID),
  573. curator_channel_id,
  574. is_censored,
  575. vec![]
  576. ),
  577. Error::<Test>::CannotCensoreCuratorGroupOwnedChannels
  578. );
  579. // Lead can still censor curator group channels
  580. assert_ok!(Content::update_channel_censorship_status(
  581. Origin::signed(LEAD_ORIGIN),
  582. ContentActor::Lead,
  583. curator_channel_id,
  584. is_censored,
  585. vec![]
  586. ));
  587. })
  588. }