DatabaseTest.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. <?php
  2. require __DIR__ . "/../../vendor/autoload.php";
  3. use GuzzleHttp\Client;
  4. use GuzzleHttp\Handler\MockHandler;
  5. use GuzzleHttp\HandlerStack;
  6. use GuzzleHttp\Psr7\Response;
  7. use GuzzleHttp\Psr7\Request;
  8. use GuzzleHttp\Exception\RequestException;
  9. class DatabaseTest extends \PHPUnit\Framework\TestCase
  10. {
  11. public function setUp() {
  12. // offer a use_response for when selecting this database
  13. $egdb1 = '{"db_name":"egdb","update_seq":"0-g1AAAABXeJzLYWBgYMpgTmEQTM4vTc5ISXLIyU9OzMnILy7JAUklMiTV____PyuRAY-iPBYgydAApP5D1GYBAJmvHGw","sizes":{"file":8488,"external":0,"active":0},"purge_seq":0,"other":{"data_size":0},"doc_del_count":0,"doc_count":0,"disk_size":8488,"disk_format_version":6,"data_size":0,"compact_running":false,"instance_start_time":"0"}';
  14. $this->use_response = new Response(200, [], $egdb1);
  15. }
  16. public function testGetAllDocs() {
  17. $docs = '{"total_rows":2,"offset":0,"rows":[
  18. {"id":"95613816b3a7490727388ebb470001a6","key":"95613816b3a7490727388ebb470001a6","value":{"rev":"1-71e39cb1ac06a5974a16c72b26969009"},"doc":{"_id":"95613816b3a7490727388ebb470001a6","_rev":"1-71e39cb1ac06a5974a16c72b26969009","sound":"squeak"}},
  19. {"id":"95613816b3a7490727388ebb4700165a","key":"95613816b3a7490727388ebb4700165a","value":{"rev":"1-1ed93c4b346f531c5e7d4d69b755ee71"},"doc":{"_id":"95613816b3a7490727388ebb4700165a","_rev":"1-1ed93c4b346f531c5e7d4d69b755ee71","noise":"pop"}}
  20. ]}';
  21. $docs_response = new Response(200, [], $docs);
  22. $mock = new MockHandler([ $this->use_response, $docs_response ]);
  23. $handler = HandlerStack::create($mock);
  24. $client = new Client(['handler' => $handler]);
  25. // userland code starts
  26. $server = new \PHPCouchDB\Server([\PHPCouchDB\Server::OPTION_CLIENT => $client]);
  27. $database = $server->useDB([\PHPCouchDB\Server::OPTION_NAME => "egdb"]);
  28. $docs = $database->getAllDocs();
  29. $this->assertInternalType('array', $docs);
  30. $this->assertInstanceOf('\PHPCouchDB\Document', $docs[0]);
  31. }
  32. public function testGetAllDocsWithNoDocs() {
  33. $docs = '{"total_rows":0,"offset":0,"rows":[
  34. ]}';
  35. $docs_response = new Response(200, [], $docs);
  36. $mock = new MockHandler([ $this->use_response, $docs_response ]);
  37. $handler = HandlerStack::create($mock);
  38. $client = new Client(['handler' => $handler]);
  39. // userland code starts
  40. $server = new \PHPCouchDB\Server([\PHPCouchDB\Server::OPTION_CLIENT => $client]);
  41. $database = $server->useDB([\PHPCouchDB\Server::OPTION_NAME => "egdb"]);
  42. $docs = $database->getAllDocs();
  43. $this->assertInternalType('array', $docs);
  44. $this->assertEmpty($docs);
  45. }
  46. public function testCreateWithID() {
  47. $create = '{"ok":true,"id":"abcde12345","rev":"1-928ec193918889e122e7ad45cfd88e47"}';
  48. $create_response = new Response(201, [], $create);
  49. $mock = new MockHandler([ $this->use_response, $create_response ]);
  50. $handler = HandlerStack::create($mock);
  51. $client = new Client(['handler' => $handler]);
  52. // userland code starts
  53. $server = new \PHPCouchDB\Server([\PHPCouchDB\Server::OPTION_CLIENT => $client]);
  54. $database = $server->useDB([\PHPCouchDB\Server::OPTION_NAME => "egdb"]);
  55. $doc = $database->create(["noise" => "howl", "id" => "abcde12345"]);
  56. $this->assertInstanceOf('PHPCouchDB\Document', $doc);
  57. $this->assertObjectHasAttribute('id', $doc);
  58. $this->assertEquals("abcde12345", $doc->id);
  59. }
  60. public function testCreateWithoutID() {
  61. $create = '{"ok":true,"id":"95613816b3a7490727388ebb47002c0f","rev":"1-928ec193918889e122e7ad45cfd88e47"}';
  62. $create_response = new Response(201, [], $create);
  63. $mock = new MockHandler([ $this->use_response, $create_response ]);
  64. $handler = HandlerStack::create($mock);
  65. $client = new Client(['handler' => $handler]);
  66. // userland code starts
  67. $server = new \PHPCouchDB\Server([\PHPCouchDB\Server::OPTION_CLIENT => $client]);
  68. $database = $server->useDB([\PHPCouchDB\Server::OPTION_NAME => "egdb"]);
  69. $doc = $database->create(["noise" => "howl"]);
  70. $this->assertInstanceOf('PHPCouchDB\Document', $doc);
  71. $this->assertObjectHasAttribute('id', $doc);
  72. }
  73. public function testGetDocById() {
  74. // create the doc with the id (which also triggers a fetch), then fetch it
  75. $create = '{"ok":true,"id":"95613816b3a7490727388ebb47002c0f","rev":"1-928ec193918889e122e7ad45cfd88e47"}';
  76. $create_response = new Response(201, [], $create);
  77. $fetch = '{"_id":"95613816b3a7490727388ebb47002c0f","_rev":"1-928ec193918889e122e7ad45cfd88e47","noise":"howl"}';
  78. $fetch_response = new Response(200, [], $fetch);
  79. $mock = new MockHandler([ $this->use_response, $create_response, $fetch_response, $fetch_response ]);
  80. $handler = HandlerStack::create($mock);
  81. $client = new Client(['handler' => $handler]);
  82. // userland code starts
  83. $server = new \PHPCouchDB\Server([\PHPCouchDB\Server::OPTION_CLIENT => $client]);
  84. $database = $server->useDB([\PHPCouchDB\Server::OPTION_NAME => "egdb"]);
  85. $doc = $database->create(["noise" => "crackle"]);
  86. $fetched_doc = $database->getDocById($doc->id);
  87. $this->assertInstanceOf('PHPCouchDB\Document', $fetched_doc);
  88. $this->assertObjectHasAttribute('id', $fetched_doc);
  89. }
  90. public function testGetName() {
  91. $mock = new MockHandler([ $this->use_response ]);
  92. $handler = HandlerStack::create($mock);
  93. $client = new Client(['handler' => $handler]);
  94. // userland code starts
  95. $server = new \PHPCouchDB\Server([\PHPCouchDB\Server::OPTION_CLIENT => $client]);
  96. $database = $server->useDB([\PHPCouchDB\Server::OPTION_NAME => "egdb"]);
  97. $this->assertInternalType('string', $database->getName());
  98. }
  99. public function testGetClient() {
  100. $mock = new MockHandler([ $this->use_response ]);
  101. $handler = HandlerStack::create($mock);
  102. $client = new Client(['handler' => $handler]);
  103. // userland code starts
  104. $server = new \PHPCouchDB\Server([\PHPCouchDB\Server::OPTION_CLIENT => $client]);
  105. $database = $server->useDB([\PHPCouchDB\Server::OPTION_NAME => "egdb"]);
  106. $this->assertInstanceOf('\GuzzleHttp\ClientInterface', $database->getClient());
  107. }
  108. public function testAllDocsWithoutIncludeDocs() {
  109. $docs = '{"total_rows":88378,"offset":0,"rows":[
  110. {"id":"27881d866ac53784daebdd4fd3036986","key":"27881d866ac53784daebdd4fd3036986","value":{"rev":"1-d3d95288556bb4875daa17ab81b21813"}},
  111. {"id":"27881d866ac53784daebdd4fd3037731","key":"27881d866ac53784daebdd4fd3037731","value":{"rev":"1-4ccc2e75f0328ac53b852684f303906f"}}
  112. ]}';
  113. $docs_response = new Response(200, [], $docs);
  114. $mock = new MockHandler([ $this->use_response, $docs_response ]);
  115. $handler = HandlerStack::create($mock);
  116. $client = new Client(['handler' => $handler]);
  117. // userland code starts
  118. $server = new \PHPCouchDB\Server([\PHPCouchDB\Server::OPTION_CLIENT => $client]);
  119. $database = $server->useDB([\PHPCouchDB\Server::OPTION_NAME => "egdb"]);
  120. $docs = $database->getAllDocs([\PHPCouchDB\Database::OPTION_INCLUDE_DOCS => false]);
  121. $this->assertInternalType('array', $docs);
  122. $this->assertInternalType('array', $docs[0]);
  123. $this->assertArrayHasKey('id', $docs[0]);
  124. $this->assertArrayHasKey('rev', $docs[0]);
  125. }
  126. public function testView() {
  127. $view = '{"rows":[
  128. {"key":"2012","value":34028},
  129. {"key":"2013","value":33023},
  130. {"key":"2014","value":21324}
  131. ]}';
  132. $view_response = new Response(200, [], $view);
  133. $mock = new MockHandler([ $this->use_response, $view_response ]);
  134. $handler = HandlerStack::create($mock);
  135. $client = new Client(['handler' => $handler]);
  136. // userland code starts
  137. $server = new \PHPCouchDB\Server([\PHPCouchDB\Server::OPTION_CLIENT => $client]);
  138. $database = $server->useDB([\PHPCouchDB\Server::OPTION_NAME => "egdb"]);
  139. $docs = $database->getView([
  140. \PHPCouchDB\Database::OPTION_DDOC => "myview",
  141. \PHPCouchDB\Database::OPTION_VIEW => "year",
  142. "group" => true
  143. ]);
  144. $this->assertInternalType('array', $docs);
  145. $this->assertEquals(3, count($docs));
  146. $this->assertInternalType('array', $docs[0]);
  147. }
  148. public function testViewWithIncludeDocs() {
  149. $view = '{"total_rows":88375,"offset":0,"rows":[
  150. {"id":"27881d866ac53784daebdd4fd3036986","key":"2012","value":1,"doc":{"_id":"27881d866ac53784daebdd4fd3036986","_rev":"1-d3d95288556bb4875daa17ab81b21813","Retailer country":"Italy","Order method type":"Sales visit","Retailer type":"Warehouse Store","Product line":"Camping Equipment","Product type":"Lanterns","Product":"EverGlow Single","Year":"2012","Quarter":"Q1 2012","Revenue":"15130.95","Quantity":"447","Gross margin":"0.46706056"}},
  151. {"id":"27881d866ac53784daebdd4fd3037731","key":"2012","value":1,"doc":{"_id":"27881d866ac53784daebdd4fd3037731","_rev":"1-4ccc2e75f0328ac53b852684f303906f","Retailer country":"Italy","Order method type":"Sales visit","Retailer type":"Warehouse Store","Product line":"Personal Accessories","Product type":"Knives","Product":"Single Edge","Year":"2012","Quarter":"Q1 2012","Revenue":"37411.15","Quantity":"3115","Gross margin":"0.28726062"}},
  152. {"id":"27881d866ac53784daebdd4fd30378ed","key":"2012","value":1,"doc":{"_id":"27881d866ac53784daebdd4fd30378ed","_rev":"1-d10f91c4f214cc96bd7bf5d38943693f","Retailer country":"Italy","Order method type":"Sales visit","Retailer type":"Warehouse Store","Product line":"Personal Accessories","Product type":"Knives","Product":"Double Edge","Year":"2012","Quarter":"Q1 2012","Revenue":"9151.38","Quantity":"567","Gross margin":"0.29182156"}}
  153. ]}';
  154. $view_response = new Response(200, [], $view);
  155. $mock = new MockHandler([ $this->use_response, $view_response ]);
  156. $handler = HandlerStack::create($mock);
  157. $client = new Client(['handler' => $handler]);
  158. // userland code starts
  159. $server = new \PHPCouchDB\Server([\PHPCouchDB\Server::OPTION_CLIENT => $client]);
  160. $database = $server->useDB([\PHPCouchDB\Server::OPTION_NAME => "egdb"]);
  161. $docs = $database->getView([
  162. \PHPCouchDB\Database::OPTION_DDOC => "myview",
  163. \PHPCouchDB\Database::OPTION_VIEW => "year",
  164. "reduce" => false,
  165. "limit" => 3,
  166. \PHPCouchDB\Database::OPTION_INCLUDE_DOCS => true
  167. ]);
  168. $this->assertInternalType('array', $docs);
  169. $this->assertEquals(3, count($docs));
  170. $this->assertInstanceOf('PHPCouchDB\Document', $docs[0]);
  171. $this->assertObjectHasAttribute('Product type', $docs[0]);
  172. }
  173. }