diff --git a/settings/Controller/PersonalController.php b/settings/Controller/PersonalController.php new file mode 100644 index 00000000000..f9c67575466 --- /dev/null +++ b/settings/Controller/PersonalController.php @@ -0,0 +1,86 @@ + + * + * @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 OC\Settings\Controller; + +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\JSONResponse; +use OCP\IConfig; +use OCP\IL10N; +use OCP\IRequest; +use OCP\L10N\IFactory; + +class PersonalController extends Controller { + /** @var IFactory */ + private $l10nFactory; + + /** @var string */ + private $userId; + + /** @var IConfig */ + private $config; + + /** @var IL10N */ + private $l; + + /** + * PersonalController constructor. + * + * @param string $appName + * @param IRequest $request + * @param IFactory $l10nFactory + * @param $userId + * @param IConfig $config + * @param IL10N $l + */ + public function __construct($appName, + IRequest $request, + IFactory $l10nFactory, + $userId, + IConfig $config, + IL10N $l) { + parent::__construct($appName, $request); + + $this->l10nFactory = $l10nFactory; + $this->userId = $userId; + $this->config = $config; + $this->l = $l; + } + + /** + * @NoAdminRequired + * @param string $lang + * @return JSONResponse + */ + public function setLanguage($lang) { + if ($lang !== '') { + $languagesCodes = $this->l10nFactory->findAvailableLanguages(); + if (array_search($lang, $languagesCodes) || $lang === 'en') { + $this->config->setUserValue($this->userId, 'core', 'lang', $lang); + return new JSONResponse([]); + } + } + + return new JSONResponse(['message' => $this->l->t('Invalid request')], Http::STATUS_BAD_REQUEST); + } +} diff --git a/tests/Settings/Controller/PersonalControllerTest.php b/tests/Settings/Controller/PersonalControllerTest.php new file mode 100644 index 00000000000..a1b727629bf --- /dev/null +++ b/tests/Settings/Controller/PersonalControllerTest.php @@ -0,0 +1,122 @@ + + * + * @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 Test\Settings\Controller; + +use OC\Settings\Controller\PersonalController; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\JSONResponse; +use OCP\IConfig; +use OCP\IL10N; +use OCP\IRequest; +use OCP\L10N\IFactory; + +class PersonalControllerTest extends \Test\TestCase { + + /** @var IFactory|\PHPUnit_Framework_MockObject_MockObject */ + private $l10nFactory; + /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */ + private $config; + /** @var PersonalController */ + private $controller; + /** @var IL10N */ + private $l; + + public function setUp() { + parent::setUp(); + + $this->l10nFactory = $this->createMock(IFactory::class); + $this->config = $this->createMock(IConfig::class); + $this->l = $this->createMock(IL10N::class); + + $this->l->method('t') + ->will($this->returnCallback(function ($text, $parameters = []) { + return vsprintf($text, $parameters); + })); + + $this->controller = new PersonalController( + 'settings', + $this->createMock(IRequest::class), + $this->l10nFactory, + 'user', + $this->config, + $this->l + ); + } + + public function testSetLanguage() { + $this->l10nFactory->method('findAvailableLanguages') + ->willReturn(['aa', 'bb', 'cc']); + $this->config->expects($this->once()) + ->method('setUserValue') + ->with( + $this->equalTo('user'), + $this->equalTo('core'), + $this->equalTo('lang'), + $this->equalTo('bb') + ); + + $resp = $this->controller->setLanguage('bb'); + $expected = new JSONResponse([]); + $this->assertEquals($expected, $resp); + } + + public function testSetLanguageEn() { + $this->l10nFactory->method('findAvailableLanguages') + ->willReturn(['aa', 'bb', 'cc']); + $this->config->expects($this->once()) + ->method('setUserValue') + ->with( + $this->equalTo('user'), + $this->equalTo('core'), + $this->equalTo('lang'), + $this->equalTo('en') + ); + + $resp = $this->controller->setLanguage('en'); + $expected = new JSONResponse([]); + $this->assertEquals($expected, $resp); + } + + public function testSetLanguageFails() { + $this->l10nFactory->method('findAvailableLanguages') + ->willReturn(['aa', 'bb', 'cc']); + $this->config->expects($this->never()) + ->method('setUserValue'); + + $resp = $this->controller->setLanguage('dd'); + $expected = new JSONResponse(['message' => 'Invalid request'], Http::STATUS_BAD_REQUEST); + $this->assertEquals($expected, $resp); + } + + + public function testSetLanguageEmpty() { + $this->l10nFactory->method('findAvailableLanguages') + ->willReturn(['aa', 'bb', 'cc']); + $this->config->expects($this->never()) + ->method('setUserValue'); + + $resp = $this->controller->setLanguage(''); + $expected = new JSONResponse(['message' => 'Invalid request'], Http::STATUS_BAD_REQUEST); + $this->assertEquals($expected, $resp); + } +}