From 3af47ba55a1418e86d124b0cb2ed70412e3fe8fb Mon Sep 17 00:00:00 2001 From: Wally Hackenslacker Date: Mon, 16 Mar 2026 00:08:03 -0400 Subject: [PATCH] feat: define board detail domain and mutation contracts --- AGENTS.md | 2 + .../app/boarddetail/BoardDetailModels.kt | 38 ++++++++++++ .../app/boarddetail/BoardDetailModelsTest.kt | 58 +++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 app/src/main/java/space/hackenslacker/kanbn4droid/app/boarddetail/BoardDetailModels.kt create mode 100644 app/src/test/java/space/hackenslacker/kanbn4droid/app/boarddetail/BoardDetailModelsTest.kt diff --git a/AGENTS.md b/AGENTS.md index 604415f..5f91e34 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -76,6 +76,8 @@ Kanbn4Droid is an unofficial app to connect to and manipulate data stored in sel **Board detail view** +- Current status: domain model and mutation contracts are defined in `app/src/main/java/space/hackenslacker/kanbn4droid/app/boarddetail/BoardDetailModels.kt`, with unit coverage in `app/src/test/java/space/hackenslacker/kanbn4droid/app/boarddetail/BoardDetailModelsTest.kt`. + - The board detail view shows the lists in the board as vertical lists. - Each list has it's title at the top. - Clicking on the title of a list allows editing the title. diff --git a/app/src/main/java/space/hackenslacker/kanbn4droid/app/boarddetail/BoardDetailModels.kt b/app/src/main/java/space/hackenslacker/kanbn4droid/app/boarddetail/BoardDetailModels.kt new file mode 100644 index 0000000..217cd7a --- /dev/null +++ b/app/src/main/java/space/hackenslacker/kanbn4droid/app/boarddetail/BoardDetailModels.kt @@ -0,0 +1,38 @@ +package space.hackenslacker.kanbn4droid.app.boarddetail + +data class BoardDetail( + val id: String, + val title: String, + val lists: List, +) + +data class BoardListDetail( + val id: String, + val title: String, + val cards: List, +) + +data class BoardCardSummary( + val id: String, + val title: String, + val tags: List, + val dueAtEpochMillis: Long?, +) + +data class BoardTagSummary( + val id: String, + val name: String, + val colorHex: String, +) + +sealed interface CardBatchMutationResult { + data object Success : CardBatchMutationResult + data class PartialSuccess( + val failedCardIds: Set, + val message: String, + ) : CardBatchMutationResult + + data class Failure( + val message: String, + ) : CardBatchMutationResult +} diff --git a/app/src/test/java/space/hackenslacker/kanbn4droid/app/boarddetail/BoardDetailModelsTest.kt b/app/src/test/java/space/hackenslacker/kanbn4droid/app/boarddetail/BoardDetailModelsTest.kt new file mode 100644 index 0000000..b7353e1 --- /dev/null +++ b/app/src/test/java/space/hackenslacker/kanbn4droid/app/boarddetail/BoardDetailModelsTest.kt @@ -0,0 +1,58 @@ +package space.hackenslacker.kanbn4droid.app.boarddetail + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Test + +class BoardDetailModelsTest { + + @Test + fun boardDetailModelsExposeRequiredFields() { + val tag = BoardTagSummary( + id = "tag-1", + name = "Urgent", + colorHex = "#FF0000", + ) + val card = BoardCardSummary( + id = "card-1", + title = "Fix sync bug", + tags = listOf(tag), + dueAtEpochMillis = null, + ) + val list = BoardListDetail( + id = "list-1", + title = "To Do", + cards = listOf(card), + ) + val detail = BoardDetail( + id = "board-1", + title = "Sprint", + lists = listOf(list), + ) + + assertEquals("tag-1", tag.id) + assertEquals("Urgent", tag.name) + assertEquals("#FF0000", tag.colorHex) + assertEquals("card-1", card.id) + assertEquals("Fix sync bug", card.title) + assertEquals(listOf(tag), card.tags) + assertNull(card.dueAtEpochMillis) + assertEquals("list-1", list.id) + assertEquals("To Do", list.title) + assertEquals(listOf(card), list.cards) + assertEquals("board-1", detail.id) + assertEquals("Sprint", detail.title) + assertEquals(listOf(list), detail.lists) + } + + @Test + fun partialSuccessCarriesFailedCardIds() { + val result = CardBatchMutationResult.PartialSuccess( + failedCardIds = setOf("card-2", "card-9"), + message = "Some cards could not be updated.", + ) + + assertEquals(setOf("card-2", "card-9"), result.failedCardIds) + assertEquals("Some cards could not be updated.", result.message) + } +}