Passed
Push — master ( cd504b...48cb3c )
by Petr
07:41
created

VolumeStorageTest   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 181
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 114
c 1
b 0
f 0
dl 0
loc 181
rs 10
wmc 10

10 Methods

Rating   Name   Duplication   Size   Complexity  
A testDir() 0 4 1
A testOperations() 0 28 1
A testLookup() 0 48 1
A getLib() 0 6 1
A testHarderCounter() 0 13 1
A testDirsRecursive() 0 10 1
A tearDown() 0 10 1
A testSimpleCounter() 0 11 1
A testExists() 0 7 1
A dotDirs() 0 3 1
1
<?php
2
3
namespace StorageTests;
4
5
6
use CommonTestClass;
7
use kalanis\kw_storage\Interfaces\IPassDirs;
8
use kalanis\kw_storage\Storage\Key\DirKey;
9
use kalanis\kw_storage\Storage\StorageDirs;
10
use kalanis\kw_storage\Storage\Target;
11
use kalanis\kw_storage\StorageException;
12
13
14
class VolumeStorageTest extends CommonTestClass
15
{
16
    public function tearDown(): void
17
    {
18
        $this->rmFile($this->mockTestFile('', false));
19
        $this->rmFile($this->mockTestFile('2', false));
20
        $this->rmFile($this->mockTestFile('3', false));
21
        $this->rmFile($this->mockTestFile('4', false));
22
        $this->rmFile($this->mockTestFile('5', false));
23
        $this->rmDir($this->mockTestFile('', false));
24
        $this->rmDir('some');
25
        parent::tearDown();
26
    }
27
28
    /**
29
     * @throws StorageException
30
     */
31
    public function testDir(): void
32
    {
33
        $volume = $this->getLib();
34
        $this->assertTrue($volume->isDir('.'));
35
    }
36
37
    /**
38
     * @throws StorageException
39
     */
40
    public function testExists(): void
41
    {
42
        $volume = $this->getLib();
43
        $this->assertFalse($volume->exists($this->mockTestFile('', false)));
44
        $this->assertFalse($volume->isDir($this->mockTestFile('', false)));
45
        $this->expectException(StorageException::class);
46
        $volume->read($this->mockTestFile('', false));
47
    }
48
49
    /**
50
     * @throws StorageException
51
     */
52
    public function testOperations(): void
53
    {
54
        $volume = $this->getLib();
55
        $this->assertFalse($volume->exists($this->mockTestFile('', false)));
56
        $this->assertFalse($volume->isDir($this->mockTestFile('', false)));
57
        $this->assertTrue($volume->write($this->mockTestFile('', false), 'asdfghjklpoiuztrewqyxcvbnm'));
58
        $this->assertTrue($volume->exists($this->mockTestFile('', false)));
59
        $this->assertFalse($volume->isDir($this->mockTestFile('', false)));
60
        $this->assertTrue($volume->isFile($this->mockTestFile('', false)));
61
        $this->assertEquals(26, $volume->size($this->mockTestFile('', false)));
62
        $created = $volume->created($this->mockTestFile('', false));
63
        $now = time();
64
        $this->assertTrue($created > $now - 10);
65
        $this->assertTrue($created < $now + 10);
66
        $this->assertEquals('asdfghjklpoiuztrewqyxcvbnm', $volume->read($this->mockTestFile('', false)));
67
        $this->assertTrue($volume->copy($this->mockTestFile('', false), $this->mockTestFile('2', false)));
68
        $this->assertTrue($volume->move($this->mockTestFile('', false), $this->mockTestFile('3', false)));
69
        $this->assertFalse($volume->copy($this->mockTestFile('', false), $this->mockTestFile('4', false)));
70
        $this->assertFalse($volume->move($this->mockTestFile('', false), $this->mockTestFile('5', false)));
71
        $this->assertFalse($volume->remove($this->mockTestFile('', false)));
72
        $this->assertTrue($volume->remove($this->mockTestFile('2', false)));
73
        $this->assertTrue($volume->remove($this->mockTestFile('3', false)));
74
        $this->assertFalse($volume->remove($this->mockTestFile('4', false)));
75
        $this->assertFalse($volume->remove($this->mockTestFile('5', false)));
76
        $this->assertFalse($volume->exists($this->mockTestFile('', false)));
77
        $this->assertFalse($volume->isDir($this->mockTestFile('', false)));
78
        $this->assertNull($volume->size($this->mockTestFile('', false)));
79
        $this->assertNull($volume->created($this->mockTestFile('', false)));
80
    }
81
82
    /**
83
     * @throws StorageException
84
     */
85
    public function testDirsRecursive(): void
86
    {
87
        $volume = $this->getLib();
88
        $this->assertTrue($volume->mkDir(implode(DIRECTORY_SEPARATOR, ['some', 'none', 'hoo']), true));
89
        $this->assertTrue($volume->exists('some'));
90
        $this->assertFalse($volume->exists('some' . DIRECTORY_SEPARATOR . 'hint.none'));
91
        $this->assertTrue($volume->write('some' . DIRECTORY_SEPARATOR . 'hint.none', 'asdfghjklpoiuztrewqyxcvbnm'));
92
        $this->assertTrue($volume->rmDir('some', true));
93
        $this->assertFalse($volume->isDir('some'));
94
        $this->assertFalse($volume->exists('some'));
95
    }
96
97
    /**
98
     * @throws StorageException
99
     */
100
    public function testLookup(): void
101
    {
102
        $volume = $this->getLib();
103
        $testFiles = [
104
            'dummyFile.tst' => 'dummyFile.tst',
105
            'dummyFile.0.tst' => 'dummyFile.0.tst',
106
            'dummyFile.1.tst' => 'dummyFile.1.tst',
107
            'dummyFile.2.tst' => 'dummyFile.2.tst',
108
        ];
109
        $removal = $volume->removeMulti($testFiles);
110
        $this->assertEquals([
111
            'dummyFile.tst' => false,
112
            'dummyFile.0.tst' => false,
113
            'dummyFile.1.tst' => false,
114
            'dummyFile.2.tst' => false,
115
        ], $removal);
116
117
        iterator_to_array($volume->lookup('this path does not exists'));
118
        $this->assertEquals(1, count(array_filter(iterator_to_array($volume->lookup('')), [$this, 'dotDirs'])));
119
120
        file_put_contents($this->getTestDir() . 'dummyFile.tst', 'asdfghjklqwertzuiopyxcvbnm');
121
        file_put_contents($this->getTestDir() . 'dummyFile.0.tst', 'asdfghjklqwertzuiopyxcvbnm');
122
        file_put_contents($this->getTestDir() . 'dummyFile.1.tst', 'asdfghjklqwertzuiopyxcvbnm');
123
        file_put_contents($this->getTestDir() . 'dummyFile.2.tst', 'asdfghjklqwertzuiopyxcvbnm');
124
125
        $files = iterator_to_array($volume->lookup(''));
126
        sort($files);
127
        $files = array_filter($files, [$this, 'dotDirs']);
128
129
        $this->assertEquals(count($testFiles) + 1, count($files)); // because gitkeep
130
        $this->assertEquals('.gitkeep', reset($files));
131
        $this->assertEquals('dummyFile.0.tst', next($files));
132
        $this->assertEquals('dummyFile.1.tst', next($files));
133
        $this->assertEquals('dummyFile.2.tst', next($files));
134
        $this->assertEquals('dummyFile.tst', next($files));
135
136
        $removal = $volume->removeMulti($testFiles);
137
        $this->assertFalse($volume->exists('dummyFile.tst'));
138
        $this->assertFalse($volume->exists('dummyFile.0.tst'));
139
        $this->assertFalse($volume->exists('dummyFile.1.tst'));
140
        $this->assertFalse($volume->exists('dummyFile.2.tst'));
141
142
        $this->assertEquals([
143
            'dummyFile.tst' => true,
144
            'dummyFile.0.tst' => true,
145
            'dummyFile.1.tst' => true,
146
            'dummyFile.2.tst' => true,
147
        ], $removal);
148
    }
149
150
    public function dotDirs(string $path): bool
151
    {
152
        return !in_array($path, ['.', '..']);
153
    }
154
155
    /**
156
     * @throws StorageException
157
     */
158
    public function testSimpleCounter(): void
159
    {
160
        $volume = $this->getLib();
161
        $this->assertFalse($volume->exists($this->mockTestFile('', false)));
162
        $this->assertTrue($volume->write($this->mockTestFile('', false), 15));
163
        $this->assertTrue($volume->decrement($this->mockTestFile('', false)));
164
        $this->assertTrue($volume->decrement($this->mockTestFile('', false)));
165
        $this->assertTrue($volume->increment($this->mockTestFile('', false)));
166
        $this->assertEquals(14, $volume->read($this->mockTestFile('', false)));
167
        $this->assertTrue($volume->remove($this->mockTestFile('', false)));
168
        $this->assertFalse($volume->exists($this->mockTestFile('', false)));
169
    }
170
171
    /**
172
     * @throws StorageException
173
     */
174
    public function testHarderCounter(): void
175
    {
176
        $volume = $this->getLib();
177
        $this->assertFalse($volume->exists($this->mockTestFile('', false)));
178
        $this->assertTrue($volume->decrement($this->mockTestFile('', false)));
179
        $this->assertTrue($volume->increment($this->mockTestFile('', false)));
180
        $this->assertEquals(1, $volume->read($this->mockTestFile('', false)));
181
        $this->assertTrue($volume->remove($this->mockTestFile('', false)));
182
        $this->assertTrue($volume->increment($this->mockTestFile('', false)));
183
        $this->assertTrue($volume->decrement($this->mockTestFile('', false)));
184
        $this->assertEquals(0, $volume->read($this->mockTestFile('', false)));
185
        $this->assertTrue($volume->remove($this->mockTestFile('', false)));
186
        $this->assertFalse($volume->exists($this->mockTestFile('', false)));
187
    }
188
189
    protected function getLib(): IPassDirs
190
    {
191
        DirKey::setDir($this->getTestDir());
192
        $volume = new Target\Volume();
193
        $volume->check($this->getTestDir());
194
        return new StorageDirs(new DirKey(), $volume);
195
    }
196
}
197