Skip to content
This repository was archived by the owner on Aug 27, 2024. It is now read-only.

Commit 7b050c3

Browse files
author
Eugene Mosunov
committed
Add tests for repository factory and nested query builder in repository
1 parent 98f64eb commit 7b050c3

2 files changed

Lines changed: 212 additions & 0 deletions

File tree

tests/NestedQueryBuilderTest.php

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
<?php
2+
3+
namespace Saritasa\LaravelRepositories\Tests;
4+
5+
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
6+
use Illuminate\Database\Query\Builder as QueryBuilder;
7+
use InvalidArgumentException;
8+
use Mockery;
9+
use Mockery\MockInterface;
10+
use PHPUnit\Framework\TestCase;
11+
use Saritasa\LaravelRepositories\DTO\Criterion;
12+
use Saritasa\LaravelRepositories\Exceptions\RepositoryException;
13+
use Saritasa\LaravelRepositories\Repositories\Repository;
14+
15+
/**
16+
* Tests of repository correct building nested queries.
17+
*/
18+
class NestedQueryBuilderTest extends TestCase
19+
{
20+
/**
21+
* Tested repository.
22+
*
23+
* @var MockInterface|Repository
24+
*/
25+
protected $repositoryMock;
26+
27+
/**
28+
* Query builder instance.
29+
*
30+
* @var MockInterface|QueryBuilder
31+
*/
32+
protected $queryMock;
33+
34+
/**
35+
* Wrapper of query builder instance.
36+
*
37+
* @var MockInterface|EloquentBuilder
38+
*/
39+
protected $builder;
40+
41+
/**
42+
* Set up test parameters.
43+
*
44+
* @return void
45+
*
46+
* @throws InvalidArgumentException
47+
*/
48+
public function setUp(): void
49+
{
50+
parent::setUp();
51+
$this->repositoryMock = Mockery::mock(Repository::class)
52+
->shouldAllowMockingProtectedMethods()
53+
->makePartial();
54+
$this->queryMock = Mockery::mock(QueryBuilder::class);
55+
$this->builder = Mockery::mock(EloquentBuilder::class);
56+
$this->builder->shouldReceive('getQuery')->andReturn($this->queryMock);
57+
$this->repositoryMock->shouldReceive('query')->andReturn($this->builder);
58+
}
59+
60+
/**
61+
* Tests that checks that top level criteria being processed correctly.
62+
*
63+
* @return void
64+
*
65+
* @throws InvalidArgumentException
66+
* @throws RepositoryException
67+
*/
68+
public function testCriteriaBuildingWithOnlyTopLevelCriteria(): void
69+
{
70+
$nestedQueryMock = Mockery::mock(QueryBuilder::class);
71+
$nestedQueryMock->shouldReceive('where')->andReturnUsing(
72+
function (string $field, string $operator, $value, string $boolean) {
73+
$this->assertEquals('value1', $value);
74+
$this->assertEquals('field1', $field);
75+
$this->assertEquals('=', $operator);
76+
$this->assertEquals('and', $boolean);
77+
},
78+
function (string $field, string $operator, $value, string $boolean) {
79+
$this->assertEquals(false, $value);
80+
$this->assertEquals('field2', $field);
81+
$this->assertEquals('<>', $operator);
82+
$this->assertEquals('and', $boolean);
83+
},
84+
function (string $field, string $operator, $value, string $boolean) {
85+
$this->assertEquals(null, $value);
86+
$this->assertEquals('field3', $field);
87+
$this->assertEquals('>', $operator);
88+
$this->assertEquals('or', $boolean);
89+
},
90+
function (string $field, string $operator, $value, string $boolean) {
91+
$this->assertEquals(999, $value);
92+
$this->assertEquals('field4', $field);
93+
$this->assertEquals('<=', $operator);
94+
$this->assertEquals('and', $boolean);
95+
}
96+
);
97+
$nestedQueryMock->shouldReceive('whereIn')->andReturnUsing(
98+
function (string $field, array $values, string $boolean) {
99+
$this->assertEquals([1, 2], $values);
100+
$this->assertEquals('field5', $field);
101+
$this->assertEquals('or', $boolean);
102+
}
103+
);
104+
$this->queryMock->shouldReceive('forNestedWhere')->andReturn($nestedQueryMock);
105+
$this->builder->shouldReceive('addNestedWhereQuery')->withArgs([$nestedQueryMock])
106+
->andReturnSelf();
107+
$this->builder->shouldReceive('first')->andReturnNull();
108+
$this->repositoryMock->findWhere([
109+
'field1' => 'value1',
110+
['field2', '<>', false],
111+
['field3', '>', null, 'or'],
112+
new Criterion([
113+
Criterion::OPERATOR => '<=',
114+
Criterion::VALUE => 999,
115+
Criterion::ATTRIBUTE => 'field4',
116+
]),
117+
new Criterion([
118+
Criterion::OPERATOR => 'in',
119+
Criterion::VALUE => [1, 2],
120+
Criterion::ATTRIBUTE => 'field5',
121+
Criterion::BOOLEAN => 'or',
122+
]),
123+
]);
124+
}
125+
}

