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