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

/code/ryzom/tools/server/www/webtt/cake/tests/cases/libs/cake_test_fixture.test.php

https://bitbucket.org/mattraykowski/ryzomcore_demoshard
PHP | 504 lines | 251 code | 69 blank | 184 comment | 1 complexity | 852d2e7d6c1bdc5b0c435e163fe6f795 MD5 | raw file
Possible License(s): AGPL-3.0, GPL-3.0, LGPL-2.1
  1. <?php
  2. /**
  3. * CakeTestFixture file
  4. *
  5. * PHP versions 4 and 5
  6. *
  7. * CakePHP(tm) Tests <http://book.cakephp.org/view/1196/Testing>
  8. * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
  9. *
  10. * Licensed under The Open Group Test Suite License
  11. * Redistributions of files must retain the above copyright notice.
  12. *
  13. * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
  14. * @link http://book.cakephp.org/view/1196/Testing CakePHP(tm) Tests
  15. * @package cake
  16. * @subpackage cake.cake.tests.libs
  17. * @since CakePHP(tm) v 1.2.0.4667
  18. * @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License
  19. */
  20. App::import('Datasource', 'DboSource', false);
  21. /**
  22. * CakeTestFixtureTestFixture class
  23. *
  24. * @package cake
  25. * @subpackage cake.cake.tests.cases.libs
  26. */
  27. class CakeTestFixtureTestFixture extends CakeTestFixture {
  28. /**
  29. * name Property
  30. *
  31. * @var string
  32. */
  33. var $name = 'FixtureTest';
  34. /**
  35. * table property
  36. *
  37. * @var string
  38. */
  39. var $table = 'fixture_tests';
  40. /**
  41. * Fields array
  42. *
  43. * @var array
  44. */
  45. var $fields = array(
  46. 'id' => array('type' => 'integer', 'key' => 'primary'),
  47. 'name' => array('type' => 'string', 'length' => '255'),
  48. 'created' => array('type' => 'datetime')
  49. );
  50. /**
  51. * Records property
  52. *
  53. * @var array
  54. */
  55. var $records = array(
  56. array('name' => 'Gandalf', 'created' => '2009-04-28 19:20:00'),
  57. array('name' => 'Captain Picard', 'created' => '2009-04-28 19:20:00'),
  58. array('name' => 'Chewbacca', 'created' => '2009-04-28 19:20:00')
  59. );
  60. }
  61. /**
  62. * StringFieldsTestFixture class
  63. *
  64. * @package cake
  65. * @subpackage cake.cake.tests.cases.libs
  66. */
  67. class StringsTestFixture extends CakeTestFixture {
  68. /**
  69. * name Property
  70. *
  71. * @var string
  72. */
  73. var $name = 'Strings';
  74. /**
  75. * table property
  76. *
  77. * @var string
  78. */
  79. var $table = 'strings';
  80. /**
  81. * Fields array
  82. *
  83. * @var array
  84. */
  85. var $fields = array(
  86. 'id' => array('type' => 'integer', 'key' => 'primary'),
  87. 'name' => array('type' => 'string', 'length' => '255'),
  88. 'email' => array('type' => 'string', 'length' => '255'),
  89. 'age' => array('type' => 'integer', 'default' => 10)
  90. );
  91. /**
  92. * Records property
  93. *
  94. * @var array
  95. */
  96. var $records = array(
  97. array('name' => 'John Doe', 'email' => 'john.doe@email.com', 'age' => 20),
  98. array('email' => 'jane.doe@email.com', 'name' => 'Jane Doe', 'age' => 30),
  99. array('name' => 'Mark Doe', 'email' => 'mark.doe@email.com')
  100. );
  101. }
  102. /**
  103. * CakeTestFixtureImportFixture class
  104. *
  105. * @package cake
  106. * @subpackage cake.cake.tests.cases.libs
  107. */
  108. class CakeTestFixtureImportFixture extends CakeTestFixture {
  109. /**
  110. * Name property
  111. *
  112. * @var string
  113. */
  114. var $name = 'ImportFixture';
  115. /**
  116. * Import property
  117. *
  118. * @var mixed
  119. */
  120. var $import = array('table' => 'fixture_tests', 'connection' => 'test_suite');
  121. }
  122. /**
  123. * CakeTestFixtureDefaultImportFixture class
  124. *
  125. * @package cake
  126. * @subpackage cake.cake.tests.cases.libs
  127. */
  128. class CakeTestFixtureDefaultImportFixture extends CakeTestFixture {
  129. /**
  130. * Name property
  131. *
  132. * @var string
  133. */
  134. var $name = 'ImportFixture';
  135. }
  136. /**
  137. * FixtureImportTestModel class
  138. *
  139. * @package default
  140. * @subpackage cake.cake.tests.cases.libs.
  141. */
  142. class FixtureImportTestModel extends Model {
  143. var $name = 'FixtureImport';
  144. var $useTable = 'fixture_tests';
  145. var $useDbConfig = 'test_suite';
  146. }
  147. class FixturePrefixTest extends Model {
  148. var $name = 'FixturePrefix';
  149. var $useTable = '_tests';
  150. var $tablePrefix = 'fixture';
  151. var $useDbConfig = 'test_suite';
  152. }
  153. Mock::generate('DboSource', 'BaseFixtureMockDboSource');
  154. class FixtureMockDboSource extends BaseFixtureMockDboSource {
  155. var $insertMulti;
  156. function value($string) {
  157. return is_string($string) ? '\'' . $string . '\'' : $string;
  158. }
  159. function insertMulti($table, $fields, $values) {
  160. $this->insertMulti = compact('table', 'fields', 'values');
  161. return true;
  162. }
  163. }
  164. /**
  165. * Test case for CakeTestFixture
  166. *
  167. * @package cake
  168. * @subpackage cake.cake.tests.cases.libs
  169. */
  170. class CakeTestFixtureTest extends CakeTestCase {
  171. /**
  172. * setUp method
  173. *
  174. * @access public
  175. * @return void
  176. */
  177. function setUp() {
  178. $this->criticDb =& new FixtureMockDboSource();
  179. $this->criticDb->fullDebug = true;
  180. }
  181. /**
  182. * tearDown
  183. *
  184. * @access public
  185. * @return void
  186. */
  187. function tearDown() {
  188. unset($this->criticDb);
  189. }
  190. /**
  191. * testInit
  192. *
  193. * @access public
  194. * @return void
  195. */
  196. function testInit() {
  197. $Fixture =& new CakeTestFixtureTestFixture();
  198. unset($Fixture->table);
  199. $Fixture->init();
  200. $this->assertEqual($Fixture->table, 'fixture_tests');
  201. $this->assertEqual($Fixture->primaryKey, 'id');
  202. $Fixture =& new CakeTestFixtureTestFixture();
  203. $Fixture->primaryKey = 'my_random_key';
  204. $Fixture->init();
  205. $this->assertEqual($Fixture->primaryKey, 'my_random_key');
  206. }
  207. /**
  208. * test that init() correctly sets the fixture table when the connection or model have prefixes defined.
  209. *
  210. * @return void
  211. */
  212. function testInitDbPrefix() {
  213. $this->_initDb();
  214. $Source =& new CakeTestFixtureTestFixture();
  215. $Source->create($this->db);
  216. $Source->insert($this->db);
  217. $Fixture =& new CakeTestFixtureImportFixture();
  218. $expected = array('id', 'name', 'created');
  219. $this->assertEqual(array_keys($Fixture->fields), $expected);
  220. $db =& ConnectionManager::getDataSource('test_suite');
  221. $config = $db->config;
  222. $config['prefix'] = 'fixture_test_suite_';
  223. ConnectionManager::create('fixture_test_suite', $config);
  224. $Fixture->fields = $Fixture->records = null;
  225. $Fixture->import = array('table' => 'fixture_tests', 'connection' => 'test_suite', 'records' => true);
  226. $Fixture->init();
  227. $this->assertEqual(count($Fixture->records), count($Source->records));
  228. $Fixture =& new CakeTestFixtureImportFixture();
  229. $Fixture->fields = $Fixture->records = $Fixture->table = null;
  230. $Fixture->import = array('model' => 'FixtureImportTestModel', 'connection' => 'test_suite');
  231. $Fixture->init();
  232. $this->assertEqual(array_keys($Fixture->fields), array('id', 'name', 'created'));
  233. $this->assertEqual($Fixture->table, 'fixture_tests');
  234. $keys = array_flip(ClassRegistry::keys());
  235. $this->assertFalse(array_key_exists('fixtureimporttestmodel', $keys));
  236. $Source->drop($this->db);
  237. }
  238. /**
  239. * test that fixtures don't duplicate the test db prefix.
  240. *
  241. * @return void
  242. */
  243. function testInitDbPrefixDuplication() {
  244. $this->_initDb();
  245. $backPrefix = $this->db->config['prefix'];
  246. $this->db->config['prefix'] = 'cake_fixture_test_';
  247. $Source =& new CakeTestFixtureTestFixture();
  248. $Source->create($this->db);
  249. $Source->insert($this->db);
  250. $Fixture =& new CakeTestFixtureImportFixture();
  251. $Fixture->fields = $Fixture->records = $Fixture->table = null;
  252. $Fixture->import = array('model' => 'FixtureImportTestModel', 'connection' => 'test_suite');
  253. $Fixture->init();
  254. $this->assertEqual(array_keys($Fixture->fields), array('id', 'name', 'created'));
  255. $this->assertEqual($Fixture->table, 'fixture_tests');
  256. $Source->drop($this->db);
  257. $this->db->config['prefix'] = $backPrefix;
  258. }
  259. /**
  260. * test init with a model that has a tablePrefix declared.
  261. *
  262. * @return void
  263. */
  264. function testInitModelTablePrefix() {
  265. $this->_initDb();
  266. $hasPrefix = !empty($this->db->config['prefix']);
  267. if ($this->skipIf($hasPrefix, 'Cannot run this test, you have a database connection prefix.')) {
  268. return;
  269. }
  270. $Source =& new CakeTestFixtureTestFixture();
  271. $Source->create($this->db);
  272. $Source->insert($this->db);
  273. $Fixture =& new CakeTestFixtureImportFixture();
  274. unset($Fixture->table);
  275. $Fixture->fields = $Fixture->records = null;
  276. $Fixture->import = array('model' => 'FixturePrefixTest', 'connection' => 'test_suite', 'records' => false);
  277. $Fixture->init();
  278. $this->assertEqual($Fixture->table, 'fixture_tests');
  279. $keys = array_flip(ClassRegistry::keys());
  280. $this->assertFalse(array_key_exists('fixtureimporttestmodel', $keys));
  281. $Source->drop($this->db);
  282. }
  283. /**
  284. * testImport
  285. *
  286. * @access public
  287. * @return void
  288. */
  289. function testImport() {
  290. $this->_initDb();
  291. $defaultDb =& ConnectionManager::getDataSource('default');
  292. $testSuiteDb =& ConnectionManager::getDataSource('test_suite');
  293. $defaultConfig = $defaultDb->config;
  294. $testSuiteConfig = $testSuiteDb->config;
  295. ConnectionManager::create('new_test_suite', array_merge($testSuiteConfig, array('prefix' => 'new_' . $testSuiteConfig['prefix'])));
  296. $newTestSuiteDb =& ConnectionManager::getDataSource('new_test_suite');
  297. $Source =& new CakeTestFixtureTestFixture();
  298. $Source->create($newTestSuiteDb);
  299. $Source->insert($newTestSuiteDb);
  300. $defaultDb->config = $newTestSuiteDb->config;
  301. $Fixture =& new CakeTestFixtureDefaultImportFixture();
  302. $Fixture->fields = $Fixture->records = null;
  303. $Fixture->import = array('model' => 'FixtureImportTestModel', 'connection' => 'new_test_suite');
  304. $Fixture->init();
  305. $this->assertEqual(array_keys($Fixture->fields), array('id', 'name', 'created'));
  306. $defaultDb->config = $defaultConfig;
  307. $keys = array_flip(ClassRegistry::keys());
  308. $this->assertFalse(array_key_exists('fixtureimporttestmodel', $keys));
  309. $Source->drop($newTestSuiteDb);
  310. }
  311. /**
  312. * test that importing with records works. Make sure to try with postgres as its
  313. * handling of aliases is a workaround at best.
  314. *
  315. * @return void
  316. */
  317. function testImportWithRecords() {
  318. $this->_initDb();
  319. $defaultDb =& ConnectionManager::getDataSource('default');
  320. $testSuiteDb =& ConnectionManager::getDataSource('test_suite');
  321. $defaultConfig = $defaultDb->config;
  322. $testSuiteConfig = $testSuiteDb->config;
  323. ConnectionManager::create('new_test_suite', array_merge($testSuiteConfig, array('prefix' => 'new_' . $testSuiteConfig['prefix'])));
  324. $newTestSuiteDb =& ConnectionManager::getDataSource('new_test_suite');
  325. $Source =& new CakeTestFixtureTestFixture();
  326. $Source->create($newTestSuiteDb);
  327. $Source->insert($newTestSuiteDb);
  328. $defaultDb->config = $newTestSuiteDb->config;
  329. $Fixture =& new CakeTestFixtureDefaultImportFixture();
  330. $Fixture->fields = $Fixture->records = null;
  331. $Fixture->import = array(
  332. 'model' => 'FixtureImportTestModel', 'connection' => 'new_test_suite', 'records' => true
  333. );
  334. $Fixture->init();
  335. $this->assertEqual(array_keys($Fixture->fields), array('id', 'name', 'created'));
  336. $this->assertFalse(empty($Fixture->records[0]), 'No records loaded on importing fixture.');
  337. $this->assertTrue(isset($Fixture->records[0]['name']), 'No name loaded for first record');
  338. $defaultDb->config = $defaultConfig;
  339. $Source->drop($newTestSuiteDb);
  340. }
  341. /**
  342. * test create method
  343. *
  344. * @access public
  345. * @return void
  346. */
  347. function testCreate() {
  348. $Fixture =& new CakeTestFixtureTestFixture();
  349. $this->criticDb->expectAtLeastOnce('execute');
  350. $this->criticDb->expectAtLeastOnce('createSchema');
  351. $return = $Fixture->create($this->criticDb);
  352. $this->assertTrue($this->criticDb->fullDebug);
  353. $this->assertTrue($return);
  354. unset($Fixture->fields);
  355. $return = $Fixture->create($this->criticDb);
  356. $this->assertFalse($return);
  357. }
  358. /**
  359. * test the insert method
  360. *
  361. * @access public
  362. * @return void
  363. */
  364. function testInsert() {
  365. $Fixture =& new CakeTestFixtureTestFixture();
  366. $this->criticDb->insertMulti = array();
  367. $return = $Fixture->insert($this->criticDb);
  368. $this->assertTrue(!empty($this->criticDb->insertMulti));
  369. $this->assertTrue($this->criticDb->fullDebug);
  370. $this->assertTrue($return);
  371. $this->assertEqual('fixture_tests', $this->criticDb->insertMulti['table']);
  372. $this->assertEqual(array('name', 'created'), $this->criticDb->insertMulti['fields']);
  373. $expected = array(
  374. '(\'Gandalf\', \'2009-04-28 19:20:00\')',
  375. '(\'Captain Picard\', \'2009-04-28 19:20:00\')',
  376. '(\'Chewbacca\', \'2009-04-28 19:20:00\')'
  377. );
  378. $this->assertEqual($expected, $this->criticDb->insertMulti['values']);
  379. }
  380. /**
  381. * test the insert method
  382. *
  383. * @access public
  384. * @return void
  385. */
  386. function testInsertStrings() {
  387. $Fixture =& new StringsTestFixture();
  388. $this->criticDb->insertMulti = array();
  389. $return = $Fixture->insert($this->criticDb);
  390. $this->assertTrue(!empty($this->criticDb->insertMulti));
  391. $this->assertTrue($this->criticDb->fullDebug);
  392. $this->assertTrue($return);
  393. $this->assertEqual('strings', $this->criticDb->insertMulti['table']);
  394. $this->assertEqual(array('name', 'email', 'age'), $this->criticDb->insertMulti['fields']);
  395. $expected = array(
  396. '(\'John Doe\', \'john.doe@email.com\', 20)',
  397. '(\'Jane Doe\', \'jane.doe@email.com\', 30)',
  398. '(\'Mark Doe\', \'mark.doe@email.com\', NULL)',
  399. );
  400. $this->assertEqual($expected, $this->criticDb->insertMulti['values']);
  401. }
  402. /**
  403. * Test the drop method
  404. *
  405. * @access public
  406. * @return void
  407. */
  408. function testDrop() {
  409. $Fixture =& new CakeTestFixtureTestFixture();
  410. $this->criticDb->setReturnValueAt(0, 'execute', true);
  411. $this->criticDb->expectAtLeastOnce('execute');
  412. $this->criticDb->expectAtLeastOnce('dropSchema');
  413. $return = $Fixture->drop($this->criticDb);
  414. $this->assertTrue($this->criticDb->fullDebug);
  415. $this->assertTrue($return);
  416. $this->criticDb->setReturnValueAt(1, 'execute', false);
  417. $return = $Fixture->drop($this->criticDb);
  418. $this->assertFalse($return);
  419. unset($Fixture->fields);
  420. $return = $Fixture->drop($this->criticDb);
  421. $this->assertFalse($return);
  422. }
  423. /**
  424. * Test the truncate method.
  425. *
  426. * @access public
  427. * @return void
  428. */
  429. function testTruncate() {
  430. $Fixture =& new CakeTestFixtureTestFixture();
  431. $this->criticDb->expectAtLeastOnce('truncate');
  432. $Fixture->truncate($this->criticDb);
  433. $this->assertTrue($this->criticDb->fullDebug);
  434. }
  435. }