Passed
Pull Request — master (#580)
by
unknown
03:07
created

ObjectParserTest::testCache()

Size

Total Lines 42
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 21
c 2
b 0
f 0
nc 1
nop 0
dl 0
loc 42
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Validator\Tests\Helper;
6
7
use Error;
8
use InvalidArgumentException;
9
use PHPUnit\Framework\TestCase;
10
use Yiisoft\Validator\Helper\ObjectParser;
11
use Yiisoft\Validator\Rule\Number;
12
use Yiisoft\Validator\Rule\Required;
13
use Yiisoft\Validator\Tests\Support\Data\ObjectForTestingCache1;
14
use Yiisoft\Validator\Tests\Support\Data\ObjectForTestingCache2;
15
use Yiisoft\Validator\Tests\Support\Data\ObjectForTestingDisabledCache;
16
use Yiisoft\Validator\Tests\Support\Data\SimpleDto;
17
use Yiisoft\Validator\Tests\Support\Rule\CustomUrlRuleSet;
18
19
final class ObjectParserTest extends TestCase
20
{
21
    public function testInvalidSource(): void
22
    {
23
        $this->expectException(InvalidArgumentException::class);
24
        $this->expectExceptionMessage('Class "non-exist-class" not found.');
25
        new ObjectParser('non-exist-class');
26
    }
27
28
    public function dataSkipStaticProperties(): array
29
    {
30
        return [
31
            [
32
                ['a' => 4, 'b' => 2],
33
                new class () {
34
                    public int $a = 4;
35
                    public static int $b = 2;
36
                },
37
                false,
38
            ],
39
            [
40
                ['a' => 4, 'c' => 'hello'],
41
                new class () {
42
                    public int $a = 4;
43
                    public static int $b = 2;
44
                    public string $c = 'hello';
45
                },
46
                true,
47
            ],
48
        ];
49
    }
50
51
    /**
52
     * @dataProvider dataSkipStaticProperties
53
     */
54
    public function testSkipStaticProperties(array $expectedData, object $object, bool $skipStaticProperties): void
55
    {
56
        $parser = new ObjectParser($object, skipStaticProperties: $skipStaticProperties);
57
58
        $this->assertSame($expectedData, $parser->getData());
59
    }
60
61
    public function testSkipStaticPropertiesDefault(): void
62
    {
63
        $object = new class () {
64
            public int $a = 4;
65
            public static int $b = 2;
66
        };
67
68
        $parser = new ObjectParser($object);
69
70
        $this->assertSame(['a' => 4, 'b' => 2], $parser->getData());
71
    }
72
73
    public function testDataWithClassString(): void
74
    {
75
        $parser = new ObjectParser(SimpleDto::class);
76
77
        $this->assertSame([], $parser->getData());
78
        $this->assertNull($parser->getAttributeValue('a'));
79
        $this->assertNull($parser->getAttributeValue('x'));
80
        $this->assertFalse($parser->hasAttribute('a'));
81
        $this->assertFalse($parser->hasAttribute('x'));
82
    }
83
84
    public function testGetRulesExpectingAttributeInheritance(): void
85
    {
86
        $object = new class () {
87
            #[CustomUrlRuleSet]
88
            public string $url;
89
        };
90
        $parser = new ObjectParser($object);
91
92
        $this->expectException(Error::class);
93
94
        $className = CustomUrlRuleSet::class;
95
        $this->expectExceptionMessage("Attempting to use non-attribute class \"$className\" as attribute");
96
97
        $parser->getRules();
98
    }
99
100
    public function testCache(): void
101
    {
102
        $parser1 = new ObjectParser(new ObjectForTestingCache1());
103
        $cacheKey1 = 'Yiisoft\Validator\Tests\Support\Data\ObjectForTestingCache1_7_0';
0 ignored issues
show
Unused Code introduced by
The assignment to $cacheKey1 is dead and can be removed.
Loading history...
104
        // $this->assertArrayNotHasKey($cacheKey1, ObjectParser::getCache());
105
106
        $expectedRules1 = [
107
            'a' => [new Required()],
108
            'b' => [new Number(min: 1)],
109
            'c' => [new Number(max: 2)],
110
        ];
111
        $rules1 = $parser1->getRules();
112
        $this->assertEquals($expectedRules1, $rules1);
113
//        $this->assertArrayHasKey($cacheKey1, ObjectParser::getCache());
114
//        $this->assertArrayHasKey('rules', ObjectParser::getCache()[$cacheKey1]);
115
//        $this->assertArrayHasKey('reflectionProperties', ObjectParser::getCache()[$cacheKey1]);
116
//        $this->assertArrayHasKey('reflectionSource', ObjectParser::getCache()[$cacheKey1]);
117
        $this->assertSame($rules1, $parser1->getRules());
118
119
        $parser2 = new ObjectParser(new ObjectForTestingCache2());
120
        $cacheKey2 = 'Yiisoft\Validator\Tests\Support\Data\ObjectForTestingCache2_7_0';
0 ignored issues
show
Unused Code introduced by
The assignment to $cacheKey2 is dead and can be removed.
Loading history...
121
//        $this->assertArrayHasKey($cacheKey1, ObjectParser::getCache());
122
//        $this->assertArrayNotHasKey($cacheKey2, ObjectParser::getCache());
123
124
        $reflectionProperties2 = $parser2->getReflectionProperties();
125
        // $this->assertArrayHasKey($cacheKey1, ObjectParser::getCache());
126
        // $this->assertArrayHasKey($cacheKey2, ObjectParser::getCache());
127
        // $this->assertArrayNotHasKey('rules', ObjectParser::getCache()[$cacheKey2]);
128
        // $this->assertArrayHasKey('reflectionProperties', ObjectParser::getCache()[$cacheKey2]);
129
        // $this->assertArrayHasKey('reflectionSource', ObjectParser::getCache()[$cacheKey2]);
130
        $this->assertSame($reflectionProperties2, $parser2->getReflectionProperties());
131
132
        $expectedRules2 = [
133
            'd' => [new Required()],
134
            'e' => [new Number(min: 5)],
135
            'f' => [new Number(max: 6)],
136
        ];
137
        $rules2 = $parser2->getRules();
138
        $this->assertEquals($expectedRules2, $parser2->getRules());
139
        // $this->assertArrayHasKey('rules', ObjectParser::getCache()[$cacheKey2]);
140
        $this->assertSame($rules2, $parser2->getRules());
141
        $this->assertSame($rules1, $parser1->getRules());
142
    }
143
144
    public function testDisabledCache(): void
145
    {
146
        $parser = new ObjectParser(new ObjectForTestingDisabledCache(), useCache: false);
147
        $cacheKey = 'Yiisoft\Validator\Tests\Support\Data\ObjectForTestingDisabledCache_7_0';
0 ignored issues
show
Unused Code introduced by
The assignment to $cacheKey is dead and can be removed.
Loading history...
148
        // $this->assertArrayNotHasKey($cacheKey, ObjectParser::getCache());
149
150
        $expectedRules = [
151
            'a' => [new Required()],
152
            'b' => [new Number(min: 1)],
153
            'c' => [new Number(max: 2)],
154
        ];
155
        $rules = $parser->getRules();
156
        $this->assertEquals($expectedRules, $rules);
157
        // $this->assertArrayNotHasKey($cacheKey, ObjectParser::getCache());
158
        $this->assertEquals($expectedRules, $parser->getRules());
159
        $this->assertNotSame($rules, $parser->getRules());
160
        // $this->assertArrayNotHasKey($cacheKey, ObjectParser::getCache());
161
    }
162
}
163