git.iko.soy/parseable-android
on 7cd2159 help sign in
123 lines 3.7 kB history raw
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
7import io.mockk.*
8import kotlinx.coroutines.Dispatchers
9import kotlinx.coroutines.ExperimentalCoroutinesApi
10import kotlinx.coroutines.test.*
11import org.junit.After
12import org.junit.Assert.*
13import org.junit.Before
14import org.junit.Test
16@OptIn(ExperimentalCoroutinesApi::class)
17class AlertsViewModelTest {
19 private lateinit var repository: ParseableRepository
20 private lateinit var viewModel: AlertsViewModel
21 private val testDispatcher = UnconfinedTestDispatcher()
23 @Before
24 fun setup() {
25 Dispatchers.setMain(testDispatcher)
26 repository = mockk(relaxed = true)
27 viewModel = AlertsViewModel(repository)
28 }
30 @After
31 fun tearDown() {
32 Dispatchers.resetMain()
33 }
35 @Test
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)
42 }
44 @Test
45 fun `refresh loads alerts on success`() = runTest {
46 val alerts = listOf(
47 Alert(id = "1", name = "Alert 1", stream = "stream1"),
48 Alert(id = "2", name = "Alert 2", stream = "stream2"),
49 )
50 coEvery { repository.listAlerts() } returns ApiResult.Success(alerts)
52 viewModel.refresh()
54 val state = viewModel.state.value
55 assertEquals(alerts, state.alerts)
56 assertFalse(state.isLoading)
57 assertNull(state.error)
58 }
60 @Test
61 fun `refresh shows error on failure`() = runTest {
62 coEvery { repository.listAlerts() } returns ApiResult.Error("Server error", 500)
64 viewModel.refresh()
66 val state = viewModel.state.value
67 assertTrue(state.alerts.isEmpty())
68 assertFalse(state.isLoading)
69 assertNotNull(state.error)
70 }
72 @Test
73 fun `requestDelete sets alertToDelete`() {
74 val alert = Alert(id = "1", name = "Alert 1", stream = "stream1")
76 viewModel.requestDelete(alert)
78 val state = viewModel.state.value
79 assertEquals(alert, state.alertToDelete)
80 }
82 @Test
83 fun `cancelDelete clears alertToDelete`() {
84 val alert = Alert(id = "1", name = "Alert 1", stream = "stream1")
85 viewModel.requestDelete(alert)
86 assertEquals(alert, viewModel.state.value.alertToDelete)
88 viewModel.cancelDelete()
90 assertNull(viewModel.state.value.alertToDelete)
91 }
93 @Test
94 fun `deleteAlert on success refreshes list`() = runTest {
95 val alerts = listOf(
96 Alert(id = "2", name = "Alert 2", stream = "stream2"),
97 )
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() }
110 }
112 @Test
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)
122 }