aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/lib/Activity/ManagerTest.php16
-rw-r--r--tests/lib/Files/Mount/ObjectHomeMountProviderTest.php2
-rw-r--r--tests/lib/Files/ObjectStore/PrimaryObjectStoreConfigTest.php285
-rw-r--r--tests/lib/Files/ViewTest.php27
-rw-r--r--tests/lib/Search/SearchComposerTest.php290
-rw-r--r--tests/lib/Share20/ManagerTest.php5
-rw-r--r--tests/lib/TemplateLayoutTest.php4
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,