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