Passed
Pull Request — master (#10)
by Alex
13:26
created

IsEmptyTest::getFilterData()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 4
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 11
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace ArpTest\DoctrineQueryFilter\Filter;
6
7
use Arp\DoctrineQueryFilter\Filter\Exception\FilterException;
8
use Arp\DoctrineQueryFilter\Filter\FilterInterface;
9
use Arp\DoctrineQueryFilter\Filter\IsEmpty;
10
use Arp\DoctrineQueryFilter\Filter\OrX;
11
use Arp\DoctrineQueryFilter\Metadata\MetadataInterface;
12
use Arp\DoctrineQueryFilter\Metadata\ParamNameGeneratorInterface;
13
use Arp\DoctrineQueryFilter\Metadata\TypecasterInterface;
14
use Arp\DoctrineQueryFilter\QueryBuilderInterface;
15
use Arp\DoctrineQueryFilter\QueryFilterManagerInterface;
16
use Mockery\Adapter\Phpunit\MockeryTestCase;
17
use Mockery\MockInterface;
18
19
/**
20
 * @covers \Arp\DoctrineQueryFilter\Filter\IsEmpty
21
 */
22
final class IsEmptyTest extends MockeryTestCase
23
{
24
    private QueryFilterManagerInterface&MockInterface $queryFilterManager;
25
26
    private QueryBuilderInterface&MockInterface $queryBuilder;
27
28
    private MetadataInterface&MockInterface $metadata;
29
30
    private IsEmpty $isEmpty;
31
32
    public function setUp(): void
33
    {
34
        $this->queryFilterManager = \Mockery::mock(QueryFilterManagerInterface::class);
35
        $this->queryBuilder = \Mockery::mock(QueryBuilderInterface::class);
36
        $this->metadata = \Mockery::mock(MetadataInterface::class);
37
38
        $this->isEmpty = new IsEmpty(
39
            $this->queryFilterManager,
40
            \Mockery::mock(TypecasterInterface::class),
0 ignored issues
show
Bug introduced by
Mockery::mock(Arp\Doctri...casterInterface::class) of type Mockery\LegacyMockInterface|Mockery\MockInterface is incompatible with the type Arp\DoctrineQueryFilter\...ata\TypecasterInterface expected by parameter $typecaster of Arp\DoctrineQueryFilter\...\IsEmpty::__construct(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

40
            /** @scrutinizer ignore-type */ \Mockery::mock(TypecasterInterface::class),
Loading history...
41
            \Mockery::mock(ParamNameGeneratorInterface::class),
0 ignored issues
show
Bug introduced by
Mockery::mock(Arp\Doctri...eratorInterface::class) of type Mockery\LegacyMockInterface|Mockery\MockInterface is incompatible with the type Arp\DoctrineQueryFilter\...mNameGeneratorInterface expected by parameter $paramNameGenerator of Arp\DoctrineQueryFilter\...\IsEmpty::__construct(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

41
            /** @scrutinizer ignore-type */ \Mockery::mock(ParamNameGeneratorInterface::class),
Loading history...
42
        );
43
    }
44
45
    public function testImplementsFilterInterface(): void
46
    {
47
        $this->assertInstanceOf(FilterInterface::class, $this->isEmpty);
48
    }
49
50
    /**
51
     * @throws FilterException
52
     */
53
    public function testMissingFieldCriteriaThrowsFilterException(): void
54
    {
55
        $this->expectException(FilterException::class);
56
        $this->expectExceptionMessage(
57
            sprintf('The required \'field\' option is missing in criteria for filter \'%s\'', IsEmpty::class),
58
        );
59
60
        $this->isEmpty->filter($this->queryBuilder, $this->metadata, []);
61
    }
62
63
    /**
64
     * @dataProvider getFilterData
65
     *
66
     * @throws FilterException
67
     */
68
    public function testFilter(array $criteria): void
69
    {
70
        $expectedCriteria = [
71
            'name' => 'or',
72
            'conditions' => [
73
                [
74
                    'name' => 'is_null',
75
                    'field' => $criteria['field'],
76
                    'alias' => $criteria['alias'] ?? null,
77
                ],
78
                [
79
                    'name' => 'eq',
80
                    'field' => $criteria['field'],
81
                    'alias' => $criteria['alias'] ?? null,
82
                    'value' => '',
83
                ],
84
            ],
85
        ];
86
87
        $this->queryFilterManager->shouldReceive('applyFilter')
88
            ->once()
89
            ->with($this->queryBuilder, $this->metadata, $expectedCriteria);
90
91
        $this->isEmpty->filter($this->queryBuilder, $this->metadata, $criteria);
92
    }
93
94
    public static function getFilterData(): array
95
    {
96
        return [
97
            [
98
                [
99
                    'field' => 'foo',
100
                ],
101
102
                [
103
                    'field' => 'bar',
104
                    'alias' => 'x',
105
                ],
106
            ],
107
        ];
108
    }
109
}
110