/tests/Unit/RepositoryTest.php

https://github.com/awes-io/repository · PHP · 444 lines · 285 code · 131 blank · 28 comment · 0 complexity · f9b0b99fa7a285332b17b3fe28d8a1c2 MD5 · raw file

  1. <?php
  2. namespace AwesIO\Repository\Tests\Unit;
  3. use AwesIO\Repository\Tests\TestCase;
  4. use Illuminate\Support\Facades\Request;
  5. use AwesIO\Repository\Tests\Stubs\Model;
  6. use AwesIO\Repository\Criteria\FindWhere;
  7. use AwesIO\Repository\Tests\Stubs\Submodel;
  8. use Illuminate\Database\Eloquent\Collection;
  9. use AwesIO\Repository\Tests\Stubs\Repository;
  10. use Illuminate\Contracts\Pagination\Paginator;
  11. use AwesIO\Repository\Tests\Stubs\InvalidRepository;
  12. use Illuminate\Database\Eloquent\Model as BaseModel;
  13. use AwesIO\Repository\Exceptions\RepositoryException;
  14. use Illuminate\Database\Eloquent\ModelNotFoundException;
  15. use Illuminate\Contracts\Pagination\LengthAwarePaginator;
  16. use Illuminate\Database\Eloquent\Relations\BelongsToMany;
  17. use AwesIO\Repository\Contracts\RepositoryInterface;
  18. class RepositoryTest extends TestCase
  19. {
  20. /** @test */
  21. public function it_has_model_entity()
  22. {
  23. $repository = new Repository;
  24. $this->assertEquals(Model::class, $repository->entity());
  25. }
  26. /** @test */
  27. public function it_gets_collection()
  28. {
  29. $repository = new Repository;
  30. $this->assertInstanceOf(Collection::class, $repository->get());
  31. }
  32. /** @test */
  33. public function it_gets_first_model()
  34. {
  35. $model = factory(Model::class)->create();
  36. $repository = new Repository;
  37. $this->assertInstanceOf(BaseModel::class, $result = $repository->first());
  38. $this->assertEquals($model->name, $result->name);
  39. }
  40. /** @test */
  41. public function it_finds_model()
  42. {
  43. $model = factory(Model::class)->create();
  44. $repository = new Repository;
  45. $this->assertInstanceOf(BaseModel::class, $result = $repository->find($model->id));
  46. $this->assertEquals($model->name, $result->name);
  47. }
  48. /** @test */
  49. public function it_finds_model_by_where_clauses()
  50. {
  51. $model = factory(Model::class)->create();
  52. $repository = new Repository;
  53. $this->assertInstanceOf(Collection::class, $results = $repository->findWhere([
  54. 'name' => $model->name
  55. ]));
  56. $this->assertEquals($model->id, $results->first()->id);
  57. }
  58. /** @test */
  59. public function it_resets_model()
  60. {
  61. $model1 = factory(Model::class)->create();
  62. $model2 = factory(Model::class)->create();
  63. $repository = new Repository;
  64. $results1 = $repository->findWhere([
  65. 'name' => $model1->name
  66. ]);
  67. $results2 = $repository->findWhere([
  68. 'name' => $model2->name
  69. ]);
  70. $this->assertEquals($model1->id, $results1->first()->id);
  71. $this->assertEquals($model2->id, $results2->first()->id);
  72. }
  73. /** @test */
  74. public function it_uses_criteria()
  75. {
  76. $model = factory(Model::class)->create();
  77. $repository = new Repository;
  78. $results = $repository->withCriteria([
  79. new FindWhere([
  80. 'name' => $model->name
  81. ])
  82. ])->get();
  83. $this->assertEquals($model->id, $results->first()->id);
  84. }
  85. /** @test */
  86. public function it_scopes_request()
  87. {
  88. $model1 = factory(Model::class)->create();
  89. $model2 = factory(Model::class)->create();
  90. $repository = new Repository;
  91. $repository->searchable = [
  92. 'name',
  93. ];
  94. $request = Request::create(
  95. '/',
  96. 'GET',
  97. ['name' => $model2->name]
  98. );
  99. $results = $repository->scope($request)->get();
  100. $this->assertEquals($model2->id, $results->first()->id);
  101. }
  102. /** @test */
  103. public function it_throws_exception_if_entity_doesnt_belong_to_valid_class()
  104. {
  105. $this->expectException(RepositoryException::class);
  106. $repository = new InvalidRepository;
  107. }
  108. /** @test */
  109. public function it_paginates()
  110. {
  111. $model = factory(Model::class, 10)->create();
  112. $repository = new Repository;
  113. $this->assertInstanceOf(LengthAwarePaginator::class, $results = $repository->paginate());
  114. }
  115. /** @test */
  116. public function it_simple_paginates()
  117. {
  118. $model = factory(Model::class, 10)->create();
  119. $repository = new Repository;
  120. $this->assertInstanceOf(Paginator::class, $results = $repository->simplePaginate());
  121. }
  122. /** @test */
  123. public function it_creates_new_record()
  124. {
  125. $model = factory(Model::class)->make();
  126. $repository = new Repository;
  127. $results = $repository->create($model->getAttributes());
  128. $this->assertDatabaseHas('models', [
  129. 'name' => $model->name
  130. ]);
  131. }
  132. /** @test */
  133. public function it_updates_existing_record()
  134. {
  135. $model = factory(Model::class)->create();
  136. $repository = new Repository;
  137. $results = $repository->update([
  138. 'name' => $name = uniqid()
  139. ], $model->id);
  140. $this->assertDatabaseHas('models', [
  141. 'name' => $name
  142. ]);
  143. }
  144. /** @test */
  145. public function it_destroys_existing_record_by_id()
  146. {
  147. $model = factory(Model::class)->create();
  148. $this->assertDatabaseHas('models', [
  149. 'name' => $model->name
  150. ]);
  151. $repository = new Repository;
  152. $results = $repository->destroy($model->id);
  153. $this->assertDatabaseMissing('models', [
  154. 'name' => $model->name
  155. ]);
  156. }
  157. /** @test */
  158. public function it_attaches_model_to_parent()
  159. {
  160. $model = factory(Model::class)->create();
  161. $submodel = factory(Submodel::class)->create();
  162. $repository = new Repository;
  163. $repository->attach($model->id, 'submodels', $submodel->id);
  164. $this->assertDatabaseHas('model_submodel', [
  165. 'model_id' => $model->id,
  166. 'submodel_id' => $submodel->id
  167. ]);
  168. }
  169. /** @test */
  170. public function it_detaches_model_from_parent()
  171. {
  172. $model = factory(Model::class)->create();
  173. $submodel = factory(Submodel::class)->create();
  174. $repository = new Repository;
  175. $repository->attach($model->id, 'submodels', $submodel->id);
  176. $this->assertDatabaseHas('model_submodel', [
  177. 'model_id' => $model->id,
  178. 'submodel_id' => $submodel->id
  179. ]);
  180. $repository->detach($model->id, 'submodels', $submodel->id);
  181. $this->assertDatabaseMissing('model_submodel', [
  182. 'model_id' => $model->id,
  183. 'submodel_id' => $submodel->id
  184. ]);
  185. }
  186. /** @test */
  187. public function it_finds_or_fails()
  188. {
  189. $model = factory(Model::class)->create();
  190. $repository = new Repository;
  191. $result = $repository->findOrFail($model->id);
  192. $this->assertEquals($model->name, $result->name);
  193. $this->expectException(ModelNotFoundException::class);
  194. $repository->findOrFail($model->id + 1);
  195. }
  196. /** @test */
  197. public function it_finds_and_returns_respository_instance_or_fails()
  198. {
  199. $model = factory(Model::class, 20)->create();
  200. $repository = new Repository;
  201. $result = $repository->findOrFailRepo($model->first()->id);
  202. $this->assertInstanceOf(RepositoryInterface::class, $result);
  203. $this->expectException(ModelNotFoundException::class);
  204. $repository->findOrFailRepo(22);
  205. }
  206. /** @test */
  207. public function it_finds_first_or_fails()
  208. {
  209. $model = factory(Model::class)->create();
  210. $repository = new Repository;
  211. $result = $repository->where('id', $model->id)->firstOrFail();
  212. $this->assertInstanceOf(Model::class, $result);
  213. $this->assertEquals($model->name, $result->name);
  214. $this->expectException(ModelNotFoundException::class);
  215. $repository->where('id', $model->id + 1)->firstOrFail();
  216. }
  217. /** @test */
  218. public function it_can_smart_paginate()
  219. {
  220. $model = factory(Model::class, 20)->create();
  221. $repository = new Repository;
  222. $result = $repository->smartPaginate();
  223. $this->assertInstanceOf(LengthAwarePaginator::class, $result);
  224. }
  225. /** @test */
  226. public function it_can_smart_paginate_by_default_limit()
  227. {
  228. $model = factory(Model::class, 20)->create();
  229. $repository = new Repository;
  230. $result = $repository->smartPaginate();
  231. $this->assertEquals(
  232. config('awesio-repository.smart_paginate.default_limit'),
  233. $result->perPage()
  234. );
  235. }
  236. /** @test */
  237. public function it_can_smart_paginate_by_limit_parameter_if_its_less_or_equals_max_limit()
  238. {
  239. $model = factory(Model::class, 20)->create();
  240. $repository = new Repository;
  241. request()->merge([
  242. config('awesio-repository.smart_paginate.request_parameter') => $limit = random_int(
  243. 1, config('awesio-repository.smart_paginate.max_limit')
  244. )
  245. ]);
  246. $result = $repository->smartPaginate();
  247. $this->assertEquals($limit, $result->perPage());
  248. }
  249. /** @test */
  250. public function it_can_smart_paginate_by_max_limit()
  251. {
  252. $model = factory(Model::class, 20)->create();
  253. $repository = new Repository;
  254. request()->merge([
  255. config('awesio-repository.smart_paginate.request_parameter') => $limit = random_int(
  256. $max = config('awesio-repository.smart_paginate.max_limit'), $max + 1000
  257. )
  258. ]);
  259. $result = $repository->smartPaginate();
  260. $this->assertEquals($max, $result->perPage());
  261. }
  262. /** @test */
  263. public function it_can_smart_paginate_if_request_parametert_is_string()
  264. {
  265. $model = factory(Model::class, 20)->create();
  266. $repository = new Repository;
  267. request()->merge([
  268. config('awesio-repository.smart_paginate.request_parameter') => 'string'
  269. ]);
  270. $result = $repository->smartPaginate();
  271. $this->assertEquals(15, $result->perPage());
  272. }
  273. /** @test */
  274. public function it_executes_model_scopes()
  275. {
  276. $model = factory(Model::class)->create([
  277. 'name' => $name = uniqid()
  278. ]);
  279. $repository = new Repository;
  280. $result = $repository->name($name)->get();
  281. $this->assertEquals($name, $result->first()->name);
  282. }
  283. /** @test */
  284. public function it_executes_model_methods()
  285. {
  286. $model = factory(Model::class)->create();
  287. $repository = new Repository;
  288. $result = $repository->submodels();
  289. $this->assertInstanceOf(Repository::class, $result);
  290. }
  291. /** @test */
  292. public function it_returns_model_props()
  293. {
  294. $model = factory(Model::class)->create();
  295. $model->submodels()->save(
  296. $submodel = factory(Submodel::class)->create()
  297. );
  298. $repository = new Repository;
  299. $result = $repository->findOrFailRepo($model->id)->submodels;
  300. $this->assertInstanceOf(Submodel::class, $result->first());
  301. $this->assertEquals($submodel->name, $result->first()->name);
  302. }
  303. /** @test */
  304. public function it_orders_by()
  305. {
  306. factory(Model::class, 5)->create();
  307. $repository = new Repository;
  308. $results = $repository->get();
  309. $this->assertEquals(1, $results->first()->id);
  310. $results = $repository->orderBy('id', 'desc')->get();
  311. $this->assertEquals(5, $results->first()->id);
  312. }
  313. }