Procházet zdrojové kódy

FileStorage::guessMimetype : refactor and makes static

Olivier Massot před 3 roky
rodič
revize
3d4ae3f45e

+ 27 - 17
src/Service/Storage/FileStorage.php

@@ -110,7 +110,7 @@ class FileStorage
             ->setType($type->getValue())
             ->setVisibility($visibility)
             ->setIsTemporaryFile($isTemporary)
-            ->setMimeType($mimeType ?? $this->guessMimeTypeFromFilename($filename))
+            ->setMimeType($mimeType ?? self::guessMimeTypeFromFilename($filename))
             ->setCreatedBy($createdBy->getId())
             ->setStatus(FileStatusEnum::PENDING()->getValue());
 
@@ -249,6 +249,32 @@ class FileStorage
         return $file;
     }
 
+    /**
+     * Return the mimetype corresponding to the givent file extension
+     *
+     * @param string $ext
+     * @return string|null
+     */
+    public static function getMimeTypeFromExt(string $ext): string | null {
+        return (new MimeTypes)->getMimeType(ltrim($ext, '.'));
+    }
+
+    /**
+     * Try to guess the mimetype from the filename
+     *
+     * Return null if it did not manage to guess it.
+     *
+     * @param string $filename
+     * @return string|null
+     */
+    public static function guessMimeTypeFromFilename(string $filename): string | null {
+        $ext = pathinfo($filename, PATHINFO_EXTENSION);
+        if (empty($ext)) {
+            return null;
+        }
+        return self::getMimeTypeFromExt($ext);
+    }
+
     /**
      * If an organization owns the file, the prefix will be '(_temp_/)organization/{id}(/{type})'.
      * If a person owns it, the prefix will be '(_temp_/)person/{id}(/{type})'
@@ -289,22 +315,6 @@ class FileStorage
         return $prefix;
     }
 
-    /**
-     * Try to guess the mimetype from the filename
-     *
-     * Return null if it did not manage to guess it.
-     *
-     * @param string $filename
-     * @return string|null
-     */
-    protected function guessMimeTypeFromFilename(string $filename): string | null {
-        $ext = pathinfo($filename, PATHINFO_EXTENSION);
-        if (empty($ext)) {
-            return null;
-        }
-        return (new MimeTypes)->getMimeType($ext);
-    }
-
     /**
      * Return an array [$organization, $person] from a given owner
      *

+ 24 - 13
tests/Service/Storage/FileStorageTest.php

@@ -20,9 +20,6 @@ class TestableFileStorage extends FileStorage {
     public function getPrefix(mixed $owner, bool $isTemporary, string $type = null): string {
         return parent::getPrefix($owner, $isTemporary, $type);
     }
-    public function guessMimeTypeFromFilename(string $filename): string | null {
-        return parent::guessMimeTypeFromFilename($filename);
-    }
     #[Pure] public function getOrganizationAndPersonFromOwner(mixed $owner): array {
         return parent::getOrganizationAndPersonFromOwner($owner);
     }
@@ -124,7 +121,6 @@ class FileStorageTest extends TestCase
         $author->method('getId')->willReturn(123);
 
         $fileStorage->method('getOrganizationAndPersonFromOwner')->with($owner)->willReturn([$owner, null]);
-        $fileStorage->method('guessMimeTypeFromFilename')->with('file.txt')->willReturn('text/plain');
 
         $this->entityManager->expects(self::once())->method('persist');
         $this->entityManager->expects(self::once())->method('flush');
@@ -162,7 +158,6 @@ class FileStorageTest extends TestCase
         $author = $this->getMockBuilder(Access::class)->getMock();
 
         $fileStorage->method('getOrganizationAndPersonFromOwner')->with($owner)->willReturn([null, $owner]);
-        $fileStorage->method('guessMimeTypeFromFilename')->with('file.txt')->willReturn('text/plain');
 
         $this->entityManager->expects(self::once())->method('persist');
         $this->entityManager->expects(self::once())->method('flush');
@@ -189,7 +184,6 @@ class FileStorageTest extends TestCase
         $author = $this->getMockBuilder(Access::class)->getMock();
 
         $fileStorage->method('getOrganizationAndPersonFromOwner')->with($owner)->willReturn([$owner, null]);
-        $fileStorage->method('guessMimeTypeFromFilename')->with('file.txt')->willReturn('text/plain');
 
         $this->entityManager->expects(self::once())->method('persist');
         $this->entityManager->expects(self::never())->method('flush');
@@ -555,14 +549,31 @@ class FileStorageTest extends TestCase
             ->setMethodsExcept(['guessMimeTypeFromFilename'])
             ->getMock();
 
-        $this->assertEquals('application/pdf', $fileStorage->guessMimeTypeFromFilename('file.pdf'));
-        $this->assertEquals('text/csv', $fileStorage->guessMimeTypeFromFilename('file.csv'));
-        $this->assertEquals('text/plain', $fileStorage->guessMimeTypeFromFilename('file.txt'));
-        $this->assertEquals('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', $fileStorage->guessMimeTypeFromFilename('file.xlsx'));
-        $this->assertEquals('application/xml', $fileStorage->guessMimeTypeFromFilename('file.xml'));
+        $this->assertEquals('application/pdf', $fileStorage::guessMimeTypeFromFilename('file.pdf'));
+        $this->assertEquals('text/csv', $fileStorage::guessMimeTypeFromFilename('file.csv'));
+        $this->assertEquals('text/plain', $fileStorage::guessMimeTypeFromFilename('file.txt'));
+        $this->assertEquals('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', $fileStorage::guessMimeTypeFromFilename('file.xlsx'));
+        $this->assertEquals('application/xml', $fileStorage::guessMimeTypeFromFilename('file.xml'));
+
+        $this->assertEquals(null, $fileStorage::guessMimeTypeFromFilename('file'));
+        $this->assertEquals(null, $fileStorage::guessMimeTypeFromFilename('file.invalid'));
+    }
+
+    public function testGuessMimeTypeFromExt(): void {
+        $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setMethodsExcept(['guessMimeTypeFromExt'])
+            ->getMock();
+
+        $this->assertEquals('application/pdf', $fileStorage::getMimeTypeFromExt('pdf'));
+        $this->assertEquals('text/csv', $fileStorage::getMimeTypeFromExt('csv'));
+        $this->assertEquals('text/plain', $fileStorage::getMimeTypeFromExt('txt'));
+        $this->assertEquals('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', $fileStorage::getMimeTypeFromExt('xlsx'));
+        $this->assertEquals('application/xml', $fileStorage::getMimeTypeFromExt('xml'));
 
-        $this->assertEquals(null, $fileStorage->guessMimeTypeFromFilename('file'));
-        $this->assertEquals(null, $fileStorage->guessMimeTypeFromFilename('file.invalid'));
+        $this->assertEquals('text/plain', $fileStorage::getMimeTypeFromExt('.txt'));
+        $this->assertEquals(null, $fileStorage::getMimeTypeFromExt(''));
+        $this->assertEquals(null, $fileStorage::getMimeTypeFromExt('invalid'));
     }
 
     public function testGetOrganizationAndPersonFromOwner(): void {