Skip to content

Commit ec46cfb

Browse files
committed
test: timed sheet tests
1 parent c0e045f commit ec46cfb

File tree

6 files changed

+920
-0
lines changed

6 files changed

+920
-0
lines changed
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
package to.bitkit.utils.timedsheets
2+
3+
import kotlinx.coroutines.ExperimentalCoroutinesApi
4+
import kotlinx.coroutines.test.TestScope
5+
import kotlinx.coroutines.test.advanceTimeBy
6+
import kotlinx.coroutines.test.runTest
7+
import org.junit.Assert.assertEquals
8+
import org.junit.Assert.assertNull
9+
import org.junit.Before
10+
import org.junit.Test
11+
import org.mockito.kotlin.doReturn
12+
import org.mockito.kotlin.mock
13+
import org.mockito.kotlin.verify
14+
import org.mockito.kotlin.whenever
15+
import to.bitkit.test.BaseUnitTest
16+
import to.bitkit.ui.components.TimedSheetType
17+
18+
@OptIn(ExperimentalCoroutinesApi::class)
19+
class TimedSheetManagerTest : BaseUnitTest() {
20+
private val testScope = TestScope()
21+
private lateinit var sut: TimedSheetManager
22+
23+
@Before
24+
fun setUp() {
25+
sut = TimedSheetManager(testScope)
26+
}
27+
28+
@Test
29+
fun `shows highest priority eligible sheet first`() = test {
30+
val highPrioritySheet = mock<TimedSheetItem> {
31+
on { type } doReturn TimedSheetType.APP_UPDATE
32+
on { priority } doReturn 5
33+
}
34+
val lowPrioritySheet = mock<TimedSheetItem> {
35+
on { type } doReturn TimedSheetType.HIGH_BALANCE
36+
on { priority } doReturn 1
37+
}
38+
39+
whenever(highPrioritySheet.shouldShow()).thenReturn(true)
40+
whenever(lowPrioritySheet.shouldShow()).thenReturn(true)
41+
42+
sut.registerSheet(lowPrioritySheet)
43+
sut.registerSheet(highPrioritySheet)
44+
45+
sut.onHomeScreenEntered()
46+
testScope.advanceTimeBy(2100)
47+
48+
assertEquals(TimedSheetType.APP_UPDATE, sut.currentSheet.value)
49+
verify(highPrioritySheet).onShown()
50+
}
51+
52+
@Test
53+
fun `does not show sheets before 2s delay`() = test {
54+
val sheet = mock<TimedSheetItem> {
55+
on { type } doReturn TimedSheetType.BACKUP
56+
on { priority } doReturn 4
57+
}
58+
whenever(sheet.shouldShow()).thenReturn(true)
59+
60+
sut.registerSheet(sheet)
61+
sut.onHomeScreenEntered()
62+
63+
testScope.advanceTimeBy(1000)
64+
assertNull(sut.currentSheet.value)
65+
66+
testScope.advanceTimeBy(1100)
67+
assertEquals(TimedSheetType.BACKUP, sut.currentSheet.value)
68+
}
69+
70+
@Test
71+
fun `cancels check when leaving home screen`() = test {
72+
val sheet = mock<TimedSheetItem> {
73+
on { type } doReturn TimedSheetType.BACKUP
74+
on { priority } doReturn 4
75+
}
76+
whenever(sheet.shouldShow()).thenReturn(true)
77+
78+
sut.registerSheet(sheet)
79+
sut.onHomeScreenEntered()
80+
testScope.advanceTimeBy(1000)
81+
sut.onHomeScreenExited()
82+
83+
testScope.advanceTimeBy(2000)
84+
assertNull(sut.currentSheet.value)
85+
}
86+
87+
@Test
88+
fun `clears queue when skipQueue is true`() = test {
89+
val sheet1 = mock<TimedSheetItem> {
90+
on { type } doReturn TimedSheetType.APP_UPDATE
91+
on { priority } doReturn 5
92+
}
93+
val sheet2 = mock<TimedSheetItem> {
94+
on { type } doReturn TimedSheetType.BACKUP
95+
on { priority } doReturn 4
96+
}
97+
whenever(sheet1.shouldShow()).thenReturn(true)
98+
whenever(sheet2.shouldShow()).thenReturn(true)
99+
100+
sut.registerSheet(sheet1)
101+
sut.registerSheet(sheet2)
102+
sut.onHomeScreenEntered()
103+
testScope.advanceTimeBy(2100)
104+
105+
assertEquals(TimedSheetType.APP_UPDATE, sut.currentSheet.value)
106+
107+
sut.dismissCurrentSheet(skipQueue = true)
108+
testScope.advanceTimeBy(100)
109+
110+
assertNull(sut.currentSheet.value)
111+
verify(sheet1).onDismissed()
112+
}
113+
114+
@Test
115+
fun `does not show sheets when none eligible`() = test {
116+
val sheet = mock<TimedSheetItem> {
117+
on { type } doReturn TimedSheetType.BACKUP
118+
on { priority } doReturn 4
119+
}
120+
whenever(sheet.shouldShow()).thenReturn(false)
121+
122+
sut.registerSheet(sheet)
123+
sut.onHomeScreenEntered()
124+
testScope.advanceTimeBy(2100)
125+
126+
assertNull(sut.currentSheet.value)
127+
}
128+
129+
@Test
130+
fun `removes sheet from queue after showing`() = test {
131+
val sheet = mock<TimedSheetItem> {
132+
on { type } doReturn TimedSheetType.BACKUP
133+
on { priority } doReturn 4
134+
}
135+
whenever(sheet.shouldShow()).thenReturn(true)
136+
137+
sut.registerSheet(sheet)
138+
sut.onHomeScreenEntered()
139+
testScope.advanceTimeBy(2100)
140+
141+
assertEquals(TimedSheetType.BACKUP, sut.currentSheet.value)
142+
143+
sut.dismissCurrentSheet(skipQueue = false)
144+
testScope.advanceTimeBy(100)
145+
146+
assertNull(sut.currentSheet.value)
147+
verify(sheet).onShown()
148+
verify(sheet).onDismissed()
149+
}
150+
151+
@Test
152+
fun `registers sheets sorted by priority`() = test {
153+
val sheet1 = mock<TimedSheetItem> {
154+
on { type } doReturn TimedSheetType.HIGH_BALANCE
155+
on { priority } doReturn 1
156+
}
157+
val sheet2 = mock<TimedSheetItem> {
158+
on { type } doReturn TimedSheetType.BACKUP
159+
on { priority } doReturn 4
160+
}
161+
val sheet3 = mock<TimedSheetItem> {
162+
on { type } doReturn TimedSheetType.APP_UPDATE
163+
on { priority } doReturn 5
164+
}
165+
166+
whenever(sheet1.shouldShow()).thenReturn(true)
167+
whenever(sheet2.shouldShow()).thenReturn(true)
168+
whenever(sheet3.shouldShow()).thenReturn(true)
169+
170+
sut.registerSheet(sheet1)
171+
sut.registerSheet(sheet2)
172+
sut.registerSheet(sheet3)
173+
174+
sut.onHomeScreenEntered()
175+
testScope.advanceTimeBy(2100)
176+
177+
assertEquals(TimedSheetType.APP_UPDATE, sut.currentSheet.value)
178+
}
179+
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package to.bitkit.utils.timedsheets.sheets
2+
3+
import kotlinx.coroutines.CoroutineDispatcher
4+
import kotlinx.coroutines.test.StandardTestDispatcher
5+
import org.junit.Assert.assertFalse
6+
import org.junit.Assert.assertTrue
7+
import org.junit.Before
8+
import org.junit.Test
9+
import org.mockito.kotlin.mock
10+
import org.mockito.kotlin.whenever
11+
import to.bitkit.test.BaseUnitTest
12+
import to.bitkit.BuildConfig
13+
import to.bitkit.data.dto.PlatformDetails
14+
import to.bitkit.data.dto.Platforms
15+
import to.bitkit.data.dto.ReleaseInfoDTO
16+
import to.bitkit.services.AppUpdaterService
17+
import to.bitkit.ui.components.TimedSheetType
18+
19+
class AppUpdateTimedSheetTest : BaseUnitTest() {
20+
private lateinit var appUpdaterService: AppUpdaterService
21+
private lateinit var bgDispatcher: CoroutineDispatcher
22+
private lateinit var sut: AppUpdateTimedSheet
23+
24+
@Before
25+
fun setUp() {
26+
appUpdaterService = mock()
27+
bgDispatcher = StandardTestDispatcher()
28+
sut = AppUpdateTimedSheet(appUpdaterService, bgDispatcher)
29+
}
30+
31+
@Test
32+
fun `type is APP_UPDATE`() {
33+
assertTrue(sut.type == TimedSheetType.APP_UPDATE)
34+
}
35+
36+
@Test
37+
fun `priority is 5`() {
38+
assertTrue(sut.priority == 5)
39+
}
40+
41+
@Test
42+
fun `should not show when build number is same or lower`() = test {
43+
val releaseInfo = ReleaseInfoDTO(
44+
platforms = Platforms(
45+
android = PlatformDetails(
46+
version = "1.0.0",
47+
buildNumber = BuildConfig.VERSION_CODE,
48+
notes = "Test release",
49+
pubDate = "2024-01-01",
50+
url = "https://example.com",
51+
isCritical = false
52+
),
53+
ios = null
54+
)
55+
)
56+
whenever(appUpdaterService.getReleaseInfo()).thenReturn(releaseInfo)
57+
58+
val result = sut.shouldShow()
59+
60+
assertFalse(result)
61+
}
62+
63+
@Test
64+
fun `should not show when update is critical`() = test {
65+
val releaseInfo = ReleaseInfoDTO(
66+
platforms = Platforms(
67+
android = PlatformDetails(
68+
version = "1.0.0",
69+
buildNumber = BuildConfig.VERSION_CODE + 1,
70+
notes = "Test release",
71+
pubDate = "2024-01-01",
72+
url = "https://example.com",
73+
isCritical = true
74+
),
75+
ios = null
76+
)
77+
)
78+
whenever(appUpdaterService.getReleaseInfo()).thenReturn(releaseInfo)
79+
80+
val result = sut.shouldShow()
81+
82+
assertFalse(result)
83+
}
84+
85+
@Test
86+
fun `should show when non-critical update available`() = test {
87+
val releaseInfo = ReleaseInfoDTO(
88+
platforms = Platforms(
89+
android = PlatformDetails(
90+
version = "1.0.0",
91+
buildNumber = BuildConfig.VERSION_CODE + 1,
92+
notes = "Test release",
93+
pubDate = "2024-01-01",
94+
url = "https://example.com",
95+
isCritical = false
96+
),
97+
ios = null
98+
)
99+
)
100+
whenever(appUpdaterService.getReleaseInfo()).thenReturn(releaseInfo)
101+
102+
val result = sut.shouldShow()
103+
104+
assertTrue(result)
105+
}
106+
107+
@Test
108+
fun `should not show when network error occurs`() = test {
109+
whenever(appUpdaterService.getReleaseInfo()).thenThrow(RuntimeException("Network error"))
110+
111+
val result = sut.shouldShow()
112+
113+
assertFalse(result)
114+
}
115+
}

0 commit comments

Comments
 (0)