From de59a1d0e73d667fe726d0acb4f568b3ed3d61fd Mon Sep 17 00:00:00 2001 From: Wally Hackenslacker Date: Thu, 30 Apr 2026 15:04:52 -0400 Subject: [PATCH] fix: filter template boards by type in board list parsing --- .../kanbn4droid/app/auth/KanbnApiClient.kt | 6 +- .../app/boards/BoardsRepository.kt | 21 +------ .../HttpKanbnApiClientBoardsParsingTest.kt | 3 +- .../app/boards/BoardsRepositoryTest.kt | 63 +------------------ 4 files changed, 4 insertions(+), 89 deletions(-) diff --git a/app/src/main/java/space/hackenslacker/kanbn4droid/app/auth/KanbnApiClient.kt b/app/src/main/java/space/hackenslacker/kanbn4droid/app/auth/KanbnApiClient.kt index cb5fe5b..4bd65fd 100644 --- a/app/src/main/java/space/hackenslacker/kanbn4droid/app/auth/KanbnApiClient.kt +++ b/app/src/main/java/space/hackenslacker/kanbn4droid/app/auth/KanbnApiClient.kt @@ -996,15 +996,11 @@ class HttpKanbnApiClient : KanbnApiClient { private fun isTemplateBoard(item: JSONObject): Boolean { val typeKeys = listOf("type", "boardType", "kind") - val hasTemplateType = typeKeys.any { key -> + return typeKeys.any { key -> item.optString(key) .trim() .equals("template", ignoreCase = true) } - if (hasTemplateType) { - return true - } - return item.optBoolean("isTemplate", false) } private fun parseSingleBoard(body: String, fallbackName: String): BoardSummary { diff --git a/app/src/main/java/space/hackenslacker/kanbn4droid/app/boards/BoardsRepository.kt b/app/src/main/java/space/hackenslacker/kanbn4droid/app/boards/BoardsRepository.kt index 47652b3..37bf305 100644 --- a/app/src/main/java/space/hackenslacker/kanbn4droid/app/boards/BoardsRepository.kt +++ b/app/src/main/java/space/hackenslacker/kanbn4droid/app/boards/BoardsRepository.kt @@ -93,30 +93,11 @@ class BoardsRepository( is BoardsApiResult.Success -> sessionResult.value is BoardsApiResult.Failure -> return sessionResult } - val boardsResult = apiClient.listBoards( + return apiClient.listBoards( baseUrl = session.baseUrl, apiKey = session.apiKey, workspaceId = session.workspaceId, ) - if (boardsResult is BoardsApiResult.Failure) { - return boardsResult - } - - val boards = (boardsResult as BoardsApiResult.Success).value - val templatesResult = apiClient.listBoardTemplates( - baseUrl = session.baseUrl, - apiKey = session.apiKey, - workspaceId = session.workspaceId, - ) - - return when (templatesResult) { - is BoardsApiResult.Success -> { - val templateIds = templatesResult.value.map { it.id }.toSet() - BoardsApiResult.Success(boards.filterNot { it.id in templateIds }) - } - - is BoardsApiResult.Failure -> BoardsApiResult.Success(boards) - } } suspend fun listTemplates(): BoardsApiResult> { diff --git a/app/src/test/java/space/hackenslacker/kanbn4droid/app/auth/HttpKanbnApiClientBoardsParsingTest.kt b/app/src/test/java/space/hackenslacker/kanbn4droid/app/auth/HttpKanbnApiClientBoardsParsingTest.kt index cdd3572..f8c2080 100644 --- a/app/src/test/java/space/hackenslacker/kanbn4droid/app/auth/HttpKanbnApiClientBoardsParsingTest.kt +++ b/app/src/test/java/space/hackenslacker/kanbn4droid/app/auth/HttpKanbnApiClientBoardsParsingTest.kt @@ -32,7 +32,6 @@ class HttpKanbnApiClientBoardsParsingTest { {"id":"board-1","name":"Roadmap"}, {"id":"tmpl-1","name":"Template A","type":"template"}, {"id":"tmpl-2","name":"Template B","kind":"template"}, - {"id":"tmpl-3","name":"Template C","isTemplate":true}, {"id":"tmpl-4","name":"Template D","boardType":" Template "}, {"publicId":"board-2","title":"Backlog"} ] @@ -59,7 +58,7 @@ class HttpKanbnApiClientBoardsParsingTest { "boards": [ {"id":"tmpl-1","name":"Template A","type":"template"}, {"id":"tmpl-2","name":"Template B","kind":"template"}, - {"id":"tmpl-3","name":"Template C","isTemplate":true} + {"id":"tmpl-3","name":"Template C","boardType":"TEMPLATE"} ] } """.trimIndent(), diff --git a/app/src/test/java/space/hackenslacker/kanbn4droid/app/boards/BoardsRepositoryTest.kt b/app/src/test/java/space/hackenslacker/kanbn4droid/app/boards/BoardsRepositoryTest.kt index 87840c5..caeb88f 100644 --- a/app/src/test/java/space/hackenslacker/kanbn4droid/app/boards/BoardsRepositoryTest.kt +++ b/app/src/test/java/space/hackenslacker/kanbn4droid/app/boards/BoardsRepositoryTest.kt @@ -109,65 +109,6 @@ class BoardsRepositoryTest { assertEquals("No workspaces available for this account.", (result as BoardsApiResult.Failure).message) } - @Test - fun listBoardsExcludesBoardsWhoseIdsMatchTemplates() = runTest { - val fakeApi = FakeBoardsApiClient().apply { - workspacesResult = BoardsApiResult.Success(listOf(WorkspaceSummary("ws-1", "Main"))) - listBoardsResult = BoardsApiResult.Success( - listOf( - BoardSummary("board-1", "Juegos"), - BoardSummary("tpl-1", "GTD Simplificado"), - BoardSummary("tpl-2", "Kanban"), - BoardSummary("board-2", "Task Tension"), - ), - ) - listTemplatesResult = BoardsApiResult.Success( - listOf( - BoardTemplate("tpl-1", "GTD Simplificado"), - BoardTemplate("tpl-2", "Kanban"), - ), - ) - } - - val repository = BoardsRepository( - sessionStore = InMemorySessionStore("https://kan.bn/"), - apiKeyStore = InMemoryApiKeyStore("api"), - apiClient = fakeApi, - ) - - val result = repository.listBoards() - - assertTrue(result is BoardsApiResult.Success) - val boards = (result as BoardsApiResult.Success).value - assertEquals(listOf("board-1", "board-2"), boards.map { it.id }) - } - - @Test - fun listBoardsReturnsApiBoardsWhenTemplateListingFails() = runTest { - val fakeApi = FakeBoardsApiClient().apply { - workspacesResult = BoardsApiResult.Success(listOf(WorkspaceSummary("ws-1", "Main"))) - listBoardsResult = BoardsApiResult.Success( - listOf( - BoardSummary("board-1", "Juegos"), - BoardSummary("tpl-1", "GTD Simplificado"), - ), - ) - listTemplatesResult = BoardsApiResult.Failure("Template endpoint unavailable") - } - - val repository = BoardsRepository( - sessionStore = InMemorySessionStore("https://kan.bn/"), - apiKeyStore = InMemoryApiKeyStore("api"), - apiClient = fakeApi, - ) - - val result = repository.listBoards() - - assertTrue(result is BoardsApiResult.Success) - val boards = (result as BoardsApiResult.Success).value - assertEquals(listOf("board-1", "tpl-1"), boards.map { it.id }) - } - @Test fun createBoardTrimsNameAndPassesTemplateId() = runTest { val fakeApi = FakeBoardsApiClient().apply { @@ -248,7 +189,6 @@ class BoardsRepositoryTest { private class FakeBoardsApiClient : KanbnApiClient { var listBoardsResult: BoardsApiResult> = BoardsApiResult.Success(emptyList()) - var listTemplatesResult: BoardsApiResult> = BoardsApiResult.Success(emptyList()) var workspacesResult: BoardsApiResult> = BoardsApiResult.Success(listOf(WorkspaceSummary("ws-1", "Main"))) var createBoardResult: BoardsApiResult = BoardsApiResult.Success(BoardSummary("new", "New")) @@ -285,8 +225,7 @@ class BoardsRepositoryTest { apiKey: String, workspaceId: String, ): BoardsApiResult> { - lastWorkspaceId = workspaceId - return listTemplatesResult + return BoardsApiResult.Success(emptyList()) } override suspend fun createBoard(