‪TYPO3CMS  ‪main
FileTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\Attributes\DataProvider;
21 use PHPUnit\Framework\Attributes\Test;
22 use PHPUnit\Framework\MockObject\MockObject;
31 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
32 
33 final class ‪FileTest extends UnitTestCase
34 {
35  protected bool ‪$resetSingletonInstances = true;
36 
37  protected ‪ResourceStorage&MockObject ‪$storageMock;
38 
39  protected function ‪setUp(): void
40  {
41  parent::setUp();
42  $this->storageMock = $this->createMock(ResourceStorage::class);
43  $this->storageMock->method('getUid')->willReturn(5);
44 
45  $mockedMetaDataRepository = $this->createMock(MetaDataRepository::class);
46  $mockedMetaDataRepository->method('findByFile')->willReturn(['file' => 1]);
47  GeneralUtility::setSingletonInstance(MetaDataRepository::class, $mockedMetaDataRepository);
48  }
49 
50  protected function ‪prepareFixture(): ‪File
51  {
52  $fixture = new ‪File(['testfile'], $this->storageMock);
53  return $fixture;
54  }
55 
56  #[Test]
58  {
59  $properties = [
60  'name' => ‪StringUtility::getUniqueId('name_'),
61  'storage' => ‪$this->storageMock,
62  'size' => 1024,
63  ];
64  $fixture = new ‪File($properties, $this->storageMock);
65  foreach ($properties as $key => $value) {
66  self::assertEquals($value, $fixture->{'get' . $key}());
67  }
68  }
69 
70  #[Test]
71  public function ‪fileIndexStatusIsTrueIfUidIsSet(): void
72  {
73  $fixture = new ‪File(['uid' => 1], $this->storageMock);
74  self::assertTrue($fixture->isIndexed());
75  }
76 
77  #[Test]
79  {
80  ‪$identifier = '/' . ‪StringUtility::getUniqueId('identifier_');
81  $fixture = new ‪File(['uid' => 1, 'identifier' => '/test'], $this->storageMock);
82  $fixture->updateProperties(['identifier' => ‪$identifier]);
83  self::assertEquals(‪$identifier, $fixture->getIdentifier());
84  }
85 
86  #[Test]
88  {
89  $fixture = new ‪File(['uid' => 1, 'foo' => 'asdf', 'identifier' => '/test'], $this->storageMock);
90  $fixture->updateProperties(['foo' => 'foobar']);
91  self::assertEquals('/test', $fixture->getIdentifier());
92  self::assertEquals('/test', $fixture->getProperty('identifier'));
93  }
94 
95  #[Test]
97  {
98  $fixture = new ‪File(['uid' => 1, 'identifier' => '/test'], $this->storageMock);
99  $fixture->updateProperties(['uid' => 3]);
100  self::assertEquals(1, $fixture->getUid());
101  }
102 
103  #[Test]
105  {
106  $fixture = new ‪File(['uid' => 1, 'foo' => 'asdf', 'baz' => 'fdsw', 'identifier' => '/test'], $this->storageMock);
107  $fixture->updateProperties(['foo' => 'foobar', 'baz' => 'foobaz']);
108  self::assertEquals(['foo', 'baz'], $fixture->getUpdatedProperties());
109  }
110 
111  #[Test]
113  {
114  $fixture = new ‪File(['uid' => 1, 'foo' => 'asdf', 'identifier' => '/test'], $this->storageMock);
115  $fixture->updateProperties(['foo' => 'asdf']);
116  self::assertEmpty($fixture->getUpdatedProperties());
117  }
118 
119  #[Test]
121  {
122  $fixture = new ‪File(['uid' => 1, 'foo' => 'asdf', 'baz' => 'fdsw', 'identifier' => '/test'], $this->storageMock);
123  $fixture->updateProperties(['foo' => 'foobar', 'baz' => 'foobaz']);
124  $fixture->updateProperties(['foo' => 'fdsw', 'baz' => 'asdf']);
125  self::assertEquals(['foo', 'baz'], $fixture->getUpdatedProperties());
126  }
127 
128  #[Test]
130  {
131  $fileProperties = [
132  'uid' => 1,
133  'storage' => 'first',
134  ];
135  $subject = $this->getMockBuilder(File::class)
136  ->onlyMethods([])
137  ->setConstructorArgs([$fileProperties, $this->storageMock])
138  ->getMock();
139  $mockedNewStorage = $this->createMock(ResourceStorage::class);
140  $mockedStorageRepository = $this->createMock(StorageRepository::class);
141  $mockedStorageRepository
142  ->expects(self::once())
143  ->method('findByUid')
144  ->willReturn($mockedNewStorage);
145  GeneralUtility::addInstance(StorageRepository::class, $mockedStorageRepository);
146 
147  $subject->updateProperties(['storage' => 'different']);
148  self::assertSame($mockedNewStorage, $subject->getStorage());
149  }
150 
151  #[Test]
153  {
154  $targetStorage = $this->createMock(ResourceStorage::class);
155  $targetFolder = $this->createMock(Folder::class);
156  $targetFolder->method('getStorage')->willReturn($targetStorage);
157  $fixture = new ‪File([], $this->storageMock);
158  $targetStorage->expects(self::once())->method('copyFile')->with(self::equalTo($fixture), self::equalTo($targetFolder));
159  $fixture->copyTo($targetFolder);
160  }
161 
162  #[Test]
164  {
165  $targetStorage = $this->createMock(ResourceStorage::class);
166  $targetFolder = $this->createMock(Folder::class);
167  $targetFolder->method('getStorage')->willReturn($targetStorage);
168  $fixture = new ‪File([], $this->storageMock);
169  $targetStorage->expects(self::once())->method('moveFile')->with(self::equalTo($fixture), self::equalTo($targetFolder));
170  $fixture->moveTo($targetFolder);
171  }
172 
173  public static function ‪filenameExtensionDataProvider(): array
174  {
175  return [
176  ['somefile.jpg', 'somefile', 'jpg'],
177  ['SomeFile.PNG', 'SomeFile', 'png'],
178  ['somefile', 'somefile', ''],
179  ['somefile.tar.gz', 'somefile.tar', 'gz'],
180  ['somefile.tar.bz2', 'somefile.tar', 'bz2'],
181  ];
182  }
183 
184  #[DataProvider('filenameExtensionDataProvider')]
185  #[Test]
186  public function ‪getNameWithoutExtensionReturnsCorrectName($originalFilename, $expectedBasename): void
187  {
188  $fixture = new ‪File(
189  [
190  'name' => $originalFilename,
191  'identifier' => '/' . $originalFilename,
192  ],
193  $this->storageMock
194  );
195  self::assertSame($expectedBasename, $fixture->getNameWithoutExtension());
196  }
197 
198  #[DataProvider('filenameExtensionDataProvider')]
199  #[Test]
200  public function ‪getExtensionReturnsCorrectExtension($originalFilename, $expectedBasename, $expectedExtension): void
201  {
202  $fixture = new ‪File([
203  'name' => $originalFilename,
204  'identifier' => '/' . $originalFilename,
205  ], $this->storageMock);
206  self::assertSame($expectedExtension, $fixture->getExtension());
207  }
208 
209  #[Test]
211  {
212  $fixture = new ‪File(['testproperty' => 'testvalue'], $this->storageMock);
213  self::assertTrue($fixture->hasProperty('testproperty'));
214  }
215 
216  #[Test]
218  {
219  $fixture = $this->getMockBuilder(File::class)
220  ->setConstructorArgs([[], $this->storageMock])
221  ->onlyMethods(['getMetaData'])
222  ->getMock();
223 
224  $metaDataAspectMock = $this->getMockBuilder(MetaDataAspect::class)
225  ->setConstructorArgs([$fixture])
226  ->onlyMethods(['get'])
227  ->getMock();
228 
229  $metaDataAspectMock->method('get')->willReturn(['testproperty' => 'testvalue']);
230  $fixture->method('getMetaData')->willReturn($metaDataAspectMock);
231 
232  self::assertTrue($fixture->hasProperty('testproperty'));
233  self::assertSame('testvalue', $fixture->getProperty('testproperty'));
234  }
235 
236  #[Test]
238  {
239  $fileData = [
240  'uid' => 1357,
241  'name' => 'dummy.svg',
242  ];
243  $metaData = [
244  'uid' => 2468,
245  'file' => 1357,
246  'title' => 'Dummy SVG',
247  ];
248  $file = new ‪File($fileData, $this->storageMock, $metaData);
249 
250  self::assertSame(
251  1357,
252  $file->getProperties()['uid']
253  );
254  self::assertSame(
255  2468,
256  $file->getProperties()['metadata_uid']
257  );
258  }
259 }
‪TYPO3\CMS\Core\Resource\Index\MetaDataRepository
Definition: MetaDataRepository.php:40
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\getNameWithoutExtensionReturnsCorrectName
‪getNameWithoutExtensionReturnsCorrectName($originalFilename, $expectedBasename)
Definition: FileTest.php:186
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\fileIndexStatusIsTrueIfUidIsSet
‪fileIndexStatusIsTrueIfUidIsSet()
Definition: FileTest.php:71
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\updatePropertiesReloadsStorageObjectIfStorageChanges
‪updatePropertiesReloadsStorageObjectIfStorageChanges()
Definition: FileTest.php:129
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\updatePropertiesUpdatesFileProperties
‪updatePropertiesUpdatesFileProperties()
Definition: FileTest.php:78
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\moveToCallsMoveOperationOnTargetFolderStorage
‪moveToCallsMoveOperationOnTargetFolderStorage()
Definition: FileTest.php:163
‪TYPO3\CMS\Core\Tests\Unit\Resource
Definition: AbstractFileTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\prepareFixture
‪prepareFixture()
Definition: FileTest.php:50
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\updatePropertiesLeavesPropertiesUntouchedIfNotSetInNewProperties
‪updatePropertiesLeavesPropertiesUntouchedIfNotSetInNewProperties()
Definition: FileTest.php:87
‪TYPO3\CMS\Core\Resource\MetaDataAspect
Definition: MetaDataAspect.php:27
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\hasPropertyReturnsTrueIfMetadataPropertyExists
‪hasPropertyReturnsTrueIfMetadataPropertyExists()
Definition: FileTest.php:217
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\getExtensionReturnsCorrectExtension
‪getExtensionReturnsCorrectExtension($originalFilename, $expectedBasename, $expectedExtension)
Definition: FileTest.php:200
‪TYPO3\CMS\Core\Resource\Folder
Definition: Folder.php:38
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\filenameExtensionDataProvider
‪static filenameExtensionDataProvider()
Definition: FileTest.php:173
‪TYPO3\CMS\Core\Resource\StorageRepository
Definition: StorageRepository.php:38
‪TYPO3\CMS\Core\Resource\File
Definition: File.php:26
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\$storageMock
‪ResourceStorage &MockObject $storageMock
Definition: FileTest.php:37
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\getPropertiesContainsUidOfSysFileMetadata
‪getPropertiesContainsUidOfSysFileMetadata()
Definition: FileTest.php:237
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest
Definition: FileTest.php:34
‪TYPO3\CMS\Core\Resource\ResourceStorage
Definition: ResourceStorage.php:129
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\updatePropertiesRecordsNamesOfChangedProperties
‪updatePropertiesRecordsNamesOfChangedProperties()
Definition: FileTest.php:104
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\hasPropertyReturnsTrueFilePropertyExists
‪hasPropertyReturnsTrueFilePropertyExists()
Definition: FileTest.php:210
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\commonPropertiesAreAvailableWithOwnGetters
‪commonPropertiesAreAvailableWithOwnGetters()
Definition: FileTest.php:57
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\updatePropertiesMarksPropertyAsChangedOnlyOnce
‪updatePropertiesMarksPropertyAsChangedOnlyOnce()
Definition: FileTest.php:120
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\copyToCallsCopyOperationOnTargetFolderStorage
‪copyToCallsCopyOperationOnTargetFolderStorage()
Definition: FileTest.php:152
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\$resetSingletonInstances
‪bool $resetSingletonInstances
Definition: FileTest.php:35
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\updatePropertiesDiscardsUidIfAlreadySet
‪updatePropertiesDiscardsUidIfAlreadySet()
Definition: FileTest.php:96
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:24
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\setUp
‪setUp()
Definition: FileTest.php:39
‪TYPO3\CMS\Webhooks\Message\$identifier
‪identifier readonly string $identifier
Definition: FileAddedMessage.php:37
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static getUniqueId(string $prefix='')
Definition: StringUtility.php:57
‪TYPO3\CMS\Core\Tests\Unit\Resource\FileTest\updatePropertiesDoesNotRecordPropertyNameIfSameValueIsProvided
‪updatePropertiesDoesNotRecordPropertyNameIfSameValueIsProvided()
Definition: FileTest.php:112