diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/lib/Activity/ManagerTest.php | 16 | ||||
-rw-r--r-- | tests/lib/Files/Mount/ObjectHomeMountProviderTest.php | 2 | ||||
-rw-r--r-- | tests/lib/Files/ObjectStore/PrimaryObjectStoreConfigTest.php | 285 | ||||
-rw-r--r-- | tests/lib/Files/ViewTest.php | 27 | ||||
-rw-r--r-- | tests/lib/Search/SearchComposerTest.php | 290 | ||||
-rw-r--r-- | tests/lib/Share20/ManagerTest.php | 5 | ||||
-rw-r--r-- | tests/lib/TemplateLayoutTest.php | 4 |
7 files changed, 614 insertions, 15 deletions
diff --git a/tests/lib/Activity/ManagerTest.php b/tests/lib/Activity/ManagerTest.php index db0bedce359..c7c30357ec7 100644 --- a/tests/lib/Activity/ManagerTest.php +++ b/tests/lib/Activity/ManagerTest.php @@ -11,6 +11,7 @@ namespace Test\Activity; use OCP\Activity\Exceptions\IncompleteActivityException; use OCP\Activity\IConsumer; use OCP\Activity\IEvent; +use OCP\AppFramework\Utility\ITimeFactory; use OCP\IConfig; use OCP\IL10N; use OCP\IRequest; @@ -30,6 +31,7 @@ class ManagerTest extends TestCase { protected IConfig&MockObject $config; protected IValidator&MockObject $validator; protected IRichTextFormatter&MockObject $richTextFormatter; + private ITimeFactory&MockObject $time; protected function setUp(): void { parent::setUp(); @@ -39,6 +41,7 @@ class ManagerTest extends TestCase { $this->config = $this->createMock(IConfig::class); $this->validator = $this->createMock(IValidator::class); $this->richTextFormatter = $this->createMock(IRichTextFormatter::class); + $this->time = $this->createMock(ITimeFactory::class); $this->activityManager = new \OC\Activity\Manager( $this->request, @@ -46,7 +49,8 @@ class ManagerTest extends TestCase { $this->config, $this->validator, $this->richTextFormatter, - $this->createMock(IL10N::class) + $this->createMock(IL10N::class), + $this->time, ); $this->assertSame([], self::invokePrivate($this->activityManager, 'getConsumers')); @@ -217,6 +221,11 @@ class ManagerTest extends TestCase { ->willReturn($authorObject); } + $time = time(); + $this->time + ->method('getTime') + ->willReturn($time); + $event = $this->activityManager->generateEvent(); $event->setApp('test') ->setType('test_type') @@ -230,9 +239,8 @@ class ManagerTest extends TestCase { $consumer->expects($this->once()) ->method('receive') ->with($event) - ->willReturnCallback(function (IEvent $event) use ($expected): void { - $this->assertLessThanOrEqual(time() + 2, $event->getTimestamp(), 'Timestamp not set correctly'); - $this->assertGreaterThanOrEqual(time() - 2, $event->getTimestamp(), 'Timestamp not set correctly'); + ->willReturnCallback(function (IEvent $event) use ($expected, $time): void { + $this->assertEquals($time, $event->getTimestamp(), 'Timestamp not set correctly'); $this->assertSame($expected, $event->getAuthor(), 'Author name not set correctly'); }); $this->activityManager->registerConsumer(function () use ($consumer) { diff --git a/tests/lib/Files/Mount/ObjectHomeMountProviderTest.php b/tests/lib/Files/Mount/ObjectHomeMountProviderTest.php index dd696279b86..ae0a53f2cc0 100644 --- a/tests/lib/Files/Mount/ObjectHomeMountProviderTest.php +++ b/tests/lib/Files/Mount/ObjectHomeMountProviderTest.php @@ -84,7 +84,7 @@ class ObjectHomeMountProviderTest extends \Test\TestCase { $this->config->method('getUserValue') ->willReturn(null); - $this->config->expects($this->once()) + $this->config ->method('setUserValue') ->with( $this->equalTo('uid'), diff --git a/tests/lib/Files/ObjectStore/PrimaryObjectStoreConfigTest.php b/tests/lib/Files/ObjectStore/PrimaryObjectStoreConfigTest.php new file mode 100644 index 00000000000..b60b7ca4f83 --- /dev/null +++ b/tests/lib/Files/ObjectStore/PrimaryObjectStoreConfigTest.php @@ -0,0 +1,285 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2025 Robin Appelman <robin@icewind.nl> + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace lib\Files\ObjectStore; + +use OC\Files\ObjectStore\PrimaryObjectStoreConfig; +use OC\Files\ObjectStore\StorageObjectStore; +use OCP\App\IAppManager; +use OCP\IConfig; +use OCP\IUser; +use PHPUnit\Framework\MockObject\MockObject; +use Test\TestCase; + +class PrimaryObjectStoreConfigTest extends TestCase { + private array $systemConfig = []; + private array $userConfig = []; + private IConfig&MockObject $config; + private IAppManager&MockObject $appManager; + private PrimaryObjectStoreConfig $objectStoreConfig; + + protected function setUp(): void { + parent::setUp(); + + $this->systemConfig = []; + $this->config = $this->createMock(IConfig::class); + $this->appManager = $this->createMock(IAppManager::class); + $this->config->method('getSystemValue') + ->willReturnCallback(function ($key, $default = '') { + if (isset($this->systemConfig[$key])) { + return $this->systemConfig[$key]; + } else { + return $default; + } + }); + $this->config->method('getUserValue') + ->willReturnCallback(function ($userId, $appName, $key, $default = '') { + if (isset($this->userConfig[$userId][$appName][$key])) { + return $this->userConfig[$userId][$appName][$key]; + } else { + return $default; + } + }); + $this->config->method('setUserValue') + ->willReturnCallback(function ($userId, $appName, $key, $value) { + $this->userConfig[$userId][$appName][$key] = $value; + }); + + $this->objectStoreConfig = new PrimaryObjectStoreConfig($this->config, $this->appManager); + } + + private function getUser(string $uid): IUser { + $user = $this->createMock(IUser::class); + $user->method('getUID') + ->willReturn($uid); + return $user; + } + + private function setConfig(string $key, $value) { + $this->systemConfig[$key] = $value; + } + + public function testNewUserGetsDefault() { + $this->setConfig('objectstore', [ + 'default' => 'server1', + 'server1' => [ + 'class' => StorageObjectStore::class, + 'arguments' => [ + 'host' => 'server1', + ], + ], + ]); + + $result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test')); + $this->assertEquals('server1', $result['arguments']['host']); + + $this->assertEquals('server1', $this->config->getUserValue('test', 'homeobjectstore', 'objectstore', null)); + } + + public function testExistingUserKeepsStorage() { + // setup user with `server1` as storage + $this->testNewUserGetsDefault(); + + $this->setConfig('objectstore', [ + 'default' => 'server2', + 'server1' => [ + 'class' => StorageObjectStore::class, + 'arguments' => [ + 'host' => 'server1', + ], + ], + 'server2' => [ + 'class' => StorageObjectStore::class, + 'arguments' => [ + 'host' => 'server2', + ], + ], + ]); + + $result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test')); + $this->assertEquals('server1', $result['arguments']['host']); + + $this->assertEquals('server1', $this->config->getUserValue('test', 'homeobjectstore', 'objectstore', null)); + + $result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('other-user')); + $this->assertEquals('server2', $result['arguments']['host']); + } + + public function testNestedAliases() { + $this->setConfig('objectstore', [ + 'default' => 'a1', + 'a1' => 'a2', + 'a2' => 'server1', + 'server1' => [ + 'class' => StorageObjectStore::class, + 'arguments' => [ + 'host' => 'server1', + ], + ], + ]); + $this->assertEquals('server1', $this->objectStoreConfig->resolveAlias('default')); + } + + public function testMultibucketChangedConfig() { + $this->setConfig('objectstore', [ + 'default' => 'server1', + 'server1' => [ + 'class' => StorageObjectStore::class, + 'arguments' => [ + 'host' => 'server1', + 'multibucket' => true, + 'num_buckets' => 8, + 'bucket' => 'bucket-' + ], + ], + ]); + + $result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test')); + $this->assertEquals('server1', $result['arguments']['host']); + $this->assertEquals('bucket-7', $result['arguments']['bucket']); + + $this->setConfig('objectstore', [ + 'default' => 'server1', + 'server1' => [ + 'class' => StorageObjectStore::class, + 'arguments' => [ + 'host' => 'server1', + 'multibucket' => true, + 'num_buckets' => 64, + 'bucket' => 'bucket-' + ], + ], + ]); + + $result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test')); + $this->assertEquals('server1', $result['arguments']['host']); + $this->assertEquals('bucket-7', $result['arguments']['bucket']); + + $result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test-foo')); + $this->assertEquals('server1', $result['arguments']['host']); + $this->assertEquals('bucket-40', $result['arguments']['bucket']); + + $this->setConfig('objectstore', [ + 'default' => 'server2', + 'server1' => [ + 'class' => StorageObjectStore::class, + 'arguments' => [ + 'host' => 'server1', + 'multibucket' => true, + 'num_buckets' => 64, + 'bucket' => 'bucket-' + ], + ], + 'server2' => [ + 'class' => StorageObjectStore::class, + 'arguments' => [ + 'host' => 'server2', + 'multibucket' => true, + 'num_buckets' => 16, + 'bucket' => 'bucket-' + ], + ], + ]); + + $result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test')); + $this->assertEquals('server1', $result['arguments']['host']); + $this->assertEquals('bucket-7', $result['arguments']['bucket']); + + $result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test-bar')); + $this->assertEquals('server2', $result['arguments']['host']); + $this->assertEquals('bucket-4', $result['arguments']['bucket']); + } + + public function testMultibucketOldConfig() { + $this->setConfig('objectstore_multibucket', [ + 'class' => StorageObjectStore::class, + 'arguments' => [ + 'host' => 'server1', + 'multibucket' => true, + 'num_buckets' => 8, + 'bucket' => 'bucket-' + ], + ]); + $configs = $this->objectStoreConfig->getObjectStoreConfigs(); + $this->assertEquals([ + 'default' => 'server1', + 'root' => 'server1', + 'server1' => [ + 'class' => StorageObjectStore::class, + 'arguments' => [ + 'host' => 'server1', + 'multibucket' => true, + 'num_buckets' => 8, + 'bucket' => 'bucket-' + ], + ], + ], $configs); + } + + public function testSingleObjectStore() { + $this->setConfig('objectstore', [ + 'class' => StorageObjectStore::class, + 'arguments' => [ + 'host' => 'server1', + ], + ]); + $configs = $this->objectStoreConfig->getObjectStoreConfigs(); + $this->assertEquals([ + 'default' => 'server1', + 'root' => 'server1', + 'server1' => [ + 'class' => StorageObjectStore::class, + 'arguments' => [ + 'host' => 'server1', + 'multibucket' => false, + ], + ], + ], $configs); + } + + public function testRoot() { + $this->setConfig('objectstore', [ + 'default' => 'server1', + 'server1' => [ + 'class' => StorageObjectStore::class, + 'arguments' => [ + 'host' => 'server1', + ], + ], + 'server2' => [ + 'class' => StorageObjectStore::class, + 'arguments' => [ + 'host' => 'server2', + ], + ], + ]); + + $result = $this->objectStoreConfig->getObjectStoreConfigForRoot(); + $this->assertEquals('server1', $result['arguments']['host']); + + $this->setConfig('objectstore', [ + 'default' => 'server1', + 'root' => 'server2', + 'server1' => [ + 'class' => StorageObjectStore::class, + 'arguments' => [ + 'host' => 'server1', + ], + ], + 'server2' => [ + 'class' => StorageObjectStore::class, + 'arguments' => [ + 'host' => 'server2', + ], + ], + ]); + + $result = $this->objectStoreConfig->getObjectStoreConfigForRoot(); + $this->assertEquals('server2', $result['arguments']['host']); + } +} diff --git a/tests/lib/Files/ViewTest.php b/tests/lib/Files/ViewTest.php index c490cd08dae..ad27c3f798c 100644 --- a/tests/lib/Files/ViewTest.php +++ b/tests/lib/Files/ViewTest.php @@ -23,6 +23,7 @@ use OCP\Cache\CappedMemoryCache; use OCP\Constants; use OCP\Files\Config\IMountProvider; use OCP\Files\Config\IMountProviderCollection; +use OCP\Files\Config\IUserMountCache; use OCP\Files\FileInfo; use OCP\Files\ForbiddenException; use OCP\Files\GenericFileException; @@ -258,28 +259,36 @@ class ViewTest extends \Test\TestCase { * @medium */ public function testGetPath(): void { + $user = $this->createMock(IUser::class); + $user->method('getUID') + ->willReturn('test'); $storage1 = $this->getTestStorage(); $storage2 = $this->getTestStorage(); $storage3 = $this->getTestStorage(); - Filesystem::mount($storage1, [], '/'); - Filesystem::mount($storage2, [], '/substorage'); - Filesystem::mount($storage3, [], '/folder/anotherstorage'); + Filesystem::mount($storage1, [], '/test/files'); + Filesystem::mount($storage2, [], '/test/files/substorage'); + Filesystem::mount($storage3, [], '/test/files/folder/anotherstorage'); - $rootView = new View(''); + $userMountCache = Server::get(IUserMountCache::class); + $userMountCache->registerMounts($user, [ + new MountPoint($storage1, '/test/files'), + new MountPoint($storage2, '/test/files/substorage'), + new MountPoint($storage3, '/test/files/folder/anotherstorage'), + ]); + + $rootView = new View('/test/files'); $cachedData = $rootView->getFileInfo('/foo.txt'); - /** @var int $id1 */ - $id1 = $cachedData['fileid']; + $id1 = $cachedData->getId(); $this->assertEquals('/foo.txt', $rootView->getPath($id1)); $cachedData = $rootView->getFileInfo('/substorage/foo.txt'); - /** @var int $id2 */ - $id2 = $cachedData['fileid']; + $id2 = $cachedData->getId(); $this->assertEquals('/substorage/foo.txt', $rootView->getPath($id2)); - $folderView = new View('/substorage'); + $folderView = new View('/test/files/substorage'); $this->assertEquals('/foo.txt', $folderView->getPath($id2)); } diff --git a/tests/lib/Search/SearchComposerTest.php b/tests/lib/Search/SearchComposerTest.php new file mode 100644 index 00000000000..f8cf1410fad --- /dev/null +++ b/tests/lib/Search/SearchComposerTest.php @@ -0,0 +1,290 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace Test\Search; + +use InvalidArgumentException; +use OC\AppFramework\Bootstrap\Coordinator; +use OC\AppFramework\Bootstrap\RegistrationContext; +use OC\AppFramework\Bootstrap\ServiceRegistration; +use OC\Search\SearchComposer; +use OCP\IAppConfig; +use OCP\IURLGenerator; +use OCP\IUser; +use OCP\Search\IInAppSearch; +use OCP\Search\IProvider; +use OCP\Search\ISearchQuery; +use PHPUnit\Framework\MockObject\MockObject; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; +use Test\TestCase; + +class SearchComposerTest extends TestCase { + private Coordinator&MockObject $bootstrapCoordinator; + private ContainerInterface&MockObject $container; + private IURLGenerator&MockObject $urlGenerator; + private LoggerInterface&MockObject $logger; + private IAppConfig&MockObject $appConfig; + private SearchComposer $searchComposer; + + protected function setUp(): void { + parent::setUp(); + + $this->bootstrapCoordinator = $this->createMock(Coordinator::class); + $this->container = $this->createMock(ContainerInterface::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->logger = $this->createMock(LoggerInterface::class); + $this->appConfig = $this->createMock(IAppConfig::class); + + $this->searchComposer = new SearchComposer( + $this->bootstrapCoordinator, + $this->container, + $this->urlGenerator, + $this->logger, + $this->appConfig + ); + + $this->setupUrlGenerator(); + } + + private function setupUrlGenerator(): void { + $this->urlGenerator->method('imagePath') + ->willReturnCallback(function ($appId, $imageName) { + return "/apps/$appId/img/$imageName"; + }); + } + + private function setupEmptyRegistrationContext(): void { + $this->bootstrapCoordinator->expects($this->once()) + ->method('getRegistrationContext') + ->willReturn(null); + } + + private function setupAppConfigForAllowedProviders(array $allowedProviders = []): void { + $this->appConfig->method('getValueArray') + ->with('core', 'unified_search.providers_allowed') + ->willReturn($allowedProviders); + } + + /** + * @param array<string, array{service: string, appId: string, order: int, isInApp?: bool}> $providerConfigs + * @return array{registrations: ServiceRegistration[], providers: IProvider[]} + */ + private function createMockProvidersAndRegistrations(array $providerConfigs): array { + $registrations = []; + $providers = []; + $containerMap = []; + + foreach ($providerConfigs as $providerId => $config) { + // Create registration mock + $registration = $this->createMock(ServiceRegistration::class); + $registration->method('getService')->willReturn($config['service']); + $registration->method('getAppId')->willReturn($config['appId']); + $registrations[] = $registration; + + // Create provider mock + $providerClass = $config['isInApp'] ?? false ? IInAppSearch::class : IProvider::class; + $provider = $this->createMock($providerClass); + $provider->method('getId')->willReturn($providerId); + $provider->method('getName')->willReturn("Provider $providerId"); + $provider->method('getOrder')->willReturn($config['order']); + + $providers[$providerId] = $provider; + $containerMap[] = [$config['service'], $provider]; + } + + $this->container->expects($this->exactly(count($providerConfigs))) + ->method('get') + ->willReturnMap($containerMap); + + return ['registrations' => $registrations, 'providers' => $providers]; + } + + private function setupRegistrationContextWithProviders(array $registrations): void { + $registrationContext = $this->createMock(RegistrationContext::class); + $registrationContext->method('getSearchProviders')->willReturn($registrations); + + $this->bootstrapCoordinator->expects($this->once()) + ->method('getRegistrationContext') + ->willReturn($registrationContext); + } + + public function testGetProvidersWithNoRegisteredProviders(): void { + $this->setupEmptyRegistrationContext(); + + $providers = $this->searchComposer->getProviders('/test/route', []); + + $this->assertIsArray($providers); + $this->assertEmpty($providers); + } + + public function testSearchWithUnknownProvider(): void { + $this->setupEmptyRegistrationContext(); + + $user = $this->createMock(IUser::class); + $query = $this->createMock(ISearchQuery::class); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Provider unknown_provider is unknown'); + + $this->searchComposer->search($user, 'unknown_provider', $query); + } + + public function testGetProvidersWithMultipleProviders(): void { + $providerConfigs = [ + 'provider1' => ['service' => 'provider1_service', 'appId' => 'app1', 'order' => 10], + 'provider2' => ['service' => 'provider2_service', 'appId' => 'app2', 'order' => 5], + 'provider3' => ['service' => 'provider3_service', 'appId' => 'app3', 'order' => 15, 'isInApp' => true], + ]; + + $mockData = $this->createMockProvidersAndRegistrations($providerConfigs); + $this->setupRegistrationContextWithProviders($mockData['registrations']); + $this->setupAppConfigForAllowedProviders(); + + $providers = $this->searchComposer->getProviders('/test/route', []); + + $this->assertProvidersStructureAndSorting($providers, [ + ['id' => 'provider2', 'name' => 'Provider provider2', 'appId' => 'app2', 'order' => 5, 'inAppSearch' => false], + ['id' => 'provider1', 'name' => 'Provider provider1', 'appId' => 'app1', 'order' => 10, 'inAppSearch' => false], + ['id' => 'provider3', 'name' => 'Provider provider3', 'appId' => 'app3', 'order' => 15, 'inAppSearch' => true], + ]); + } + + public function testGetProvidersWithEmptyAllowedProvidersConfiguration(): void { + $providerConfigs = [ + 'provider1' => ['service' => 'provider1_service', 'appId' => 'app1', 'order' => 10], + 'provider2' => ['service' => 'provider2_service', 'appId' => 'app2', 'order' => 5], + ]; + + $mockData = $this->createMockProvidersAndRegistrations($providerConfigs); + $this->setupRegistrationContextWithProviders($mockData['registrations']); + $this->setupAppConfigForAllowedProviders(); + + $providers = $this->searchComposer->getProviders('/test/route', []); + + $this->assertCount(2, $providers); + $this->assertProvidersAreSortedByOrder($providers); + $this->assertEquals('provider2', $providers[0]['id']); + $this->assertEquals('provider1', $providers[1]['id']); + } + + public function testGetProvidersWithAllowedProvidersRestriction(): void { + $providerConfigs = [ + 'provider1' => ['service' => 'provider1_service', 'appId' => 'app1', 'order' => 10], + 'provider2' => ['service' => 'provider2_service', 'appId' => 'app2', 'order' => 5], + 'provider3' => ['service' => 'provider3_service', 'appId' => 'app3', 'order' => 15], + 'provider4' => ['service' => 'provider4_service', 'appId' => 'app4', 'order' => 8], + ]; + + $mockData = $this->createMockProvidersAndRegistrations($providerConfigs); + $this->setupRegistrationContextWithProviders($mockData['registrations']); + $this->setupAppConfigForAllowedProviders(['provider1', 'provider3']); + + $providers = $this->searchComposer->getProviders('/test/route', []); + + $this->assertProvidersStructureAndSorting($providers, [ + ['id' => 'provider1', 'name' => 'Provider provider1', 'appId' => 'app1', 'order' => 10, 'inAppSearch' => false], + ['id' => 'provider3', 'name' => 'Provider provider3', 'appId' => 'app3', 'order' => 15, 'inAppSearch' => false], + ]); + + // Verify excluded providers are not present + $providerIds = array_column($providers, 'id'); + $this->assertNotContains('provider2', $providerIds); + $this->assertNotContains('provider4', $providerIds); + } + + public function testGetProvidersFiltersByAllowedProvidersCompletely(): void { + $providerConfigs = [ + 'provider1' => ['service' => 'provider1_service', 'appId' => 'app1', 'order' => 10], + 'provider2' => ['service' => 'provider2_service', 'appId' => 'app2', 'order' => 5], + ]; + + $mockData = $this->createMockProvidersAndRegistrations($providerConfigs); + $this->setupRegistrationContextWithProviders($mockData['registrations']); + $this->setupAppConfigForAllowedProviders(['provider_not_exists']); + + $providers = $this->searchComposer->getProviders('/test/route', []); + + $this->assertIsArray($providers); + $this->assertEmpty($providers); + } + + public function testGetProvidersWithMixedOrderValues(): void { + $providerConfigs = [ + 'provider1' => ['service' => 'provider1_service', 'appId' => 'app1', 'order' => 100], + 'provider2' => ['service' => 'provider2_service', 'appId' => 'app2', 'order' => 1], + 'provider3' => ['service' => 'provider3_service', 'appId' => 'app3', 'order' => 50], + ]; + + $mockData = $this->createMockProvidersAndRegistrations($providerConfigs); + $this->setupRegistrationContextWithProviders($mockData['registrations']); + $this->setupAppConfigForAllowedProviders(); + + $providers = $this->searchComposer->getProviders('/test/route', []); + + $this->assertCount(3, $providers); + $this->assertProvidersAreSortedByOrder($providers); + + // Verify correct ordering: provider2 (1), provider3 (50), provider1 (100) + $this->assertEquals('provider2', $providers[0]['id']); + $this->assertEquals('provider3', $providers[1]['id']); + $this->assertEquals('provider1', $providers[2]['id']); + } + + public function testProviderIconGeneration(): void { + $providerConfigs = [ + 'provider1' => ['service' => 'provider1_service', 'appId' => 'app1', 'order' => 10], + ]; + + $mockData = $this->createMockProvidersAndRegistrations($providerConfigs); + $this->setupRegistrationContextWithProviders($mockData['registrations']); + $this->setupAppConfigForAllowedProviders(); + + $providers = $this->searchComposer->getProviders('/test/route', []); + + $this->assertCount(1, $providers); + $this->assertArrayHasKey('icon', $providers[0]); + $this->assertStringContainsString('/apps/provider1/img/provider1.svg', $providers[0]['icon']); + } + + /** + * Assert providers array structure and expected sorting + */ + private function assertProvidersStructureAndSorting(array $actualProviders, array $expectedProviders): void { + $this->assertIsArray($actualProviders); + $this->assertCount(count($expectedProviders), $actualProviders); + + foreach ($actualProviders as $index => $provider) { + $this->assertProviderHasRequiredFields($provider); + + $expected = $expectedProviders[$index]; + $this->assertEquals($expected['id'], $provider['id']); + $this->assertEquals($expected['name'], $provider['name']); + $this->assertEquals($expected['appId'], $provider['appId']); + $this->assertEquals($expected['order'], $provider['order']); + $this->assertEquals($expected['inAppSearch'], $provider['inAppSearch']); + } + + $this->assertProvidersAreSortedByOrder($actualProviders); + } + + private function assertProviderHasRequiredFields(array $provider): void { + $requiredFields = ['id', 'appId', 'name', 'icon', 'order', 'triggers', 'filters', 'inAppSearch']; + foreach ($requiredFields as $field) { + $this->assertArrayHasKey($field, $provider, "Provider must have '$field' field"); + } + } + + private function assertProvidersAreSortedByOrder(array $providers): void { + $orders = array_column($providers, 'order'); + $sortedOrders = $orders; + sort($sortedOrders); + $this->assertEquals($sortedOrders, $orders, 'Providers should be sorted by order'); + } +} diff --git a/tests/lib/Share20/ManagerTest.php b/tests/lib/Share20/ManagerTest.php index 7859407651f..0e37934786a 100644 --- a/tests/lib/Share20/ManagerTest.php +++ b/tests/lib/Share20/ManagerTest.php @@ -722,7 +722,10 @@ class ManagerTest extends \Test\TestCase { $this->config->method('getAppValue')->willReturnMap([ ['core', 'shareapi_enforce_links_password_excluded_groups', '', ''], - ['core', 'shareapi_enforce_links_password', 'no', 'yes'], + ]); + + $this->appConfig->method('getValueBool')->willReturnMap([ + ['core', 'shareapi_enforce_links_password', true], ]); self::invokePrivate($this->manager, 'verifyPassword', [null]); diff --git a/tests/lib/TemplateLayoutTest.php b/tests/lib/TemplateLayoutTest.php index c1cafcd6b93..ce5d2f6dd0b 100644 --- a/tests/lib/TemplateLayoutTest.php +++ b/tests/lib/TemplateLayoutTest.php @@ -13,6 +13,7 @@ use OC\InitialStateService; use OC\TemplateLayout; use OCP\App\IAppManager; use OCP\AppFramework\Http\TemplateResponse; +use OCP\IAppConfig; use OCP\IConfig; use OCP\INavigationManager; use OCP\ServerVersion; @@ -21,6 +22,7 @@ use PHPUnit\Framework\MockObject\MockObject; class TemplateLayoutTest extends \Test\TestCase { private IConfig&MockObject $config; + private IAppConfig&MockObject $appConfig; private IAppManager&MockObject $appManager; private InitialStateService&MockObject $initialState; private INavigationManager&MockObject $navigationManager; @@ -33,6 +35,7 @@ class TemplateLayoutTest extends \Test\TestCase { parent::setUp(); $this->config = $this->createMock(IConfig::class); + $this->appConfig = $this->createMock(IAppConfig::class); $this->appManager = $this->createMock(IAppManager::class); $this->initialState = $this->createMock(InitialStateService::class); $this->navigationManager = $this->createMock(INavigationManager::class); @@ -68,6 +71,7 @@ class TemplateLayoutTest extends \Test\TestCase { ->onlyMethods(['getAppNamefromPath']) ->setConstructorArgs([ $this->config, + $this->appConfig, $this->appManager, $this->initialState, $this->navigationManager, |