OXYGENHUB
# 26530d9758ee oxygenhub-android / app / src / test / java / io / oxygenhub / android / ui / IssueViewModelTest.kt
3.6 KiB · last changed Issues on the phone: read, comment, close and reopen, labels, and new issues (refs #4) 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.Comment
6
import io.oxygenhub.android.api.HubException
7
import io.oxygenhub.android.api.Issue
8
import io.oxygenhub.android.ui.common.Load
9
import io.oxygenhub.android.ui.issues.IssueViewModel
10
import io.oxygenhub.android.ui.issues.NewIssueViewModel
11
import org.junit.Assert.assertEquals
12
import org.junit.Assert.assertFalse
13
import org.junit.Assert.assertNull
14
import org.junit.Assert.assertTrue
15
import org.junit.Rule
16
import org.junit.Test
17
18
class IssueViewModelTest {
19
    @get:Rule val main = MainDispatcherRule()
20
21
    private val api = FakeHubApi().apply {
22
        issueStore[7] = Issue(7, "Crash on start", "It **crashes**.", author = "bob", comments = 1)
23
        commentStore[7] = mutableListOf(Comment(1, "bob", "Still happens"))
24
    }
25
26
    private fun thread(vm: IssueViewModel) = (vm.state.value as Load.Ready).value
27
28
    @Test
29
    fun showsTheIssueAndItsComments() {
30
        val vm = IssueViewModel(api, "andymccall", "demo", 7)
31
        assertEquals("Crash on start", thread(vm).issue.title)
32
        assertEquals(listOf("Still happens"), thread(vm).comments.map { it.body })
33
    }
34
35
    @Test
36
    fun aCommentJoinsTheThreadAndTheBoxEmpties() {
37
        val vm = IssueViewModel(api, "andymccall", "demo", 7)
38
        var done: Boolean? = null
39
        vm.comment("  Fixed in 4f07c5a0  ") { done = it }
40
        assertEquals(true, done)
41
        assertEquals(listOf("Still happens", "Fixed in 4f07c5a0"), thread(vm).comments.map { it.body })
42
        assertEquals(2, thread(vm).issue.comments)
43
        assertFalse(vm.working.value)
44
    }
45
46
    @Test
47
    fun closingAndReopeningChangeItsState() {
48
        val vm = IssueViewModel(api, "andymccall", "demo", 7)
49
        vm.close("not_planned")
50
        assertFalse(thread(vm).issue.isOpen)
51
        assertEquals("not_planned", thread(vm).issue.reason)
52
        assertTrue("state 7 closed:not_planned" in api.calls)
53
        vm.reopen()
54
        assertTrue(thread(vm).issue.isOpen)
55
    }
56
57
    @Test
58
    fun labelsAreSetAsAWholeSet() {
59
        val vm = IssueViewModel(api, "andymccall", "demo", 7)
60
        vm.loadLabels()
61
        assertEquals(listOf("bug", "ui"), (vm.labels.value as Load.Ready).value.map { it.name })
62
        vm.setLabels(listOf("bug"))
63
        assertEquals(listOf("bug"), thread(vm).issue.labels.map { it.name })
64
    }
65
66
    @Test
67
    fun whatTheHubRefusesIsSaidAndThePageStays() {
68
        val vm = IssueViewModel(api, "andymccall", "demo", 7)
69
        api.commentStore.clear()
70
        val failing = object : io.oxygenhub.android.api.HubApi by api {
71
            override suspend fun comment(owner: String, name: String, number: Long, body: String): Comment =
72
                throw HubException.Http(403, "the issue is locked")
73
        }
74
        val locked = IssueViewModel(failing, "andymccall", "demo", 7)
75
        var done: Boolean? = null
76
        locked.comment("hello") { done = it }
77
        assertEquals(false, done)
78
        assertTrue(locked.error.value!!.contains("locked"))
79
        assertEquals("Crash on start", thread(locked).issue.title)
80
        locked.dismissError()
81
        assertNull(locked.error.value)
82
        assertEquals("Crash on start", thread(vm).issue.title)
83
    }
84
85
    @Test
86
    fun aNewIssueOpensWithItsTitle() {
87
        val vm = NewIssueViewModel(api, "andymccall", "demo")
88
        var opened: Issue? = null
89
        vm.open("  ", "body") { opened = it }
90
        assertNull("no title, nothing opened", opened)
91
        vm.open(" Board grows ", "Done keeps growing") { opened = it }
92
        assertEquals("Board grows", opened?.title)
93
        assertEquals(8L, opened?.number)
94
    }
95
}