Skip to content

Commit 4047a08

Browse files
author
Julien Veyssier
committed
refs #2338 improve and test ImageService::getUniqueFileName()
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
1 parent 6759366 commit 4047a08

File tree

2 files changed

+48
-4
lines changed

2 files changed

+48
-4
lines changed

lib/Service/ImageService.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -242,13 +242,20 @@ private function copyImageFile(File $imageFile, Folder $saveDir, File $textFile)
242242
* @param string $fileName
243243
* @return string
244244
*/
245-
private function getUniqueFileName(Folder $dir, string $fileName): string {
245+
public static function getUniqueFileName(Folder $dir, string $fileName): string {
246246
$extension = pathinfo($fileName, PATHINFO_EXTENSION);
247247
$counter = 1;
248248
$uniqueFileName = $fileName;
249-
while ($dir->nodeExists($uniqueFileName)) {
250-
$counter++;
251-
$uniqueFileName = preg_replace('/\.' . $extension . '$/', ' (' . $counter . ').' . $extension, $fileName);
249+
if ($extension !== '') {
250+
while ($dir->nodeExists($uniqueFileName)) {
251+
$counter++;
252+
$uniqueFileName = preg_replace('/\.' . $extension . '$/', ' (' . $counter . ').' . $extension, $fileName);
253+
}
254+
} else {
255+
while ($dir->nodeExists($uniqueFileName)) {
256+
$counter++;
257+
$uniqueFileName = preg_replace('/$/', ' (' . $counter . ')', $fileName);
258+
}
252259
}
253260
return $uniqueFileName;
254261
}

tests/TextTest.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use OCA\Text\AppInfo\Application;
66
use OCA\Text\Service\ImageService;
7+
use OCP\Files\Folder;
78

89
class TextTest extends \PHPUnit\Framework\TestCase {
910
public function testDummy() {
@@ -34,4 +35,40 @@ public function testGetAttachmentNamesFromContent() {
3435
$this->assertContains($contentName, $computedNames);
3536
}
3637
}
38+
39+
public function testGetUniqueFileName() {
40+
$fileNameList = [
41+
'foo.png',
42+
'bar',
43+
'plop.png',
44+
'plop (2).png',
45+
'lala.png',
46+
'lala (2).png',
47+
'lala (3).png',
48+
'yay.png',
49+
'yay (2).png',
50+
'yay (3).png',
51+
'yay (5).png',
52+
'file.ext.ext',
53+
];
54+
55+
$folder = $this->createMock(Folder::class);
56+
$folder->expects(self::any())
57+
->method('nodeExists')
58+
->willReturnCallback(function ($name) use ($fileNameList) {
59+
return in_array($name, $fileNameList);
60+
});
61+
62+
// files that do not exist yet
63+
$this->assertEquals('doesNotExistYet', ImageService::getUniqueFileName($folder, 'doesNotExistYet'));
64+
$this->assertEquals('doesNotExistYet.png', ImageService::getUniqueFileName($folder, 'doesNotExistYet.png'));
65+
66+
// files that already exist
67+
$this->assertEquals('foo (2).png', ImageService::getUniqueFileName($folder, 'foo.png'));
68+
$this->assertEquals('bar (2)', ImageService::getUniqueFileName($folder, 'bar'));
69+
$this->assertEquals('plop (3).png', ImageService::getUniqueFileName($folder, 'plop.png'));
70+
$this->assertEquals('lala (4).png', ImageService::getUniqueFileName($folder, 'lala.png'));
71+
$this->assertEquals('yay (4).png', ImageService::getUniqueFileName($folder, 'yay.png'));
72+
$this->assertEquals('file.ext (2).ext', ImageService::getUniqueFileName($folder, 'file.ext.ext'));
73+
}
3774
}

0 commit comments

Comments
 (0)