✨feature: Initial MVP
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
<?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']);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user