aboutsummaryrefslogtreecommitdiffstats
path: root/tests/lib/Repair/Owncloud/UpdateLanguageCodesTest.php
blob: a7907308d93e99e908704dcfdbc13bb6c7256d79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #ff
<?php
/**
 * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */

namespace Test\Repair\Owncloud;

use OC\Repair\Owncloud\UpdateLanguageCodes;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IConfig;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use PHPUnit\Framework\MockObject\MockObject;
use Test\TestCase;

/**
 * Class UpdateLanguageCodesTest
 *
 * @group DB
 *
 * @package Test\Repair
 */
class UpdateLanguageCodesTest extends TestCase {

	protected IDBConnection $connection;
	private IConfig&MockObject $config;

	protected function setUp(): void {
		parent::setUp();

		$this->connection = \OCP\Server::get(IDBConnection::class);
		$this->config = $this->createMock(IConfig::class);
	}

	public function testRun(): void {
		$users = [
			['userid' => 'user1', 'configvalue' => 'fi_FI'],
			['userid' => 'user2', 'configvalue' => 'de'],
			['userid' => 'user3', 'configvalue' => 'fi'],
			['userid' => 'user4', 'configvalue' => 'ja'],
			['userid' => 'user5', 'configvalue' => 'bg_BG'],
			['userid' => 'user6', 'configvalue' => 'ja'],
			['userid' => 'user7', 'configvalue' => 'th_TH'],
			['userid' => 'user8', 'configvalue' => 'th_TH'],
		];

		// insert test data
		$qb = $this->connection->getQueryBuilder();
		$qb->insert('preferences')
			->values([
				'userid' => $qb->createParameter('userid'),
				'appid' => $qb->createParameter('appid'),
				'configkey' => $qb->createParameter('configkey'),
				'configvalue' => $qb->createParameter('configvalue'),
			]);
		foreach ($users as $user) {
			$qb->setParameters([
				'userid' => $user['userid'],
				'appid' => 'core',
				'configkey' => 'lang',
				'configvalue' => $user['configvalue'],
			])->executeStatement();
		}

		// check if test data is written to DB
		$qb = $this->connection->getQueryBuilder();
		$result = $qb->select(['userid', 'configvalue'])
			->from('preferences')
			->where($qb->expr()->eq('appid', $qb->createNamedParameter('core')))
			->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('lang')))
			->orderBy('userid')
			->executeQuery();

		$rows = $result->fetchAll();
		$result->closeCursor();

		$this->assertSame($users, $rows, 'Asserts that the entries are the ones from the test data set');

		$expectedOutput = [
			['Changed 1 setting(s) from "bg_BG" to "bg" in preferences table.'],
			['Changed 0 setting(s) from "cs_CZ" to "cs" in preferences table.'],
			['Changed 1 setting(s) from "fi_FI" to "fi" in preferences table.'],
			['Changed 0 setting(s) from "hu_HU" to "hu" in preferences table.'],
			['Changed 0 setting(s) from "nb_NO" to "nb" in preferences table.'],
			['Changed 0 setting(s) from "sk_SK" to "sk" in preferences table.'],
			['Changed 2 setting(s) from "th_TH" to "th" in preferences table.'],
		];
		$outputMessages = [];
		/** @var IOutput&MockObject $outputMock */
		$outputMock = $this->createMock(IOutput::class);
		$outputMock->expects($this->exactly(7))
			->method('info')
			->willReturnCallback(function () use (&$outputMessages) {
				$outputMessages[] = func_get_args();
			});

		$this->config->expects($this->once())
			->method('getSystemValueString')
			->with('version', '0.0.0')
			->willReturn('12.0.0.13');

		// run repair step
		$repair = new UpdateLanguageCodes($this->connection, $this->config);
		$repair->run($outputMock);

		// check if test data is correctly modified in DB
		$qb = $this->connection->getQueryBuilder();
		$result = $qb->select(['userid', 'configvalue'])
			->from('preferences')
			->where($qb->expr()->eq('appid', $qb->createNamedParameter('core')))
			->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('lang')))
			->orderBy('userid')
			->executeQuery();

		$rows = $result->fetchAll();
		$result->closeCursor();

		// value has changed for one user
		$users[0]['configvalue'] = 'fi';
		$users[4]['configvalue'] = 'bg';
		$users[6]['configvalue'] = 'th';
		$users[7]['configvalue'] = 'th';
		$this->assertSame($users, $rows, 'Asserts that the entries are updated correctly.');

		// remove test data
		foreach ($users as $user) {
			$qb = $this->connection->getQueryBuilder();
			$qb->delete('preferences')
				->where($qb->expr()->eq('userid', $qb->createNamedParameter($user['userid'])))
				->andWhere($qb->expr()->eq('appid', $qb->createNamedParameter('core')))
				->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('lang')))
				->andWhere($qb->expr()->eq('configvalue', $qb->createNamedParameter($user['configvalue']), IQueryBuilder::PARAM_STR))
				->executeStatement();
		}
		self::assertEquals($expectedOutput, $outputMessages);
	}

	public function testSecondRun(): void {
		/** @var IOutput&MockObject $outputMock */
		$outputMock = $this->createMock(IOutput::class);
		$outputMock->expects($this->never())
			->method('info');

		$this->config->expects($this->once())
			->method('getSystemValueString')
			->with('version', '0.0.0')
			->willReturn('12.0.0.14');

		// run repair step
		$repair = new UpdateLanguageCodes($this->connection, $this->config);
		$repair->run($outputMock);
	}
}