/tests/DatabaseTest.php

https://github.com/tmarois/Filebase · PHP · 341 lines · 231 code · 100 blank · 10 comment · 4 complexity · 8c958f439cd1e861796b25a242adc9e5 MD5 · raw file

  1. <?php namespace Filebase;
  2. use Filebase\Filesystem\SavingException;
  3. class badformat {
  4. }
  5. class DatabaseTest extends \PHPUnit\Framework\TestCase
  6. {
  7. public function testVersion()
  8. {
  9. $db = new \Filebase\Database([
  10. 'dir' => __DIR__.'/databases',
  11. 'read_only' => true
  12. ]);
  13. $this->assertRegExp('/[0-9]+\.[0-9]+\.[0-9]+/', $db->version());
  14. }
  15. public function testNotWritable()
  16. {
  17. $this->expectException(\Exception::class);
  18. if (!is_dir(__DIR__.'/databases/cantedit'))
  19. {
  20. mkdir(__DIR__.'/databases/cantedit');
  21. }
  22. chmod(__DIR__.'/databases/cantedit', 0444);
  23. $db = new \Filebase\Database([
  24. 'dir' => __DIR__.'/databases/cantedit'
  25. ]);
  26. chmod(__DIR__.'/databases/cantedit', 0777);
  27. rmdir(__DIR__.'/databases/cantedit');
  28. }
  29. public function testNotWritableButReadonly()
  30. {
  31. if (!is_dir(__DIR__.'/databases/cantedit'))
  32. {
  33. mkdir(__DIR__.'/databases/cantedit');
  34. }
  35. chmod(__DIR__.'/databases/cantedit', 0444);
  36. $db = new \Filebase\Database([
  37. 'dir' => __DIR__.'/databases/cantedit',
  38. 'read_only' => true
  39. ]);
  40. $this->assertEquals(true, true);
  41. chmod(__DIR__.'/databases/cantedit', 0777);
  42. rmdir(__DIR__.'/databases/cantedit');
  43. }
  44. public function testDatabaseReadOnlyDelete()
  45. {
  46. $this->expectException(\Exception::class);
  47. $db = new \Filebase\Database([
  48. 'dir' => __DIR__.'/databases'
  49. ]);
  50. $db->flush(true);
  51. $db->get('test1')->set(['key'=>'value'])->save();
  52. $db2 = new \Filebase\Database([
  53. 'dir' => __DIR__.'/databases',
  54. 'read_only' => true
  55. ]);
  56. $db2->get('test1')->delete();
  57. }
  58. public function testReadonlyBadFlush()
  59. {
  60. $this->expectException(\Exception::class);
  61. $db = new \Filebase\Database([
  62. 'dir' => __DIR__.'/databases',
  63. 'read_only' => true
  64. ]);
  65. $db->flush(true);
  66. }
  67. public function testReadonlyBadTurncate()
  68. {
  69. $this->expectException(\Exception::class);
  70. $db = new \Filebase\Database([
  71. 'dir' => __DIR__.'/databases',
  72. 'read_only' => true
  73. ]);
  74. $db->truncate();
  75. }
  76. public function testDatabaseBadSave()
  77. {
  78. $this->expectException(\Exception::class);
  79. $db = new \Filebase\Database([
  80. 'dir' => __DIR__.'/databases',
  81. 'read_only' => true
  82. ]);
  83. $db->get('test1')->set(['key'=>'value'])->save();
  84. }
  85. public function testMissingFormatClass()
  86. {
  87. $this->expectException(\Exception::class);
  88. $db = new \Filebase\Database([
  89. 'dir' => __DIR__.'/databases',
  90. 'format' => ''
  91. ]);
  92. }
  93. public function testBadFormatClass()
  94. {
  95. $this->expectException(\Exception::class);
  96. $db = new \Filebase\Database([
  97. 'dir' => __DIR__.'/databases',
  98. 'format' => badformat::class
  99. ]);
  100. }
  101. public function testDatabaseFlushTrue()
  102. {
  103. $db = new \Filebase\Database([
  104. 'dir' => __DIR__.'/databases'
  105. ]);
  106. $db->flush(true);
  107. $db->get('test1')->set(['key'=>'value'])->save();
  108. $db->get('test2')->set(['key'=>'value'])->save();
  109. // true for all documents to be deleted.
  110. $this->assertEquals(true, $db->flush(true));
  111. }
  112. public function testDatabaseTruncate()
  113. {
  114. $db = new \Filebase\Database([
  115. 'dir' => __DIR__.'/databases/test_delete'
  116. ]);
  117. $db->flush(true);
  118. $db->get('test1')->set(['key'=>'value'])->save();
  119. $db->get('test2')->set(['key'=>'value'])->save();
  120. $this->assertEquals(true, $db->truncate());
  121. $test = $db->get('test2');
  122. $this->assertEquals(null, $test->key);
  123. }
  124. public function testDatabaseFlushFalse()
  125. {
  126. $this->expectException(\Exception::class);
  127. $db = new \Filebase\Database([
  128. 'dir' => __DIR__.'/databases'
  129. ]);
  130. $db->flush(true);
  131. $db->get('test1')->set(['key'=>'value'])->save();
  132. $db->get('test2')->set(['key'=>'value'])->save();
  133. $db->flush();
  134. }
  135. public function testDatabaseFindAllSimple()
  136. {
  137. $db = new \Filebase\Database([
  138. 'dir' => __DIR__.'/databases'
  139. ]);
  140. $db->flush(true);
  141. $db->get('test1')->set(['key'=>'value'])->save();
  142. $db->get('test2')->set(['key'=>'value'])->save();
  143. $documents = $db->findAll(false);
  144. // should have 2 docs
  145. $this->assertEquals(2, count($documents));
  146. // check if these equal correctly
  147. $this->assertEquals('test1', $documents[0]);
  148. $this->assertEquals('test2', $documents[1]);
  149. $db->flush(true);
  150. }
  151. public function testDatabaseFindAllDataOnly()
  152. {
  153. $db = new \Filebase\Database([
  154. 'dir' => __DIR__.'/databases'
  155. ]);
  156. $db->flush(true);
  157. $db->get('test')->set(['key'=>'value'])->save();
  158. $documents = $db->findAll(true,true);
  159. // should only have 1 doc
  160. $this->assertEquals(1, count($documents));
  161. $this->assertEquals(['key'=>'value'], $documents[0]);
  162. $db->flush(true);
  163. }
  164. public function testDatabaseSavingNotEncodableDocument()
  165. {
  166. $this->expectException(SavingException::class);
  167. $db = new \Filebase\Database([
  168. 'dir' => __DIR__.'/databases'
  169. ]);
  170. $doc = $db->get("testDatabaseSavingNotEncodableDocument");
  171. // insert invalid utf-8 characters
  172. $doc->testProp = "\xB1\x31";
  173. $doc->save();
  174. }
  175. public function test_Call_Queryclass_methods_on_database_without_query_method()
  176. {
  177. $db = new \Filebase\Database([
  178. 'dir' => __DIR__.'/databases/saved',
  179. 'cache' => true
  180. ]);
  181. $db->flush(true);
  182. for ($x = 1; $x <= 10; $x++)
  183. {
  184. $user = $db->get(uniqid());
  185. $user->name = 'John';
  186. $user->email = 'john@example.com';
  187. $user->save();
  188. }
  189. $results = $db->where('name','=','John')->andWhere('email','==','john@example.com')->resultDocuments();
  190. $result_from_cache = $db->where('name','=','John')->andWhere('email','==','john@example.com')->resultDocuments();
  191. $this->assertEquals(10, count($results));
  192. $this->assertEquals(true, ($result_from_cache[0]->isCache()));
  193. $id = $result_from_cache[0]->getId();
  194. $id2 = $result_from_cache[1]->getId();
  195. // Change the name
  196. $result_from_cache[0]->name = 'Tim';
  197. $result_from_cache[0]->save();
  198. $results = $db
  199. ->where('name','=','John')
  200. ->andWhere('email','==','john@example.com')
  201. ->resultDocuments();
  202. $this->assertEquals($id2, $results[0]->getId());
  203. $this->assertEquals('John', $results[0]->name);
  204. $db->flush(true);
  205. }
  206. public function test_must_return_exception_on_non_exist_method()
  207. {
  208. $db = new \Filebase\Database([
  209. 'dir' => __DIR__.'/databases/saved',
  210. 'cache' => true
  211. ]);
  212. $this->expectException(\BadMethodCallException::class);
  213. $results = $db->none('name','=','John')->andWhere('email','==','john@example.com')->resultDocuments();
  214. }
  215. /**
  216. * based on issue #41
  217. * results() returns document instead of array #41
  218. */
  219. public function test_must_return_array_on_select_an_culomn_from_cache()
  220. {
  221. $db = new \Filebase\Database([
  222. 'dir' => __DIR__.'/databases/saved',
  223. 'cache' => true
  224. ]);
  225. $db->flush(true);
  226. for ($x = 1; $x <= 10; $x++)
  227. {
  228. $user = $db->get(uniqid());
  229. $user->name = 'John';
  230. $user->email = 'john@example.com';
  231. $user->save();
  232. }
  233. $db->where('name','=','John')->andWhere('email','==','john@example.com')->select('email')->results();
  234. $result_from_cache = $db->where('name','=','John')->andWhere('email','==','john@example.com')->select('email')->results();
  235. $this->assertCount(10,$result_from_cache);
  236. $this->assertEquals(['email'=>'john@example.com'],$result_from_cache[0]);
  237. $this->assertInternalType('array', $result_from_cache[0]);
  238. $this->assertInternalType('string', $result_from_cache[0]['email']);
  239. $db->flush(true);
  240. }
  241. }