diff --git a/.gitignore b/.gitignore index a71b34a5c..7347b58b3 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,6 @@ dev/compose.override.yaml dev/.env # server files -server/ \ No newline at end of file +# ignore: server, server34 +server/ +server[0-9]*/ \ No newline at end of file diff --git a/bootstrap.php b/bootstrap.php index e26ec3bcb..91a08e38a 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -9,17 +9,20 @@ use Composer\Autoload\ClassLoader; include_once __DIR__.'/vendor/autoload.php'; -$serverPath = __DIR__ . '/server'; -if (!file_exists($serverPath . '/lib/base.php')) { +$serverPath = getenv('SERVER_PATH') ?: __DIR__ . '/server'; +$serverBaseFile = '/lib/base.php'; + +if (!file_exists($serverPath . $serverBaseFile)) { $serverPath = __DIR__ . '/../..'; } -if (!file_exists($serverPath . '/lib/base.php')) { - throw new RuntimeException('Server path not found: ' . $serverPath); + +if (!file_exists($serverPath . $serverBaseFile)) { + throw new RuntimeException('Server files not found at ' . $serverPath); } include_once $serverPath.'/3rdparty/autoload.php'; -require_once $serverPath. '/lib/base.php'; +require_once $serverPath. $serverBaseFile; $classLoader = new ClassLoader(); $classLoader->addPsr4("OCA\\OpenProject\\", __DIR__ . '/lib', true); diff --git a/makefile b/makefile index 3cd4047f8..132d8e829 100644 --- a/makefile +++ b/makefile @@ -60,7 +60,15 @@ npm-dev: .PHONY: psalm psalm: - composer run psalm + @if [ -n "$$SERVER_PATH" ]; then \ + sed -i "s|name=\"server/lib\"|name=\"$$SERVER_PATH/lib\"|g" psalm.xml; \ + fi + + @composer run psalm || exit_code=$$?; \ + if [ -n "$$SERVER_PATH" ]; then \ + sed -i "s|name=\"$$SERVER_PATH/lib\"|name=\"server/lib\"|g" psalm.xml; \ + fi; \ + exit $$exit_code .PHONY: phpcs phpcs: diff --git a/phpunit.xml b/phpunit.xml index f845ca292..4f6f945ce 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -5,8 +5,11 @@ --> @@ -18,14 +21,12 @@ lib - tests/lib/ - @@ -34,7 +35,6 @@ - - + \ No newline at end of file diff --git a/tests/lib/Controller/DirectUploadControllerTest.php b/tests/lib/Controller/DirectUploadControllerTest.php index 0892726d6..c0c25701e 100644 --- a/tests/lib/Controller/DirectUploadControllerTest.php +++ b/tests/lib/Controller/DirectUploadControllerTest.php @@ -10,9 +10,9 @@ use OCP\Files\Folder; use OCP\Files\ForbiddenException as FileAccessForbiddenException; use OCP\Files\InvalidContentException; +use OCP\Files\IUserFolder; use OCP\IL10N; use OCP\IRequest; -use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use function PHPUnit\Framework\assertSame; @@ -23,11 +23,21 @@ class DirectUploadControllerTest extends TestCase { */ private $l; + /** + * @return mixed + */ + public function getFolderMock(): mixed { + if (interface_exists(IUserFolder::class)) { + return $this->createMock(IUserFolder::class); + } + return $this->createMock(Folder::class); + } + /** * @return void */ public function testprepareDirectUpload() { - $folderMock = $this->getMockBuilder('\OCP\Files\Folder')->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById')->willReturn($this->getNodeMock('dir')); $directUploadController = $this->createDirectUploadController($folderMock); $result = $directUploadController->prepareDirectUpload(123); @@ -45,7 +55,7 @@ public function testprepareDirectUpload() { * @return void */ public function testprepareDirectUploadTypeFile(): void { - $folderMock = $this->getMockBuilder('\OCP\Files\Folder')->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById')->willReturn($this->getNodeMock('file')); $directUploadController = $this->createDirectUploadController($folderMock); $result = $directUploadController->prepareDirectUpload(123); @@ -59,7 +69,7 @@ public function testprepareDirectUploadTypeFile(): void { } public function testprepareDirectUploadException(): void { - $folderMock = $this->getMockBuilder('\OCP\Files\Folder')->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById') ->will($this->throwException(new \Exception('something bad happened'))); $directUploadController = $this->createDirectUploadController($folderMock); @@ -93,7 +103,7 @@ public function directUploadInvalidTokenDataProvider() { * @return void */ public function testDirectUploadInvalidToken(string $token):void { - $folderMock = $this->getMockBuilder('\OCP\Files\Folder')->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById')->willReturn($this->getNodeMock('folder')); $directUploadController = $this->createDirectUploadController($folderMock); $result = $directUploadController->directUpload($token); @@ -110,7 +120,7 @@ public function testDirectUploadNotEnoughSpace():void { $nodeMock = $this->getNodeMock('folder'); $nodeMock[0]->method('getFreeSpace')->willReturn(100); - $userFolderMock = $this->getMockBuilder('\OCP\Files\Folder')->getMock(); + $userFolderMock = $this->getFolderMock(); $userFolderMock->method('getById')->willReturn($nodeMock); $directUploadController = $this->createDirectUploadController( $userFolderMock, 101 @@ -146,7 +156,7 @@ public function fileNotUploadedDataProvider() { public function testDirectUploadFileNotUploaded(string $tmpName, int $error):void { $nodeMock = $this->getNodeMock('folder'); - $userFolderMock = $this->getMockBuilder('\OCP\Files\Folder')->getMock(); + $userFolderMock = $this->getFolderMock(); $userFolderMock->method('getById')->willReturn($nodeMock); $directUploadController = $this->createDirectUploadController( $userFolderMock, 100, $tmpName, $error @@ -185,7 +195,7 @@ public function testDirectUploadException( $tmpFileName = '/tmp/integration_openproject_unit_test'; touch($tmpFileName); $nodeMock[0]->method('newFile')->will($this->throwException($exception)); - $userFolderMock = $this->getMockBuilder('\OCP\Files\Folder')->getMock(); + $userFolderMock = $this->getFolderMock(); $userFolderMock->method('getById')->willReturn($nodeMock); $directUploadController = $this->createDirectUploadController( $userFolderMock, 0, $tmpFileName); @@ -214,7 +224,7 @@ public function testNegativeFreeSpace(): void { touch($tmpFileName); $nodeMock[0]->method('getFreeSpace')->willReturn(-3); $nodeMock[0]->method('newFile')->willReturn($fileMock); - $userFolderMock = $this->getMockBuilder('\OCP\Files\Folder')->getMock(); + $userFolderMock = $this->getFolderMock(); $userFolderMock->method('getById')->willReturn($nodeMock); $directUploadController = $this->createDirectUploadController( $userFolderMock, 101, $tmpFileName @@ -234,14 +244,14 @@ public function testNegativeFreeSpace(): void { /** - * @param MockObject $folderMock + * @param mixed $folderMock * @param int $uploadedFileSize * @param string $uploadedFileTmpName * @param int $uploadedFileError * @return DirectUploadController */ private function createDirectUploadController( - MockObject $folderMock, + mixed $folderMock, int $uploadedFileSize = 9999, string $uploadedFileTmpName = '/tmp/andjashd', int $uploadedFileError = 0 @@ -307,7 +317,7 @@ private function createDirectUploadController( * * @param string $type * @param int $id - * @return array + * @return array */ private function getNodeMock(string $type, int $id = 123): array { $ownerMock = $this->getMockBuilder('\OCP\IUser')->getMock(); @@ -323,7 +333,7 @@ private function getNodeMock(string $type, int $id = 123): array { $fileMock->method('getId')->willReturn(123); $fileMock->method('getStorage')->willReturn($storageMock); - $folderMock = $this->createMock('\OCP\Files\Folder'); + $folderMock = $this->getFolderMock(); $folderMock->method('getId')->willReturn($id); $folderMock->method('getType')->willReturn($type); $folderMock->method('isCreatable')->willReturn(true); diff --git a/tests/lib/Controller/FilesControllerTest.php b/tests/lib/Controller/FilesControllerTest.php index 096e1e4f9..4465285e6 100644 --- a/tests/lib/Controller/FilesControllerTest.php +++ b/tests/lib/Controller/FilesControllerTest.php @@ -14,6 +14,7 @@ use OCP\Files\Config\IUserMountCache; use OCP\Files\DavUtil; use OCP\Files\Folder; +use OCP\Files\IUserFolder; use OCP\Files\Node; use OCP\IDBConnection; use OCP\IRequest; @@ -28,6 +29,16 @@ class FilesControllerTest extends TestCase { use PHPMock; + /** + * @return mixed + */ + public function getFolderMock(): mixed { + if (interface_exists(IUserFolder::class)) { + return $this->createMock(IUserFolder::class); + } + return $this->createMock(Folder::class); + } + /** * @return array */ @@ -104,7 +115,7 @@ public function testGetFileInfo( $expectedMimeType, $expectedPath ) { - $folderMock = $this->getMockBuilder(Folder::class)->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById')->willReturn($nodeMocks); $mountCacheMock = $this->getSimpleMountCacheMock($internalPath); @@ -136,7 +147,7 @@ public function testGetFileInfo( } public function testGetFileInfoFileNotFound(): void { - $folderMock = $this->getMockBuilder(Folder::class)->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById')->willReturn([]); $filesController = $this->createFilesController($folderMock); @@ -147,7 +158,7 @@ public function testGetFileInfoFileNotFound(): void { } public function testGetFileInfoFileExistingButNotReadable(): void { - $folderMock = $this->getMockBuilder(Folder::class)->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById')->willReturn([]); $mountCacheMock = $this->getMockBuilder(IUserMountCache::class)->getMock(); $mountCacheMock->method('getMountsForFileId') @@ -165,7 +176,7 @@ public function testGetFileInfoFileExistingButNotReadable(): void { } public function testGetFileInfoFileExistingButCannotGetNameInContextOfOwner(): void { - $folderMock = $this->getMockBuilder(Folder::class)->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById')->willReturn( [$this->getNodeMock('image/png', 586, 'file', '/testUser/files/name-in-the-context-of-requester')] ); @@ -186,7 +197,7 @@ public function testGetFileInfoFileExistingButCannotGetNameInContextOfOwner(): v } public function testGetFilesInfoFourIdsRequestedOneExistsOneInTrashOneNotExisitingOneForbidden(): void { - $folderMock = $this->getMockBuilder(Folder::class)->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById') ->willReturnMap( [ @@ -243,7 +254,7 @@ public function testGetFilesInfoFourIdsRequestedOneExistsOneInTrashOneNotExisiti } public function testGetFilesInfoOneIdRequestedFileExistsReturnsOneResult(): void { - $folderMock = $this->getMockBuilder(Folder::class)->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById') ->willReturn( [ @@ -268,7 +279,7 @@ public function testGetFilesInfoOneIdRequestedFileExistsReturnsOneResult(): void } public function testGetFilesInfoThreeIdsRequestedOneFileExistsReturnsOneResult(): void { - $folderMock = $this->getMockBuilder(Folder::class)->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById') ->willReturnMap( [ @@ -312,7 +323,7 @@ public function testGetFilesInfoThreeIdsRequestedOneFileExistsReturnsOneResult() } public function testGetFilesInfoTwoIdsRequestedAllFilesExistsEachReturnsOneResult(): void { - $folderMock = $this->getMockBuilder(Folder::class)->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById') ->willReturnMap( [ @@ -356,7 +367,7 @@ public function testGetFilesInfoTwoIdsRequestedAllFilesExistsEachReturnsOneResul } public function testGetFilesInfoTwoIdsRequestedAllFilesExistsEachReturnsMultipleResults(): void { - $folderMock = $this->getMockBuilder(Folder::class)->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById') ->willReturnMap( [ @@ -401,7 +412,7 @@ public function testGetFilesInfoTwoIdsRequestedAllFilesExistsEachReturnsMultiple } public function testGetFilesInfoTwoIdsRequestedEachReturnsOneFolder(): void { - $folderMock = $this->getMockBuilder(Folder::class)->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById') ->willReturnMap([ [ @@ -494,7 +505,7 @@ public function testGetFilesInfoTwoIdsRequestedEachReturnsOneFolder(): void { } public function testGetFilesInfoInvalidRequest(): void { - $folderMock = $this->getMockBuilder(Folder::class)->getMock(); + $folderMock = $this->getFolderMock(); $filesController = $this->createFilesController($folderMock); $result = $filesController->getFilesInfo(null); @@ -506,7 +517,7 @@ public function testGetFilesInfoInvalidRequest(): void { } public function testGetFilesInfoSendStringIds(): void { - $folderMock = $this->getMockBuilder(Folder::class)->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById') ->willReturnMap([ [ 2, @@ -598,7 +609,7 @@ public function testGetFileInfoWithLastModifier() { $classExistsMock = $this->getFunctionMock(__NAMESPACE__, "class_exists"); $classExistsMock->expects($this->any())->willReturn(false); - $folderMock = $this->getMockBuilder(Folder::class)->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById') ->willReturn([ $this->getNodeMock('image/png', 1, 'file', '/testUser/files/inFolder/image.png') @@ -754,7 +765,7 @@ public function testDavPermissions( $name, $path ): void { - $folderMock = $this->getMockBuilder(Folder::class)->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById')->willReturn($nodeMocks); $mountCacheMock = $this->getSimpleMountCacheMock($path); @@ -909,14 +920,14 @@ private function createFilesController( /** * @param array $onlyMethods - * @param MockObject $folderMock + * @param mixed $folderMock * @param MockObject|null $mountCacheMock mock for Files that exist but cannot be accessed by this user * @param MockObject|null $davUtilsMock * @return FilesController|MockObject */ public function getFilesControllerMock( array $onlyMethods, - MockObject $folderMock, + mixed $folderMock, MockObject $mountCacheMock = null, MockObject $davUtilsMock = null ): FilesController|MockObject { diff --git a/tests/lib/Service/DirectDownloadServiceTest.php b/tests/lib/Service/DirectDownloadServiceTest.php index d2a475d80..e9d54e94a 100644 --- a/tests/lib/Service/DirectDownloadServiceTest.php +++ b/tests/lib/Service/DirectDownloadServiceTest.php @@ -11,6 +11,7 @@ use OC\User\Session; use OCA\DAV\Controller\DirectController; use OCA\OpenProject\AppInfo\Application; +use OCP\Files\Folder; use OCP\Files\IRootFolder; use OCP\IUserManager; use PHPUnit\Framework\TestCase; @@ -23,7 +24,7 @@ class DirectDownloadServiceTest extends TestCase { */ private $directDownloadService; /** - * @var \OCP\Files\Folder + * @var Folder */ private $userFolder; /** diff --git a/tests/lib/Service/OpenProjectAPIServiceTest.php b/tests/lib/Service/OpenProjectAPIServiceTest.php index 4f2da8703..7abae88f7 100644 --- a/tests/lib/Service/OpenProjectAPIServiceTest.php +++ b/tests/lib/Service/OpenProjectAPIServiceTest.php @@ -34,7 +34,9 @@ use OCP\AppFramework\Http; use OCP\Encryption\IManager; use OCP\EventDispatcher\IEventDispatcher; +use OCP\Files\Folder; use OCP\Files\IRootFolder; +use OCP\Files\IUserFolder; use OCP\Files\NotFoundException; use OCP\Files\NotPermittedException; use OCP\Files\SimpleFS\ISimpleFile; @@ -575,6 +577,16 @@ class OpenProjectAPIServiceTest extends TestCase { private MockServerEnvConfig $pactMockServerConfig; private array $appValues = []; + /** + * @return mixed + */ + public function getFolderMock(): mixed { + if (interface_exists(IUserFolder::class)) { + return $this->createMock(IUserFolder::class); + } + return $this->createMock(Folder::class); + } + /** * [key => value] pairs of custom app values * @param array $withValues @@ -602,26 +614,15 @@ public function getAppValues(array $withValues = []): array { } return $appValues; } + /** * @return void - * @before */ - public function setupMockServer(): void { + protected function setUp(): void { // NOTE: mocking 'class_exists' must be done before anything else $this->classExistsMock = $this->getFunctionMock(__NAMESPACE__, "class_exists"); $this->pactMockServerConfig = new MockServerEnvConfig(); - - // find an unused port and use it for the mock server - // using the same port all the time is not stable - // sometimes the server fails saying its already used - $address = $this->pactMockServerConfig->getHost(); - $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); - socket_bind($sock, $address); - socket_getsockname($sock, $address, $port); - socket_close($sock); - - $this->pactMockServerConfig->setPort($port); $this->builder = new InteractionBuilder($this->pactMockServerConfig); $this->service = $this->getOpenProjectAPIService(); @@ -651,7 +652,7 @@ private function getNodeMock($nodeClassName = null) { private function getStorageMock($nodeClassName = null) { $nodeMock = $this->getNodeMock($nodeClassName); - $folderMock = $this->getMockBuilder('\OCP\Files\Folder')->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById')->willReturn([$nodeMock]); $storageMock = $this->getMockBuilder('\OCP\Files\IRootFolder')->getMock(); @@ -1863,7 +1864,7 @@ public function getNodeNotFoundExceptionDataProvider() { * @return void */ public function testGetNodeNotFoundException($expectedReturn) { - $folderMock = $this->getMockBuilder('\OCP\Files\Folder')->getMock(); + $folderMock = $this->getFolderMock(); $folderMock->method('getById')->willReturn($expectedReturn); $storageMock = $this->getMockBuilder('\OCP\Files\IRootFolder')->getMock(); $storageMock->method('getUserFolder')->willReturn($folderMock);