PageRenderTime 53ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/cases/models/datasources/couchdb_source.test.php

https://github.com/predominant/datasources
PHP | 530 lines | 303 code | 81 blank | 146 comment | 3 complexity | b66c96e34e0aa80dd86652cfa6057c1f MD5 | raw file
  1. <?php
  2. /**
  3. * Couchdb DataSource Test file
  4. * PHP version 5
  5. *
  6. * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
  7. * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
  8. *
  9. * Licensed under The MIT License
  10. * Redistributions of files must retain the above copyright notice.
  11. *
  12. * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
  13. * @link http://cakephp.org CakePHP(tm) Project
  14. * @package datasources
  15. * @subpackage datasources.models.datasources
  16. * @since CakePHP Datasources v 0.3
  17. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  18. */
  19. /**
  20. * Post Model for the test
  21. *
  22. * @package app
  23. * @subpackage app.model.post
  24. */
  25. class Post extends AppModel {
  26. public $name = 'Post';
  27. public $useDbConfig = 'couchdb_test';
  28. public $displayField = 'title';
  29. public $recursive = -1;
  30. public $validate = array(
  31. 'title' => array(
  32. 'notempty' => array(
  33. 'rule' => array('notempty'),
  34. //'message' => 'Your custom message here',
  35. //'allowEmpty' => false,
  36. //'required' => false,
  37. //'last' => false, // Stop validation after this rule
  38. //'on' => 'create', // Limit validation to 'create' or 'update' operations
  39. ),
  40. ),
  41. );
  42. public $schema = array(
  43. 'id' => array(
  44. 'type' => 'string',
  45. 'null' => true,
  46. 'key' => 'primary',
  47. 'length' => 32,
  48. ),
  49. 'rev' => array(
  50. 'type' => 'string',
  51. 'null' => true,
  52. 'key' => 'primary',
  53. 'length' => 34,
  54. ),
  55. 'title' => array(
  56. 'type' => 'string',
  57. 'null' => true,
  58. 'length' => 255,
  59. ),
  60. 'description' => array(
  61. 'type' => 'text',
  62. 'null' => true,
  63. )
  64. );
  65. }
  66. /**
  67. * CouchdbTestCase
  68. *
  69. * @package datasources
  70. * @subpackage datasources.tests.cases.models.datasources
  71. */
  72. class CouchdbTestCase extends CakeTestCase {
  73. /**
  74. * CouchDB Datasource object
  75. *
  76. * @var object
  77. */
  78. public $Couchdb = null;
  79. /**
  80. * Configuration
  81. *
  82. * @var array
  83. */
  84. protected $config = array(
  85. 'datasource' => 'couchdb',
  86. 'persistent' => false,
  87. 'host' => 'localhost',
  88. 'port' => '5984',
  89. 'login' => '',
  90. 'password' => '',
  91. 'database' => null
  92. );
  93. /**
  94. * Start Test
  95. *
  96. * @return void
  97. */
  98. public function startTest() {
  99. $config = new DATABASE_CONFIG();
  100. if (isset($config->couchdb_test)) {
  101. $this->config = $config->couchdb_test;
  102. }
  103. ConnectionManager::create('couchdb_test', $this->config);
  104. $this->Post = ClassRegistry::init('Post');
  105. $this->removeAllDocuments();
  106. }
  107. /**
  108. * testConnection
  109. *
  110. * @return void
  111. */
  112. public function testConnection() {
  113. $this->Couchdb = new CouchdbSource($this->config);
  114. $this->Couchdb =& ConnectionManager::getDataSource($this->Post->useDbConfig);
  115. $reconnect = $this->Couchdb->reconnect($this->config);
  116. $this->assertTrue($reconnect);
  117. $disconnect = $this->Couchdb->disconnect();
  118. $this->assertTrue($disconnect);
  119. }
  120. /**
  121. * testFind
  122. *
  123. * @return void
  124. */
  125. public function testFind() {
  126. $data = array(
  127. 'title' => 'My first post',
  128. 'description' => 'My first post'
  129. );
  130. $this->Post->save($data);
  131. $result = $this->Post->find('all');
  132. $this->assertEqual(1, count($result));
  133. $resultData = $result[0]['Post'];
  134. $this->assertEqual(4, count($resultData));
  135. $this->assertTrue(!empty($resultData['id']));
  136. $this->assertEqual($this->Post->id, $resultData['id']);
  137. $this->assertEqual($this->Post->rev, $resultData['rev']);
  138. $this->assertEqual($data['title'], $resultData['title']);
  139. $this->assertEqual($data['description'], $resultData['description']);
  140. }
  141. /**
  142. * testFindConditions
  143. *
  144. * @return void
  145. */
  146. public function testFindConditions() {
  147. $data = array(
  148. 'title' => 'My first post',
  149. 'description' => 'My first post'
  150. );
  151. $this->Post->save($data);
  152. $this->Post->create();
  153. $this->Post->save($data);
  154. $result = $this->Post->find('all');
  155. $this->assertEqual(2, count($result));
  156. $result = $this->Post->find('all', array('conditions' => array('Post.id' => $this->Post->id)));
  157. $this->assertEqual(1, count($result));
  158. $result = $this->Post->find('all', array('conditions' => array('id' => $this->Post->id)));
  159. $this->assertEqual(1, count($result));
  160. }
  161. /**
  162. * testFindRevs
  163. *
  164. * @return void
  165. */
  166. public function testFindRevs() {
  167. $data = array(
  168. 'title' => 'My first post',
  169. 'description' => 'My first post'
  170. );
  171. $this->Post->save($data);
  172. $this->Post->save($data);
  173. $this->Post->recursive = 0;
  174. $result = $this->Post->find('all', array('conditions' => array('id' => $this->Post->id)));
  175. $this->assertEqual(2, count($result[0]['Post']['_revs_info']));
  176. }
  177. /**
  178. * Tests save method.
  179. *
  180. * @return void
  181. */
  182. public function testSave() {
  183. $data = array(
  184. 'title' => 'My first post',
  185. 'description' => 'My first post'
  186. );
  187. $this->Post->create();
  188. $saveResult = $this->Post->save($data);
  189. $this->assertTrue($saveResult);
  190. $result = $this->Post->find('all');
  191. $this->assertEqual(1, count($result));
  192. $resultData = $result[0]['Post'];
  193. $this->assertEqual(4, count($resultData));
  194. $this->assertTrue(!empty($resultData['id']));
  195. $this->assertEqual($this->Post->id, $resultData['id']);
  196. $this->assertEqual($this->Post->rev, $resultData['rev']);
  197. $this->assertEqual($data['title'], $resultData['title']);
  198. $this->assertEqual($data['description'], $resultData['description']);
  199. }
  200. /**
  201. * Tests save method.
  202. *
  203. * @return void
  204. */
  205. public function testSaveWithId() {
  206. $data = array(
  207. 'id' => String::uuid(),
  208. 'title' => 'My first post',
  209. 'description' => 'My first post'
  210. );
  211. $this->Post->create();
  212. $saveResult = $this->Post->save($data);
  213. $this->assertTrue($saveResult);
  214. $result = $this->Post->find('all');
  215. $this->assertEqual(1, count($result));
  216. $resultData = $result[0]['Post'];
  217. $this->assertEqual(4, count($resultData));
  218. $this->assertTrue(!empty($resultData['id']));
  219. $this->assertEqual($resultData['id'], $data['id']);
  220. $this->assertEqual($this->Post->id, $resultData['id']);
  221. $this->assertEqual($this->Post->rev, $resultData['rev']);
  222. $this->assertEqual($data['title'], $resultData['title']);
  223. $this->assertEqual($data['description'], $resultData['description']);
  224. }
  225. /**
  226. * Tests saveAll method.
  227. *
  228. * @return void
  229. */
  230. public function testSaveAll() {
  231. $data[0]['Post'] = array(
  232. 'title' => 'My first post',
  233. 'description' => 'My first post'
  234. );
  235. $data[1]['Post'] = array(
  236. 'title' => 'My second post',
  237. 'description' => 'My second post'
  238. );
  239. $this->Post->create();
  240. $saveResult = $this->Post->saveAll($data);
  241. $result = $this->Post->find('all');
  242. $this->assertEqual(2, count($result));
  243. $resultData = $result[0]['Post'];
  244. $this->assertEqual(4, count($resultData));
  245. $this->assertTrue(!empty($resultData['id']));
  246. $this->assertEqual($data[0]['Post']['title'], $resultData['title']);
  247. $this->assertEqual($data[0]['Post']['description'], $resultData['description']);
  248. $resultData = $result[1]['Post'];
  249. $this->assertEqual(4, count($resultData));
  250. $this->assertTrue(!empty($resultData['id']));
  251. $this->assertEqual($data[1]['Post']['title'], $resultData['title']);
  252. $this->assertEqual($data[1]['Post']['description'], $resultData['description']);
  253. }
  254. /**
  255. * Tests update method.
  256. *
  257. * @return void
  258. */
  259. public function testUpdate() {
  260. // Count posts
  261. $uri = '/posts/_temp_view?group=true';
  262. $post = array(
  263. 'map' => 'function(doc) { emit(doc._id,1); }',
  264. 'reduce' => 'function(keys, values) { return sum(values); }'
  265. );
  266. $mapReduce = $this->Post->query($uri, $post);
  267. if(isset($mapReduce->rows[0]->value)) $count0 = $mapReduce->rows[0]->value;
  268. else $count0 = 0;
  269. $count1 = $this->testUpdate1($uri, $post, $count0);
  270. $count2 = $this->testUpdate2($uri, $post, $count1);
  271. $count3 = $this->testUpdate3($uri, $post, $count2);
  272. $count4 = $this->testUpdate4($uri, $post, $count2);
  273. $updateData = $this->testUpdate5($uri, $post, $count4);
  274. // Final test
  275. $result = $this->Post->find('all');
  276. $this->assertEqual(1, count($result));
  277. $resultData = $result[0]['Post'];
  278. $this->assertEqual(4, count($resultData));
  279. $this->assertTrue(!empty($resultData['id']));
  280. $this->assertEqual($this->Post->id, $resultData['id']);
  281. $this->assertEqual($this->Post->rev, $resultData['rev']);
  282. $this->assertNotEqual($updateData['title'], $resultData['title']);
  283. $this->assertNotEqual($updateData['description'], $resultData['description']);
  284. }
  285. /**
  286. * Tests update1 method.
  287. *
  288. * @param string $uri
  289. * @param array $post
  290. * @param interger $previousCount
  291. * @return void
  292. */
  293. private function testUpdate1($uri, $post, $previousCount) {
  294. $data = array(
  295. 'title' => 'My first post',
  296. 'description' => 'My first post'
  297. );
  298. $this->Post->create();
  299. $saveResult = $this->Post->save($data);
  300. $this->assertTrue($saveResult);
  301. $this->assertTrue($this->Post->id);
  302. $mapReduce = $this->Post->query($uri, $post);
  303. $count1 = $mapReduce->rows[0]->value;
  304. $this->assertIdentical($count1 - $previousCount, 1);
  305. return $count1;
  306. }
  307. /**
  308. * Tests update2 method.
  309. *
  310. * @param string $uri
  311. * @param array $post
  312. * @param interger $previousCount
  313. * @return void
  314. */
  315. private function testUpdate2($uri, $post, $previousCount) {
  316. $findResult = $this->Post->find('first');
  317. $this->assertEqual(4, count($findResult['Post']));
  318. $updateData = array(
  319. 'title' => 'My post update',
  320. 'description' => 'My post update'
  321. );
  322. $this->Post->id = $findResult['Post']['id'];
  323. $this->Post->rev = $findResult['Post']['rev'];
  324. $saveResult = $this->Post->save($updateData);
  325. $this->assertTrue($saveResult);
  326. $mapReduce = $this->Post->query($uri, $post);
  327. $count2 = $mapReduce->rows[0]->value;
  328. $this->assertIdentical($count2 - $previousCount, 0);
  329. return $count2;
  330. }
  331. /**
  332. * Tests update3 method.
  333. *
  334. * @param string $uri
  335. * @param array $post
  336. * @param interger $previousCount
  337. * @return void
  338. */
  339. private function testUpdate3($uri, $post, $previousCount) {
  340. $findResult = $this->Post->find('first');
  341. $this->assertEqual(4, count($findResult['Post']));
  342. $updateData = array(
  343. 'id' => $findResult['Post']['id'],
  344. 'title' => 'My post update',
  345. 'description' => 'My post update'
  346. );
  347. $this->Post->rev = $findResult['Post']['rev'];
  348. $saveResult = $this->Post->save($updateData);
  349. $this->assertTrue($saveResult);
  350. $this->assertIdentical($this->Post->id, $findResult['Post']['id']);
  351. $mapReduce = $this->Post->query($uri, $post);
  352. $count3 = $mapReduce->rows[0]->value;
  353. $this->assertIdentical($count3 - $previousCount, 0);
  354. return $count3;
  355. }
  356. /**
  357. * Tests update4 method.
  358. *
  359. * @param string $uri
  360. * @param array $post
  361. * @param interger $previousCount
  362. * @return void
  363. */
  364. private function testUpdate4($uri, $post, $previousCount) {
  365. $findResult = $this->Post->find('first');
  366. $this->assertEqual(4, count($findResult['Post']));
  367. $updateData = array(
  368. 'id' => $findResult['Post']['id'],
  369. 'rev' => $findResult['Post']['rev'],
  370. 'title' => 'My post update',
  371. 'description' => 'My post update'
  372. );
  373. $saveResult = $this->Post->save($updateData);
  374. $this->assertTrue($saveResult);
  375. $this->assertIdentical($this->Post->id, $findResult['Post']['id']);
  376. $mapReduce = $this->Post->query($uri, $post);
  377. $count4 = $mapReduce->rows[0]->value;
  378. $this->assertIdentical($count4 - $previousCount, 0);
  379. return $count4;
  380. }
  381. /**
  382. * Tests update5 method.
  383. *
  384. * @param string $uri
  385. * @param array $post
  386. * @param interger $previousCount
  387. * @return void
  388. */
  389. private function testUpdate5($uri, $post, $previousCount) {
  390. $findResult = $this->Post->find('first');
  391. $this->assertEqual(4, count($findResult['Post']));
  392. $updateData = array(
  393. 'id' => $findResult['Post']['id'],
  394. 'rev' => 'whatever',
  395. 'title' => 'My post fail',
  396. 'description' => 'My post fail'
  397. );
  398. $saveResult = $this->Post->save($updateData);
  399. $this->assertFalse($saveResult);
  400. $this->assertIdentical($this->Post->id, $findResult['Post']['id']);
  401. $mapReduce = $this->Post->query($uri, $post);
  402. $count5 = $mapReduce->rows[0]->value;
  403. $this->assertIdentical($count5 - $previousCount, 0);
  404. return $updateData;
  405. }
  406. /**
  407. * Tests delete method.
  408. *
  409. * @return void
  410. */
  411. public function testDelete() {
  412. $data = array(
  413. 'title' => 'My first post',
  414. 'description' => 'My first post'
  415. );
  416. $this->Post->create();
  417. $saveResult = $this->Post->save($data);
  418. $result = $this->Post->find('all');
  419. $this->assertEqual(1, count($result));
  420. $this->Post->id = $result[0]['Post']['id'];
  421. $this->Post->rev = $result[0]['Post']['rev'];
  422. $this->Post->delete();
  423. $result = $this->Post->find('all');
  424. $this->assertEqual(0, count($result));
  425. }
  426. /**
  427. * Remove all documents from database
  428. *
  429. * @return void
  430. */
  431. private function removeAllDocuments() {
  432. $posts = $this->Post->find('list', array('fields' => array('Post.rev')));
  433. foreach($posts as $id => $post) {
  434. $this->Post->rev = $post;
  435. $this->Post->delete($id);
  436. }
  437. }
  438. /**
  439. * End Test
  440. *
  441. * @return void
  442. */
  443. public function endTest() {
  444. $this->removeAllDocuments();
  445. unset($this->Post);
  446. unset($this->Couchdb);
  447. ClassRegistry::flush();
  448. }
  449. }