0
0
Fork 0
mirror of https://github.com/nextcloud/server.git synced 2025-02-11 11:39:27 +00:00
nextcloud_server/apps/theming/tests/Migration/Version2006Date20240905111627Test.php
Ferdinand Thiessen bf7dc2f2e7
fix(theming): Do not throw in background color migration
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-01-29 15:32:43 +01:00

181 lines
5.8 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Theming\Tests\Migration;
use NCU\Config\IUserConfig;
use OCA\Theming\Migration\Version2006Date20240905111627;
use OCP\BackgroundJob\IJobList;
use OCP\IAppConfig;
use OCP\IDBConnection;
use OCP\IUserManager;
use OCP\Migration\IOutput;
use PHPUnit\Framework\MockObject\MockObject;
use Test\TestCase;
/**
* @group DB
*/
class Version2006Date20240905111627Test extends TestCase {
private IAppConfig&MockObject $appConfig;
private IDBConnection&MockObject $connection;
private IJobList&MockObject $jobList;
private Version2006Date20240905111627 $migration;
protected function setUp(): void {
parent::setUp();
$this->appConfig = $this->createMock(IAppConfig::class);
$this->connection = $this->createMock(IDBConnection::class);
$this->jobList = $this->createMock(IJobList::class);
$this->migration = new Version2006Date20240905111627(
$this->jobList,
$this->appConfig,
$this->connection,
);
}
public function testRestoreSystemColors(): void {
$this->appConfig->expects(self::once())
->method('getValueString')
->with('theming', 'color', '')
->willReturn('ffab00');
$this->appConfig->expects(self::once())
->method('getValueBool')
->with('theming', 'disable-user-theming')
->willReturn(true);
// expect the color value to be deleted
$this->appConfig->expects(self::once())
->method('deleteKey')
->with('theming', 'color');
// expect the correct calls to setValueString (setting the new values)
$setValueCalls = [];
$this->appConfig->expects(self::exactly(2))
->method('setValueString')
->willReturnCallback(function () use (&$setValueCalls) {
$setValueCalls[] = func_get_args();
return true;
});
$output = $this->createMock(IOutput::class);
$this->migration->changeSchema($output, fn () => null, []);
$this->assertEquals([
['theming', 'background_color', 'ffab00', false, false],
['theming', 'primary_color', 'ffab00', false, false],
], $setValueCalls);
}
/**
* @group DB
*/
public function testRestoreUserColors(): void {
$this->appConfig->expects(self::once())
->method('getValueString')
->with('theming', 'color', '')
->willReturn('');
$this->appConfig->expects(self::once())
->method('getValueBool')
->with('theming', 'disable-user-theming')
->willReturn(false);
// Create a user
$manager = \OCP\Server::get(IUserManager::class);
$user = $manager->createUser('theming_legacy', 'theming_legacy');
self::assertNotFalse($user);
// Set the users theming value to legacy key
$config = \OCP\Server::get(IUserConfig::class);
$config->setValueString('theming_legacy', 'theming', 'background_color', 'ffab00');
// expect some output
$output = $this->createMock(IOutput::class);
$output->expects(self::exactly(3))
->method('info')
->willReturnCallback(fn ($txt) => match($txt) {
'No custom system color configured - skipping' => true,
'Restoring user primary color' => true,
'Primary color of users restored' => true,
default => self::fail('output.info called with unexpected argument: ' . $txt)
});
// Create the migration class
$migration = new Version2006Date20240905111627(
$this->jobList,
$this->appConfig,
\OCP\Server::get(IDBConnection::class),
);
// Run the migration
$migration->changeSchema($output, fn () => null, []);
// See new value
$config->clearCache('theming_legacy');
$newValue = $config->getValueString('theming_legacy', 'theming', 'primary_color');
self::assertEquals('ffab00', $newValue);
// cleanup
$user->delete();
}
/**
* Ensure only users with background color but no primary color are migrated
* @group DB
*/
public function testRestoreUserColorsWithConflicts(): void {
$this->appConfig->expects(self::once())
->method('getValueString')
->with('theming', 'color', '')
->willReturn('');
$this->appConfig->expects(self::once())
->method('getValueBool')
->with('theming', 'disable-user-theming')
->willReturn(false);
// Create a user
$manager = \OCP\Server::get(IUserManager::class);
$legacyUser = $manager->createUser('theming_legacy', 'theming_legacy');
self::assertNotFalse($legacyUser);
$user = $manager->createUser('theming_no_legacy', 'theming_no_legacy');
self::assertNotFalse($user);
// Set the users theming value to legacy key
$config = \OCP\Server::get(IUserConfig::class);
$config->setValueString($user->getUID(), 'theming', 'primary_color', '999999');
$config->setValueString($user->getUID(), 'theming', 'background_color', '111111');
$config->setValueString($legacyUser->getUID(), 'theming', 'background_color', 'ffab00');
// expect some output
$output = $this->createMock(IOutput::class);
$output->expects(self::exactly(3))
->method('info')
->willReturnCallback(fn ($txt) => match($txt) {
'No custom system color configured - skipping' => true,
'Restoring user primary color' => true,
'Primary color of users restored' => true,
default => self::fail('output.info called with unexpected argument: ' . $txt)
});
// Create the migration class
$migration = new Version2006Date20240905111627(
$this->jobList,
$this->appConfig,
\OCP\Server::get(IDBConnection::class),
);
// Run the migration
$migration->changeSchema($output, fn () => null, []);
// See new value of only the legacy user
$config->clearCacheAll();
self::assertEquals('111111', $config->getValueString($user->getUID(), 'theming', 'background_color'));
self::assertEquals('999999', $config->getValueString($user->getUID(), 'theming', 'primary_color'));
self::assertEquals('ffab00', $config->getValueString($legacyUser->getUID(), 'theming', 'primary_color'));
// cleanup
$legacyUser->delete();
$user->delete();
}
}