diff --git a/l10n/en_GB.js b/l10n/en_GB.js index 8266fb71c..a9c375117 100644 --- a/l10n/en_GB.js +++ b/l10n/en_GB.js @@ -74,6 +74,6 @@ OC.L10N.register( "Shared boards" : "Shared boards", "View more" : "View more", "Move board to archive" : "Move board to archive", - "Create a new board" : "Create a new board" + "Create a new board" : "Create a new board" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/en_GB.json b/l10n/en_GB.json index c394f0559..4366eef90 100644 --- a/l10n/en_GB.json +++ b/l10n/en_GB.json @@ -72,6 +72,6 @@ "Shared boards" : "Shared boards", "View more" : "View more", "Move board to archive" : "Move board to archive", - "Create a new board" : "Create a new board" + "Create a new board" : "Create a new board" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/lib/Controller/PageController.php b/lib/Controller/PageController.php index b8a8449ae..e457c154f 100644 --- a/lib/Controller/PageController.php +++ b/lib/Controller/PageController.php @@ -23,17 +23,30 @@ namespace OCA\Deck\Controller; +use OCA\Deck\Service\DefaultBoardService; use OCP\IRequest; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Controller; +use OCP\IL10N; class PageController extends Controller { + private $defaultBoardService; private $userId; + private $l10n; - public function __construct($AppName, IRequest $request, $userId) { + public function __construct( + $AppName, + IRequest $request, + DefaultBoardService $defaultBoardService, + IL10N $l10n, + $userId + ) { parent::__construct($AppName, $request); + $this->userId = $userId; + $this->defaultBoardService = $defaultBoardService; + $this->l10n = $l10n; } /** @@ -48,6 +61,11 @@ public function index() { 'user' => $this->userId, 'maxUploadSize' => (int)\OCP\Util::uploadLimit(), ]; + + if ($this->defaultBoardService->checkFirstRun($this->userId, $this->appName)) { + $this->defaultBoardService->createDefaultBoard($this->l10n->t('Personal'), $this->userId, '000000'); + } + return new TemplateResponse('deck', 'main', $params); } diff --git a/lib/Service/DefaultBoardService.php b/lib/Service/DefaultBoardService.php new file mode 100644 index 000000000..f79b8d24e --- /dev/null +++ b/lib/Service/DefaultBoardService.php @@ -0,0 +1,88 @@ + + * + * @author Ryan Fletcher + * + * @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\Deck\Service; + +use OCA\Deck\Db\BoardMapper; +use OCA\Deck\Service\BoardService; +use OCA\Deck\Service\StackService; +use OCA\Deck\Service\CardService; +use OCP\IConfig; +use OCP\IL10N; + +class DefaultBoardService { + + private $boardMapper; + private $boardService; + private $stackService; + private $cardService; + private $config; + private $l10n; + + public function __construct( + IL10N $l10n, + BoardMapper $boardMapper, + BoardService $boardService, + StackService $stackService, + CardService $cardService, + IConfig $config + ) { + + $this->boardService = $boardService; + $this->stackService = $stackService; + $this->cardService = $cardService; + $this->config = $config; + $this->boardMapper = $boardMapper; + $this->l10n = $l10n; + } + + public function checkFirstRun($userId, $appName) { + $firstRun = $this->config->getUserValue($userId, $appName, 'firstRun', 'yes'); + $userBoards = $this->boardMapper->findAllByUser($userId); + + if ($firstRun === 'yes' && count($userBoards) === 0) { + $this->config->setUserValue($userId, $appName, 'firstRun', 'no'); + return true; + } + + return false; + } + + public function createDefaultBoard($title, $userId, $color) { + $defaultBoard = $this->boardService->create($title, $userId, $color); + $defaultStacks = []; + $defaultCards = []; + + $boardId = $defaultBoard->getId(); + + $defaultStacks[] = $this->stackService->create($this->l10n->t('To do'), $boardId, 1); + $defaultStacks[] = $this->stackService->create($this->l10n->t('Doing'), $boardId, 1); + $defaultStacks[] = $this->stackService->create($this->l10n->t('Done'), $boardId, 1); + + $defaultCards[] = $this->cardService->create($this->l10n->t('Example Task 3'), $defaultStacks[0]->getId(), 'text', 0, $userId); + $defaultCards[] = $this->cardService->create($this->l10n->t('Example Task 2'), $defaultStacks[1]->getId(), 'text', 0, $userId); + $defaultCards[] = $this->cardService->create($this->l10n->t('Example Task 1'), $defaultStacks[2]->getId(), 'text', 0, $userId); + + return $defaultBoard; + } +} \ No newline at end of file diff --git a/tests/unit/Service/DefaultBoardServiceTest.php b/tests/unit/Service/DefaultBoardServiceTest.php new file mode 100644 index 000000000..ecabdfb61 --- /dev/null +++ b/tests/unit/Service/DefaultBoardServiceTest.php @@ -0,0 +1,195 @@ + + * + * @author Ryan Fletcher + * + * @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\Deck\Service; + +use OCA\Deck\Db\Card; +use OCA\Deck\Db\Board; +use OCA\Deck\Db\Stack; +use OCA\Deck\Db\BoardMapper; +use OCA\Deck\Service\DefaultBoardService; +use OCA\Deck\Service\BoardService; +use OCA\Deck\Service\StackService; +use OCA\Deck\Service\CardService; +use OCP\IConfig; +use OCP\IL10N; +use \Test\TestCase; + +class DefaultBoardServiceTest extends TestCase { + + /** @var DefaultBoardService */ + private $service; + + /** @var BoardService */ + private $boardService; + + /** @var StackService */ + private $stackService; + + /** @var CardService */ + private $cardService; + + /** @var BoardMapper */ + private $boardMapper; + + /** @var IConfig */ + private $config; + + private $l10n; + + private $userId = 'admin'; + + public function setUp() { + parent::setUp(); + $this->boardMapper = $this->createMock(BoardMapper::class); + $this->boardService = $this->createMock(BoardService::class); + $this->stackService = $this->createMock(StackService::class); + $this->cardService = $this->createMock(CardService::class); + $this->config = $this->createMock(IConfig::class); + $this->l10n = $this->createMock(IL10N::class); + + $this->service = new DefaultBoardService( + $this->l10n, + $this->boardMapper, + $this->boardService, + $this->stackService, + $this->cardService, + $this->config + ); + } + + public function testCheckFirstRunCaseTrue() { + $appName = 'deck'; + $userBoards = []; + + $this->config->expects($this->once()) + ->method('getUserValue') + ->willReturn('yes'); + + $this->boardMapper->expects($this->once()) + ->method('findAllByUser') + ->willReturn($userBoards); + + $this->config->expects($this->once()) + ->method('setUserValue'); + + $result = $this->service->checkFirstRun($this->userId, $appName); + $this->assertEquals($result, true); + } + + public function testCheckFirstRunCaseFalse() { + $appName = 'deck'; + $board = new Board(); + $board->setTitle('Personal'); + $board->setOwner($this->userId); + $board->setColor('000000'); + + $userBoards = [$board]; + + $this->config->expects($this->once()) + ->method('getUserValue') + ->willReturn('no'); + + $this->boardMapper->expects($this->once()) + ->method('findAllByUser') + ->willReturn($userBoards); + + $result = $this->service->checkFirstRun($this->userId, $appName); + $this->assertEquals($result, false); + } + + public function testCreateDefaultBoard() { + $title = 'Personal'; + $color = '000000'; + $boardId = 5; + + $board = new Board(); + $board->setId($boardId); + $board->setTitle($title); + $board->setOwner($this->userId); + $board->setColor($color); + $this->boardService->expects($this->once()) + ->method('create') + ->willReturn($board); + + $this->l10n->expects($this->any()) + ->method('t') + ->willReturnCallback(function($text) { return $text; }); + + $stackToDoId = '123'; + $stackToDo = $this->assembleTestStack('To do', $stackToDoId, $boardId); + + $stackDoingId = '124'; + $stackDoing = $this->assembleTestStack('Doing', $stackDoingId, $boardId); + + $stackDoneId = '125'; + $stackDone = $this->assembleTestStack('Done', $stackDoneId, $boardId); + $this->stackService->expects($this->exactly(3)) + ->method('create') + ->withConsecutive( + [$this->l10n->t('To do'), $boardId, 1], + [$this->l10n->t('Doing'), $boardId, 1], + [$this->l10n->t('Done'), $boardId, 1] + ) + ->willReturnOnConsecutiveCalls($stackToDo, $stackDoing, $stackDone); + + $cardExampleTask3 = $this->assembleTestCard('Example Task 3', $stackToDoId, $this->userId); + $cardExampleTask2 = $this->assembleTestCard('Example Task 2', $stackDoingId, $this->userId); + $cardExampleTask1 = $this->assembleTestCard('Example Task 1', $stackDoneId, $this->userId); + $this->cardService->expects($this->exactly(3)) + ->method('create') + ->withConsecutive( + ['Example Task 3', $stackToDoId, 'text', 0, $this->userId], + ['Example Task 2', $stackDoingId, 'text', 0, $this->userId], + ['Example Task 1', $stackDoneId, 'text', 0, $this->userId] + ) + ->willReturnonConsecutiveCalls($cardExampleTask3, $cardExampleTask2, $cardExampleTask1); + + $result = $this->service->createDefaultBoard($title, $this->userId, $color); + + $this->assertEquals($result->getTitle(), $title); + $this->assertEquals($result->getOwner(), $this->userId); + $this->assertEquals($result->getColor(), $color); + } + + private function assembleTestStack($title, $id, $boardId) { + $stack = new Stack(); + $stack->setId($id); + $stack->setTitle($title); + $stack->setBoardId($boardId); + $stack->setOrder(1); + + return $stack; + } + + private function assembleTestCard($title, $stackId, $userId) { + $card = new Card(); + $card->setTitle($title); + $card->setStackId($stackId); + $card->setType('text'); + $card->setOrder(0); + $card->setOwner($userId); + + return $card; + } +} \ No newline at end of file diff --git a/tests/unit/controller/PageControllerTest.php b/tests/unit/controller/PageControllerTest.php index ff0d444e3..f4aa70e08 100644 --- a/tests/unit/controller/PageControllerTest.php +++ b/tests/unit/controller/PageControllerTest.php @@ -3,6 +3,7 @@ * @copyright Copyright (c) 2016 Julius Härtl * * @author Julius Härtl + * @author Ryan Fletcher * * @license GNU AGPL version 3 or any later version * @@ -24,6 +25,9 @@ namespace OCA\Deck\Controller; use PHPUnit_Framework_TestCase; +use OCA\Deck\Service\DefaultBoardService; +use OCA\Deck\Db\Board; +use OCP\IConfig; class PageControllerTest extends \Test\TestCase { @@ -31,6 +35,8 @@ class PageControllerTest extends \Test\TestCase { private $request; private $l10n; private $userId = 'john'; + private $defaultBoardService; + private $config; public function setUp() { $this->l10n = $this->request = $this->getMockBuilder( @@ -42,16 +48,43 @@ public function setUp() { ->disableOriginalConstructor() ->getMock(); + $this->defaultBoardService = $this->createMock(DefaultBoardService::class); + $this->config = $this->createMock(IConfig::class); + $this->controller = new PageController( - 'deck', $this->request, $this->l10n, $this->userId + 'deck', $this->request, $this->defaultBoardService, $this->l10n, $this->userId ); } + + public function testIndexOnFirstRun() { + + $board = new Board(); + $board->setTitle('Personal'); + $board->setOwner($this->userId); + $board->setColor('000000'); + + $this->defaultBoardService->expects($this->once()) + ->method('checkFirstRun') + ->willReturn(true); + $this->defaultBoardService->expects($this->once()) + ->method('createDefaultBoard') + ->willReturn($board); - public function testIndex() { $response = $this->controller->index(); - $this->assertEquals('main', $response->getTemplateName()); + $this->assertEquals('main', $response->getTemplateName()); } + public function testIndexOnSecondRun() { + + $this->config->setUserValue($this->userId, 'deck', 'firstRun', 'no'); + + $this->defaultBoardService->expects($this->once()) + ->method('checkFirstRun') + ->willReturn(false); + + $response = $this->controller->index(); + $this->assertEquals('main', $response->getTemplateName()); + } } \ No newline at end of file