diff options
-rw-r--r-- | apps/dav/lib/Settings/CalDAVSettings.php | 14 | ||||
-rw-r--r-- | apps/dav/tests/unit/Settings/CalDAVSettingsTest.php | 20 | ||||
-rw-r--r-- | lib/private/App/AppManager.php | 12 | ||||
-rw-r--r-- | lib/private/App/InfoParser.php | 10 | ||||
-rw-r--r-- | lib/public/App/IAppManager.php | 15 | ||||
-rw-r--r-- | resources/app-info-shipped.xsd | 7 | ||||
-rw-r--r-- | resources/app-info.xsd | 8 | ||||
-rw-r--r-- | tests/data/app/expected-info.json | 5 | ||||
-rw-r--r-- | tests/data/app/navigation-one-item.json | 5 | ||||
-rw-r--r-- | tests/data/app/navigation-two-items.json | 5 | ||||
-rw-r--r-- | tests/data/app/valid-info.xml | 1 | ||||
-rw-r--r-- | tests/lib/App/AppManagerTest.php | 48 |
12 files changed, 138 insertions, 12 deletions
diff --git a/apps/dav/lib/Settings/CalDAVSettings.php b/apps/dav/lib/Settings/CalDAVSettings.php index 75bb70c530a..7c738a83148 100644 --- a/apps/dav/lib/Settings/CalDAVSettings.php +++ b/apps/dav/lib/Settings/CalDAVSettings.php @@ -6,6 +6,7 @@ namespace OCA\DAV\Settings; use OCA\DAV\AppInfo\Application; +use OCP\App\IAppManager; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Services\IInitialState; use OCP\IConfig; @@ -21,6 +22,7 @@ class CalDAVSettings implements IDelegatedSettings { private $initialState; private IURLGenerator $urlGenerator; + private IAppManager $appManager; private const defaults = [ 'sendInvitations' => 'yes', @@ -36,10 +38,11 @@ class CalDAVSettings implements IDelegatedSettings { * @param IConfig $config * @param IInitialState $initialState */ - public function __construct(IConfig $config, IInitialState $initialState, IURLGenerator $urlGenerator) { + public function __construct(IConfig $config, IInitialState $initialState, IURLGenerator $urlGenerator, IAppManager $appManager) { $this->config = $config; $this->initialState = $initialState; $this->urlGenerator = $urlGenerator; + $this->appManager = $appManager; } public function getForm(): TemplateResponse { @@ -51,10 +54,11 @@ class CalDAVSettings implements IDelegatedSettings { return new TemplateResponse(Application::APP_ID, 'settings-admin-caldav'); } - /** - * @return string - */ - public function getSection() { + public function getSection(): ?string { + if (!$this->appManager->isBackendRequired(IAppManager::BACKEND_CALDAV)) { + return null; + } + return 'groupware'; } diff --git a/apps/dav/tests/unit/Settings/CalDAVSettingsTest.php b/apps/dav/tests/unit/Settings/CalDAVSettingsTest.php index 46a8db6f3eb..ed497d006e1 100644 --- a/apps/dav/tests/unit/Settings/CalDAVSettingsTest.php +++ b/apps/dav/tests/unit/Settings/CalDAVSettingsTest.php @@ -6,6 +6,7 @@ namespace OCA\DAV\Tests\Unit\DAV\Settings; use OCA\DAV\Settings\CalDAVSettings; +use OCP\App\IAppManager; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Services\IInitialState; use OCP\IConfig; @@ -24,6 +25,9 @@ class CalDAVSettingsTest extends TestCase { /** @var IURLGenerator|MockObject */ private $urlGenerator; + /** @var IAppManager|MockObject */ + private $appManager; + private CalDAVSettings $settings; protected function setUp(): void { @@ -32,7 +36,8 @@ class CalDAVSettingsTest extends TestCase { $this->config = $this->createMock(IConfig::class); $this->initialState = $this->createMock(IInitialState::class); $this->urlGenerator = $this->createMock(IURLGenerator::class); - $this->settings = new CalDAVSettings($this->config, $this->initialState, $this->urlGenerator); + $this->appManager = $this->createMock(IAppManager::class); + $this->settings = new CalDAVSettings($this->config, $this->initialState, $this->urlGenerator, $this->appManager); } public function testGetForm(): void { @@ -65,10 +70,23 @@ class CalDAVSettingsTest extends TestCase { } public function testGetSection(): void { + $this->appManager->expects(self::once()) + ->method('isBackendRequired') + ->with(IAppManager::BACKEND_CALDAV) + ->willReturn(true); $this->assertEquals('groupware', $this->settings->getSection()); } + public function testGetSectionWithoutCaldavBackend(): void { + $this->appManager->expects(self::once()) + ->method('isBackendRequired') + ->with(IAppManager::BACKEND_CALDAV) + ->willReturn(false); + $this->assertEquals(null, $this->settings->getSection()); + } + public function testGetPriority(): void { $this->assertEquals(10, $this->settings->getPriority()); } + } diff --git a/lib/private/App/AppManager.php b/lib/private/App/AppManager.php index 52a88a724ff..2f129ca77fa 100644 --- a/lib/private/App/AppManager.php +++ b/lib/private/App/AppManager.php @@ -875,4 +875,16 @@ class AppManager implements IAppManager { $this->config->setSystemValue('defaultapp', join(',', $defaultApps)); } + + public function isBackendRequired(string $backend): bool { + foreach ($this->appInfos as $appInfo) { + foreach ($appInfo['dependencies']['backend'] as $appBackend) { + if ($backend === $appBackend) { + return true; + } + } + } + + return false; + } } diff --git a/lib/private/App/InfoParser.php b/lib/private/App/InfoParser.php index d29b1d6596d..54afd0069fb 100644 --- a/lib/private/App/InfoParser.php +++ b/lib/private/App/InfoParser.php @@ -113,6 +113,12 @@ class InfoParser { if (!array_key_exists('personal-section', $array['settings'])) { $array['settings']['personal-section'] = []; } + if (!array_key_exists('dependencies', $array)) { + $array['dependencies'] = []; + } + if (!array_key_exists('backend', $array['dependencies'])) { + $array['dependencies']['backend'] = []; + } if (array_key_exists('types', $array)) { if (is_array($array['types'])) { @@ -177,10 +183,12 @@ class InfoParser { if (isset($array['settings']['personal-section']) && !is_array($array['settings']['personal-section'])) { $array['settings']['personal-section'] = [$array['settings']['personal-section']]; } - if (isset($array['navigations']['navigation']) && $this->isNavigationItem($array['navigations']['navigation'])) { $array['navigations']['navigation'] = [$array['navigations']['navigation']]; } + if (isset($array['dependencies']['backend']) && !is_array($array['dependencies']['backend'])) { + $array['dependencies']['backend'] = [$array['dependencies']['backend']]; + } if ($this->cache !== null) { $this->cache->set($fileCacheKey, json_encode($array)); diff --git a/lib/public/App/IAppManager.php b/lib/public/App/IAppManager.php index 508143426f5..e11bb0c36f5 100644 --- a/lib/public/App/IAppManager.php +++ b/lib/public/App/IAppManager.php @@ -20,6 +20,11 @@ use OCP\IUser; */ interface IAppManager { /** + * @since 30.0.0 + */ + public const BACKEND_CALDAV = 'caldav'; + + /** * Returns the app information from "appinfo/info.xml". * * @param string|null $lang @@ -261,4 +266,14 @@ interface IAppManager { * @since 28.0.0 */ public function setDefaultApps(array $defaultApps): void; + + /** + * Check whether the given backend is required by at least one app. + * + * @param self::BACKEND_* $backend Name of the backend, one of `self::BACKEND_*` + * @return bool True if at least one app requires the backend + * + * @since 30.0.0 + */ + public function isBackendRequired(string $backend): bool; } diff --git a/resources/app-info-shipped.xsd b/resources/app-info-shipped.xsd index 2ad858af0f5..a340dde30bd 100644 --- a/resources/app-info-shipped.xsd +++ b/resources/app-info-shipped.xsd @@ -575,6 +575,8 @@ maxOccurs="1"/> <xs:element name="architecture" type="architecture" minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="backend" type="backend" minOccurs="0" + maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> @@ -757,4 +759,9 @@ </xs:restriction> </xs:simpleType> + <xs:simpleType name="backend"> + <xs:restriction base="xs:string"> + <xs:enumeration value="caldav"/> + </xs:restriction> + </xs:simpleType> </xs:schema> diff --git a/resources/app-info.xsd b/resources/app-info.xsd index a0b9439e350..76cc02a8431 100644 --- a/resources/app-info.xsd +++ b/resources/app-info.xsd @@ -563,6 +563,8 @@ maxOccurs="1"/> <xs:element name="architecture" type="architecture" minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="backend" type="backend" minOccurs="0" + maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> @@ -737,4 +739,10 @@ value="[a-zA-Z_][0-9a-zA-Z_]*(\\[a-zA-Z_][0-9a-zA-Z_]*)*"/> </xs:restriction> </xs:simpleType> + + <xs:simpleType name="backend"> + <xs:restriction base="xs:string"> + <xs:enumeration value="caldav"/> + </xs:restriction> + </xs:simpleType> </xs:schema> diff --git a/tests/data/app/expected-info.json b/tests/data/app/expected-info.json index 8527f18a2c0..c3ea27af7d3 100644 --- a/tests/data/app/expected-info.json +++ b/tests/data/app/expected-info.json @@ -65,7 +65,10 @@ "min-version": "7.0.1", "max-version": "8" } - } + }, + "backend": [ + "caldav" + ] }, "repair-steps": { "install": [], diff --git a/tests/data/app/navigation-one-item.json b/tests/data/app/navigation-one-item.json index c9002da6b0d..2bd81461586 100644 --- a/tests/data/app/navigation-one-item.json +++ b/tests/data/app/navigation-one-item.json @@ -29,7 +29,8 @@ "min-version": "16", "max-version": "16" } - } + }, + "backend": [] }, "background-jobs": [ "OCA\\Activity\\BackgroundJob\\EmailNotification", @@ -82,4 +83,4 @@ "uninstall": [] }, "two-factor-providers": [] -}
\ No newline at end of file +} diff --git a/tests/data/app/navigation-two-items.json b/tests/data/app/navigation-two-items.json index a7579217238..4b081d3bbd9 100644 --- a/tests/data/app/navigation-two-items.json +++ b/tests/data/app/navigation-two-items.json @@ -29,7 +29,8 @@ "min-version": "16", "max-version": "16" } - } + }, + "backend": [] }, "background-jobs": [ "OCA\\Activity\\BackgroundJob\\EmailNotification", @@ -88,4 +89,4 @@ "uninstall": [] }, "two-factor-providers": [] -}
\ No newline at end of file +} diff --git a/tests/data/app/valid-info.xml b/tests/data/app/valid-info.xml index 9044c00f353..d2569788399 100644 --- a/tests/data/app/valid-info.xml +++ b/tests/data/app/valid-info.xml @@ -34,5 +34,6 @@ <lib>curl</lib> <os>Linux</os> <owncloud min-version="7.0.1" max-version="8" /> + <backend>caldav</backend> </dependencies> </info> diff --git a/tests/lib/App/AppManagerTest.php b/tests/lib/App/AppManagerTest.php index c38cadf8e38..03c9d474c55 100644 --- a/tests/lib/App/AppManagerTest.php +++ b/tests/lib/App/AppManagerTest.php @@ -885,4 +885,52 @@ class AppManagerTest extends TestCase { $this->assertEquals($expectedApp, $this->manager->getDefaultAppForUser(null, $withFallbacks)); } + + public static function isBackendRequiredDataProvider(): array { + return [ + // backend available + [ + 'caldav', + ['app1' => ['caldav']], + true, + ], + [ + 'caldav', + ['app1' => [], 'app2' => ['foo'], 'app3' => ['caldav']], + true, + ], + // backend not available + [ + 'caldav', + ['app3' => [], 'app1' => ['foo'], 'app2' => ['bar', 'baz']], + false, + ], + // no app available + [ + 'caldav', + [], + false, + ], + ]; + } + + /** + * @dataProvider isBackendRequiredDataProvider + */ + public function testIsBackendRequired( + string $backend, + array $appBackends, + bool $expected, + ): void { + $appInfoData = array_map( + static fn (array $backends) => ['dependencies' => ['backend' => $backends]], + $appBackends, + ); + + $reflection = new \ReflectionClass($this->manager); + $property = $reflection->getProperty('appInfos'); + $property->setValue($this->manager, $appInfoData); + + $this->assertEquals($expected, $this->manager->isBackendRequired($backend)); + } } |