feat: define board detail domain and mutation contracts

This commit is contained in:
2026-03-16 00:08:03 -04:00
parent c820b413aa
commit 3af47ba55a
3 changed files with 98 additions and 0 deletions

View File

@@ -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.

View File

@@ -0,0 +1,38 @@
package space.hackenslacker.kanbn4droid.app.boarddetail
data class BoardDetail(
val id: String,
val title: String,
val lists: List<BoardListDetail>,
)
data class BoardListDetail(
val id: String,
val title: String,
val cards: List<BoardCardSummary>,
)
data class BoardCardSummary(
val id: String,
val title: String,
val tags: List<BoardTagSummary>,
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<String>,
val message: String,
) : CardBatchMutationResult
data class Failure(
val message: String,
) : CardBatchMutationResult
}

View File

@@ -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)
}
}