OXYGENHUB
# 263c6cad5e51 oxygenhub-android / app / src / test / java / io / oxygenhub / android / ui / ProjectsViewModelTest.kt
3.4 KiB · last changed Project boards on the phone: every board you can see, columns to swipe, cards that open and move 10 days ago source blame history raw
1
package io.oxygenhub.android.ui
2
3
import io.oxygenhub.android.FakeHubApi
4
import io.oxygenhub.android.MainDispatcherRule
5
import io.oxygenhub.android.api.Board
6
import io.oxygenhub.android.api.HubApi
7
import io.oxygenhub.android.api.HubException
8
import io.oxygenhub.android.api.Project
9
import io.oxygenhub.android.api.ProjectCard
10
import io.oxygenhub.android.api.ProjectColumn
11
import io.oxygenhub.android.api.Repository
12
import io.oxygenhub.android.ui.common.Load
13
import io.oxygenhub.android.ui.projects.BoardViewModel
14
import io.oxygenhub.android.ui.projects.ProjectsViewModel
15
import org.junit.Assert.assertEquals
16
import org.junit.Assert.assertNull
17
import org.junit.Assert.assertTrue
18
import org.junit.Rule
19
import org.junit.Test
20
21
class ProjectsViewModelTest {
22
    @get:Rule val main = MainDispatcherRule()
23
24
    private val api = FakeHubApi()
25
26
    @Test
27
    fun boardsOfTheAccountAndItsRepositoriesOwnersOpenFirst() {
28
        api.repositories = { listOf(Repository("andymccall", "oxygen"), Repository("doomsdayone", "tetris")) }
29
        api.projectsOf = { owner ->
30
            when (owner) {
31
                "andymccall" -> listOf(Project("andymccall", 3, "OxygenHub", updatedMs = 10), Project("andymccall", 1, "Old", closed = true, updatedMs = 99))
32
                "doomsdayone" -> listOf(Project("doomsdayone", 4, "Super Mario Land 2", updatedMs = 20))
33
                else -> throw HubException.Http(404, "no such owner")
34
            }
35
        }
36
        val vm = ProjectsViewModel(api, "andymccall")
37
        val projects = (vm.state.value as Load.Ready).value
38
        assertEquals(listOf("Super Mario Land 2", "OxygenHub", "Old"), projects.map { it.title })
39
        assertTrue("projects doomsdayone" in api.calls)
40
    }
41
42
    @Test
43
    fun anOwnerWhoseBoardsWillNotLoadIsLeftOut() {
44
        api.repositories = { listOf(Repository("gone", "x")) }
45
        api.projectsOf = { owner -> if (owner == "gone") throw HubException.Http(500, "down") else listOf(Project(owner, 1, "Mine")) }
46
        val projects = (ProjectsViewModel(api, "andymccall").state.value as Load.Ready).value
47
        assertEquals(listOf("Mine"), projects.map { it.title })
48
    }
49
50
    private val board = Board(
51
        Project("andymccall", 3, "OxygenHub"),
52
        listOf(
53
            ProjectColumn(1, "Doing", listOf(ProjectCard(10, "issue", "andymccall/oxygenhub#315", "Form lines up", "open"))),
54
            ProjectColumn(2, "Done", emptyList()),
55
        ),
56
    )
57
58
    @Test
59
    fun aCardMovesToAnotherColumn() {
60
        api.boards[3] = board
61
        val vm = BoardViewModel(api, "andymccall", 3)
62
        vm.move(10, "Done")
63
        val b = (vm.state.value as Load.Ready).value
64
        assertEquals(listOf(0, 1), b.columns.map { it.cards.size })
65
        assertTrue("move 10 Done" in api.calls)
66
        assertEquals(Triple("andymccall", "oxygenhub", 315L), b.columns[1].cards[0].target)
67
    }
68
69
    @Test
70
    fun aMoveTheHubRefusesIsPutBack() {
71
        api.boards[3] = board
72
        val refusing = object : HubApi by api {
73
            override suspend fun moveCard(owner: String, number: Long, card: Long, column: String) = throw HubException.Http(403, "needs write access")
74
        }
75
        val vm = BoardViewModel(refusing, "andymccall", 3)
76
        vm.move(10, "Done")
77
        assertEquals(listOf(1, 0), (vm.state.value as Load.Ready).value.columns.map { it.cards.size })
78
        assertTrue(vm.error.value!!.contains("write access"))
79
        vm.dismissError()
80
        assertNull(vm.error.value)
81
    }
82
}