Files
IronKanban/tests/Service/BoardServiceTest.php
T
Keith Solomon 812e5c2f2a feature: Initial MVP
2026-04-05 16:20:39 -05:00

108 lines
3.4 KiB
PHP

<?php
// phpcs:disable PEAR.Commenting.FileComment,PEAR.Commenting.ClassComment
/**
* Board service integration tests.
*/
declare(strict_types=1);
namespace Tests\Service;
use IronKanban\Service\BoardService;
use Tests\Support\IntegrationTestCase;
/**
* Covers core board and task workflows against markdown storage.
*/
final class BoardServiceTest extends IntegrationTestCase
{
/**
* Ensure a new project gets the default kanban columns.
*
* @return void
*/
public function testGetBoardStateBuildsDefaultColumnsForNewProject(): void
{
$projectId = $this->createProject();
$service = new BoardService();
$state = $service->getBoardState($projectId);
self::assertSame(
['backlog', 'ready', 'in-progress', 'review', 'done', 'trash'],
array_column($state['columns'], 'id')
);
self::assertSame([], $state['tasks']);
self::assertSame([], $state['notes']);
self::assertSame('Demo Project', $state['project']['title']);
}
/**
* Ensure a created task is persisted and returned in board state.
*
* @return void
*/
public function testCreateTaskPersistsTaskInRequestedColumn(): void
{
$projectId = $this->createProject();
$service = new BoardService();
$state = $service->createTask($projectId, 'Ship first milestone', 'ready', 'Write release notes');
self::assertSame('Ship first milestone', $state['task']['title']);
self::assertSame('ready', $state['task']['column']);
self::assertSame('Write release notes', $state['task']['body']);
self::assertCount(1, $state['tasks']);
self::assertSame($state['task']['id'], $state['tasks'][0]['id']);
self::assertNotSame('0', $state['revision']);
}
/**
* Ensure deleting a task without force moves it into trash.
*
* @return void
*/
public function testDeleteTaskMovesTaskToTrashByDefault(): void
{
$projectId = $this->createProject();
$service = new BoardService();
$created = $service->createTask($projectId, 'Clean up copy', 'in-progress');
$state = $service->deleteTask($projectId, $created['task']['id']);
self::assertCount(1, $state['tasks']);
self::assertSame('trash', $state['tasks'][0]['column']);
self::assertSame($created['task']['id'], $state['tasks'][0]['id']);
}
/**
* Ensure removing a column moves its tasks into trash and keeps trash available.
*
* @return void
*/
public function testUpdateBoardMovesDeletedColumnTasksIntoTrash(): void
{
$projectId = $this->createProject();
$service = new BoardService();
$service->createTask($projectId, 'Review architecture', 'review');
$state = $service->updateBoard(
$projectId,
[
['id' => 'backlog', 'label' => 'Backlog'],
['id' => 'ready', 'label' => 'Ready'],
['id' => 'in-progress', 'label' => 'In Progress'],
['id' => 'done', 'label' => 'Done'],
['id' => 'trash', 'label' => 'Trash'],
],
'review'
);
self::assertContains('trash', array_column($state['columns'], 'id'));
self::assertCount(1, $state['tasks']);
self::assertSame('trash', $state['tasks'][0]['column']);
}
}