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

BeginsWithTest::testFilter()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 7
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 12
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace ArpTest\DoctrineQueryFilter\Filter;
6
7
use Arp\DoctrineQueryFilter\Filter\BeginsWith;
8
use Arp\DoctrineQueryFilter\Filter\Exception\FilterException;
9
use Arp\DoctrineQueryFilter\Filter\FilterInterface;
10
use Arp\DoctrineQueryFilter\Metadata\MetadataInterface;
11
use Arp\DoctrineQueryFilter\Metadata\ParamNameGeneratorInterface;
12
use Arp\DoctrineQueryFilter\Metadata\TypecasterInterface;
13
use Arp\DoctrineQueryFilter\QueryBuilderInterface;
14
use Arp\DoctrineQueryFilter\QueryFilterManagerInterface;
15
use Mockery\Adapter\Phpunit\MockeryTestCase;
16
use Mockery\MockInterface;
17
18
/**
19
 * @covers \Arp\DoctrineQueryFilter\Filter\BeginsWith
20
 */
21
final class BeginsWithTest extends MockeryTestCase
22
{
23
    private QueryFilterManagerInterface&MockInterface $queryFilterManager;
24
25
    private QueryBuilderInterface&MockInterface $queryBuilder;
26
27
    private MetadataInterface&MockInterface $metadata;
28
29
    private BeginsWith $beginsWith;
30
31
    public function setUp(): void
32
    {
33
        $this->queryFilterManager = \Mockery::mock(QueryFilterManagerInterface::class);
34
        $this->queryBuilder = \Mockery::mock(QueryBuilderInterface::class);
35
        $this->metadata = \Mockery::mock(MetadataInterface::class);
36
37
        $this->beginsWith = new BeginsWith(
38
            $this->queryFilterManager,
39
            \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\...ginsWith::__construct(). ( Ignorable by Annotation )

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

39
            /** @scrutinizer ignore-type */ \Mockery::mock(TypecasterInterface::class),
Loading history...
40
            \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\...ginsWith::__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(ParamNameGeneratorInterface::class),
Loading history...
41
        );
42
    }
43
44
    public function testImplementsFilterInterface(): void
45
    {
46
        $this->assertInstanceOf(FilterInterface::class, $this->beginsWith);
47
    }
48
49
    /**
50
     * @throws FilterException
51
     */
52
    public function testMissingValueCriteriaThrowsFilterException(): void
53
    {
54
        $this->expectException(FilterException::class);
55
        $this->expectExceptionMessage(
56
            sprintf('The required \'value\' option is missing in criteria for filter \'%s\'', BeginsWith::class),
57
        );
58
59
        $this->beginsWith->filter($this->queryBuilder, $this->metadata, []);
60
    }
61
62
    /**
63
     * @dataProvider getFilterData
64
     *
65
     * @throws FilterException
66
     */
67
    public function testFilter(array $criteria): void
68
    {
69
        $expectedCriteria = array_merge(
70
            $criteria,
71
            ['name' => 'like', 'value' => $criteria['value'] . '%'],
72
        );
73
74
        $this->queryFilterManager->shouldReceive('applyFilter')
75
            ->once()
76
            ->with($this->queryBuilder, $this->metadata, $expectedCriteria);
77
78
        $this->beginsWith->filter($this->queryBuilder, $this->metadata, $criteria);
79
    }
80
81
    public static function getFilterData(): array
82
    {
83
        return [
84
            [
85
                [
86
                    'field' => 'foo',
87
                    'value' => 'test',
88
                ],
89
90
                [
91
                    'field' => 'bar',
92
                    'value' => 'example',
93
                    'alias' => 'x',
94
                ],
95
            ],
96
        ];
97
    }
98
}
99