PageRenderTime 61ms CodeModel.GetById 35ms RepoModel.GetById 0ms app.codeStats 0ms

/cake/tests/cases/libs/cake_test_fixture.test.php

https://github.com/campagsi/bisad
PHP | 408 lines | 199 code | 57 blank | 152 comment | 1 complexity | 5e722b1d8288cc331506828c916ce46e MD5 | raw file
  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. * CakeTestFixtureImportFixture class
  63. *
  64. * @package cake
  65. * @subpackage cake.cake.tests.cases.libs
  66. */
  67. class CakeTestFixtureImportFixture extends CakeTestFixture {
  68. /**
  69. * Name property
  70. *
  71. * @var string
  72. */
  73. var $name = 'ImportFixture';
  74. /**
  75. * Import property
  76. *
  77. * @var mixed
  78. */
  79. var $import = array('table' => 'fixture_tests', 'connection' => 'test_suite');
  80. }
  81. /**
  82. * CakeTestFixtureDefaultImportFixture class
  83. *
  84. * @package cake
  85. * @subpackage cake.cake.tests.cases.libs
  86. */
  87. class CakeTestFixtureDefaultImportFixture extends CakeTestFixture {
  88. /**
  89. * Name property
  90. *
  91. * @var string
  92. */
  93. var $name = 'ImportFixture';
  94. }
  95. /**
  96. * FixtureImportTestModel class
  97. *
  98. * @package default
  99. * @subpackage cake.cake.tests.cases.libs.
  100. */
  101. class FixtureImportTestModel extends Model {
  102. var $name = 'FixtureImport';
  103. var $useTable = 'fixture_tests';
  104. var $useDbConfig = 'test_suite';
  105. }
  106. class FixturePrefixTest extends Model {
  107. var $name = 'FixturePrefix';
  108. var $useTable = '_tests';
  109. var $tablePrefix = 'fixture';
  110. var $useDbConfig = 'test_suite';
  111. }
  112. Mock::generate('DboSource', 'FixtureMockDboSource');
  113. /**
  114. * Test case for CakeTestFixture
  115. *
  116. * @package cake
  117. * @subpackage cake.cake.tests.cases.libs
  118. */
  119. class CakeTestFixtureTest extends CakeTestCase {
  120. /**
  121. * setUp method
  122. *
  123. * @access public
  124. * @return void
  125. */
  126. function setUp() {
  127. $this->criticDb =& new FixtureMockDboSource();
  128. $this->criticDb->fullDebug = true;
  129. }
  130. /**
  131. * tearDown
  132. *
  133. * @access public
  134. * @return void
  135. */
  136. function tearDown() {
  137. unset($this->criticDb);
  138. }
  139. /**
  140. * testInit
  141. *
  142. * @access public
  143. * @return void
  144. */
  145. function testInit() {
  146. $Fixture =& new CakeTestFixtureTestFixture();
  147. unset($Fixture->table);
  148. $Fixture->init();
  149. $this->assertEqual($Fixture->table, 'fixture_tests');
  150. $this->assertEqual($Fixture->primaryKey, 'id');
  151. $Fixture =& new CakeTestFixtureTestFixture();
  152. $Fixture->primaryKey = 'my_random_key';
  153. $Fixture->init();
  154. $this->assertEqual($Fixture->primaryKey, 'my_random_key');
  155. }
  156. /**
  157. * test that init() correctly sets the fixture table when the connection or model have prefixes defined.
  158. *
  159. * @return void
  160. */
  161. function testInitDbPrefix() {
  162. $this->_initDb();
  163. $Source =& new CakeTestFixtureTestFixture();
  164. $Source->create($this->db);
  165. $Source->insert($this->db);
  166. $Fixture =& new CakeTestFixtureImportFixture();
  167. $expected = array('id', 'name', 'created');
  168. $this->assertEqual(array_keys($Fixture->fields), $expected);
  169. $db =& ConnectionManager::getDataSource('test_suite');
  170. $config = $db->config;
  171. $config['prefix'] = 'fixture_test_suite_';
  172. ConnectionManager::create('fixture_test_suite', $config);
  173. $Fixture->fields = $Fixture->records = null;
  174. $Fixture->import = array('table' => 'fixture_tests', 'connection' => 'test_suite', 'records' => true);
  175. $Fixture->init();
  176. $this->assertEqual(count($Fixture->records), count($Source->records));
  177. $Fixture =& new CakeTestFixtureImportFixture();
  178. $Fixture->fields = $Fixture->records = $Fixture->table = null;
  179. $Fixture->import = array('model' => 'FixtureImportTestModel', 'connection' => 'test_suite');
  180. $Fixture->init();
  181. $this->assertEqual(array_keys($Fixture->fields), array('id', 'name', 'created'));
  182. $this->assertEqual($Fixture->table, 'fixture_tests');
  183. $keys = array_flip(ClassRegistry::keys());
  184. $this->assertFalse(array_key_exists('fixtureimporttestmodel', $keys));
  185. $Source->drop($this->db);
  186. }
  187. /**
  188. * test that fixtures don't duplicate the test db prefix.
  189. *
  190. * @return void
  191. */
  192. function testInitDbPrefixDuplication() {
  193. $this->_initDb();
  194. $backPrefix = $this->db->config['prefix'];
  195. $this->db->config['prefix'] = 'cake_fixture_test_';
  196. $Source =& new CakeTestFixtureTestFixture();
  197. $Source->create($this->db);
  198. $Source->insert($this->db);
  199. $Fixture =& new CakeTestFixtureImportFixture();
  200. $Fixture->fields = $Fixture->records = $Fixture->table = null;
  201. $Fixture->import = array('model' => 'FixtureImportTestModel', 'connection' => 'test_suite');
  202. $Fixture->init();
  203. $this->assertEqual(array_keys($Fixture->fields), array('id', 'name', 'created'));
  204. $this->assertEqual($Fixture->table, 'fixture_tests');
  205. $Source->drop($this->db);
  206. $this->db->config['prefix'] = $backPrefix;
  207. }
  208. /**
  209. * test init with a model that has a tablePrefix declared.
  210. *
  211. * @return void
  212. */
  213. function testInitModelTablePrefix() {
  214. $this->_initDb();
  215. $hasPrefix = !empty($this->db->config['prefix']);
  216. if ($this->skipIf($hasPrefix, 'Cannot run this test, you have a database connection prefix.')) {
  217. return;
  218. }
  219. $Source =& new CakeTestFixtureTestFixture();
  220. $Source->create($this->db);
  221. $Source->insert($this->db);
  222. $Fixture =& new CakeTestFixtureImportFixture();
  223. unset($Fixture->table);
  224. $Fixture->fields = $Fixture->records = null;
  225. $Fixture->import = array('model' => 'FixturePrefixTest', 'connection' => 'test_suite', 'records' => false);
  226. $Fixture->init();
  227. $this->assertEqual($Fixture->table, 'fixture_tests');
  228. $keys = array_flip(ClassRegistry::keys());
  229. $this->assertFalse(array_key_exists('fixtureimporttestmodel', $keys));
  230. $Source->drop($this->db);
  231. }
  232. /**
  233. * testImport
  234. *
  235. * @access public
  236. * @return void
  237. */
  238. function testImport() {
  239. $this->_initDb();
  240. $defaultDb =& ConnectionManager::getDataSource('default');
  241. $testSuiteDb =& ConnectionManager::getDataSource('test_suite');
  242. $defaultConfig = $defaultDb->config;
  243. $testSuiteConfig = $testSuiteDb->config;
  244. ConnectionManager::create('new_test_suite', array_merge($testSuiteConfig, array('prefix' => 'new_' . $testSuiteConfig['prefix'])));
  245. $newTestSuiteDb =& ConnectionManager::getDataSource('new_test_suite');
  246. $Source =& new CakeTestFixtureTestFixture();
  247. $Source->create($newTestSuiteDb);
  248. $Source->insert($newTestSuiteDb);
  249. $defaultDb->config = $newTestSuiteDb->config;
  250. $Fixture =& new CakeTestFixtureDefaultImportFixture();
  251. $Fixture->fields = $Fixture->records = null;
  252. $Fixture->import = array('model' => 'FixtureImportTestModel', 'connection' => 'new_test_suite');
  253. $Fixture->init();
  254. $this->assertEqual(array_keys($Fixture->fields), array('id', 'name', 'created'));
  255. $defaultDb->config = $defaultConfig;
  256. $keys = array_flip(ClassRegistry::keys());
  257. $this->assertFalse(array_key_exists('fixtureimporttestmodel', $keys));
  258. $Source->drop($newTestSuiteDb);
  259. }
  260. /**
  261. * test that importing with records works. Make sure to try with postgres as its
  262. * handling of aliases is a workaround at best.
  263. *
  264. * @return void
  265. */
  266. function testImportWithRecords() {
  267. $this->_initDb();
  268. $defaultDb =& ConnectionManager::getDataSource('default');
  269. $testSuiteDb =& ConnectionManager::getDataSource('test_suite');
  270. $defaultConfig = $defaultDb->config;
  271. $testSuiteConfig = $testSuiteDb->config;
  272. ConnectionManager::create('new_test_suite', array_merge($testSuiteConfig, array('prefix' => 'new_' . $testSuiteConfig['prefix'])));
  273. $newTestSuiteDb =& ConnectionManager::getDataSource('new_test_suite');
  274. $Source =& new CakeTestFixtureTestFixture();
  275. $Source->create($newTestSuiteDb);
  276. $Source->insert($newTestSuiteDb);
  277. $defaultDb->config = $newTestSuiteDb->config;
  278. $Fixture =& new CakeTestFixtureDefaultImportFixture();
  279. $Fixture->fields = $Fixture->records = null;
  280. $Fixture->import = array(
  281. 'model' => 'FixtureImportTestModel', 'connection' => 'new_test_suite', 'records' => true
  282. );
  283. $Fixture->init();
  284. $this->assertEqual(array_keys($Fixture->fields), array('id', 'name', 'created'));
  285. $this->assertFalse(empty($Fixture->records[0]), 'No records loaded on importing fixture.');
  286. $this->assertTrue(isset($Fixture->records[0]['name']), 'No name loaded for first record');
  287. $defaultDb->config = $defaultConfig;
  288. $Source->drop($newTestSuiteDb);
  289. }
  290. /**
  291. * test create method
  292. *
  293. * @access public
  294. * @return void
  295. */
  296. function testCreate() {
  297. $Fixture =& new CakeTestFixtureTestFixture();
  298. $this->criticDb->expectAtLeastOnce('execute');
  299. $this->criticDb->expectAtLeastOnce('createSchema');
  300. $return = $Fixture->create($this->criticDb);
  301. $this->assertTrue($this->criticDb->fullDebug);
  302. $this->assertTrue($return);
  303. unset($Fixture->fields);
  304. $return = $Fixture->create($this->criticDb);
  305. $this->assertFalse($return);
  306. }
  307. /**
  308. * test the insert method
  309. *
  310. * @access public
  311. * @return void
  312. */
  313. function testInsert() {
  314. $Fixture =& new CakeTestFixtureTestFixture();
  315. $this->criticDb->setReturnValue('insertMulti', true);
  316. $this->criticDb->expectAtLeastOnce('insertMulti');
  317. $return = $Fixture->insert($this->criticDb);
  318. $this->assertTrue($this->criticDb->fullDebug);
  319. $this->assertTrue($return);
  320. }
  321. /**
  322. * Test the drop method
  323. *
  324. * @access public
  325. * @return void
  326. */
  327. function testDrop() {
  328. $Fixture =& new CakeTestFixtureTestFixture();
  329. $this->criticDb->setReturnValueAt(0, 'execute', true);
  330. $this->criticDb->expectAtLeastOnce('execute');
  331. $this->criticDb->expectAtLeastOnce('dropSchema');
  332. $return = $Fixture->drop($this->criticDb);
  333. $this->assertTrue($this->criticDb->fullDebug);
  334. $this->assertTrue($return);
  335. $this->criticDb->setReturnValueAt(1, 'execute', false);
  336. $return = $Fixture->drop($this->criticDb);
  337. $this->assertFalse($return);
  338. }
  339. /**
  340. * Test the truncate method.
  341. *
  342. * @access public
  343. * @return void
  344. */
  345. function testTruncate() {
  346. $Fixture =& new CakeTestFixtureTestFixture();
  347. $this->criticDb->expectAtLeastOnce('truncate');
  348. $Fixture->truncate($this->criticDb);
  349. $this->assertTrue($this->criticDb->fullDebug);
  350. }
  351. }