ClientTest.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. <?php
  2. declare(strict_types=1);
  3. namespace Tests\Endpoints;
  4. use MeiliSearch\Client;
  5. use MeiliSearch\Endpoints\Indexes;
  6. use MeiliSearch\Exceptions\ApiException;
  7. use Tests\TestCase;
  8. final class ClientTest extends TestCase
  9. {
  10. public function testGetAllIndexesWhenEmpty(): void
  11. {
  12. $response = $this->client->getAllIndexes();
  13. $this->assertIsArray($response);
  14. $this->assertEmpty($response);
  15. }
  16. public function testCreateIndexWithOnlyUid(): void
  17. {
  18. $index = $this->client->createIndex('index');
  19. $this->assertInstanceOf(Indexes::class, $index);
  20. $this->assertSame('index', $index->getUid());
  21. $this->assertNull($index->getPrimaryKey());
  22. }
  23. public function testCreateIndexWithUidAndPrimaryKey(): void
  24. {
  25. $index = $this->client->createIndex(
  26. 'index',
  27. ['primaryKey' => 'ObjectId']
  28. );
  29. $this->assertInstanceOf(Indexes::class, $index);
  30. $this->assertSame('index', $index->getUid());
  31. $this->assertSame('ObjectId', $index->getPrimaryKey());
  32. }
  33. public function testCreateIndexWithUidInOptions(): void
  34. {
  35. $index = $this->client->createIndex(
  36. 'index',
  37. [
  38. 'uid' => 'wrong',
  39. 'primaryKey' => 'ObjectId',
  40. ]
  41. );
  42. $this->assertInstanceOf(Indexes::class, $index);
  43. $this->assertSame('index', $index->getUid());
  44. $this->assertSame('ObjectId', $index->getPrimaryKey());
  45. }
  46. public function testGetAllIndexes(): void
  47. {
  48. $indexA = 'indexA';
  49. $indexB = 'indexB';
  50. $this->client->createIndex($indexA);
  51. $this->client->createIndex($indexB);
  52. $response = $this->client->getAllIndexes();
  53. $this->assertIsArray($response);
  54. $this->assertCount(2, $response);
  55. $uids = array_map(function ($index) {
  56. return $index->getUid();
  57. }, $response);
  58. $this->assertContains($indexA, $uids);
  59. $this->assertContains($indexB, $uids);
  60. }
  61. public function testUpdateIndex(): void
  62. {
  63. $this->client->createIndex('indexA');
  64. $index = $this->client->updateIndex('indexA', ['primaryKey' => 'id']);
  65. $this->assertInstanceOf(Indexes::class, $index);
  66. $this->assertSame($index->getPrimaryKey(), 'id');
  67. $this->assertSame($index->getUid(), 'indexA');
  68. }
  69. public function testDeleteIndex(): void
  70. {
  71. $this->client->createIndex('index');
  72. $response = $this->client->getAllIndexes();
  73. $this->assertCount(1, $response);
  74. $response = $this->client->deleteIndex('index');
  75. $this->assertEmpty($response);
  76. $response = $this->client->getAllIndexes();
  77. $this->assertCount(0, $response);
  78. }
  79. public function testDeleteAllIndexes(): void
  80. {
  81. $this->client->createIndex('index-1');
  82. $this->client->createIndex('index-2');
  83. $response = $this->client->getAllIndexes();
  84. $this->assertCount(2, $response);
  85. $this->client->deleteAllIndexes();
  86. $response = $this->client->getAllIndexes();
  87. $this->assertCount(0, $response);
  88. }
  89. public function testDeleteAllIndexesWhenThereAreNoIndexes(): void
  90. {
  91. $response = $this->client->getAllIndexes();
  92. $this->assertCount(0, $response);
  93. $this->client->deleteAllIndexes();
  94. $this->assertCount(0, $response);
  95. }
  96. public function testGetIndex(): void
  97. {
  98. $this->client->createIndex('index');
  99. $index = $this->client->getIndex('index');
  100. $this->assertInstanceOf(Indexes::class, $index);
  101. $this->assertSame('index', $index->getUid());
  102. $this->assertNull($index->getPrimaryKey());
  103. }
  104. public function testIndex(): void
  105. {
  106. $this->client->createIndex('index');
  107. $index = $this->client->index('index');
  108. $this->assertInstanceOf(Indexes::class, $index);
  109. $this->assertSame('index', $index->getUid());
  110. $this->assertNull($index->getPrimaryKey());
  111. }
  112. public function testGetOrCreateIndexWithOnlyUid(): void
  113. {
  114. $index = $this->client->getOrCreateIndex('index');
  115. $this->assertInstanceOf(Indexes::class, $index);
  116. $this->assertSame('index', $index->getUid());
  117. $this->assertNull($index->getPrimaryKey());
  118. }
  119. public function testGetOrCreateIndexWithUidAndPrimaryKey(): void
  120. {
  121. $index = $this->client->getOrCreateIndex(
  122. 'index',
  123. ['primaryKey' => 'ObjectId']
  124. );
  125. $this->assertInstanceOf(Indexes::class, $index);
  126. $this->assertSame('index', $index->getUid());
  127. $this->assertSame('ObjectId', $index->getPrimaryKey());
  128. }
  129. public function testGetOrCreateIndexWithUidInOptions(): void
  130. {
  131. $index = $this->client->getOrCreateIndex(
  132. 'index',
  133. [
  134. 'uid' => 'wrong',
  135. 'primaryKey' => 'ObjectId',
  136. ]
  137. );
  138. $this->assertInstanceOf(Indexes::class, $index);
  139. $this->assertSame('index', $index->getUid());
  140. $this->assertSame('ObjectId', $index->getPrimaryKey());
  141. }
  142. public function testGetOrCreateWithIndexAlreadyExists(): void
  143. {
  144. $index1 = $this->client->getOrCreateIndex('index');
  145. $index2 = $this->client->getOrCreateIndex('index');
  146. $index3 = $this->client->getOrCreateIndex('index');
  147. $this->assertSame('index', $index1->getUid());
  148. $this->assertSame('index', $index2->getUid());
  149. $this->assertSame('index', $index3->getUid());
  150. $update = $index1->addDocuments([['book_id' => 1, 'name' => 'Some book']]);
  151. $index1->waitForPendingUpdate($update['updateId']);
  152. $documents = $index2->getDocuments();
  153. $this->assertCount(1, $documents);
  154. $index2->delete();
  155. }
  156. public function testExceptionIsThrownWhenOverwritingPrimaryKeyUsingUpdateIndex(): void
  157. {
  158. $this->client->createIndex(
  159. 'indexB',
  160. ['primaryKey' => 'objectId']
  161. );
  162. $this->expectException(ApiException::class);
  163. $this->client->updateIndex('indexB', ['primaryKey' => 'objectID']);
  164. }
  165. public function testExceptionIsThrownWhenUpdateIndexUseANoneExistingIndex(): void
  166. {
  167. $this->expectException(ApiException::class);
  168. $this->client->updateIndex(
  169. 'IndexNotExist',
  170. ['primaryKey' => 'objectId']
  171. );
  172. }
  173. public function testExceptionIfUidTakenWhenCreating(): void
  174. {
  175. $this->client->createIndex('index');
  176. $this->expectException(ApiException::class);
  177. $this->client->createIndex('index');
  178. }
  179. public function testExceptionIfUidIsNullWhenCreating(): void
  180. {
  181. $this->expectException(\TypeError::class);
  182. $this->client->createIndex(null);
  183. }
  184. public function testExceptionIfUidIsEmptyStringWhenCreating(): void
  185. {
  186. $this->expectException(ApiException::class);
  187. $this->client->createIndex('');
  188. }
  189. public function testExceptionIfNoIndexWhenShowing(): void
  190. {
  191. $this->expectException(ApiException::class);
  192. $this->client->getIndex('a-non-existing-index');
  193. }
  194. public function testExceptionIfNoIndexWhenDeleting(): void
  195. {
  196. $this->expectException(ApiException::class);
  197. $this->client->deleteIndex('a-non-existing-index');
  198. }
  199. public function testHealth(): void
  200. {
  201. $response = $this->client->health();
  202. $this->assertEquals('available', $response['status']);
  203. }
  204. public function testIsHealthyIsTrue(): void
  205. {
  206. $response = $this->client->isHealthy();
  207. $this->assertTrue($response);
  208. }
  209. public function testIsHealthyIsFalse(): void
  210. {
  211. $client = new Client('http://127.0.0.1.com:1234', 'masterKey');
  212. $response = $client->isHealthy();
  213. $this->assertFalse($response);
  214. }
  215. public function testVersion(): void
  216. {
  217. $response = $this->client->version();
  218. $this->assertArrayHasKey('commitSha', $response);
  219. $this->assertArrayHasKey('buildDate', $response);
  220. $this->assertArrayHasKey('pkgVersion', $response);
  221. }
  222. public function testStats(): void
  223. {
  224. $response = $this->client->stats();
  225. $this->assertArrayHasKey('databaseSize', $response);
  226. $this->assertArrayHasKey('lastUpdate', $response);
  227. $this->assertArrayHasKey('indexes', $response);
  228. }
  229. public function testBadClientUrl(): void
  230. {
  231. try {
  232. $client = new Client('http://127.0.0.1.com:1234', 'some-key');
  233. $client->createIndex('index');
  234. } catch (\Exception $e) {
  235. $this->assertIsString($e->getMessage());
  236. return;
  237. }
  238. $this->fail('Bad client was accepted and the exception was not thrown');
  239. }
  240. }