FileStorageTest.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. <?php /** @noinspection DuplicatedCode */
  2. use ApiPlatform\Core\Api\IriConverterInterface;
  3. use App\Entity\Access\Access;
  4. use App\Entity\Core\File;
  5. use App\Entity\Organization\Organization;
  6. use App\Entity\Person\Person;
  7. use App\Enum\Core\FileStatusEnum;
  8. use App\Enum\Core\FileTypeEnum;
  9. use App\Repository\Access\AccessRepository;
  10. use App\Service\Storage\FileStorage;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Gaufrette\Filesystem;
  13. use JetBrains\PhpStorm\Pure;
  14. use Knp\Bundle\GaufretteBundle\FilesystemMap;
  15. use PHPUnit\Framework\TestCase;
  16. class TestableFileStorage extends FileStorage {
  17. public const FS_KEY = parent::FS_KEY;
  18. public function getPrefix(mixed $owner, bool $isTemporary, string $type = null): string {
  19. return parent::getPrefix($owner, $isTemporary, $type);
  20. }
  21. #[Pure] public function getOrganizationAndPersonFromOwner(mixed $owner): array {
  22. return parent::getOrganizationAndPersonFromOwner($owner);
  23. }
  24. }
  25. class FileStorageTest extends TestCase
  26. {
  27. private FilesystemMap $filesystemMap;
  28. private EntityManagerInterface $entityManager;
  29. private AccessRepository $accessRepository;
  30. private Filesystem $filesystem;
  31. private IriConverterInterface $iriConverter;
  32. public function setUp(): void
  33. {
  34. $this->filesystemMap = $this->getMockBuilder(FilesystemMap::class)->disableOriginalConstructor()->getMock();
  35. $this->entityManager = $this->getMockBuilder(EntityManagerInterface::class)->disableOriginalConstructor()->getMock();
  36. $this->accessRepository = $this->getMockBuilder(AccessRepository::class)->disableOriginalConstructor()->getMock();
  37. $this->iriConverter = $this->getMockBuilder(IriConverterInterface::class)->disableOriginalConstructor()->getMock();
  38. $this->filesystem = $this->getMockBuilder(Filesystem::class)->disableOriginalConstructor()->getMock();
  39. $this->filesystemMap->method('get')->with(TestableFileStorage::FS_KEY)->willReturn($this->filesystem);
  40. }
  41. public function testExists(): void {
  42. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  43. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  44. ->setMethodsExcept(['exists'])
  45. ->getMock();
  46. $file = $this->getMockBuilder(File::class)->getMock();
  47. $file->method('getSlug')->willReturn('foo');
  48. $this->filesystem->expects(self::once())->method('has')->with('foo')->willReturn(true);
  49. $this->assertTrue($fileStorage->exists($file));
  50. }
  51. public function testExistsInexistant(): void {
  52. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  53. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  54. ->setMethodsExcept(['exists'])
  55. ->getMock();
  56. $file = $this->getMockBuilder(File::class)->getMock();
  57. $file->method('getSlug')->willReturn('foo');
  58. $this->filesystem->expects(self::once())->method('has')->with('foo')->willReturn(false);
  59. $this->assertFalse($fileStorage->exists($file));
  60. }
  61. public function testListByOwner(): void
  62. {
  63. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  64. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  65. ->setMethodsExcept(['listByOwner'])
  66. ->getMock();
  67. $owner = $this->getMockBuilder(Organization::class)->getMock();
  68. $fileStorage->method('getPrefix')->with($owner, false, FileTypeEnum::LICENCE_CMF()->getValue())->willReturn('foo');
  69. $this->filesystem->method('listKeys')->with('foo')->willReturn(['foo/a.txt', 'foo/b.pdf']);
  70. $this->assertEquals(
  71. ['foo/a.txt', 'foo/b.pdf'],
  72. $fileStorage->listByOwner($owner, FileTypeEnum::LICENCE_CMF())
  73. );
  74. }
  75. public function testRead(): void
  76. {
  77. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  78. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  79. ->setMethodsExcept(['read'])
  80. ->getMock();
  81. $file = $this->getMockBuilder(File::class)->getMock();
  82. $file->method('getSlug')->willReturn('foo');
  83. $this->filesystem->method('read')->with('foo')->willReturn('12345679');
  84. $this->assertEquals(
  85. '12345679',
  86. $fileStorage->read($file)
  87. );
  88. }
  89. public function testPrepareFile(): void
  90. {
  91. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  92. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  93. ->setMethodsExcept(['prepareFile'])
  94. ->getMock();
  95. $owner = $this->getMockBuilder(Organization::class)->getMock();
  96. $author = $this->getMockBuilder(Access::class)->getMock();
  97. $author->method('getId')->willReturn(123);
  98. $fileStorage->method('getOrganizationAndPersonFromOwner')->with($owner)->willReturn([$owner, null]);
  99. $this->entityManager->expects(self::once())->method('persist');
  100. $this->entityManager->expects(self::once())->method('flush');
  101. $file = $fileStorage->prepareFile(
  102. $owner,
  103. 'file.ext',
  104. FileTypeEnum::LICENCE_CMF(),
  105. $author,
  106. true,
  107. 'ONLY_ORGANIZATION',
  108. 'application/pdf'
  109. );
  110. $this->assertEquals($owner, $file->getOrganization());
  111. $this->assertEquals(null, $file->getPerson());
  112. $this->assertEquals('file.ext', $file->getName());
  113. $this->assertEquals(null, $file->getSlug());
  114. $this->assertEquals(FileTypeEnum::LICENCE_CMF()->getValue(), $file->getType());
  115. $this->assertEquals(true, $file->getIsTemporaryFile());
  116. $this->assertEquals('ONLY_ORGANIZATION', $file->getVisibility());
  117. $this->assertEquals('application/pdf', $file->getMimeType());
  118. $this->assertEquals(123, $file->getCreatedBy());
  119. }
  120. public function testPrepareFileDefaultValues(): void
  121. {
  122. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  123. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  124. ->setMethodsExcept(['prepareFile'])
  125. ->getMock();
  126. $owner = $this->getMockBuilder(Person::class)->getMock();
  127. $author = $this->getMockBuilder(Access::class)->getMock();
  128. $fileStorage->method('getOrganizationAndPersonFromOwner')->with($owner)->willReturn([null, $owner]);
  129. $this->entityManager->expects(self::once())->method('persist');
  130. $this->entityManager->expects(self::once())->method('flush');
  131. $file = $fileStorage->prepareFile($owner, 'file.txt', FileTypeEnum::NONE(), $author);
  132. $this->assertEquals(null, $file->getOrganization());
  133. $this->assertEquals($owner, $file->getPerson());
  134. $this->assertEquals('file.txt', $file->getName());
  135. $this->assertEquals(FileTypeEnum::NONE()->getValue(), $file->getType());
  136. $this->assertEquals(false, $file->getIsTemporaryFile());
  137. $this->assertEquals('NOBODY', $file->getVisibility());
  138. $this->assertEquals('text/plain', $file->getMimeType());
  139. }
  140. public function testPrepareFileNoFlush(): void
  141. {
  142. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  143. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  144. ->setMethodsExcept(['prepareFile'])
  145. ->getMock();
  146. $owner = $this->getMockBuilder(Organization::class)->getMock();
  147. $author = $this->getMockBuilder(Access::class)->getMock();
  148. $fileStorage->method('getOrganizationAndPersonFromOwner')->with($owner)->willReturn([$owner, null]);
  149. $this->entityManager->expects(self::once())->method('persist');
  150. $this->entityManager->expects(self::never())->method('flush');
  151. $fileStorage->prepareFile(
  152. $owner,
  153. 'file.txt',
  154. FileTypeEnum::NONE(),
  155. $author,
  156. false,
  157. 'NOBODY',
  158. null,
  159. false
  160. );
  161. }
  162. public function testWriteFileNewFile(): void {
  163. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  164. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  165. ->setMethodsExcept(['writeFile'])
  166. ->getMock();
  167. $organization = $this->getMockBuilder(Organization::class)->getMock();
  168. $author = $this->getMockBuilder(Access::class)->getMock();
  169. $author->method('getId')->willReturn(123);
  170. $file = $this->getMockBuilder(File::class)->getMock();
  171. $file->method('getName')->willReturn('foo.txt');
  172. $file->method('getOrganization')->willReturn($organization);
  173. $file->method('getPerson')->willReturn(null);
  174. $file->method('getIsTemporaryFile')->willReturn(false);
  175. $file->method('getSlug')->willReturn(null);
  176. $file->method('getType')->willReturn(FileTypeEnum::NONE()->getValue());
  177. $fileStorage
  178. ->method('getPrefix')
  179. ->with($organization, false, FileTypeEnum::NONE()->getValue())
  180. ->willReturn('prefix/');
  181. $content = '123456789';
  182. $size = strlen($content);
  183. $this->filesystem
  184. ->expects(self::once())
  185. ->method('write')
  186. ->with(self::matchesRegularExpression('/^prefix\/\w{16,24}\/foo.txt/'), $content, true)
  187. ->willReturn($size);
  188. $file->expects(self::once())->method('setSize')->with($size)->willReturnSelf();
  189. $file->expects(self::once())->method('setStatus')->with(FileStatusEnum::READY()->getValue())->willReturnSelf();
  190. $file->expects(self::once())
  191. ->method('setSlug')
  192. ->with(self::matchesRegularExpression('/^prefix\/\w{16,24}\/foo.txt/'))
  193. ->willReturnSelf();
  194. $file->expects(self::once())->method('setCreateDate')->with(self::isInstanceOf(DateTime::class))->willReturnSelf();
  195. $file->expects(self::once())->method('setCreatedBy')->with(123)->willReturnSelf();
  196. $file->expects(self::never())->method('setUpdateDate');
  197. $file->expects(self::never())->method('setUpdatedBy');
  198. $this->entityManager->expects(self::once())->method('flush');
  199. $returned = $fileStorage->writeFile($file, $content, $author);
  200. $this->assertEquals($file, $returned);
  201. }
  202. public function testWriteFileExistingFile(): void {
  203. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  204. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  205. ->setMethodsExcept(['writeFile'])
  206. ->getMock();
  207. $person = $this->getMockBuilder(Person::class)->getMock();
  208. $author = $this->getMockBuilder(Access::class)->getMock();
  209. $author->method('getId')->willReturn(123);
  210. $key = 'prefix/uid/bar.txt';
  211. $file = $this->getMockBuilder(File::class)->getMock();
  212. $file->method('getName')->willReturn('bar.txt');
  213. $file->method('getOrganization')->willReturn(null);
  214. $file->method('getPerson')->willReturn($person);
  215. $file->method('getIsTemporaryFile')->willReturn(true);
  216. $file->method('getSlug')->willReturn($key);
  217. $file->method('getType')->willReturn(FileTypeEnum::NONE()->getValue());
  218. $fileStorage->expects(self::never())->method('getPrefix');
  219. $content = '123 Soleil';
  220. $size = strlen($content);
  221. $this->filesystem
  222. ->expects(self::once())
  223. ->method('write')
  224. ->with($key, $content, true)
  225. ->willReturn($size);
  226. $this->filesystem->method('has')->with($key)->willReturn(true);
  227. $file->expects(self::once())->method('setSize')->with($size)->willReturnSelf();
  228. $file->expects(self::once())->method('setStatus')->with(FileStatusEnum::READY()->getValue())->willReturnSelf();
  229. $file->expects(self::never())->method('setSlug');
  230. $file->expects(self::never())->method('setCreateDate');
  231. $file->expects(self::never())->method('setCreatedBy');
  232. $file->expects(self::once())->method('setUpdateDate')->with(self::isInstanceOf(DateTime::class))->willReturnSelf();
  233. $file->expects(self::once())->method('setUpdatedBy')->with(123)->willReturnSelf();
  234. $this->entityManager->expects(self::once())->method('flush');
  235. $returned = $fileStorage->writeFile($file, $content, $author);
  236. $this->assertEquals($file, $returned);
  237. }
  238. public function testWriteFileExistingButMissingFile(): void
  239. {
  240. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  241. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  242. ->setMethodsExcept(['writeFile'])
  243. ->getMock();
  244. $person = $this->getMockBuilder(Person::class)->getMock();
  245. $author = $this->getMockBuilder(Access::class)->getMock();
  246. $key = 'prefix/uid/bar.txt';
  247. $file = $this->getMockBuilder(File::class)->getMock();
  248. $file->method('getName')->willReturn('bar.txt');
  249. $file->method('getOrganization')->willReturn(null);
  250. $file->method('getPerson')->willReturn($person);
  251. $file->method('getIsTemporaryFile')->willReturn(true);
  252. $file->method('getSlug')->willReturn($key);
  253. $file->method('getType')->willReturn(FileTypeEnum::NONE()->getValue());
  254. $this->filesystem->expects(self::never())->method('write');
  255. $this->entityManager->expects(self::never())->method('flush');
  256. $this->filesystem->method('has')->with($key)->willReturn(false);
  257. $this->expectException(RuntimeException::class);
  258. $this->expectDeprecationMessage('The file `' . $key . '` does not exist in the file storage');
  259. $returned = $fileStorage->writeFile($file, '12346', $author);
  260. }
  261. public function testWriteFileWithAccessOwner(): void {
  262. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  263. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  264. ->setMethodsExcept(['writeFile'])
  265. ->getMock();
  266. $access = $this->getMockBuilder(Access::class)->getMock();
  267. $person = $this->getMockBuilder(Person::class)->getMock();
  268. $organization = $this->getMockBuilder(Organization::class)->getMock();
  269. $author = $this->getMockBuilder(Access::class)->getMock();
  270. $author->method('getId')->willReturn(123);
  271. $file = $this->getMockBuilder(File::class)->getMock();
  272. $file->method('getName')->willReturn('bar.txt');
  273. $file->method('getOrganization')->willReturn($organization);
  274. $file->method('getPerson')->willReturn($person);
  275. $file->method('getIsTemporaryFile')->willReturn(true);
  276. $file->method('getSlug')->willReturn(null);
  277. $file->method('getType')->willReturn(FileTypeEnum::NONE()->getValue());
  278. $this->accessRepository
  279. ->expects(self::once())
  280. ->method('findOneBy')
  281. ->with(['organization' => $organization, 'person' => $person])
  282. ->willReturn($access);
  283. $fileStorage
  284. ->expects(self::once())
  285. ->method('getPrefix')
  286. ->with($access, true, FileTypeEnum::NONE()->getValue())
  287. ->willReturn('prefix/');
  288. $content = '1';
  289. $this->filesystem->method('write')->willReturn(1);
  290. $fileStorage->writeFile($file, $content, $author);
  291. }
  292. public function testWriteFileWithNoName(): void
  293. {
  294. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  295. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  296. ->setMethodsExcept(['writeFile'])
  297. ->getMock();
  298. $author = $this->getMockBuilder(Access::class)->getMock();
  299. $file = $this->getMockBuilder(File::class)->getMock();
  300. $file->method('getName')->willReturn('');
  301. $this->expectException(RuntimeException::class);
  302. $this->expectExceptionMessage('File has no filename');
  303. $fileStorage->writeFile($file, '...', $author);
  304. }
  305. public function testMakeFile(): void {
  306. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  307. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  308. ->setMethodsExcept(['makeFile'])
  309. ->getMock();
  310. $organization = $this->getMockBuilder(Organization::class)->getMock();
  311. $author = $this->getMockBuilder(Access::class)->getMock();
  312. $file = $this->getMockBuilder(File::class)->getMock();
  313. $fileStorage
  314. ->expects(self::once())
  315. ->method('prepareFile')
  316. ->with($organization, 'foo.txt', FileTypeEnum::NONE(), $author, true, 'ONLY_ORGANIZATION', 'mime/type')
  317. ->willReturn($file);
  318. $fileStorage
  319. ->expects(self::once())
  320. ->method('writeFile')
  321. ->with($file, '...', $author)
  322. ->willReturn($file);
  323. $fileStorage->makeFile(
  324. $organization,
  325. 'foo.txt',
  326. FileTypeEnum::NONE(),
  327. '...',
  328. $author,
  329. true,
  330. 'ONLY_ORGANIZATION',
  331. 'mime/type');
  332. }
  333. public function testDelete(): void {
  334. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  335. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  336. ->setMethodsExcept(['delete'])
  337. ->getMock();
  338. $author = $this->getMockBuilder(Access::class)->getMock();
  339. $author->method('getId')->willReturn(123);
  340. $file = $this->getMockBuilder(File::class)->getMock();
  341. $file->method('getSlug')->willReturn('key');
  342. $this->filesystem->expects(self::once())->method('delete')->with('key')->willReturn(true);
  343. $file->expects(self::once())->method('setStatus')->with(FileStatusEnum::DELETED()->getValue())->willReturnSelf();
  344. $file->expects(self::once())->method('setSize')->with(0)->willReturnSelf();
  345. $file->expects(self::once())->method('setUpdatedBy')->with(123)->willReturnSelf();
  346. $returned = $fileStorage->delete($file, $author);
  347. $this->assertEquals($file, $returned);
  348. }
  349. public function testDeleteFailed(): void {
  350. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  351. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  352. ->setMethodsExcept(['delete'])
  353. ->getMock();
  354. $author = $this->getMockBuilder(Access::class)->getMock();
  355. $author->method('getId')->willReturn(123);
  356. $file = $this->getMockBuilder(File::class)->getMock();
  357. $file->method('getSlug')->willReturn('key');
  358. $this->filesystem->expects(self::once())->method('delete')->with('key')->willReturn(false);
  359. $file->expects(self::never())->method('setStatus');
  360. $file->expects(self::never())->method('setSize');
  361. $file->expects(self::never())->method('setUpdatedBy');
  362. $this->expectException(RuntimeException::class);
  363. $this->expectExceptionMessage('File `' . $file->getSlug() . '` could\'nt be deleted');
  364. $fileStorage->delete($file, $author);
  365. }
  366. public function testGetPrefixAccess(): void {
  367. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  368. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  369. ->setMethodsExcept(['getPrefix'])
  370. ->getMock();
  371. $organization = $this->getMockBuilder(Organization::class)->getMock();
  372. $organization->method('getId')->willReturn(2);
  373. $access = $this->getMockBuilder(Access::class)->getMock();
  374. $access->method('getOrganization')->willReturn($organization);
  375. $access->method('getId')->willReturn(1);
  376. $prefix = $fileStorage->getPrefix($access, false);
  377. $this->assertEquals('organization/2/1', $prefix);
  378. }
  379. public function testGetPrefixOrganization(): void {
  380. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  381. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  382. ->setMethodsExcept(['getPrefix'])
  383. ->getMock();
  384. $organization = $this->getMockBuilder(Organization::class)->getMock();
  385. $organization->method('getId')->willReturn(1);
  386. $prefix = $fileStorage->getPrefix($organization, false);
  387. $this->assertEquals('organization/1', $prefix);
  388. }
  389. public function testGetPrefixPerson(): void {
  390. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  391. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  392. ->setMethodsExcept(['getPrefix'])
  393. ->getMock();
  394. $person = $this->getMockBuilder(Person::class)->getMock();
  395. $person->method('getId')->willReturn(1);
  396. $prefix = $fileStorage->getPrefix($person, false);
  397. $this->assertEquals('person/1', $prefix);
  398. }
  399. public function testGetPrefixTemp(): void {
  400. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  401. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  402. ->setMethodsExcept(['getPrefix'])
  403. ->getMock();
  404. $organization = $this->getMockBuilder(Organization::class)->getMock();
  405. $organization->method('getId')->willReturn(1);
  406. $prefix = $fileStorage->getPrefix($organization, true);
  407. $this->assertEquals('temp/organization/1', $prefix);
  408. }
  409. public function testGetPrefixWithType(): void {
  410. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  411. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  412. ->setMethodsExcept(['getPrefix'])
  413. ->getMock();
  414. $organization = $this->getMockBuilder(Organization::class)->getMock();
  415. $organization->method('getId')->willReturn(1);
  416. $prefix = $fileStorage->getPrefix($organization, false, FileTypeEnum::LICENCE_CMF()->getValue());
  417. $this->assertEquals('organization/1/licence_cmf', $prefix);
  418. }
  419. public function testGuessMimeTypeFromFilename(): void {
  420. $this->assertEquals('application/pdf', TestableFileStorage::guessMimeTypeFromFilename('file.pdf'));
  421. $this->assertEquals('text/csv', TestableFileStorage::guessMimeTypeFromFilename('file.csv'));
  422. $this->assertEquals('text/plain', TestableFileStorage::guessMimeTypeFromFilename('file.txt'));
  423. $this->assertEquals('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', TestableFileStorage::guessMimeTypeFromFilename('file.xlsx'));
  424. $this->assertEquals('application/xml', TestableFileStorage::guessMimeTypeFromFilename('file.xml'));
  425. $this->assertEquals(null, TestableFileStorage::guessMimeTypeFromFilename('file'));
  426. $this->assertEquals(null, TestableFileStorage::guessMimeTypeFromFilename('file.invalid'));
  427. }
  428. public function testGuessMimeTypeFromExt(): void {
  429. $this->assertEquals('application/pdf', TestableFileStorage::getMimeTypeFromExt('pdf'));
  430. $this->assertEquals('text/csv', TestableFileStorage::getMimeTypeFromExt('csv'));
  431. $this->assertEquals('text/plain', TestableFileStorage::getMimeTypeFromExt('txt'));
  432. $this->assertEquals('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', TestableFileStorage::getMimeTypeFromExt('xlsx'));
  433. $this->assertEquals('application/xml', TestableFileStorage::getMimeTypeFromExt('xml'));
  434. $this->assertEquals('text/plain', TestableFileStorage::getMimeTypeFromExt('.txt'));
  435. $this->assertEquals(null, TestableFileStorage::getMimeTypeFromExt(''));
  436. $this->assertEquals(null, TestableFileStorage::getMimeTypeFromExt('invalid'));
  437. }
  438. public function testGetOrganizationAndPersonFromOwner(): void {
  439. $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
  440. ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
  441. ->setMethodsExcept(['getOrganizationAndPersonFromOwner'])
  442. ->getMock();
  443. $organization = $this->getMockBuilder(Organization::class)->getMock();
  444. $organization->method('getId')->willReturn(2);
  445. $person = $this->getMockBuilder(Person::class)->getMock();
  446. $person->method('getId')->willReturn(1);
  447. $access = $this->getMockBuilder(Access::class)->getMock();
  448. $access->method('getOrganization')->willReturn($organization);
  449. $access->method('getPerson')->willReturn($person);
  450. $access->method('getId')->willReturn(1);
  451. $this->assertEquals([$organization, $person], $fileStorage->getOrganizationAndPersonFromOwner($access));
  452. $this->assertEquals([$organization, null], $fileStorage->getOrganizationAndPersonFromOwner($organization));
  453. $this->assertEquals([null, $person], $fileStorage->getOrganizationAndPersonFromOwner($person));
  454. }
  455. }