/tests/classes/fORMOrdering/fORMOrderingTest.php

https://github.com/netcarver/flourish · PHP · 502 lines · 361 code · 88 blank · 53 comment · 6 complexity · fda06783cd03ec0a4a88003190372e65 MD5 · raw file

  1. <?php
  2. require_once('./support/init.php');
  3. class User extends fActiveRecord { }
  4. class Group extends fActiveRecord { }
  5. class Artist extends fActiveRecord { }
  6. class Album extends fActiveRecord { }
  7. class Song extends fActiveRecord { }
  8. class UserDetail extends fActiveRecord { }
  9. class RecordLabel extends fActiveRecord { }
  10. class FavoriteAlbum extends fActiveRecord { }
  11. class YearFavoriteAlbum extends fActiveRecord { }
  12. class InvalidTable extends fActiveRecord { }
  13. class TopAlbum extends fActiveRecord { }
  14. class fORMOrderingTest extends PHPUnit_Framework_TestCase
  15. {
  16. protected static $db;
  17. protected static $schema;
  18. public static function setUpBeforeClass()
  19. {
  20. if (defined('SKIPPING')) {
  21. return;
  22. }
  23. $db = new fDatabase(DB_TYPE, DB, DB_USERNAME, DB_PASSWORD, DB_HOST, DB_PORT);
  24. $db->execute(file_get_contents(DB_SETUP_FILE));
  25. $db->execute(file_get_contents(DB_EXTENDED_SETUP_FILE));
  26. self::$db = $db;
  27. self::$schema = new fSchema($db);
  28. fORMDatabase::attach(self::$db);
  29. fORMSchema::attach(self::$schema);
  30. fORMOrdering::configureOrderingColumn('TopAlbum', 'position');
  31. fORMOrdering::configureOrderingColumn('FavoriteAlbum', 'position');
  32. fORMOrdering::configureOrderingColumn('YearFavoriteAlbum', 'position');
  33. if (defined('MAP_TABLES')) {
  34. fORM::mapClassToTable('User', 'user');
  35. fORM::mapClassToTable('Group', 'group');
  36. fORM::mapClassToTable('Artist', 'popular_artists');
  37. fORM::mapClassToTable('Album', 'records');
  38. }
  39. }
  40. public static function tearDownAfterClass()
  41. {
  42. if (defined('SKIPPING')) {
  43. return;
  44. }
  45. teardown(self::$db, DB_EXTENDED_TEARDOWN_FILE);
  46. teardown(self::$db, DB_TEARDOWN_FILE);
  47. }
  48. public function setUp()
  49. {
  50. if (defined('SKIPPING')) {
  51. $this->markTestSkipped();
  52. }
  53. self::$db->execute('BEGIN');
  54. fActiveRecord::clearIdentityMap();
  55. }
  56. public function tearDown()
  57. {
  58. if (defined('SKIPPING')) {
  59. return;
  60. }
  61. self::$db->execute('ROLLBACK');
  62. }
  63. static public function reorderSingleColumnProvider()
  64. {
  65. $output = array();
  66. // Original order
  67. //$output[] = array(1, 2, array(1, 4, 5, 6, 2, 3));
  68. $output[] = array(1, 2, array(4, 1, 5, 6, 2, 3));
  69. $output[] = array(6, 5, array(1, 4, 5, 6, 3, 2));
  70. $output[] = array(2, 1, array(4, 1, 5, 6, 2, 3));
  71. $output[] = array(5, 6, array(1, 4, 5, 6, 3, 2));
  72. $output[] = array(1, 6, array(4, 5, 6, 2, 3, 1));
  73. $output[] = array(6, 1, array(3, 1, 4, 5, 6, 2));
  74. $output[] = array(2, 6, array(1, 5, 6, 2, 3, 4));
  75. $output[] = array(6, 6, array(1, 4, 5, 6, 2, 3));
  76. return $output;
  77. }
  78. /**
  79. * @dataProvider reorderSingleColumnProvider
  80. */
  81. public function testReorderSingleColumn($start_position, $end_position, $resulting_order)
  82. {
  83. $top_album = new TopAlbum(array('position' => $start_position));
  84. $top_album->setPosition($end_position);
  85. $top_album->store();
  86. $expected_result = array();
  87. foreach ($resulting_order as $index => $album_id) {
  88. $expected_result[] = array(
  89. 'position' => $index+1,
  90. 'album_id' => $album_id
  91. );
  92. }
  93. $actual_result = self::$db->translatedQuery("SELECT position, album_id FROM top_albums ORDER BY position ASC")->fetchAllRows();
  94. $this->assertEquals($expected_result, $actual_result);
  95. }
  96. static public function addSingleColumnProvider()
  97. {
  98. $output = array();
  99. // Original order
  100. //$output[] = array(NULL, array(1, 4, 5, 6, 2, 3));
  101. $output[] = array(NULL, array(1, 4, 5, 6, 2, 3, 7));
  102. $output[] = array(1, array(7, 1, 4, 5, 6, 2, 3));
  103. $output[] = array(6, array(1, 4, 5, 6, 2, 7, 3));
  104. $output[] = array(9, array(1, 4, 5, 6, 2, 3, 7));
  105. return $output;
  106. }
  107. /**
  108. * @dataProvider addSingleColumnProvider
  109. */
  110. public function testAddSingleColumn($position, $resulting_order)
  111. {
  112. $top_album = new TopAlbum();
  113. $top_album->setAlbumId(7);
  114. $top_album->setPosition($position);
  115. $top_album->store();
  116. $expected_result = array();
  117. foreach ($resulting_order as $index => $album_id) {
  118. $expected_result[] = array(
  119. 'position' => $index+1,
  120. 'album_id' => $album_id
  121. );
  122. }
  123. $actual_result = self::$db->translatedQuery("SELECT position, album_id FROM top_albums ORDER BY position ASC")->fetchAllRows();
  124. $this->assertEquals($expected_result, $actual_result);
  125. }
  126. static public function deleteSingleColumnProvider()
  127. {
  128. $output = array();
  129. // Original order
  130. //$output[] = array(NULL, array(1, 4, 5, 6, 2, 3));
  131. $output[] = array(1, array(4, 5, 6, 2, 3));
  132. $output[] = array(6, array(1, 4, 5, 6, 2));
  133. $output[] = array(2, array(1, 5, 6, 2, 3));
  134. $output[] = array(4, array(1, 4, 5, 2, 3));
  135. return $output;
  136. }
  137. /**
  138. * @dataProvider deleteSingleColumnProvider
  139. */
  140. public function testDeleteSingleColumn($position, $resulting_order)
  141. {
  142. $top_album = new TopAlbum(array('position' => $position));
  143. $top_album->delete();
  144. $expected_result = array();
  145. foreach ($resulting_order as $index => $album_id) {
  146. $expected_result[] = array(
  147. 'position' => $index+1,
  148. 'album_id' => $album_id
  149. );
  150. }
  151. $actual_result = self::$db->translatedQuery("SELECT position, album_id FROM top_albums ORDER BY position ASC")->fetchAllRows();
  152. $this->assertEquals($expected_result, $actual_result);
  153. }
  154. static public function reorderMultiColumnProvider()
  155. {
  156. $output = array();
  157. // Original order
  158. //$output[] = array('will@flourishlib.com', 1, 2, array(2, 1, 3, 7, 4));
  159. $output[] = array('will@flourishlib.com', 1, 1, array(1, 2, 3, 7, 4));
  160. $output[] = array('will@flourishlib.com', 2, 2, array(1, 2, 3, 7, 4));
  161. $output[] = array('will@flourishlib.com', 4, 4, array(2, 1, 3, 4, 7));
  162. $output[] = array('will@flourishlib.com', 7, 5, array(2, 1, 3, 4, 7));
  163. $output[] = array('will@flourishlib.com', 2, 5, array(1, 3, 7, 4, 2));
  164. $output[] = array('will@flourishlib.com', 1, 5, array(2, 3, 7, 4, 1));
  165. return $output;
  166. }
  167. /**
  168. * @dataProvider reorderMultiColumnProvider
  169. */
  170. public function testReorderMultiColumn($email, $album_id, $end_position, $resulting_order)
  171. {
  172. $favorite_album = new FavoriteAlbum(array('email' => $email, 'album_id' => $album_id));
  173. $favorite_album->setPosition($end_position);
  174. $favorite_album->store();
  175. $expected_result = array();
  176. foreach ($resulting_order as $index => $album_id) {
  177. $expected_result[] = array(
  178. 'email' => $email,
  179. 'position' => $index+1,
  180. 'album_id' => $album_id
  181. );
  182. }
  183. $actual_result = self::$db->translatedQuery("SELECT email, position, album_id FROM favorite_albums WHERE email = %s ORDER BY position ASC", $email)->fetchAllRows();
  184. $this->assertEquals($expected_result, $actual_result);
  185. }
  186. static public function addMultiColumnProvider()
  187. {
  188. $output = array();
  189. // Original order
  190. //$output[] = array('will@flourishlib.com', 6, 1, array(2, 1, 3, 7, 4));
  191. $output[] = array('will@flourishlib.com', 6, 1, array(6, 2, 1, 3, 7, 4));
  192. $output[] = array('will@flourishlib.com', 6, 2, array(2, 6, 1, 3, 7, 4));
  193. $output[] = array('will@flourishlib.com', 6, 3, array(2, 1, 6, 3, 7, 4));
  194. $output[] = array('will@flourishlib.com', 6, 4, array(2, 1, 3, 6, 7, 4));
  195. $output[] = array('will@flourishlib.com', 6, 5, array(2, 1, 3, 7, 6, 4));
  196. $output[] = array('will@flourishlib.com', 6, 6, array(2, 1, 3, 7, 4, 6));
  197. $output[] = array('will@flourishlib.com', 6, NULL, array(2, 1, 3, 7, 4, 6));
  198. $output[] = array('will@flourishlib.com', 6, 9, array(2, 1, 3, 7, 4, 6));
  199. return $output;
  200. }
  201. /**
  202. * @dataProvider addMultiColumnProvider
  203. */
  204. public function testAddMultiColumn($email, $album_id, $position, $resulting_order)
  205. {
  206. $favorite_album = new FavoriteAlbum();
  207. $favorite_album->setAlbumId($album_id);
  208. $favorite_album->setEmail($email);
  209. $favorite_album->setPosition($position);
  210. $favorite_album->store();
  211. $expected_result = array();
  212. foreach ($resulting_order as $index => $album_id) {
  213. $expected_result[] = array(
  214. 'email' => $email,
  215. 'position' => $index+1,
  216. 'album_id' => $album_id
  217. );
  218. }
  219. $actual_result = self::$db->translatedQuery("SELECT email, position, album_id FROM favorite_albums WHERE email = %s ORDER BY position ASC", $email)->fetchAllRows();
  220. $this->assertEquals($expected_result, $actual_result);
  221. }
  222. static public function deleteMultiColumnProvider()
  223. {
  224. $output = array();
  225. // Original order
  226. //$output[] = array('will@flourishlib.com', 1, array(2, 1, 3, 7, 4));
  227. $output[] = array('will@flourishlib.com', 2, array(1, 3, 7, 4));
  228. $output[] = array('will@flourishlib.com', 1, array(2, 3, 7, 4));
  229. $output[] = array('will@flourishlib.com', 3, array(2, 1, 7, 4));
  230. $output[] = array('will@flourishlib.com', 7, array(2, 1, 3, 4));
  231. $output[] = array('will@flourishlib.com', 4, array(2, 1, 3, 7));
  232. return $output;
  233. }
  234. /**
  235. * @dataProvider deleteMultiColumnProvider
  236. */
  237. public function testDeleteMultiColumn($email, $album_id, $resulting_order)
  238. {
  239. $favorite_album = new FavoriteAlbum(array('email' => $email, 'album_id' => $album_id));
  240. $favorite_album->delete();
  241. $expected_result = array();
  242. foreach ($resulting_order as $index => $album_id) {
  243. $expected_result[] = array(
  244. 'email' => $email,
  245. 'position' => $index+1,
  246. 'album_id' => $album_id
  247. );
  248. }
  249. $actual_result = self::$db->translatedQuery("SELECT email, position, album_id FROM favorite_albums WHERE email = %s ORDER BY position ASC", $email)->fetchAllRows();
  250. $this->assertEquals($expected_result, $actual_result);
  251. }
  252. static public function moveSetMultiColumnProvider()
  253. {
  254. $output = array();
  255. // Original order
  256. //$output[] = array('will@flourishlib.com', 1, 'john@smith.com', 1, array(2, 1, 3, 7, 4), array(2));
  257. $output[] = array('will@flourishlib.com', 1, 'john@smith.com', 1, array(2, 3, 7, 4), array(1, 2));
  258. $output[] = array('will@flourishlib.com', 7, 'john@smith.com', 2, array(2, 1, 3, 4), array(2, 7));
  259. $output[] = array('will@flourishlib.com', 7, 'john@smith.com', NULL, array(2, 1, 3, 4), array(2, 7));
  260. $output[] = array('will@flourishlib.com', 2, 'bar@example.com', 1, array(1, 3, 7, 4), array(2));
  261. return $output;
  262. }
  263. /**
  264. * @dataProvider moveSetMultiColumnProvider
  265. */
  266. public function testMoveSetMultiColumn($origin_email, $album_id, $destination_email, $position, $origin_resulting_order, $destination_resulting_order)
  267. {
  268. $origin_fa = new FavoriteAlbum(array('email' => $origin_email, 'album_id' => $album_id));
  269. $origin_fa->setEmail($destination_email);
  270. if ($position) {
  271. $origin_fa->setPosition($position);
  272. }
  273. $origin_fa->store();
  274. $expected_origin_result = array();
  275. foreach ($origin_resulting_order as $index => $album_id) {
  276. $expected_origin_result[] = array(
  277. 'email' => $origin_email,
  278. 'position' => $index+1,
  279. 'album_id' => $album_id
  280. );
  281. }
  282. $actual_origin_result = self::$db->translatedQuery("SELECT email, position, album_id FROM favorite_albums WHERE email = %s ORDER BY position ASC", $origin_email)->fetchAllRows();
  283. $this->assertEquals($expected_origin_result, $actual_origin_result);
  284. $expected_destination_result = array();
  285. foreach ($destination_resulting_order as $index => $album_id) {
  286. $expected_destination_result[] = array(
  287. 'email' => $destination_email,
  288. 'position' => $index+1,
  289. 'album_id' => $album_id
  290. );
  291. }
  292. $actual_destination_result = self::$db->translatedQuery("SELECT email, position, album_id FROM favorite_albums WHERE email = %s ORDER BY position ASC", $destination_email)->fetchAllRows();
  293. $this->assertEquals($expected_destination_result, $actual_destination_result);
  294. }
  295. static public function reorderThreeColumnProvider()
  296. {
  297. $output = array();
  298. // Original order
  299. //$output[] = array('will@flourishlib.com', 2009, 1, 2, array(2, 1, 3, 7, 4));
  300. $output[] = array('will@flourishlib.com', 2009, 1, 1, array(1, 2, 3, 7, 4));
  301. $output[] = array('will@flourishlib.com', 2009, 2, 2, array(1, 2, 3, 7, 4));
  302. $output[] = array('will@flourishlib.com', 2009, 4, 4, array(2, 1, 3, 4, 7));
  303. $output[] = array('will@flourishlib.com', 2009, 7, 5, array(2, 1, 3, 4, 7));
  304. $output[] = array('will@flourishlib.com', 2009, 2, 5, array(1, 3, 7, 4, 2));
  305. $output[] = array('will@flourishlib.com', 2009, 1, 5, array(2, 3, 7, 4, 1));
  306. return $output;
  307. }
  308. /**
  309. * @dataProvider reorderThreeColumnProvider
  310. */
  311. public function testReorderThreeColumn($email, $year, $album_id, $end_position, $resulting_order)
  312. {
  313. $favorite_album = new YearFavoriteAlbum(array('email' => $email, 'year' => $year, 'album_id' => $album_id));
  314. $favorite_album->setPosition($end_position);
  315. $favorite_album->store();
  316. $expected_result = array();
  317. foreach ($resulting_order as $index => $album_id) {
  318. $expected_result[] = array(
  319. 'email' => $email,
  320. 'position' => $index+1,
  321. 'album_id' => $album_id
  322. );
  323. }
  324. $actual_result = self::$db->translatedQuery("SELECT email, position, album_id FROM year_favorite_albums WHERE email = %s ORDER BY position ASC", $email)->fetchAllRows();
  325. $this->assertEquals($expected_result, $actual_result);
  326. }
  327. static public function addThreeColumnProvider()
  328. {
  329. $output = array();
  330. // Original order
  331. //$output[] = array('will@flourishlib.com', 2009, 6, 1, array(2, 1, 3, 7, 4));
  332. $output[] = array('will@flourishlib.com', 2009, 6, 1, array(6, 2, 1, 3, 7, 4));
  333. $output[] = array('will@flourishlib.com', 2009, 6, 2, array(2, 6, 1, 3, 7, 4));
  334. $output[] = array('will@flourishlib.com', 2009, 6, 3, array(2, 1, 6, 3, 7, 4));
  335. $output[] = array('will@flourishlib.com', 2009, 6, 4, array(2, 1, 3, 6, 7, 4));
  336. $output[] = array('will@flourishlib.com', 2009, 6, 5, array(2, 1, 3, 7, 6, 4));
  337. $output[] = array('will@flourishlib.com', 2009, 6, 6, array(2, 1, 3, 7, 4, 6));
  338. $output[] = array('will@flourishlib.com', 2009, 6, NULL, array(2, 1, 3, 7, 4, 6));
  339. $output[] = array('will@flourishlib.com', 2009, 6, 9, array(2, 1, 3, 7, 4, 6));
  340. return $output;
  341. }
  342. /**
  343. * @dataProvider addThreeColumnProvider
  344. */
  345. public function testAddThreeColumn($email, $year, $album_id, $position, $resulting_order)
  346. {
  347. $favorite_album = new YearFavoriteAlbum();
  348. $favorite_album->setAlbumId($album_id);
  349. $favorite_album->setEmail($email);
  350. $favorite_album->setPosition($position);
  351. $favorite_album->setYear($year);
  352. $favorite_album->store();
  353. $expected_result = array();
  354. foreach ($resulting_order as $index => $album_id) {
  355. $expected_result[] = array(
  356. 'email' => $email,
  357. 'position' => $index+1,
  358. 'album_id' => $album_id
  359. );
  360. }
  361. $actual_result = self::$db->translatedQuery("SELECT email, position, album_id FROM year_favorite_albums WHERE email = %s ORDER BY position ASC", $email)->fetchAllRows();
  362. $this->assertEquals($expected_result, $actual_result);
  363. }
  364. static public function deleteThreeColumnProvider()
  365. {
  366. $output = array();
  367. // Original order
  368. //$output[] = array('will@flourishlib.com', 2009, 1, array(2, 1, 3, 7, 4));
  369. $output[] = array('will@flourishlib.com', 2009, 2, array(1, 3, 7, 4));
  370. $output[] = array('will@flourishlib.com', 2009, 1, array(2, 3, 7, 4));
  371. $output[] = array('will@flourishlib.com', 2009, 3, array(2, 1, 7, 4));
  372. $output[] = array('will@flourishlib.com', 2009, 7, array(2, 1, 3, 4));
  373. $output[] = array('will@flourishlib.com', 2009, 4, array(2, 1, 3, 7));
  374. return $output;
  375. }
  376. /**
  377. * @dataProvider deleteThreeColumnProvider
  378. */
  379. public function testDeleteThreeColumn($email, $year, $album_id, $resulting_order)
  380. {
  381. $favorite_album = new YearFavoriteAlbum(array('email' => $email, 'year' => $year, 'album_id' => $album_id));
  382. $favorite_album->delete();
  383. $expected_result = array();
  384. foreach ($resulting_order as $index => $album_id) {
  385. $expected_result[] = array(
  386. 'email' => $email,
  387. 'position' => $index+1,
  388. 'album_id' => $album_id
  389. );
  390. }
  391. $actual_result = self::$db->translatedQuery("SELECT email, position, album_id FROM year_favorite_albums WHERE email = %s ORDER BY position ASC", $email)->fetchAllRows();
  392. $this->assertEquals($expected_result, $actual_result);
  393. }
  394. static public function inspectProvider()
  395. {
  396. $output = array();
  397. $output[] = array('FavoriteAlbum', array('email' => 'will@flourishlib.com', 'album_id' => 1), 'inspectPosition', 5);
  398. $output[] = array('FavoriteAlbum', array('email' => 'john@smith.com', 'album_id' => 2), 'inspectPosition', 1);
  399. $output[] = array('TopAlbum', array('position' => 1), 'inspectPosition', 6);
  400. $output[] = array('TopAlbum', array('position' => 3), 'inspectPosition', 6);
  401. $output[] = array('FavoriteAlbum', NULL, 'inspectPosition', 1);
  402. $output[] = array('TopAlbum', NULL, 'inspectPosition', 7);
  403. return $output;
  404. }
  405. /**
  406. * @dataProvider inspectProvider
  407. */
  408. public function testInspect($class, $primary_key, $method, $max_ordering_value)
  409. {
  410. $object = new $class($primary_key);
  411. $this->assertEquals('ordering', $object->$method('feature'));
  412. $this->assertEquals($max_ordering_value, $object->$method('max_ordering_value'));
  413. }
  414. }