PageRenderTime 26ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/classes/fActiveRecord/fActiveRecordTest.php

https://github.com/netcarver/flourish
PHP | 565 lines | 481 code | 84 blank | 0 comment | 5 complexity | 6b2c68d0ca39c4a9c9b1c9b93fae90e1 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 OtherUserDetail extends fActiveRecord { }
  10. class RecordDeal extends fActiveRecord { }
  11. class RecordLabel extends fActiveRecord { }
  12. class FavoriteAlbum extends fActiveRecord { }
  13. class YearFavoriteAlbum extends fActiveRecord
  14. {
  15. public function getTwoDigitYear()
  16. {
  17. return '<em>"' . substr($this->getYear(), -2) . '"</em>';
  18. }
  19. }
  20. class Event extends fActiveRecord { }
  21. class EventSlot extends fActiveRecord { }
  22. class Registration extends fActiveRecord { }
  23. class EventDetail extends fActiveRecord { }
  24. class InvalidTable extends fActiveRecord { }
  25. function changed($object, &$values, &$old_values, &$related_records, &$cache, $method, $parameters) {
  26. return fActiveRecord::changed($values, $old_values, $parameters[0]);
  27. }
  28. class fActiveRecordTest extends PHPUnit_Framework_TestCase
  29. {
  30. protected static $db;
  31. protected static $schema;
  32. public static function setUpBeforeClass()
  33. {
  34. if (defined('SKIPPING')) {
  35. return;
  36. }
  37. $db = new fDatabase(DB_TYPE, DB, DB_USERNAME, DB_PASSWORD, DB_HOST, DB_PORT);
  38. $db->execute(file_get_contents(DB_SETUP_FILE));
  39. $db->execute(file_get_contents(DB_EXTENDED_SETUP_FILE));
  40. self::$db = $db;
  41. self::$schema = new fSchema($db);
  42. }
  43. public static function tearDownAfterClass()
  44. {
  45. if (defined('SKIPPING')) {
  46. return;
  47. }
  48. teardown(self::$db, DB_EXTENDED_TEARDOWN_FILE);
  49. teardown(self::$db, DB_TEARDOWN_FILE);
  50. }
  51. protected function createUser()
  52. {
  53. $user = new User();
  54. $user->setFirstName('John');
  55. $user->setLastName('Smith Jr.');
  56. $user->setEmailAddress('johnjr@smith.com');
  57. $user->setDateCreated(new fTimestamp());
  58. $user->setHashedPassword('8njsbck');
  59. return $user;
  60. }
  61. public function setUp()
  62. {
  63. if (defined('SKIPPING')) {
  64. $this->markTestSkipped();
  65. }
  66. fORMDatabase::attach(self::$db);
  67. fORMSchema::attach(self::$schema);
  68. if (defined('MAP_TABLES')) {
  69. fORM::mapClassToTable('User', 'user');
  70. fORM::mapClassToTable('Group', 'group');
  71. fORM::mapClassToTable('Artist', 'popular_artists');
  72. fORM::mapClassToTable('Album', 'records');
  73. }
  74. fORM::registerActiveRecordMethod('User', 'hasChanged', 'changed');
  75. }
  76. public function tearDown()
  77. {
  78. if (defined('SKIPPING')) {
  79. return;
  80. }
  81. self::$db->query('DELETE FROM events_artists');
  82. self::$db->query('DELETE FROM event_details');
  83. self::$db->query('DELETE FROM registrations');
  84. self::$db->query('DELETE FROM events WHERE event_id > 9');
  85. self::$db->query('DELETE FROM %r WHERE user_id > 4', fORM::tablize('User'));
  86. __reset();
  87. }
  88. public function testMissingPrimaryKey()
  89. {
  90. $this->setExpectedException('fProgrammerException');
  91. $invalid_table = new InvalidTable();
  92. }
  93. public function testSimpleConstruct()
  94. {
  95. $user = new User(1);
  96. $this->assertEquals(
  97. 1,
  98. $user->getUserId()
  99. );
  100. }
  101. public function testSimpleTextConstruct()
  102. {
  103. $label = new RecordLabel('EMI');
  104. $this->assertEquals(
  105. 'EMI',
  106. $label->getName()
  107. );
  108. }
  109. public function testArrayConstruct()
  110. {
  111. $user = new User(array('user_id' => 1));
  112. $this->assertEquals(
  113. 1,
  114. $user->getUserId()
  115. );
  116. }
  117. public function testMultiColumnConstruct()
  118. {
  119. $album = new FavoriteAlbum(array('email' => 'will@flourishlib.com', 'album_id' => 1));
  120. $this->assertEquals(
  121. 'will@flourishlib.com',
  122. $album->getEmail()
  123. );
  124. $this->assertEquals(
  125. 2,
  126. $album->getPosition()
  127. );
  128. }
  129. public function testSwappedMultiColumnConstruct()
  130. {
  131. $album = new FavoriteAlbum(array('album_id' => 1, 'email' => 'will@flourishlib.com'));
  132. $this->assertEquals(
  133. 'will@flourishlib.com',
  134. $album->getEmail()
  135. );
  136. $this->assertEquals(
  137. 2,
  138. $album->getPosition()
  139. );
  140. }
  141. public function testUniqueKeyConstruct()
  142. {
  143. $user = new User(array('email_address' => 'will@flourishlib.com'));
  144. $this->assertEquals(
  145. 1,
  146. $user->getUserId()
  147. );
  148. }
  149. public function testIteratorConstruct()
  150. {
  151. $user = new User(fORMDatabase::retrieve()->query("SELECT * FROM %r WHERE user_id = 1", fORM::tablize('User')));
  152. $this->assertEquals(
  153. 1,
  154. $user->getUserId()
  155. );
  156. }
  157. public function testMultiColumnUniqueConstruct()
  158. {
  159. $album = new Album(array('artist_id' => 1, 'name' => 'Give Up'));
  160. $this->assertEquals(
  161. 1,
  162. $album->getAlbumId()
  163. );
  164. }
  165. public function testSwappedMultiColumnUniqueConstruct()
  166. {
  167. $album = new Album(array('name' => 'Give Up', 'artist_id' => 1));
  168. $this->assertEquals(
  169. 1,
  170. $album->getAlbumId()
  171. );
  172. }
  173. public function testCloneAutoIncrement()
  174. {
  175. $user = new User(1);
  176. $new_user = clone $user;
  177. $this->assertEquals(
  178. NULL,
  179. $new_user->getUserId()
  180. );
  181. $this->assertEquals(
  182. 'Will',
  183. $new_user->getFirstName()
  184. );
  185. }
  186. public function testCloneNonAutoIncrement()
  187. {
  188. $label = new RecordLabel('EMI');
  189. $new_label = clone $label;
  190. $this->assertEquals(
  191. 'EMI',
  192. $new_label->getName()
  193. );
  194. $this->assertEquals(
  195. 'EMI',
  196. $label->getName()
  197. );
  198. }
  199. public function testDelete()
  200. {
  201. $user = $this->createUser();
  202. $user->store();
  203. $id = $user->getUserId();
  204. $user->delete();
  205. $this->assertEquals(
  206. 0,
  207. self::$db->query('SELECT user_id FROM %r WHERE user_id = %i', fORM::tablize('User'), $id)->countReturnedRows()
  208. );
  209. }
  210. public function testDelete2()
  211. {
  212. $label = new RecordLabel();
  213. $label->setName('Will’s Label');
  214. $label->store();
  215. $label->delete();
  216. $this->assertEquals(
  217. 0,
  218. self::$db->query('SELECT name FROM record_labels WHERE name = %s', 'Will’s Label')->countReturnedRows()
  219. );
  220. }
  221. public function testExists()
  222. {
  223. $user = new User(1);
  224. $this->assertEquals(
  225. TRUE,
  226. $user->exists()
  227. );
  228. }
  229. public function testExistsAfterStoreAndDelete()
  230. {
  231. $user = $this->createUser();
  232. $user->store();
  233. $this->assertEquals(
  234. TRUE,
  235. $user->exists()
  236. );
  237. $user->delete();
  238. $this->assertEquals(
  239. FALSE,
  240. $user->exists()
  241. );
  242. }
  243. public function testNotExists()
  244. {
  245. $user = new User();
  246. $this->assertEquals(
  247. FALSE,
  248. $user->exists()
  249. );
  250. }
  251. public function testLoad()
  252. {
  253. $user = new User(1);
  254. $user->setFirstName('');
  255. $user->load();
  256. $this->assertEquals(
  257. 'Will',
  258. $user->getFirstName()
  259. );
  260. }
  261. public function testSetChain()
  262. {
  263. $user = new User();
  264. $this->assertEquals(
  265. TRUE,
  266. $user->setUserId(2) instanceof User
  267. );
  268. }
  269. public function testInsert()
  270. {
  271. $user = new User();
  272. $user->setFirstName('testInsert');
  273. $user->setLastName('User');
  274. $user->setEmailAddress('testinsert@example.com');
  275. $user->setDateCreated(new fTimestamp());
  276. $user->setHashedPassword('abcdefgh');
  277. $user->store();
  278. $this->assertEquals(
  279. 1,
  280. self::$db->query('SELECT * FROM %r WHERE first_name = %s', fORM::tablize('User'), 'testInsert')->countReturnedRows()
  281. );
  282. $user->delete();
  283. }
  284. public function testInsertSetNullNotNullColumnWithDefault()
  285. {
  286. $user = new User();
  287. $user->setFirstName('testInsertSetNullNotNullColumnWithDefault');
  288. $user->setMiddleInitial(NULL);
  289. $user->setLastName('User');
  290. $user->setEmailAddress('testinsert@example.com');
  291. $user->setDateCreated(new fTimestamp());
  292. $user->setHashedPassword('abcdefgh');
  293. $user->store();
  294. $this->assertEquals(
  295. 1,
  296. self::$db->query('SELECT * FROM %r WHERE first_name = %s', fORM::tablize('User'), 'testInsertSetNullNotNullColumnWithDefault')->countReturnedRows()
  297. );
  298. $user->delete();
  299. }
  300. public function testUpdate()
  301. {
  302. $user = new User(1);
  303. $user->setFirstName('William');
  304. $user->store();
  305. $this->assertEquals(
  306. 1,
  307. self::$db->query('SELECT * FROM %r WHERE first_name = %s', fORM::tablize('User'), 'William')->countReturnedRows()
  308. );
  309. self::$db->query('UPDATE %r SET first_name = %s WHERE user_id = %i', fORM::tablize('User'), 'Will', 1);
  310. }
  311. public function testUpdateWithNoChanges()
  312. {
  313. $user = new User(1);
  314. $user->store();
  315. $this->assertEquals(
  316. 1,
  317. self::$db->query('SELECT * FROM %r WHERE user_id = %i', fORM::tablize('User'), 1)->countReturnedRows()
  318. );
  319. }
  320. public function testChanged()
  321. {
  322. $user = $this->createUser();
  323. $user->setMiddleInitial('A');
  324. $this->assertEquals(
  325. TRUE,
  326. $user->hasChanged('middle_initial')
  327. );
  328. }
  329. public function testNullChangedToZero()
  330. {
  331. $user = $this->createUser();
  332. $user->setMiddleInitial(0);
  333. $this->assertEquals(
  334. TRUE,
  335. $user->hasChanged('middle_initial')
  336. );
  337. }
  338. public function testNullChangedToFalse()
  339. {
  340. $user = $this->createUser();
  341. $user->setMiddleInitial(FALSE);
  342. $this->assertEquals(
  343. TRUE,
  344. $user->hasChanged('middle_initial')
  345. );
  346. }
  347. public function testNullChanged()
  348. {
  349. $user = $this->createUser();
  350. $user->setMiddleInitial('');
  351. $this->assertEquals(
  352. FALSE,
  353. $user->hasChanged('middle_initial')
  354. );
  355. }
  356. public function testNullChangedBlankStringFromDatabase()
  357. {
  358. $user = new User(1);
  359. $user->setMiddleInitial('');
  360. $this->assertEquals(
  361. FALSE,
  362. $user->hasChanged('middle_initial')
  363. );
  364. }
  365. public function testEncodeOnCustomGetMethod()
  366. {
  367. $user = new YearFavoriteAlbum(array('email' => 'will@flourishlib.com', 'year' => '2009', 'position' => 1));
  368. $this->assertEquals(
  369. '&lt;em&gt;&quot;09&quot;&lt;/em&gt;',
  370. $user->encodeTwoDigitYear()
  371. );
  372. }
  373. public function testPrepareOnCustomGetMethod()
  374. {
  375. $user = new YearFavoriteAlbum(array('email' => 'will@flourishlib.com', 'year' => '2009', 'position' => 1));
  376. $this->assertEquals(
  377. '<em>&quot;09&quot;</em>',
  378. $user->prepareTwoDigitYear()
  379. );
  380. }
  381. public function testBadMapping()
  382. {
  383. $this->setExpectedException('fProgrammerException');
  384. eval("class BadUser extends fActiveRecord { }");
  385. $user = new BadUser(1);
  386. }
  387. public function testCustomMapping()
  388. {
  389. eval("class TestUser extends fActiveRecord {
  390. protected function configure() {
  391. fORM::mapClassToTable(\$this, '" . fORM::tablize('User') . "');
  392. }
  393. }");
  394. $user = new TestUser(1);
  395. $this->assertEquals(
  396. 1,
  397. $user->getUserId()
  398. );
  399. }
  400. public function testDeleteRestrictOneToMany()
  401. {
  402. $this->setExpectedException('fValidationException');
  403. $event = new Event();
  404. $event->setTitle('Delete Restrict Event');
  405. $event->setStartDate(new fDate());
  406. $event->store();
  407. $registration = new Registration();
  408. $registration->setEventId($event->getEventId());
  409. $registration->setName('Will');
  410. $registration->store();
  411. $event->delete();
  412. }
  413. public function testDeleteForceCascadeOneToMany()
  414. {
  415. $event = new Event();
  416. $event->setTitle('Delete Restrict Event');
  417. $event->setStartDate(new fDate());
  418. $event->store();
  419. $registration = new Registration();
  420. $registration->setEventId($event->getEventId());
  421. $registration->setName('Will');
  422. $registration->store();
  423. $event->delete(TRUE);
  424. $this->assertEquals(
  425. FALSE,
  426. $event->exists()
  427. );
  428. }
  429. public function testDeleteRestrictOneToOne()
  430. {
  431. $this->setExpectedException('fValidationException');
  432. $event = new Event();
  433. $event->setTitle('Delete Restrict Event');
  434. $event->setStartDate(new fDate());
  435. $event->store();
  436. $event_detail = new EventDetail();
  437. $event_detail->setEventId($event->getEventId());
  438. $event_detail->setAllowsRegistration(TRUE);
  439. $event_detail->store();
  440. $event->delete();
  441. }
  442. public function testDeleteForceCascadeOneToOne()
  443. {
  444. $event = new Event();
  445. $event->setTitle('Delete Restrict Event');
  446. $event->setStartDate(new fDate());
  447. $event->store();
  448. $event_detail = new EventDetail();
  449. $event_detail->setEventId($event->getEventId());
  450. $event_detail->setAllowsRegistration(TRUE);
  451. $event_detail->store();
  452. $event->delete(TRUE);
  453. $this->assertEquals(
  454. FALSE,
  455. $event->exists()
  456. );
  457. }
  458. public function testDeleteRestrictManyToMany()
  459. {
  460. $this->setExpectedException('fValidationException');
  461. $event = new Event();
  462. $event->setTitle('Delete Restrict Event');
  463. $event->setStartDate(new fDate());
  464. $event->associateArtists(array(1));
  465. $event->store();
  466. $event->delete();
  467. }
  468. public function testDeleteForceCascadeManyToMany()
  469. {
  470. $event = new Event();
  471. $event->setTitle('Delete Restrict Event');
  472. $event->setStartDate(new fDate());
  473. $event->associateArtists(array(1));
  474. $event->store();
  475. $event->delete(TRUE);
  476. $this->assertEquals(
  477. FALSE,
  478. $event->exists()
  479. );
  480. }
  481. }