Completed
Push — master ( cd1e12...75a4af )
by Alex
17s queued 14s
created

ContainsTest::setUp()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
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 0
dl 0
loc 10
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace ArpTest\DoctrineQueryFilter\Filter;
6
7
use Arp\DoctrineQueryFilter\Filter\Contains;
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\Contains
20
 * @covers \Arp\DoctrineQueryFilter\Filter\AbstractFilter
21
 */
22
final class ContainsTest extends MockeryTestCase
23
{
24
    private QueryFilterManagerInterface&MockInterface $queryFilterManager;
25
26
    private QueryBuilderInterface&MockInterface $queryBuilder;
27
28
    private MetadataInterface&MockInterface $metadata;
29
30
    private Contains $contains;
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->contains = new Contains(
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\...Contains::__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\...Contains::__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->contains);
48
    }
49
50
    /**
51
     * @throws FilterException
52
     */
53
    public function testMissingValueCriteriaThrowsFilterException(): void
54
    {
55
        $this->expectException(FilterException::class);
56
        $this->expectExceptionMessage(
57
            sprintf('The required \'value\' option is missing in criteria for filter \'%s\'', Contains::class),
58
        );
59
60
        $this->contains->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 = array_merge(
71
            $criteria,
72
            ['name' => 'like', 'value' => '%' . $criteria['value'] . '%'],
73
        );
74
75
        $this->queryFilterManager->shouldReceive('applyFilter')
76
            ->once()
77
            ->with($this->queryBuilder, $this->metadata, $expectedCriteria);
78
79
        $this->contains->filter($this->queryBuilder, $this->metadata, $criteria);
80
    }
81
82
    public static function getFilterData(): array
83
    {
84
        return [
85
            [
86
                [
87
                    'field' => 'test',
88
                    'value' => 'foo',
89
                ],
90
91
                [
92
                    'field' => 'name',
93
                    'value' => 'bar',
94
                    'alias' => 'abc',
95
                ],
96
            ],
97
        ];
98
    }
99
}
100