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;
private $initialState;
private IURLGenerator $urlGenerator;
+ private IAppManager $appManager;
private const defaults = [
'sendInvitations' => 'yes',
* @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 {
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';
}
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;
/** @var IURLGenerator|MockObject */
private $urlGenerator;
+ /** @var IAppManager|MockObject */
+ private $appManager;
+
private CalDAVSettings $settings;
protected function setUp(): void {
$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 {
}
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());
}
+
}
$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;
+ }
}
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'])) {
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));
* @since 8.0.0
*/
interface IAppManager {
+ /**
+ * @since 30.0.0
+ */
+ public const BACKEND_CALDAV = 'caldav';
+
/**
* Returns the app information from "appinfo/info.xml".
*
* @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;
}
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>
</xs:restriction>
</xs:simpleType>
+ <xs:simpleType name="backend">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="caldav"/>
+ </xs:restriction>
+ </xs:simpleType>
</xs:schema>
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>
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>
"min-version": "7.0.1",
"max-version": "8"
}
- }
+ },
+ "backend": [
+ "caldav"
+ ]
},
"repair-steps": {
"install": [],
"min-version": "16",
"max-version": "16"
}
- }
+ },
+ "backend": []
},
"background-jobs": [
"OCA\\Activity\\BackgroundJob\\EmailNotification",
"uninstall": []
},
"two-factor-providers": []
-}
\ No newline at end of file
+}
"min-version": "16",
"max-version": "16"
}
- }
+ },
+ "backend": []
},
"background-jobs": [
"OCA\\Activity\\BackgroundJob\\EmailNotification",
"uninstall": []
},
"two-factor-providers": []
-}
\ No newline at end of file
+}
<lib>curl</lib>
<os>Linux</os>
<owncloud min-version="7.0.1" max-version="8" />
+ <backend>caldav</backend>
</dependencies>
</info>
$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));
+ }
}