* * @author Christoph Wurst * @author Georg Ehrke * @author Morris Jobke * @author Nils Wittenbrink * @author Roeland Jago Douma * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ namespace OCA\DAV\Tests\unit\Provisioning\Apple; use OCA\DAV\Provisioning\Apple\AppleProvisioningPlugin; use OCA\Theming\ThemingDefaults; use OCP\IL10N; use OCP\IRequest; use OCP\IURLGenerator; use OCP\IUser; use OCP\IUserSession; use Test\TestCase; class AppleProvisioningPluginTest extends TestCase { /** @var \Sabre\DAV\Server|\PHPUnit\Framework\MockObject\MockObject */ protected $server; /** @var IUserSession|\PHPUnit\Framework\MockObject\MockObject */ protected $userSession; /** @var IURLGenerator|\PHPUnit\Framework\MockObject\MockObject */ protected $urlGenerator; /** @var ThemingDefaults|\PHPUnit\Framework\MockObject\MockObject */ protected $themingDefaults; /** @var IRequest|\PHPUnit\Framework\MockObject\MockObject */ protected $request; /** @var IL10N|\PHPUnit\Framework\MockObject\MockObject */ protected $l10n; /** @var \Sabre\HTTP\RequestInterface|\PHPUnit\Framework\MockObject\MockObject */ protected $sabreRequest; /** @var \Sabre\HTTP\ResponseInterface|\PHPUnit\Framework\MockObject\MockObject */ protected $sabreResponse; /** @var AppleProvisioningPlugin */ protected $plugin; protected function setUp(): void { parent::setUp(); $this->server = $this->createMock(\Sabre\DAV\Server::class); $this->userSession = $this->createMock(IUserSession::class); $this->urlGenerator = $this->createMock(IURLGenerator::class); $this->themingDefaults = $this->createMock(ThemingDefaults::class); $this->request = $this->createMock(IRequest::class); $this->l10n = $this->createMock(IL10N::class); $this->plugin = new AppleProvisioningPlugin($this->userSession, $this->urlGenerator, $this->themingDefaults, $this->request, $this->l10n, function () { return 'generated-uuid'; } ); $this->sabreRequest = $this->createMock(\Sabre\HTTP\RequestInterface::class); $this->sabreResponse = $this->createMock(\Sabre\HTTP\ResponseInterface::class); } public function testInitialize(): void { $server = $this->createMock(\Sabre\DAV\Server::class); $plugin = new AppleProvisioningPlugin($this->userSession, $this->urlGenerator, $this->themingDefaults, $this->request, $this->l10n, function (): void { }); $server->expects($this->once()) ->method('on') ->with('method:GET', [$plugin, 'httpGet'], 90); $plugin->initialize($server); } public function testHttpGetOnHttp(): void { $this->sabreRequest->expects($this->once()) ->method('getPath') ->with() ->willReturn('provisioning/apple-provisioning.mobileconfig'); $user = $this->createMock(IUser::class); $this->userSession->expects($this->once()) ->method('getUser') ->willReturn($user); $this->request->expects($this->once()) ->method('getServerProtocol') ->wilLReturn('http'); $this->themingDefaults->expects($this->once()) ->method('getName') ->willReturn('InstanceName'); $this->l10n->expects($this->once()) ->method('t') ->with('Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS.', ['InstanceName']) ->willReturn('LocalizedErrorMessage'); $this->sabreResponse->expects($this->once()) ->method('setStatus') ->with(200); $this->sabreResponse->expects($this->once()) ->method('setHeader') ->with('Content-Type', 'text/plain; charset=utf-8'); $this->sabreResponse->expects($this->once()) ->method('setBody') ->with('LocalizedErrorMessage'); $returnValue = $this->plugin->httpGet($this->sabreRequest, $this->sabreResponse); $this->assertFalse($returnValue); } public function testHttpGetOnHttps(): void { $this->sabreRequest->expects($this->once()) ->method('getPath') ->with() ->willReturn('provisioning/apple-provisioning.mobileconfig'); $user = $this->createMock(IUser::class); $user->expects($this->once()) ->method('getUID') ->willReturn('userName'); $this->userSession->expects($this->once()) ->method('getUser') ->willReturn($user); $this->request->expects($this->once()) ->method('getServerProtocol') ->wilLReturn('https'); $this->urlGenerator->expects($this->once()) ->method('getBaseUrl') ->willReturn('https://nextcloud.tld/nextcloud'); $this->themingDefaults->expects($this->once()) ->method('getName') ->willReturn('InstanceName'); $this->l10n->expects($this->exactly(2)) ->method('t') ->withConsecutive( ['Configures a CalDAV account'], ['Configures a CardDAV account'], ) ->willReturnOnConsecutiveCalls( 'LocalizedConfiguresCalDAV', 'LocalizedConfiguresCardDAV', ); $this->sabreResponse->expects($this->once()) ->method('setStatus') ->with(200); $this->sabreResponse->expects($this->exactly(2)) ->method('setHeader') ->withConsecutive( ['Content-Disposition', 'attachment; filename="userName-apple-provisioning.mobileconfig"'], ['Content-Type', 'application/xml; charset=utf-8'], ); $this->sabreResponse->expects($this->once()) ->method('setBody') ->with(<< PayloadContent CalDAVAccountDescription InstanceName CalDAVHostName nextcloud.tld CalDAVUsername userName CalDAVUseSSL CalDAVPort 443 PayloadDescription LocalizedConfiguresCalDAV PayloadDisplayName InstanceName CalDAV PayloadIdentifier tld.nextcloud.generated-uuid PayloadType com.apple.caldav.account PayloadUUID generated-uuid PayloadVersion 1 CardDAVAccountDescription InstanceName CardDAVHostName nextcloud.tld CardDAVUsername userName CardDAVUseSSL CardDAVPort 443 PayloadDescription LocalizedConfiguresCardDAV PayloadDisplayName InstanceName CardDAV PayloadIdentifier tld.nextcloud.generated-uuid PayloadType com.apple.carddav.account PayloadUUID generated-uuid PayloadVersion 1 PayloadDisplayName InstanceName PayloadIdentifier tld.nextcloud.generated-uuid PayloadRemovalDisallowed PayloadType Configuration PayloadUUID generated-uuid PayloadVersion 1 EOF ); $returnValue = $this->plugin->httpGet($this->sabreRequest, $this->sabreResponse); $this->assertFalse($returnValue); } }