Passed
Push — master ( a80842...bbbee0 )
by Caen
03:37 queued 13s
created

PublicationFieldValidatorTest   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 150
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 67
dl 0
loc 150
rs 10
c 0
b 0
f 0
wmc 20
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Hyde\Publications\Testing\Feature;
6
7
use Hyde\Publications\Actions\PublicationFieldValidator;
8
use Hyde\Publications\Models\PublicationFieldDefinition;
9
use Hyde\Publications\Models\PublicationType;
10
use Hyde\Testing\TestCase;
11
use Illuminate\Validation\ValidationException;
12
use PHPUnit\Framework\MockObject\MockObject;
13
14
/**
15
 * @covers \Hyde\Publications\Actions\PublicationFieldValidator
16
 */
17
class PublicationFieldValidatorTest extends TestCase
18
{
19
    public function testConstruct()
20
    {
21
        $this->assertInstanceOf(PublicationFieldValidator::class, new PublicationFieldValidator(
22
            $this->createMock(PublicationType::class),
23
            $this->createMock(PublicationFieldDefinition::class)
24
        ));
25
    }
26
27
    public function testValidate()
28
    {
29
        $fieldDefinition = new PublicationFieldDefinition('string', 'myString');
30
        $validated = (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->validate('foo');
31
        $this->assertSame(['myString' => 'foo'], $validated);
32
33
        $this->expectValidationException('The my string must be a string.');
34
        $fieldDefinition = new PublicationFieldDefinition('string', 'myString');
35
        (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->validate(1);
36
    }
37
38
    public function testValidateWithCustomTypeRules()
39
    {
40
        $fieldDefinition = new PublicationFieldDefinition('string', 'myString', ['min:3']);
41
        $validated = (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->validate('foo');
42
        $this->assertSame(['myString' => 'foo'], $validated);
43
44
        $this->expectValidationException('The my string must be at least 5 characters.');
45
        $fieldDefinition = new PublicationFieldDefinition('string', 'myString', ['min:5']);
46
        (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->validate('foo');
47
    }
48
49
    public function testGetRules()
50
    {
51
        $fieldDefinition = new PublicationFieldDefinition('string', 'myString');
52
        $rules = (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->getValidationRules();
53
        $this->assertSame(['string'], $rules);
54
    }
55
56
    public function testGetRulesWithCustomTypeRules()
57
    {
58
        $fieldDefinition = new PublicationFieldDefinition('string', 'myString', ['foo', 'bar']);
59
        $rules = (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->getValidationRules();
60
        $this->assertSame(['string', 'foo', 'bar'], $rules);
61
    }
62
63
    public function testGetRulesForArray()
64
    {
65
        $fieldDefinition = new PublicationFieldDefinition('array', 'myArray');
66
        $rules = (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->getValidationRules();
67
        $this->assertSame(['array'], $rules);
68
    }
69
70
    public function testValidateArrayPasses()
71
    {
72
        $fieldDefinition = new PublicationFieldDefinition('array', 'myArray');
73
        $validated = (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->validate([
74
            'foo', 'bar', 'baz',
75
        ]);
76
        $this->assertSame(['myArray' => ['foo', 'bar', 'baz']], $validated);
77
    }
78
79
    public function testValidateArrayFails()
80
    {
81
        $this->expectValidationException('The my array must be an array.');
82
        $fieldDefinition = new PublicationFieldDefinition('array', 'myArray');
83
        (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->validate('foo');
84
    }
85
86
    public function testGetRulesForDatetime()
87
    {
88
        $fieldDefinition = new PublicationFieldDefinition('datetime', 'myDatetime');
89
        $rules = (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->getValidationRules();
90
        $this->assertSame(['date'], $rules);
91
    }
92
93
    public function testValidateDatetimePasses()
94
    {
95
        $fieldDefinition = new PublicationFieldDefinition('datetime', 'myDatetime');
96
        $validated = (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->validate('2021-01-01');
97
        $this->assertSame(['myDatetime' => '2021-01-01'], $validated);
98
    }
99
100
    public function testValidateDatetimeFailsForInvalidType()
101
    {
102
        $this->expectValidationException('The my datetime is not a valid date.');
103
        $fieldDefinition = new PublicationFieldDefinition('datetime', 'myDatetime');
104
        (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->validate('string');
105
    }
106
107
    public function testGetRulesForFloat()
108
    {
109
        $fieldDefinition = new PublicationFieldDefinition('float', 'myFloat');
110
        $rules = (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->getValidationRules();
111
        $this->assertSame(['numeric'], $rules);
112
    }
113
114
    public function testGetRulesForInteger()
115
    {
116
        $fieldDefinition = new PublicationFieldDefinition('integer', 'myInteger');
117
        $rules = (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->getValidationRules();
118
        $this->assertSame(['integer'], $rules);
119
    }
120
121
    public function testGetRulesForString()
122
    {
123
        $fieldDefinition = new PublicationFieldDefinition('string', 'myString');
124
        $rules = (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->getValidationRules();
125
        $this->assertSame(['string'], $rules);
126
    }
127
128
    public function testGetRulesForText()
129
    {
130
        $fieldDefinition = new PublicationFieldDefinition('text', 'myText');
131
        $rules = (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->getValidationRules();
132
        $this->assertSame(['string'], $rules);
133
    }
134
135
    public function testGetRulesForMedia()
136
    {
137
        $this->directory('_media/foo');
138
        $this->file('_media/foo/bar.jpg');
139
        $fieldDefinition = new PublicationFieldDefinition('media', 'myMedia');
140
        $rules = (new PublicationFieldValidator(new PublicationType('foo'), $fieldDefinition))->getValidationRules();
141
        $this->assertSame(['string', 'in:foo/bar.jpg'], $rules);
142
    }
143
144
    public function testGetRulesForTag()
145
    {
146
        $fieldDefinition = new PublicationFieldDefinition('tag', 'myTag');
147
        $rules = (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->getValidationRules();
148
        $this->assertSame(['in:'], $rules);
149
    }
150
151
    public function testGetRulesForUrl()
152
    {
153
        $fieldDefinition = new PublicationFieldDefinition('url', 'myUrl');
154
        $rules = (new PublicationFieldValidator($this->mockPublicationType(), $fieldDefinition))->getValidationRules();
155
        $this->assertSame(['url'], $rules);
156
    }
157
158
    protected function expectValidationException(string $message): void
159
    {
160
        $this->expectException(ValidationException::class);
161
        $this->expectExceptionMessage($message);
162
    }
163
164
    protected function mockPublicationType(): PublicationType|MockObject
165
    {
166
        return $this->createMock(PublicationType::class);
167
    }
168
}
169