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);