PlaylistControllerTest.php 8.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  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. class PlaylistControllerTest extends FunctionalTest
  8. {
  9. protected $security_context_test;
  10. protected $tests_cases;
  11. protected function init()
  12. {
  13. $this->client = self::createClient();
  14. $this->security_context_test = new SecurityContextTest($this->client, $this);
  15. $this->tests_cases = new ContextTestCases($this->client, $this);
  16. }
  17. public function testActionsSecurityRoles()
  18. {
  19. $this->init();
  20. $this->checkProhibedActionsForAnonymous();
  21. $this->checkAutorizedsActionsForAnonymous();
  22. }
  23. protected function checkProhibedActionsForAnonymous()
  24. {
  25. $this->security_context_test->testUserCantMakeActionStatus(
  26. SecurityContext::ACTION_PLAYLIST_ADD_ELEMENT,
  27. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  28. true
  29. );
  30. $this->security_context_test->testUserCantMakeActionStatus(
  31. SecurityContext::ACTION_PLAYLIST_UPDATE_ORDER,
  32. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  33. true
  34. );
  35. $this->security_context_test->testUserCantMakeActionStatus(
  36. SecurityContext::ACTION_PLAYLIST_REMOVE_ELEMENT,
  37. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  38. true
  39. );
  40. $this->security_context_test->testUserCantMakeActionStatus(
  41. SecurityContext::ACTION_PLAYLIST_CREATE,
  42. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  43. true
  44. );
  45. $this->security_context_test->testUserCantMakeActionStatus(
  46. SecurityContext::ACTION_PLAYLIST_COPY,
  47. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  48. true
  49. );
  50. $this->security_context_test->testUserCantMakeActionStatus(
  51. SecurityContext::ACTION_PLAYLIST_DELETE,
  52. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  53. true
  54. );
  55. $this->security_context_test->testUserCantMakeActionStatus(
  56. SecurityContext::ACTION_PLAYLIST_UNPICK,
  57. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  58. true
  59. );
  60. $this->security_context_test->testUserCantMakeActionStatus(
  61. SecurityContext::ACTION_PLAYLIST_PICK,
  62. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  63. true
  64. );
  65. }
  66. protected function checkAutorizedsActionsForAnonymous()
  67. {
  68. $this->security_context_test->testUserCantMakeActionStatus(
  69. SecurityContext::ACTION_PLAYLIST_SHOW,
  70. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  71. false
  72. );
  73. $this->security_context_test->testUserCantMakeActionStatus(
  74. SecurityContext::ACTION_PLAYLIST_DATA_AUTOPLAY,
  75. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  76. false
  77. );
  78. $this->security_context_test->testUserCantMakeActionStatus(
  79. SecurityContext::ACTION_PLAYLIST_ADD_PROMPT,
  80. SecurityContext::CONDITION_USER_NOT_CONNECTED,
  81. false
  82. );
  83. }
  84. public function testPlaylistsRead()
  85. {
  86. $this->init();
  87. $this->initReadContextData();
  88. $this->checkReadablePlaylistsForAnonymous();
  89. $this->checkReadablePlaylistsForConnected();
  90. $this->checkReadablePlaylistsForOwner();
  91. }
  92. protected function initReadContextData()
  93. {
  94. $this->users['bux'] = $this->findUserByUsername('bux');
  95. $this->playlists['bux_1_pub'] = $this->findOneBy('Playlist', 'Un peu de basses ?');
  96. $this->playlists['bux_2_priv'] = $this->findOneBy('Playlist', 'Ma playlist perso');
  97. $this->playlists['bob_pub'] = $this->findOneBy('Playlist', 'A travers l\'espace');
  98. }
  99. protected function checkReadablePlaylistsForAnonymous()
  100. {
  101. $this->checkReadPlaylists($this->users['bux'], array($this->playlists['bux_1_pub']));
  102. }
  103. protected function checkReadPlaylists($user, $playlists, $elements = null)
  104. {
  105. $this->tests_cases->playlistsShow($user->getSlug());
  106. $this->isResponseSuccess();
  107. $this->checkReadPlaylistsDom($playlists);
  108. foreach ($playlists as $playlist)
  109. {
  110. $this->tests_cases->playlistShow($user->getSlug(), $playlist->getId());
  111. $this->isResponseSuccess();
  112. $this->checkReadPlaylist($playlist, $elements);
  113. }
  114. }
  115. protected function checkReadPlaylistsDom($playlists)
  116. {
  117. $this->assertEquals(count($playlists), $this->crawler->filter('ul.playlists li.playlist')->count());
  118. foreach ($playlists as $playlist)
  119. {
  120. $this->exist('a[href="'.$this->generateUrl('playlist_datas_for_autoplay', array('playlist_id' => $playlist->getId())).'"]');
  121. }
  122. }
  123. protected function checkReadPlaylist($playlist, $elements = null)
  124. {
  125. $this->exist('h2:contains("'.$playlist->getName().'")');
  126. if ($elements !== null)
  127. {
  128. $this->checkPlaylistElements($playlist, $elements[$playlist->getId()]);
  129. }
  130. }
  131. protected function checkPlaylistElements($playlist, $elements)
  132. {
  133. $this->assertEquals(count($elements), $this->crawler->filter('li.playlist_element')->count());
  134. foreach ($elements as $element)
  135. {
  136. $this->exist('a[data-id="'.$element->getId().'"]');
  137. }
  138. }
  139. protected function checkReadablePlaylistsForConnected()
  140. {
  141. $this->connectUser('jean', 'toor');
  142. $this->checkReadPlaylists($this->users['bux'], array($this->playlists['bux_1_pub']));
  143. $this->disconnectUser();
  144. }
  145. protected function checkReadablePlaylistsForOwner()
  146. {
  147. $this->connectUser('bux', 'toor');
  148. $this->checkReadPlaylists($this->users['bux'], array(
  149. $this->playlists['bux_1_pub'],
  150. $this->playlists['bux_2_priv'],
  151. $this->playlists['bob_pub'],
  152. ));
  153. }
  154. public function testPlaylistCreation()
  155. {
  156. $this->init();
  157. $this->initCreateContextData();
  158. $this->connectUser('joelle', 'toor');
  159. $this->playlists['joelle_1'] = $this->createPlaylistWithElement($this->elements['babylon']);
  160. $this->checkReadPlaylists($this->users['joelle'],
  161. array($this->playlists['joelle_1']),
  162. array($this->playlists['joelle_1']->getId() => array($this->elements['babylon']))
  163. );
  164. }
  165. protected function initCreateContextData()
  166. {
  167. $this->initReadContextData();
  168. $this->users['joelle'] = $this->findUserByUsername('joelle');
  169. $this->users['bob'] = $this->findUserByUsername('bob');
  170. $this->elements['babylon'] = $this->findOneBy('Element', 'Babylon Pression - Des Tasers et des Pauvres');
  171. }
  172. protected function createPlaylistWithElement($element)
  173. {
  174. $this->tests_cases->playlistCreate($element->getId(), 'Playlist de test');
  175. $this->assertTrue(!is_null($playlist = $this->findOneBy('Playlist', 'Playlist de test')));
  176. return $playlist;
  177. }
  178. public function testAutoplayDatas()
  179. {
  180. $this->init();
  181. $this->initReadContextData();
  182. $this->checkPublicPlaylist();
  183. $this->checkPrivatePlaylist();
  184. $this->connectUser('bob', 'toor');
  185. $this->checkPublicPlaylist();
  186. $this->checkPrivatePlaylist();
  187. $this->disconnectUser();
  188. $this->connectUser('bux', 'toor');
  189. $this->checkPublicPlaylist();
  190. $this->checkPrivatePlaylist(true);
  191. }
  192. protected function checkPublicPlaylist()
  193. {
  194. $response = $this->tests_cases->playlistAutoplay($this->playlists['bux_1_pub']->getId());
  195. $this->jsonResponseIsSuccess($response);
  196. }
  197. protected function checkPrivatePlaylist($success = false)
  198. {
  199. $response = $this->tests_cases->playlistAutoplay($this->playlists['bux_2_priv']->getId());
  200. if (!$success)
  201. $this->jsonResponseIsError($response);
  202. if ($success)
  203. $this->jsonResponseIsSuccess($response);
  204. }
  205. public function testPrompt()
  206. {
  207. $this->init();
  208. $this->initCreateContextData();
  209. $this->setCrawlerWithJsonResponseData($this->tests_cases->playlistPrompt($this->elements['babylon']->getId()));
  210. $this->checkPlaylistsInPrompt(array());
  211. $this->connectUser('bux', 'toor');
  212. $this->setCrawlerWithJsonResponseData($this->tests_cases->playlistPrompt($this->elements['babylon']->getId()));
  213. $this->checkPlaylistsInPrompt(array(
  214. $this->playlists['bux_1_pub'],
  215. $this->playlists['bux_2_priv'],
  216. $this->playlists['bob_pub'],
  217. ));
  218. }
  219. protected function checkPlaylistsInPrompt($playlists)
  220. {
  221. $this->assertEquals(count($playlists), $this->crawler->filter('ul.playlists_for_element li.playlist')->count());
  222. foreach ($playlists as $playlist)
  223. {
  224. $this->exist('a:contains("'.$playlist->getName().'")');
  225. }
  226. }
  227. }