1package com.parseable.android
3import com.parseable.android.data.model.Alert
4import com.parseable.android.data.model.ApiResult
5import com.parseable.android.data.repository.ParseableRepository
6import com.parseable.android.ui.screens.alerts.AlertsViewModel
8import kotlinx.coroutines.Dispatchers
9import kotlinx.coroutines.ExperimentalCoroutinesApi
10import kotlinx.coroutines.test.*
12import org.junit.Assert.*
13import org.junit.Before
16@OptIn(ExperimentalCoroutinesApi::class)
17class AlertsViewModelTest {
19 private lateinit var repository: ParseableRepository
20 private lateinit var viewModel: AlertsViewModel
21 private val testDispatcher = UnconfinedTestDispatcher()
25 Dispatchers.setMain(testDispatcher)
26 repository = mockk(relaxed = true)
27 viewModel = AlertsViewModel(repository)
32 Dispatchers.resetMain()
36 fun `initial state has empty alerts and no loading`() {
37 val state = viewModel.state.value
38 assertTrue(state.alerts.isEmpty())
39 assertFalse(state.isLoading)
40 assertNull(state.error)
41 assertNull(state.alertToDelete)
45 fun `refresh loads alerts on success`() = runTest {
47 Alert(id = "1", title = "Alert 1", datasets = listOf("stream1"), state = "NotTriggered"),
48 Alert(id = "2", title = "Alert 2", datasets = listOf("stream2"), state = "Triggered"),
50 coEvery { repository.listAlerts() } returns ApiResult.Success(alerts)
54 val state = viewModel.state.value
55 assertEquals(alerts, state.alerts)
56 assertFalse(state.isLoading)
57 assertNull(state.error)
61 fun `refresh shows error on failure`() = runTest {
62 coEvery { repository.listAlerts() } returns ApiResult.Error("Server error", 500)
66 val state = viewModel.state.value
67 assertTrue(state.alerts.isEmpty())
68 assertFalse(state.isLoading)
69 assertNotNull(state.error)
73 fun `requestDelete sets alertToDelete`() {
74 val alert = Alert(id = "1", title = "Alert 1", datasets = listOf("stream1"))
76 viewModel.requestDelete(alert)
78 val state = viewModel.state.value
79 assertEquals(alert, state.alertToDelete)
83 fun `cancelDelete clears alertToDelete`() {
84 val alert = Alert(id = "1", title = "Alert 1", datasets = listOf("stream1"))
85 viewModel.requestDelete(alert)
86 assertEquals(alert, viewModel.state.value.alertToDelete)
88 viewModel.cancelDelete()
90 assertNull(viewModel.state.value.alertToDelete)
94 fun `deleteAlert on success refreshes list`() = runTest {
96 Alert(id = "2", title = "Alert 2", datasets = listOf("stream2")),
98 coEvery { repository.deleteAlert("1") } returns ApiResult.Success("deleted")
99 coEvery { repository.listAlerts() } returns ApiResult.Success(alerts)
101 viewModel.deleteAlert("1")
103 val state = viewModel.state.value
104 assertEquals(alerts, state.alerts)
105 assertFalse(state.isLoading)
106 assertNull(state.error)
107 assertNull(state.alertToDelete)
108 coVerify { repository.deleteAlert("1") }
109 coVerify { repository.listAlerts() }
113 fun `deleteAlert on error shows error message`() = runTest {
114 coEvery { repository.deleteAlert("1") } returns ApiResult.Error("Not found", 404)
116 viewModel.deleteAlert("1")
118 val state = viewModel.state.value
119 assertFalse(state.isLoading)
120 assertNotNull(state.error)
121 assertNull(state.alertToDelete)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list