]>
Commit | Line | Data |
---|---|---|
1 | <?php | |
2 | ||
3 | namespace Shaarli\Helper; | |
4 | ||
5 | use Exception; | |
6 | use Shaarli\Exceptions\IOException; | |
7 | use Shaarli\TestCase; | |
8 | ||
9 | /** | |
10 | * Class FileUtilsTest | |
11 | * | |
12 | * Test file utility class. | |
13 | */ | |
14 | class FileUtilsTest extends TestCase | |
15 | { | |
16 | /** | |
17 | * @var string Test file path. | |
18 | */ | |
19 | protected static $file = 'sandbox/flat.db'; | |
20 | ||
21 | protected function setUp(): void | |
22 | { | |
23 | @mkdir('sandbox'); | |
24 | mkdir('sandbox/folder2'); | |
25 | touch('sandbox/file1'); | |
26 | touch('sandbox/file2'); | |
27 | mkdir('sandbox/folder1'); | |
28 | touch('sandbox/folder1/file1'); | |
29 | touch('sandbox/folder1/file2'); | |
30 | mkdir('sandbox/folder3'); | |
31 | mkdir('/tmp/shaarli-to-delete'); | |
32 | } | |
33 | ||
34 | /** | |
35 | * Delete test file after every test. | |
36 | */ | |
37 | protected function tearDown(): void | |
38 | { | |
39 | @unlink(self::$file); | |
40 | ||
41 | @unlink('sandbox/folder1/file1'); | |
42 | @unlink('sandbox/folder1/file2'); | |
43 | @rmdir('sandbox/folder1'); | |
44 | @unlink('sandbox/file1'); | |
45 | @unlink('sandbox/file2'); | |
46 | @rmdir('sandbox/folder2'); | |
47 | @rmdir('sandbox/folder3'); | |
48 | @rmdir('/tmp/shaarli-to-delete'); | |
49 | } | |
50 | ||
51 | /** | |
52 | * Test writeDB, then readDB with different data. | |
53 | */ | |
54 | public function testSimpleWriteRead() | |
55 | { | |
56 | $data = ['blue', 'red']; | |
57 | $this->assertTrue(FileUtils::writeFlatDB(self::$file, $data) > 0); | |
58 | $this->assertTrue(startsWith(file_get_contents(self::$file), '<?php /*')); | |
59 | $this->assertEquals($data, FileUtils::readFlatDB(self::$file)); | |
60 | ||
61 | $data = 0; | |
62 | $this->assertTrue(FileUtils::writeFlatDB(self::$file, $data) > 0); | |
63 | $this->assertEquals($data, FileUtils::readFlatDB(self::$file)); | |
64 | ||
65 | $data = null; | |
66 | $this->assertTrue(FileUtils::writeFlatDB(self::$file, $data) > 0); | |
67 | $this->assertEquals($data, FileUtils::readFlatDB(self::$file)); | |
68 | ||
69 | $data = false; | |
70 | $this->assertTrue(FileUtils::writeFlatDB(self::$file, $data) > 0); | |
71 | $this->assertEquals($data, FileUtils::readFlatDB(self::$file)); | |
72 | } | |
73 | ||
74 | /** | |
75 | * File not writable: raise an exception. | |
76 | */ | |
77 | public function testWriteWithoutPermission() | |
78 | { | |
79 | $this->expectException(\Shaarli\Exceptions\IOException::class); | |
80 | $this->expectExceptionMessage('Error accessing "sandbox/flat.db"'); | |
81 | ||
82 | touch(self::$file); | |
83 | chmod(self::$file, 0440); | |
84 | FileUtils::writeFlatDB(self::$file, null); | |
85 | } | |
86 | ||
87 | /** | |
88 | * Folder non existent: raise an exception. | |
89 | */ | |
90 | public function testWriteFolderDoesNotExist() | |
91 | { | |
92 | $this->expectException(\Shaarli\Exceptions\IOException::class); | |
93 | $this->expectExceptionMessage('Error accessing "nopefolder"'); | |
94 | ||
95 | FileUtils::writeFlatDB('nopefolder/file', null); | |
96 | } | |
97 | ||
98 | /** | |
99 | * Folder non writable: raise an exception. | |
100 | */ | |
101 | public function testWriteFolderPermission() | |
102 | { | |
103 | $this->expectException(\Shaarli\Exceptions\IOException::class); | |
104 | $this->expectExceptionMessage('Error accessing "sandbox"'); | |
105 | ||
106 | chmod(dirname(self::$file), 0555); | |
107 | try { | |
108 | FileUtils::writeFlatDB(self::$file, null); | |
109 | } catch (Exception $e) { | |
110 | chmod(dirname(self::$file), 0755); | |
111 | throw $e; | |
112 | } | |
113 | } | |
114 | ||
115 | /** | |
116 | * Read non existent file, use default parameter. | |
117 | */ | |
118 | public function testReadNotExistentFile() | |
119 | { | |
120 | $this->assertEquals(null, FileUtils::readFlatDB(self::$file)); | |
121 | $this->assertEquals(['test'], FileUtils::readFlatDB(self::$file, ['test'])); | |
122 | } | |
123 | ||
124 | /** | |
125 | * Read non readable file, use default parameter. | |
126 | */ | |
127 | public function testReadNotReadable() | |
128 | { | |
129 | touch(self::$file); | |
130 | chmod(self::$file, 0220); | |
131 | $this->assertEquals(null, FileUtils::readFlatDB(self::$file)); | |
132 | $this->assertEquals(['test'], FileUtils::readFlatDB(self::$file, ['test'])); | |
133 | } | |
134 | ||
135 | /** | |
136 | * Test clearFolder with self delete and excluded files | |
137 | */ | |
138 | public function testClearFolderSelfDeleteWithExclusion(): void | |
139 | { | |
140 | FileUtils::clearFolder('sandbox', true, ['file2']); | |
141 | ||
142 | static::assertFileExists('sandbox/folder1/file2'); | |
143 | static::assertFileExists('sandbox/folder1'); | |
144 | static::assertFileExists('sandbox/file2'); | |
145 | static::assertFileExists('sandbox'); | |
146 | ||
147 | static::assertFileNotExists('sandbox/folder1/file1'); | |
148 | static::assertFileNotExists('sandbox/file1'); | |
149 | static::assertFileNotExists('sandbox/folder3'); | |
150 | } | |
151 | ||
152 | /** | |
153 | * Test clearFolder with self delete and excluded files | |
154 | */ | |
155 | public function testClearFolderSelfDeleteWithoutExclusion(): void | |
156 | { | |
157 | FileUtils::clearFolder('sandbox', true); | |
158 | ||
159 | static::assertFileNotExists('sandbox'); | |
160 | } | |
161 | ||
162 | /** | |
163 | * Test clearFolder with self delete and excluded files | |
164 | */ | |
165 | public function testClearFolderNoSelfDeleteWithoutExclusion(): void | |
166 | { | |
167 | FileUtils::clearFolder('sandbox', false); | |
168 | ||
169 | static::assertFileExists('sandbox'); | |
170 | ||
171 | // 2 because '.' and '..' | |
172 | static::assertCount(2, new \DirectoryIterator('sandbox')); | |
173 | } | |
174 | ||
175 | /** | |
176 | * Test clearFolder on a file instead of a folder | |
177 | */ | |
178 | public function testClearFolderOnANonDirectory(): void | |
179 | { | |
180 | $this->expectException(IOException::class); | |
181 | $this->expectExceptionMessage('Provided path is not a directory.'); | |
182 | ||
183 | FileUtils::clearFolder('sandbox/file1', false); | |
184 | } | |
185 | ||
186 | /** | |
187 | * Test clearFolder on a file instead of a folder | |
188 | */ | |
189 | public function testClearFolderOutsideOfShaarliDirectory(): void | |
190 | { | |
191 | $this->expectException(IOException::class); | |
192 | $this->expectExceptionMessage('Trying to delete a folder outside of Shaarli path.'); | |
193 | ||
194 | ||
195 | FileUtils::clearFolder('/tmp/shaarli-to-delete', true); | |
196 | } | |
197 | } |