123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557 |
- <?php
- declare(strict_types=1);
- /**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Julius Härtl <jus@bitgrid.net>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Vincent Petry <vincent@nextcloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
- namespace OCA\UpdateNotification\Tests\Settings;
- use OCA\UpdateNotification\Settings\Admin;
- use OCA\UpdateNotification\UpdateChecker;
- use OCP\AppFramework\Http\TemplateResponse;
- use OCP\IConfig;
- use OCP\IDateTimeFormatter;
- use OCP\IGroup;
- use OCP\IGroupManager;
- use OCP\IUserManager;
- use OCP\L10N\IFactory;
- use OCP\L10N\ILanguageIterator;
- use OCP\Support\Subscription\IRegistry;
- use OCP\UserInterface;
- use OCP\User\Backend\ICountUsersBackend;
- use OCP\AppFramework\Services\IInitialState;
- use OCP\Util;
- use OC\User\Backend;
- use Psr\Log\LoggerInterface;
- use Test\TestCase;
- class AdminTest extends TestCase {
- /** @var IFactory|\PHPUnit\Framework\MockObject\MockObject */
- protected $l10nFactory;
- /** @var Admin */
- private $admin;
- /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */
- private $config;
- /** @var UpdateChecker|\PHPUnit\Framework\MockObject\MockObject */
- private $updateChecker;
- /** @var IGroupManager|\PHPUnit\Framework\MockObject\MockObject */
- private $groupManager;
- /** @var IDateTimeFormatter|\PHPUnit\Framework\MockObject\MockObject */
- private $dateTimeFormatter;
- /** @var IRegistry|\PHPUnit\Framework\MockObject\MockObject */
- private $subscriptionRegistry;
- /** @var IUserManager|\PHPUnit\Framework\MockObject\MockObject */
- private $userManager;
- /** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */
- private $logger;
- /** IInitialState|\PHPUnit\Framework\MockObject\MockObject */
- private $initialState;
- protected function setUp(): void {
- parent::setUp();
- $this->config = $this->createMock(IConfig::class);
- $this->updateChecker = $this->createMock(UpdateChecker::class);
- $this->groupManager = $this->createMock(IGroupManager::class);
- $this->dateTimeFormatter = $this->createMock(IDateTimeFormatter::class);
- $this->l10nFactory = $this->createMock(IFactory::class);
- $this->subscriptionRegistry = $this->createMock(IRegistry::class);
- $this->userManager = $this->createMock(IUserManager::class);
- $this->logger = $this->createMock(LoggerInterface::class);
- $this->initialState = $this->createMock(IInitialState::class);
- $this->admin = new Admin(
- $this->config,
- $this->updateChecker,
- $this->groupManager,
- $this->dateTimeFormatter,
- $this->l10nFactory,
- $this->subscriptionRegistry,
- $this->userManager,
- $this->logger,
- $this->initialState
- );
- }
- public function testGetFormWithUpdate() {
- $backend1 = $this->createMock(CountUsersBackend::class);
- $backend2 = $this->createMock(CountUsersBackend::class);
- $backend3 = $this->createMock(CountUsersBackend::class);
- $backend1
- ->expects($this->once())
- ->method('implementsActions')
- ->with(Backend::COUNT_USERS)
- ->willReturn(false);
- $backend2
- ->expects($this->once())
- ->method('implementsActions')
- ->with(Backend::COUNT_USERS)
- ->willReturn(true);
- $backend3
- ->expects($this->once())
- ->method('implementsActions')
- ->with(Backend::COUNT_USERS)
- ->willReturn(true);
- $backend1
- ->expects($this->never())
- ->method('countUsers');
- $backend2
- ->expects($this->once())
- ->method('countUsers')
- ->with()
- ->willReturn(false);
- $backend3
- ->expects($this->once())
- ->method('countUsers')
- ->with()
- ->willReturn(5);
- $this->userManager
- ->expects($this->once())
- ->method('getBackends')
- ->with()
- ->willReturn([$backend1, $backend2, $backend3]);
- $channels = [
- 'daily',
- 'beta',
- 'stable',
- 'production',
- ];
- $currentChannel = Util::getChannel();
- if ($currentChannel === 'git') {
- $channels[] = 'git';
- }
- $this->config
- ->expects($this->exactly(2))
- ->method('getAppValue')
- ->willReturnMap([
- ['core', 'lastupdatedat', '', '12345'],
- ['updatenotification', 'notify_groups', '["admin"]', '["admin"]'],
- ]);
- $this->config
- ->method('getSystemValue')
- ->willReturnMap([
- ['updater.server.url', 'https://updates.nextcloud.com/updater_server/', 'https://updates.nextcloud.com/updater_server/'],
- ['upgrade.disable-web', false, false],
- ]);
- $this->dateTimeFormatter
- ->expects($this->once())
- ->method('formatDateTime')
- ->with('12345')
- ->willReturn('LastCheckedReturnValue');
- $this->updateChecker
- ->expects($this->once())
- ->method('getUpdateState')
- ->willReturn([
- 'updateAvailable' => true,
- 'updateVersion' => '8.1.2',
- 'updateVersionString' => 'Nextcloud 8.1.2',
- 'downloadLink' => 'https://downloads.nextcloud.org/server',
- 'changes' => [],
- 'updaterEnabled' => true,
- 'versionIsEol' => false,
- ]);
- $group = $this->createMock(IGroup::class);
- $group->expects($this->any())
- ->method('getDisplayName')
- ->willReturn('Administrators');
- $group->expects($this->any())
- ->method('getGID')
- ->willReturn('admin');
- $this->groupManager->expects($this->once())
- ->method('get')
- ->with('admin')
- ->willReturn($group);
- $this->subscriptionRegistry
- ->expects($this->once())
- ->method('delegateHasValidSubscription')
- ->willReturn(true);
- $this->initialState->expects($this->once())
- ->method('provideInitialState')
- ->with('data', [
- 'isNewVersionAvailable' => true,
- 'isUpdateChecked' => true,
- 'lastChecked' => 'LastCheckedReturnValue',
- 'currentChannel' => Util::getChannel(),
- 'channels' => $channels,
- 'newVersion' => '8.1.2',
- 'newVersionString' => 'Nextcloud 8.1.2',
- 'downloadLink' => 'https://downloads.nextcloud.org/server',
- 'changes' => [],
- 'webUpdaterEnabled' => true,
- 'isWebUpdaterRecommended' => true,
- 'updaterEnabled' => true,
- 'versionIsEol' => false,
- 'isDefaultUpdateServerURL' => true,
- 'updateServerURL' => 'https://updates.nextcloud.com/updater_server/',
- 'notifyGroups' => [
- ['id' => 'admin', 'displayname' => 'Administrators'],
- ],
- 'hasValidSubscription' => true,
- ]);
- $expected = new TemplateResponse('updatenotification', 'admin', [], '');
- $this->assertEquals($expected, $this->admin->getForm());
- }
- public function testGetFormWithUpdateAndChangedUpdateServer() {
- $backend1 = $this->createMock(CountUsersBackend::class);
- $backend2 = $this->createMock(CountUsersBackend::class);
- $backend3 = $this->createMock(CountUsersBackend::class);
- $backend1
- ->expects($this->once())
- ->method('implementsActions')
- ->with(Backend::COUNT_USERS)
- ->willReturn(false);
- $backend2
- ->expects($this->once())
- ->method('implementsActions')
- ->with(Backend::COUNT_USERS)
- ->willReturn(true);
- $backend3
- ->expects($this->once())
- ->method('implementsActions')
- ->with(Backend::COUNT_USERS)
- ->willReturn(true);
- $backend1
- ->expects($this->never())
- ->method('countUsers');
- $backend2
- ->expects($this->once())
- ->method('countUsers')
- ->with()
- ->willReturn(false);
- $backend3
- ->expects($this->once())
- ->method('countUsers')
- ->with()
- ->willReturn(5);
- $this->userManager
- ->expects($this->once())
- ->method('getBackends')
- ->with()
- ->willReturn([$backend1, $backend2, $backend3]);
- $channels = [
- 'daily',
- 'beta',
- 'stable',
- 'production',
- ];
- $currentChannel = Util::getChannel();
- if ($currentChannel === 'git') {
- $channels[] = 'git';
- }
- $this->config
- ->expects($this->exactly(2))
- ->method('getAppValue')
- ->willReturnMap([
- ['core', 'lastupdatedat', '', '12345'],
- ['updatenotification', 'notify_groups', '["admin"]', '["admin"]'],
- ]);
- $this->config
- ->method('getSystemValue')
- ->willReturnMap([
- ['updater.server.url', 'https://updates.nextcloud.com/updater_server/', 'https://updates.nextcloud.com/updater_server_changed/'],
- ['upgrade.disable-web', false, true],
- ]);
- $this->dateTimeFormatter
- ->expects($this->once())
- ->method('formatDateTime')
- ->with('12345')
- ->willReturn('LastCheckedReturnValue');
- $this->updateChecker
- ->expects($this->once())
- ->method('getUpdateState')
- ->willReturn([
- 'updateAvailable' => true,
- 'updateVersion' => '8.1.2',
- 'updateVersionString' => 'Nextcloud 8.1.2',
- 'downloadLink' => 'https://downloads.nextcloud.org/server',
- 'changes' => [],
- 'updaterEnabled' => true,
- 'versionIsEol' => false,
- ]);
- $group = $this->createMock(IGroup::class);
- $group->expects($this->any())
- ->method('getDisplayName')
- ->willReturn('Administrators');
- $group->expects($this->any())
- ->method('getGID')
- ->willReturn('admin');
- $this->groupManager->expects($this->once())
- ->method('get')
- ->with('admin')
- ->willReturn($group);
- $this->subscriptionRegistry
- ->expects($this->once())
- ->method('delegateHasValidSubscription')
- ->willReturn(true);
- $this->initialState->expects($this->once())
- ->method('provideInitialState')
- ->with('data', [
- 'isNewVersionAvailable' => true,
- 'isUpdateChecked' => true,
- 'lastChecked' => 'LastCheckedReturnValue',
- 'currentChannel' => Util::getChannel(),
- 'channels' => $channels,
- 'newVersion' => '8.1.2',
- 'newVersionString' => 'Nextcloud 8.1.2',
- 'downloadLink' => 'https://downloads.nextcloud.org/server',
- 'changes' => [],
- 'webUpdaterEnabled' => false,
- 'isWebUpdaterRecommended' => true,
- 'updaterEnabled' => true,
- 'versionIsEol' => false,
- 'isDefaultUpdateServerURL' => false,
- 'updateServerURL' => 'https://updates.nextcloud.com/updater_server_changed/',
- 'notifyGroups' => [
- ['id' => 'admin', 'displayname' => 'Administrators'],
- ],
- 'hasValidSubscription' => true,
- ]);
- $expected = new TemplateResponse('updatenotification', 'admin', [], '');
- $this->assertEquals($expected, $this->admin->getForm());
- }
- public function testGetFormWithUpdateAndCustomersUpdateServer() {
- $backend1 = $this->createMock(CountUsersBackend::class);
- $backend2 = $this->createMock(CountUsersBackend::class);
- $backend3 = $this->createMock(CountUsersBackend::class);
- $backend1
- ->expects($this->once())
- ->method('implementsActions')
- ->with(Backend::COUNT_USERS)
- ->willReturn(false);
- $backend2
- ->expects($this->once())
- ->method('implementsActions')
- ->with(Backend::COUNT_USERS)
- ->willReturn(true);
- $backend3
- ->expects($this->once())
- ->method('implementsActions')
- ->with(Backend::COUNT_USERS)
- ->willReturn(true);
- $backend1
- ->expects($this->never())
- ->method('countUsers');
- $backend2
- ->expects($this->once())
- ->method('countUsers')
- ->with()
- ->willReturn(false);
- $backend3
- ->expects($this->once())
- ->method('countUsers')
- ->with()
- ->willReturn(5);
- $this->userManager
- ->expects($this->once())
- ->method('getBackends')
- ->with()
- ->willReturn([$backend1, $backend2, $backend3]);
- $channels = [
- 'daily',
- 'beta',
- 'stable',
- 'production',
- ];
- $currentChannel = Util::getChannel();
- if ($currentChannel === 'git') {
- $channels[] = 'git';
- }
- $this->config
- ->expects($this->exactly(2))
- ->method('getAppValue')
- ->willReturnMap([
- ['core', 'lastupdatedat', '', '12345'],
- ['updatenotification', 'notify_groups', '["admin"]', '["admin"]'],
- ]);
- $this->config
- ->method('getSystemValue')
- ->willReturnMap([
- ['updater.server.url', 'https://updates.nextcloud.com/updater_server/', 'https://updates.nextcloud.com/customers/ABC-DEF/'],
- ['upgrade.disable-web', false, false],
- ]);
- $this->dateTimeFormatter
- ->expects($this->once())
- ->method('formatDateTime')
- ->with('12345')
- ->willReturn('LastCheckedReturnValue');
- $this->updateChecker
- ->expects($this->once())
- ->method('getUpdateState')
- ->willReturn([
- 'updateAvailable' => true,
- 'updateVersion' => '8.1.2',
- 'updateVersionString' => 'Nextcloud 8.1.2',
- 'downloadLink' => 'https://downloads.nextcloud.org/server',
- 'changes' => [],
- 'updaterEnabled' => true,
- 'versionIsEol' => false,
- ]);
- $group = $this->createMock(IGroup::class);
- $group->expects($this->any())
- ->method('getDisplayName')
- ->willReturn('Administrators');
- $group->expects($this->any())
- ->method('getGID')
- ->willReturn('admin');
- $this->groupManager->expects($this->once())
- ->method('get')
- ->with('admin')
- ->willReturn($group);
- $this->subscriptionRegistry
- ->expects($this->once())
- ->method('delegateHasValidSubscription')
- ->willReturn(true);
- $this->initialState->expects($this->once())
- ->method('provideInitialState')
- ->with('data', [
- 'isNewVersionAvailable' => true,
- 'isUpdateChecked' => true,
- 'lastChecked' => 'LastCheckedReturnValue',
- 'currentChannel' => Util::getChannel(),
- 'channels' => $channels,
- 'newVersion' => '8.1.2',
- 'newVersionString' => 'Nextcloud 8.1.2',
- 'downloadLink' => 'https://downloads.nextcloud.org/server',
- 'changes' => [],
- 'webUpdaterEnabled' => true,
- 'isWebUpdaterRecommended' => true,
- 'updaterEnabled' => true,
- 'versionIsEol' => false,
- 'isDefaultUpdateServerURL' => true,
- 'updateServerURL' => 'https://updates.nextcloud.com/customers/ABC-DEF/',
- 'notifyGroups' => [
- ['id' => 'admin', 'displayname' => 'Administrators'],
- ],
- 'hasValidSubscription' => true,
- ]);
- $expected = new TemplateResponse('updatenotification', 'admin', [], '');
- $this->assertEquals($expected, $this->admin->getForm());
- }
- public function testGetSection() {
- $this->assertSame('overview', $this->admin->getSection());
- }
- public function testGetPriority() {
- $this->assertSame(11, $this->admin->getPriority());
- }
- public function changesProvider() {
- return [
- [ #0, all info, en
- [
- 'changelogURL' => 'https://go.to.changelog',
- 'whatsNew' => [
- 'en' => [
- 'regular' => ['content'],
- ],
- 'de' => [
- 'regular' => ['inhalt'],
- ]
- ],
- ],
- 'en',
- [
- 'changelogURL' => 'https://go.to.changelog',
- 'whatsNew' => [
- 'regular' => ['content'],
- ],
- ]
- ],
- [ #1, all info, de
- [
- 'changelogURL' => 'https://go.to.changelog',
- 'whatsNew' => [
- 'en' => [
- 'regular' => ['content'],
- ],
- 'de' => [
- 'regular' => ['inhalt'],
- ]
- ],
- ],
- 'de',
- [
- 'changelogURL' => 'https://go.to.changelog',
- 'whatsNew' => [
- 'regular' => ['inhalt'],
- ]
- ],
- ],
- [ #2, just changelog
- [ 'changelogURL' => 'https://go.to.changelog' ],
- 'en',
- [ 'changelogURL' => 'https://go.to.changelog' ],
- ],
- [ #3 nothing
- [],
- 'ru',
- []
- ]
- ];
- }
- /**
- * @dataProvider changesProvider
- */
- public function testFilterChanges($changes, $userLang, $expectation) {
- $iterator = $this->createMock(ILanguageIterator::class);
- $iterator->expects($this->any())
- ->method('current')
- ->willReturnOnConsecutiveCalls('es', $userLang, 'it', 'en');
- $iterator->expects($this->any())
- ->method('valid')
- ->willReturn(true);
- $this->l10nFactory->expects($this->atMost(1))
- ->method('getLanguageIterator')
- ->willReturn($iterator);
- $result = $this->invokePrivate($this->admin, 'filterChanges', [$changes]);
- $this->assertSame($expectation, $result);
- }
- }
- abstract class CountUsersBackend implements UserInterface, ICountUsersBackend {
- }
|