tests/RepositoryFactoryTest.php

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<?php
2+
3+
namespace Saritasa\LaravelRepositories\Tests;
4+
5+
use Illuminate\Database\Eloquent\Model;
6+
use PHPUnit\Framework\TestCase;
7+
use Saritasa\LaravelRepositories\Exceptions\RepositoryException;
8+
use Saritasa\LaravelRepositories\Exceptions\RepositoryRegisterException;
9+
use Saritasa\LaravelRepositories\Repositories\Repository;
10+
use Saritasa\LaravelRepositories\Repositories\RepositoryFactory;
11+
use SebastianBergmann\RecursionContext\InvalidArgumentException;
12+
13+
/**
14+
* Tests work of repository factory.
15+
*/
16+
class RepositoryFactoryTest extends TestCase
17+
{
18+
/**
19+
* Test register custom repositories for model with different cases.
20+
*
21+
* @dataProvider registerRepositoriesData
22+
*
23+
* @param string $model Model for which need to register custom repository
24+
* @param string $repository Custom repository
25+
* @param bool $expectException Shows whether should be thrown an exception
26+
*
27+
* @return void
28+
*
29+
* @throws RepositoryRegisterException
30+
* @throws RepositoryException
31+
* @throws InvalidArgumentException
32+
*/
33+
public function testRegisterCustomRepositories(string $model, string $repository, bool $expectException): void
34+
{
35+
$repositoryFactory = new RepositoryFactory();
36+
37+
if ($expectException) {
38+
$this->expectException(RepositoryRegisterException::class);
39+
}
40+
41+
$repositoryFactory->register($model, $repository);
42+
43+
if (!$expectException) {
44+
$actualRepositoryInstance = $repositoryFactory->getRepository($model);
45+
$this->assertEquals($repository, get_class($actualRepositoryInstance));
46+
}
47+
}
48+
49+
/**
50+
* Returns data to test different cases in register method.
51+
*
52+
* @return array
53+
*/
54+
public function registerRepositoriesData(): array
55+
{
56+
$modelObject = new class extends Model {};
57+
58+
return [
59+
['Not object class', Repository::class, true],
60+
[Repository::class, Repository::class, true],
61+
[get_class($modelObject), 'Not existing repository', true],
62+
[get_class($modelObject), get_class($modelObject), true],
63+
[get_class($modelObject), Repository::class, false],
64+
];
65+
}
66+
67+
/**
68+
* Tests that factory returns the same repository instance each time when it called.
69+
*
70+
* @return void
71+
*
72+
* @throws RepositoryRegisterException
73+
* @throws RepositoryException
74+
* @throws InvalidArgumentException
75+
*/
76+
public function testThatEachTimeReturnsTheSameInstance(): void
77+
{
78+
$repositoryFactory = new RepositoryFactory();
79+
$modelObject = new class extends Model {};
80+
$modelClass = get_class($modelObject);
81+
$repositoryFactory->register($modelClass, Repository::class);
82+
$firstInstance = $repositoryFactory->getRepository($modelClass);
83+
$secondInstance = $repositoryFactory->getRepository($modelClass);
84+
85+
$this->assertSame($firstInstance, $secondInstance);
86+
}
87+
}

0 commit comments

Comments
 (0)