PlaylistControllerTest.php 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. <?php
  2. namespace Muzich\CoreBundle\Tests\Controller;
  3. use Muzich\CoreBundle\lib\FunctionalTest;
  4. use Muzich\CoreBundle\Tests\lib\Security\Context as SecurityContextTest;
  5. use Muzich\CoreBundle\Security\Context as SecurityContext;
  6. use Muzich\CoreBundle\Tests\lib\Security\ContextTestCases;
  7. use Muzich\CoreBundle\lib\Collection\ElementCollectionManager;
  8. class PlaylistControllerTest extends FunctionalTest
  9. {
  10. protected $security_context_test;
  11. protected $tests_cases;
  12. protected function init()
  13. {
  14. $this->client = self::createClient();
  15. $this->security_context_test = new SecurityContextTest($this->client, $this);
  16. $this->tests_cases = new ContextTestCases($this->client, $this);
  17. }
  18. public function testActionsSecurityRoles()
  19. {
  20. $this->init();
  21. $this->checkProhibedActionsForAnonymous();
  22. $this->checkAutorizedsActionsForAnonymous();
  23. }
  24. protected function checkProhibedActionsForAnonymous()
  25. {
  26. $this->security_context_test->testUserCantMakeActionStatus(
  27. SecurityContext::ACTION_PLAYLIST_ADD_ELEMENT,
  28. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  29. true
  30. );
  31. $this->security_context_test->testUserCantMakeActionStatus(
  32. SecurityContext::ACTION_PLAYLIST_UPDATE_ORDER,
  33. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  34. true
  35. );
  36. $this->security_context_test->testUserCantMakeActionStatus(
  37. SecurityContext::ACTION_PLAYLIST_REMOVE_ELEMENT,
  38. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  39. true
  40. );
  41. $this->security_context_test->testUserCantMakeActionStatus(
  42. SecurityContext::ACTION_PLAYLIST_CREATE,
  43. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  44. true
  45. );
  46. $this->security_context_test->testUserCantMakeActionStatus(
  47. SecurityContext::ACTION_PLAYLIST_COPY,
  48. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  49. true
  50. );
  51. $this->security_context_test->testUserCantMakeActionStatus(
  52. SecurityContext::ACTION_PLAYLIST_DELETE,
  53. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  54. true
  55. );
  56. $this->security_context_test->testUserCantMakeActionStatus(
  57. SecurityContext::ACTION_PLAYLIST_UNPICK,
  58. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  59. true
  60. );
  61. $this->security_context_test->testUserCantMakeActionStatus(
  62. SecurityContext::ACTION_PLAYLIST_PICK,
  63. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  64. true
  65. );
  66. }
  67. protected function checkAutorizedsActionsForAnonymous()
  68. {
  69. $this->security_context_test->testUserCantMakeActionStatus(
  70. SecurityContext::ACTION_PLAYLIST_SHOW,
  71. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  72. false
  73. );
  74. $this->security_context_test->testUserCantMakeActionStatus(
  75. SecurityContext::ACTION_PLAYLIST_DATA_AUTOPLAY,
  76. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  77. false
  78. );
  79. $this->security_context_test->testUserCantMakeActionStatus(
  80. SecurityContext::ACTION_PLAYLIST_ADD_PROMPT,
  81. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  82. false
  83. );
  84. }
  85. public function testPlaylistsRead()
  86. {
  87. $this->init();
  88. $this->initReadContextData();
  89. $this->checkReadablePlaylistsForAnonymous();
  90. $this->checkReadablePlaylistsForConnected();
  91. $this->checkReadablePlaylistsForOwner();
  92. }
  93. protected function initReadContextData()
  94. {
  95. $this->users['bux'] = $this->findUserByUsername('bux');
  96. $this->playlists['bux_1_pub'] = $this->findOneBy('Playlist', 'Un peu de basses ?');
  97. $this->playlists['bux_2_priv'] = $this->findOneBy('Playlist', 'Ma playlist perso');
  98. $this->playlists['bob_pub'] = $this->findOneBy('Playlist', 'A travers l\'espace');
  99. }
  100. protected function checkReadablePlaylistsForAnonymous()
  101. {
  102. $this->checkReadPlaylists($this->users['bux'], array($this->playlists['bux_1_pub']));
  103. }
  104. protected function checkReadPlaylists($user, $playlists, $elements = null)
  105. {
  106. $this->tests_cases->playlistsShow($user->getSlug());
  107. $this->isResponseSuccess();
  108. $this->checkReadPlaylistsDom($playlists);
  109. foreach ($playlists as $playlist)
  110. {
  111. $this->tests_cases->playlistShow($user->getSlug(), $playlist->getId());
  112. $this->isResponseSuccess();
  113. $this->checkReadPlaylist($playlist, $elements);
  114. }
  115. }
  116. protected function checkReadPlaylistsDom($playlists)
  117. {
  118. $this->assertEquals(count($playlists), $this->crawler->filter('ul.playlists li.playlist')->count());
  119. foreach ($playlists as $playlist)
  120. {
  121. $this->exist('a[href="'.$this->generateUrl('playlist_datas_for_autoplay', array('playlist_id' => $playlist->getId())).'"]');
  122. }
  123. }
  124. protected function checkReadPlaylist($playlist, $elements = null)
  125. {
  126. $this->exist('h2:contains("'.$playlist->getName().'")');
  127. if ($elements !== null)
  128. {
  129. $this->checkPlaylistElements($playlist, $elements[$playlist->getId()]);
  130. }
  131. }
  132. protected function checkPlaylistElements($playlist, $elements)
  133. {
  134. $this->assertEquals(count($elements), $this->crawler->filter('li.playlist_element')->count());
  135. foreach ($elements as $element)
  136. {
  137. $this->exist('a[data-id="'.$element->getId().'"]');
  138. }
  139. }
  140. protected function checkReadablePlaylistsForConnected()
  141. {
  142. $this->connectUser('jean', 'toor');
  143. $this->checkReadPlaylists($this->users['bux'], array($this->playlists['bux_1_pub']));
  144. $this->disconnectUser();
  145. }
  146. protected function checkReadablePlaylistsForOwner()
  147. {
  148. $this->connectUser('bux', 'toor');
  149. $this->checkReadPlaylists($this->users['bux'], array(
  150. $this->playlists['bux_1_pub'],
  151. $this->playlists['bux_2_priv'],
  152. $this->playlists['bob_pub'],
  153. ));
  154. }
  155. public function testPlaylistCreation()
  156. {
  157. $this->init();
  158. $this->initCreateContextData();
  159. $this->connectUser('joelle', 'toor');
  160. $this->playlists['joelle_1'] = $this->createPlaylistWithElement($this->elements['babylon']);
  161. $this->checkReadPlaylists($this->users['joelle'],
  162. array($this->playlists['joelle_1']),
  163. array($this->playlists['joelle_1']->getId() => array($this->elements['babylon']))
  164. );
  165. }
  166. protected function initCreateContextData()
  167. {
  168. $this->initReadContextData();
  169. $this->users['joelle'] = $this->findUserByUsername('joelle');
  170. $this->users['bob'] = $this->findUserByUsername('bob');
  171. $this->elements['babylon'] = $this->findOneBy('Element', 'Babylon Pression - Des Tasers et des Pauvres');
  172. }
  173. protected function createPlaylistWithElement($element)
  174. {
  175. $this->tests_cases->playlistCreate($element->getId(), 'Playlist de test');
  176. $this->assertTrue(!is_null($playlist = $this->findOneBy('Playlist', 'Playlist de test')));
  177. return $playlist;
  178. }
  179. public function testAutoplayDatas()
  180. {
  181. $this->init();
  182. $this->initReadContextData();
  183. $this->checkPublicPlaylist();
  184. $this->checkPrivatePlaylist();
  185. $this->connectUser('bob', 'toor');
  186. $this->checkPublicPlaylist();
  187. $this->checkPrivatePlaylist();
  188. $this->disconnectUser();
  189. $this->connectUser('bux', 'toor');
  190. $this->checkPublicPlaylist();
  191. $this->checkPrivatePlaylist(true);
  192. }
  193. protected function checkPublicPlaylist()
  194. {
  195. $response = $this->tests_cases->playlistAutoplay($this->playlists['bux_1_pub']->getId());
  196. $this->jsonResponseIsSuccess($response);
  197. }
  198. protected function checkPrivatePlaylist($success = false)
  199. {
  200. $response = $this->tests_cases->playlistAutoplay($this->playlists['bux_2_priv']->getId());
  201. if (!$success)
  202. $this->jsonResponseIsError($response);
  203. if ($success)
  204. $this->jsonResponseIsSuccess($response);
  205. }
  206. public function testPrompt()
  207. {
  208. $this->init();
  209. $this->initCreateContextData();
  210. $this->setCrawlerWithJsonResponseData($this->tests_cases->playlistPrompt($this->elements['babylon']->getId()));
  211. $this->checkPlaylistsInPrompt(array());
  212. $this->connectUser('bux', 'toor');
  213. $this->setCrawlerWithJsonResponseData($this->tests_cases->playlistPrompt($this->elements['babylon']->getId()));
  214. $this->checkPlaylistsInPrompt(array(
  215. $this->playlists['bux_1_pub'],
  216. $this->playlists['bux_2_priv'],
  217. $this->playlists['bob_pub'],
  218. ));
  219. }
  220. protected function checkPlaylistsInPrompt($playlists)
  221. {
  222. $this->assertEquals(count($playlists), $this->crawler->filter('ul.playlists_for_element li.playlist')->count());
  223. foreach ($playlists as $playlist)
  224. {
  225. $this->exist('a:contains("'.$playlist->getName().'")');
  226. }
  227. }
  228. public function testUpdateOrder()
  229. {
  230. $this->init();
  231. $this->initOrderContextData();
  232. $this->connectUser('bux', 'toor');
  233. $this->checkPlaylistOrder($this->playlists['bux_2_priv'], array(
  234. $this->elements['heretik'], $this->elements['fab']
  235. ));
  236. $this->updatePlaylistOrder($this->playlists['bux_2_priv'], array(
  237. $this->elements['fab'], $this->elements['heretik']
  238. ));
  239. $this->playlists['bux_2_priv'] = $this->findOneBy('Playlist', 'Ma playlist perso');
  240. $this->checkPlaylistOrder($this->playlists['bux_2_priv'], array(
  241. $this->elements['fab'], $this->elements['heretik']
  242. ));
  243. }
  244. protected function initOrderContextData()
  245. {
  246. $this->initReadContextData();
  247. $this->elements['heretik'] = $this->findOneBy('Element', 'Heretik System Popof - Resistance');
  248. $this->elements['fab'] = $this->findOneBy('Element', 'DJ FAB');
  249. }
  250. protected function checkPlaylistOrder($playlist, $elements)
  251. {
  252. $collection_manager = new ElementCollectionManager(array());
  253. foreach ($elements as $element)
  254. {
  255. $collection_manager->add($element);
  256. }
  257. $this->assertEquals($collection_manager->getContent(), $playlist->getelements());
  258. }
  259. protected function updatePlaylistOrder($playlist, $elements)
  260. {
  261. $response = $this->tests_cases->playlistUpdateOrder($playlist->getId(), $elements);
  262. $this->jsonResponseIsSuccess($response);
  263. }
  264. public function testAddAndRemoveElement()
  265. {
  266. $this->init();
  267. $this->initAddRemoveContextData();
  268. $this->connectUser('bux', 'toor');
  269. $this->tests_cases->playlistShow($this->users['bux']->getSlug(), $this->playlists['bux_2_priv']->getId());
  270. $this->checkReadPlaylist($this->playlists['bux_2_priv'],
  271. array($this->playlists['bux_2_priv']->getId() => array(
  272. $this->elements['heretik'],
  273. $this->elements['fab']
  274. ))
  275. );
  276. $this->addElementToPlaylist($this->playlists['bux_2_priv'], $this->elements['azyd']);
  277. $this->tests_cases->playlistShow($this->users['bux']->getSlug(), $this->playlists['bux_2_priv']->getId());
  278. $this->checkReadPlaylist($this->playlists['bux_2_priv'],
  279. array($this->playlists['bux_2_priv']->getId() => array(
  280. $this->elements['heretik'],
  281. $this->elements['fab'],
  282. $this->elements['azyd']
  283. ))
  284. );
  285. $this->removeElementFromPlaylist($this->playlists['bux_2_priv'], $this->elements['fab']);
  286. $this->tests_cases->playlistShow($this->users['bux']->getSlug(), $this->playlists['bux_2_priv']->getId());
  287. $this->checkReadPlaylist($this->playlists['bux_2_priv'],
  288. array($this->playlists['bux_2_priv']->getId() => array(
  289. $this->elements['heretik'],
  290. $this->elements['azyd']
  291. ))
  292. );
  293. }
  294. protected function initAddRemoveContextData()
  295. {
  296. $this->initOrderContextData();
  297. $this->elements['heretik'] = $this->findOneBy('Element', 'Heretik System Popof - Resistance');
  298. $this->elements['fab'] = $this->findOneBy('Element', 'DJ FAB');
  299. $this->elements['azyd'] = $this->findOneBy('Element', 'AZYD AZYLUM Live au Café Provisoire');
  300. }
  301. protected function addElementToPlaylist($playlist, $element)
  302. {
  303. $this->tests_cases->playlistAddElement($playlist->getId(), $element->getId());
  304. }
  305. protected function removeElementFromPlaylist($playlist, $element)
  306. {
  307. $this->tests_cases->playlistremoveElement($playlist->getId(), $element->getId());
  308. }
  309. public function testCopyWhenAddingElementToPickedPlaylist()
  310. {
  311. $this->init();
  312. $this->initCopysContextData();
  313. $this->connectUser('bux', 'toor');
  314. $this->checkPlaylistPickedBy($this->playlists['bob_pub'], $this->users['bux']);
  315. $this->addElementAndCopyPlaylist($this->playlists['bob_pub'], $this->elements['azyd']);
  316. $this->playlists['bux_bob_pub'] = $this->findOneBy('Playlist', array(
  317. 'name' => 'A travers l\'espace',
  318. 'owner' => $this->users['bux']->getId()
  319. ));
  320. $this->assertTrue(!is_null($this->playlists['bux_bob_pub']));
  321. $this->checkPlaylistOwnedBy($this->playlists['bux_bob_pub'], $this->users['bux']);
  322. }
  323. protected function initCopysContextData()
  324. {
  325. $this->initReadContextData();
  326. $this->elements['azyd'] = $this->findOneBy('Element', 'AZYD AZYLUM Live au Café Provisoire');
  327. }
  328. protected function checkPlaylistPickedBy($playlist, $user)
  329. {
  330. $this->assertTrue($playlist->havePickerUser($user));
  331. }
  332. protected function addElementAndCopyPlaylist($playlist, $element)
  333. {
  334. $response = $this->tests_cases->playlistAddElementAndCopy($playlist->getId(), $element->getId());
  335. $this->jsonResponseIsSuccess($response);
  336. }
  337. protected function checkPlaylistOwnedBy($playlist, $user)
  338. {
  339. $this->assertEquals($playlist->getOwner()->getId(), $user->getId());
  340. }
  341. protected function checkPlaylistNotOwnedBy($playlist, $user)
  342. {
  343. $this->assertNotEquals($playlist->getOwner()->getId(), $user->getId());
  344. }
  345. public function testCopyWhenPickedPlaylistDeleted()
  346. {
  347. $this->init();
  348. $this->initCopysContextData();
  349. $this->connectUser('bob', 'toor');
  350. $this->checkPlaylistPickedBy($this->playlists['bob_pub'], $this->users['bux']);
  351. $this->checkPlaylistNotOwnedBy($this->playlists['bob_pub'], $this->users['bux']);
  352. $this->deletePlaylist($this->playlists['bob_pub']);
  353. $this->playlists['bux_bob_pub'] = $this->findOneBy('Playlist', array('name' => 'A travers l\'espace'));
  354. $this->assertTrue(!is_null($this->playlists['bux_bob_pub']));
  355. $this->checkPlaylistOwnedBy($this->playlists['bux_bob_pub'], $this->users['bux']);
  356. }
  357. protected function deletePlaylist($playlist)
  358. {
  359. $this->tests_cases->playlistDelete($playlist->getId());
  360. $this->isResponseRedirection();
  361. $this->followRedirection();
  362. $this->isResponseSuccess();
  363. }
  364. }