Passed
Push — master ( 744fa2...6e775d )
by Petr
10:23
created

LoaderTest::testJsonString()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 9
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 15
rs 9.9666
1
<?php
2
3
use kalanis\kw_input\Interfaces\IEntry;
4
use kalanis\kw_input\Loaders;
5
use kalanis\kw_input\Parsers;
6
7
8
class LoaderTest extends CommonTestClass
9
{
10
    protected $tempFile = '';
11
12
    protected function tearDown(): void
13
    {
14
        parent::tearDown();
15
        if (is_file($this->tempFile)) {
16
            @unlink($this->tempFile);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition for unlink(). This can introduce security issues, and is generally not recommended. ( Ignorable by Annotation )

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

16
            /** @scrutinizer ignore-unhandled */ @unlink($this->tempFile);

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
17
        }
18
    }
19
20
    public function testFactory(): void
21
    {
22
        $factory = new Loaders\Factory();
23
        $loader1 = $factory->getLoader(IEntry::SOURCE_GET);
24
        $loader2 = $factory->getLoader(IEntry::SOURCE_GET); // intentionally same
25
        $loader3 = $factory->getLoader(IEntry::SOURCE_FILES);
26
        $loader4 = $factory->getLoader(IEntry::SOURCE_JSON);
27
28
        $this->assertInstanceOf('\kalanis\kw_input\Loaders\Entry', $loader1);
29
        $this->assertInstanceOf('\kalanis\kw_input\Loaders\Entry', $loader2);
30
        $this->assertInstanceOf('\kalanis\kw_input\Loaders\File', $loader3);
31
        $this->assertInstanceOf('\kalanis\kw_input\Loaders\Json', $loader4);
32
        $this->assertEquals($loader1, $loader2);
33
        $this->assertNotEquals($loader3, $loader2);
34
        $this->assertNotEquals($loader3, $loader4);
35
    }
36
37
    public function testEntry(): void
38
    {
39
        $data = new Loaders\Entry();
40
        $this->assertInstanceOf('\kalanis\kw_input\Loaders\ALoader', $data);
41
42
        $entries = $data->loadVars(IEntry::SOURCE_GET, $this->entryDataset());
43
44
        $entry = reset($entries);
45
        $this->assertEquals(IEntry::SOURCE_GET, $entry->getSource());
46
        $this->assertEquals('foo', $entry->getKey());
47
        $this->assertEquals('val1', $entry->getValue());
48
49
        $entry = next($entries);
50
        $this->assertEquals(IEntry::SOURCE_GET, $entry->getSource());
51
        $this->assertEquals('bar', $entry->getKey());
52
        $this->assertEquals(['bal1', 'bal2'], $entry->getValue());
53
54
        $entry = next($entries);
55
        $this->assertEquals(IEntry::SOURCE_GET, $entry->getSource());
56
        $this->assertEquals('baz', $entry->getKey());
57
        $this->assertEquals(true, $entry->getValue());
58
59
        $entry = next($entries);
60
        $this->assertEquals(IEntry::SOURCE_GET, $entry->getSource());
61
        $this->assertEquals('aff', $entry->getKey());
62
        $this->assertEquals(42, $entry->getValue());
63
    }
64
65
    public function testFile(): void
66
    {
67
        $data = new Loaders\File();
68
        $this->assertInstanceOf('\kalanis\kw_input\Loaders\ALoader', $data);
69
70
        $entries = $data->loadVars(IEntry::SOURCE_FILES, $this->fileDataset());
71
72
        $entry = reset($entries);
73
        $this->assertEquals(IEntry::SOURCE_FILES, $entry->getSource());
74
        $this->assertEquals('files', $entry->getKey());
75
        $this->assertEquals('facepalm.jpg', $entry->getValue());
76
        $this->assertEquals('image/jpeg', $entry->getMimeType());
77
        $this->assertEquals('/tmp/php3zU3t5', $entry->getTempName());
78
        $this->assertEquals(UPLOAD_ERR_OK, $entry->getError());
79
        $this->assertEquals(591387, $entry->getSize());
80
81
        $entry = next($entries);
82
        $this->assertEquals(IEntry::SOURCE_FILES, $entry->getSource());
83
        $this->assertEquals('download[file1]', $entry->getKey());
84
        $this->assertEquals('MyFile.txt', $entry->getValue());
85
        $this->assertEquals('text/plain', $entry->getMimeType());
86
        $this->assertEquals('/tmp/php/phpgj46fg', $entry->getTempName());
87
        $this->assertEquals(UPLOAD_ERR_CANT_WRITE, $entry->getError());
88
        $this->assertEquals(816, $entry->getSize());
89
90
        $entry = next($entries);
91
        $this->assertEquals(IEntry::SOURCE_FILES, $entry->getSource());
92
        $this->assertEquals('download[file2]', $entry->getKey());
93
        $this->assertEquals('MyFile.jpg', $entry->getValue());
94
        $this->assertEquals('image/jpeg', $entry->getMimeType());
95
        $this->assertEquals('/tmp/php/php7s4ag4', $entry->getTempName());
96
        $this->assertEquals(UPLOAD_ERR_PARTIAL, $entry->getError());
97
        $this->assertEquals(3075, $entry->getSize());
98
    }
99
100
    public function testCliFile(): void
101
    {
102
        $data = new Loaders\CliEntry();
103
        $this->assertInstanceOf('\kalanis\kw_input\Loaders\ALoader', $data);
104
105
        $cli = new Parsers\Cli();
106
        $entries = $data->loadVars(IEntry::SOURCE_CLI, $cli->parseInput($this->cliDataset()));
107
108
        $entry = reset($entries);
109
        $this->assertEquals(IEntry::SOURCE_CLI, $entry->getSource());
110
        $this->assertEquals('testing', $entry->getKey());
111
        $this->assertEquals('foo', $entry->getValue());
112
113
        $entry = next($entries);
114
        $this->assertEquals(IEntry::SOURCE_CLI, $entry->getSource());
115
        $this->assertEquals('bar', $entry->getKey());
116
        $this->assertEquals(['baz', 'eek'], $entry->getValue());
117
118
        $entry = next($entries);
119
        $this->assertEquals(IEntry::SOURCE_CLI, $entry->getSource());
120
        $this->assertEquals('mko', $entry->getKey());
121
        $this->assertEquals('', $entry->getValue());
122
123
        $entry = next($entries);
124
        $this->assertEquals(IEntry::SOURCE_CLI, $entry->getSource());
125
        $this->assertEquals('der', $entry->getKey());
126
        $this->assertEquals(true, $entry->getValue());
127
128
        $entry = next($entries);
129
        $this->assertEquals(IEntry::SOURCE_FILES, $entry->getSource());
130
        $this->assertEquals('file1', $entry->getKey());
131
        $this->assertEquals('./data/tester.gif', $entry->getValue());
132
133
        $entry = next($entries);
134
        $this->assertEquals(IEntry::SOURCE_FILES, $entry->getSource());
135
        $this->assertEquals('file2', $entry->getKey());
136
        $this->assertEquals('data/testing.1.txt', $entry->getValue());
137
138
        $entry = next($entries);
139
        $this->assertEquals(IEntry::SOURCE_CLI, $entry->getSource());
140
        $this->assertEquals('file3', $entry->getKey());
141
        $this->assertEquals('./data/testing.2.txt', $entry->getValue());
142
    }
143
144
    public function testJson(): void
145
    {
146
        $parser = new Parsers\Json();
147
        $loader = new Loaders\Json();
148
149
        $this->assertInstanceOf('\kalanis\kw_input\Loaders\ALoader', $loader);
150
151
        $this->setTempData($this->jsonDataset());
152
153
        $entries = $loader->loadVars(IEntry::SOURCE_JSON, $parser->parseInput([$this->tempFile]));
154
155
        $entry = reset($entries);
156
        $this->assertEquals(IEntry::SOURCE_JSON, $entry->getSource());
157
        $this->assertEquals('foo', $entry->getKey());
158
        $this->assertEquals('bar', $entry->getValue());
159
160
        $entry = next($entries);
161
        $this->assertEquals(IEntry::SOURCE_JSON, $entry->getSource());
162
        $this->assertEquals('baz', $entry->getKey());
163
        $this->assertEquals(['rfv' => 123, 'edc'=> 456], $entry->getValue());
164
165
        $entry = next($entries);
166
        $this->assertEquals(IEntry::SOURCE_JSON, $entry->getSource());
167
        $this->assertEquals('sbr', $entry->getKey());
168
        $this->assertEquals(['cde', 'dgs'], $entry->getValue());
169
    }
170
171
    public function testJsonString(): void
172
    {
173
        $parser = new Parsers\Json();
174
        $loader = new Loaders\Json();
175
176
        $this->assertInstanceOf('\kalanis\kw_input\Loaders\ALoader', $loader);
177
178
        $this->setTempData($this->jsonStringDataset());
179
180
        $entries = $loader->loadVars(IEntry::SOURCE_JSON, $parser->parseInput([$this->tempFile]));
181
182
        $entry = reset($entries);
183
        $this->assertEquals(IEntry::SOURCE_JSON, $entry->getSource());
184
        $this->assertEquals(0, $entry->getKey());
185
        $this->assertEquals('Just content', $entry->getValue());
186
    }
187
188
    public function testJsonFile(): void
189
    {
190
        $loader = new Loaders\Json();
191
        $parser = new Parsers\Json();
192
193
        $this->assertInstanceOf('\kalanis\kw_input\Loaders\ALoader', $loader);
194
195
        $this->setTempData($this->jsonFileDataset());
196
197
        $entries = $loader->loadVars(IEntry::SOURCE_JSON, $parser->parseInput([$this->tempFile]));
198
199
        /** @var \kalanis\kw_input\Entries\FileEntry $entry */
200
        $entry = reset($entries);
201
        $this->assertEquals(IEntry::SOURCE_FILES, $entry->getSource());
202
        $this->assertEquals('foo', $entry->getKey());
203
        $this->assertEquals('foo.json', $entry->getValue());
204
205
        // now file content
206
        $this->assertNotEmpty($entry->getTempName());
207
        $this->assertEquals('application/octet-stream', $entry->getMimeType());
208
        $this->assertEquals(21, $entry->getSize());
209
        $this->assertEquals('This won' . chr(0) . 't be changed', file_get_contents($entry->getTempName()));
210
        @unlink($entry->getTempName());
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition for unlink(). This can introduce security issues, and is generally not recommended. ( Ignorable by Annotation )

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

210
        /** @scrutinizer ignore-unhandled */ @unlink($entry->getTempName());

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
211
212
        // second record is not a file
213
        $entry = next($entries);
214
        $this->assertEquals(IEntry::SOURCE_JSON, $entry->getSource());
215
        $this->assertEquals('bar', $entry->getKey());
216
        $this->assertEquals(['ijn' => ['FILE' => 'This will be changed']], $entry->getValue());
217
    }
218
219
    public function testJsonNothing(): void
220
    {
221
        $loader = new Loaders\Json();
222
        $parser = new Parsers\Json();
223
224
        $this->setTempData('{}');
225
226
        $entries = $loader->loadVars(IEntry::SOURCE_JSON, $parser->parseInput([$this->tempFile]));
227
228
        $this->assertEmpty($entries);
229
    }
230
231
    public function testJsonBadToDecode(): void
232
    {
233
        $loader = new Loaders\Json();
234
        $parser = new Parsers\Json();
235
236
        $this->setTempData('This is not a valid JSON string {\0');
237
238
        $entries = $loader->loadVars(IEntry::SOURCE_JSON, $parser->parseInput([$this->tempFile]));
239
240
        $this->assertEmpty($entries);
241
    }
242
243
    public function testJsonNoToDecode(): void
244
    {
245
        $loader = new Loaders\Json();
246
        $parser = new Parsers\Json();
247
248
        $this->setTempData('This is not a valid JSON string {\0');
249
250
        $entries = $loader->loadVars(IEntry::SOURCE_JSON, $parser->parseInput([]));
251
252
        $this->assertEmpty($entries);
253
    }
254
255
    public function testJsonNoFile(): void
256
    {
257
        $loader = new Loaders\Json();
258
        $parser = new Parsers\Json();
259
260
        $entries = $loader->loadVars(IEntry::SOURCE_JSON, $parser->parseInput(['not_exists']));
261
262
        $this->assertEmpty($entries);
263
    }
264
265
    protected function setTempData(string $dataset): void
266
    {
267
        $this->tempFile = tempnam(sys_get_temp_dir(), 'js_test_');
268
        file_put_contents($this->tempFile, $dataset);
269
    }
270
}
271