OXYGENHUB
# 31e4f3755627 oxygenhub-android / app / src / test / java / io / oxygenhub / android / ui / CodeBrowserTest.kt
3.8 KiB · last changed A code browser: files at any bookmark or tag, highlighted, the README rendered, history and changes (refs #3) 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.ChangeSummary
6
import io.oxygenhub.android.api.History
7
import io.oxygenhub.android.api.TreeEntry
8
import io.oxygenhub.android.ui.code.CodeViewModel
9
import io.oxygenhub.android.ui.code.HistoryViewModel
10
import io.oxygenhub.android.ui.code.languageOf
11
import io.oxygenhub.android.ui.common.Load
12
import dev.snipme.highlights.model.SyntaxLanguage
13
import org.junit.Assert.assertEquals
14
import org.junit.Assert.assertFalse
15
import org.junit.Assert.assertNull
16
import org.junit.Assert.assertTrue
17
import org.junit.Rule
18
import org.junit.Test
19
20
class CodeBrowserTest {
21
    @get:Rule val main = MainDispatcherRule()
22
23
    private val api = FakeHubApi()
24
25
    private fun <T> ready(load: Load<T>): T = (load as Load.Ready).value
26
27
    private val top = listOf(
28
        TreeEntry("src", "src", "dir"),
29
        TreeEntry("README.md", "README.md", "file", size = 12),
30
        TreeEntry("Cargo.toml", "Cargo.toml", "file"),
31
        TreeEntry("assets", "assets", "dir"),
32
    )
33
34
    @Test
35
    fun startsAtTheDefaultBookmarkFoldersFirstWithTheReadme() {
36
        api.repository = api.repository.copy(defaultBookmark = "trunk")
37
        api.tree = { _, path -> if (path.isEmpty()) top else listOf(TreeEntry("main.rs", "src/main.rs")) }
38
        api.files = mapOf("README.md" to "# Demo")
39
        val vm = CodeViewModel(api, "andymccall", "demo")
40
        val dir = ready(vm.state.value)
41
        assertEquals("trunk", vm.ref.value)
42
        assertEquals(listOf("assets", "src", "Cargo.toml", "README.md"), dir.entries.map { it.name })
43
        assertEquals("# Demo", dir.readme?.text)
44
        assertTrue("tree trunk:" in api.calls)
45
46
        vm.open("src")
47
        assertEquals(listOf("main.rs"), ready(vm.state.value).entries.map { it.name })
48
        assertNull("no README here", ready(vm.state.value).readme)
49
        assertTrue(vm.up())
50
        assertEquals("", vm.path.value)
51
        assertFalse("already at the top", vm.up())
52
    }
53
54
    @Test
55
    fun aReadmeThatWillNotLoadIsLeftOut() {
56
        api.tree = { _, _ -> top }
57
        val dir = ready(CodeViewModel(api, "andymccall", "demo", "main").state.value)
58
        assertNull(dir.readme)
59
        assertEquals(4, dir.entries.size)
60
    }
61
62
    @Test
63
    fun anotherBookmarkOrTagIsBrowsedFromItsTop() {
64
        api.tree = { ref, _ -> if (ref == "v1.0") listOf(TreeEntry("OLD", "OLD")) else top }
65
        api.refs = listOf("main", "develop") to listOf("v1.0")
66
        val vm = CodeViewModel(api, "andymccall", "demo", "main")
67
        vm.loadRefs()
68
        assertEquals(listOf("main", "develop") to listOf("v1.0"), ready(vm.refs.value))
69
        vm.setRef("v1.0")
70
        assertEquals(listOf("OLD"), ready(vm.state.value).entries.map { it.name })
71
    }
72
73
    @Test
74
    fun historyComesAPageAtATime() {
75
        val c = { n: Int -> ChangeSummary("%064x".format(n), "change $n\n\nbody") }
76
        api.history = History("main", total = 3, changes = listOf(c(1), c(2)))
77
        val vm = HistoryViewModel(api, "andymccall", "demo", "main", "src/main.rs")
78
        assertEquals(listOf("change 1", "change 2"), ready(vm.state.value).changes.map { it.subject })
79
        assertTrue(ready(vm.state.value).hasMore)
80
        assertTrue("history main:src/main.rs" in api.calls)
81
        api.history = History("main", total = 3, offset = 2, changes = listOf(c(3)))
82
        vm.more()
83
        assertEquals(3, ready(vm.state.value).changes.size)
84
        assertFalse(ready(vm.state.value).hasMore)
85
    }
86
87
    @Test
88
    fun filesAreHighlightedByTheirNames() {
89
        assertEquals(SyntaxLanguage.RUST, languageOf("crates/hub/src/main.rs"))
90
        assertEquals(SyntaxLanguage.KOTLIN, languageOf("app/build.gradle.kts"))
91
        assertEquals(SyntaxLanguage.SHELL, languageOf("Makefile"))
92
        assertEquals(SyntaxLanguage.DEFAULT, languageOf("pipeline.kdl"))
93
    }
94
}