11package org.kabiri.android.usbterminal.viewmodel
22
3+ import android.hardware.usb.UsbDevice
34import com.google.common.truth.Truth.assertThat
45import io.mockk.clearAllMocks
56import io.mockk.every
67import io.mockk.mockk
8+ import io.mockk.mockkStatic
79import io.mockk.unmockkStatic
10+ import io.mockk.verify
811import kotlinx.coroutines.Dispatchers
912import kotlinx.coroutines.ExperimentalCoroutinesApi
1013import kotlinx.coroutines.test.StandardTestDispatcher
@@ -19,6 +22,8 @@ import org.kabiri.android.usbterminal.R
1922import org.kabiri.android.usbterminal.domain.IArduinoUseCase
2023import org.kabiri.android.usbterminal.domain.IUsbUseCase
2124import org.kabiri.android.usbterminal.util.IResourceProvider
25+ import org.kabiri.android.usbterminal.util.isCloneArduinoBoard
26+ import org.kabiri.android.usbterminal.util.isOfficialArduinoBoard
2227
2328@OptIn(ExperimentalCoroutinesApi ::class )
2429internal class MainActivityViewModelTest {
@@ -62,4 +67,69 @@ internal class MainActivityViewModelTest {
6267 // assert
6368 assertThat(sut.errorMessage.value).isEqualTo(expected)
6469 }
70+
71+ @Test
72+ fun `connect emits expected message and calls requestPermission anyways when the device is unknown` () {
73+ // arrange
74+ val expectedError = " device not found"
75+ val expectedInfo = " connecting anyways"
76+
77+ val fakeDevice: UsbDevice = mockk(relaxed = true )
78+ mockkStatic(UsbDevice ::isOfficialArduinoBoard, UsbDevice ::isCloneArduinoBoard)
79+ every { fakeDevice.isOfficialArduinoBoard() } returns false
80+ every { fakeDevice.isCloneArduinoBoard() } returns false
81+
82+ every { mockUsbUseCase.scanForUsbDevices() } returns listOf (fakeDevice)
83+ every { mockResourceProvider.getString(R .string.helper_error_arduino_device_not_found) } returns expectedError
84+ every { mockResourceProvider.getString(R .string.helper_error_connecting_anyway) } returns expectedInfo
85+
86+ // act
87+ sut.connect()
88+
89+ // assert
90+ assertThat(sut.errorMessage.value).isEqualTo(expectedError)
91+ assertThat(sut.infoMessage.value).isEqualTo(expectedInfo)
92+ verify(exactly = 1 ) { mockUsbUseCase.requestPermission(fakeDevice) }
93+ }
94+
95+ @Test
96+ fun `connect emits expected message and calls requestPermission when the device is a clone` () {
97+ // arrange
98+ val expected = " connecting anyways"
99+
100+ val fakeDevice: UsbDevice = mockk(relaxed = true )
101+ mockkStatic(UsbDevice ::isOfficialArduinoBoard, UsbDevice ::isCloneArduinoBoard)
102+ every { fakeDevice.isOfficialArduinoBoard() } returns false
103+ every { fakeDevice.isCloneArduinoBoard() } returns true
104+
105+ every { mockUsbUseCase.scanForUsbDevices() } returns listOf (fakeDevice)
106+ every { mockResourceProvider.getString(R .string.helper_error_connecting_anyway) } returns expected
107+
108+ // act
109+ sut.connect()
110+
111+ // assert
112+ assertThat(sut.infoMessage.value).isEqualTo(expected)
113+ verify(exactly = 1 ) { mockUsbUseCase.requestPermission(fakeDevice) }
114+ }
115+
116+ @Test
117+ fun `connect calls requestPermission when the device is official` () {
118+ // arrange
119+ val fakeDevice: UsbDevice = mockk(relaxed = true )
120+ mockkStatic(UsbDevice ::isOfficialArduinoBoard, UsbDevice ::isCloneArduinoBoard)
121+ every { fakeDevice.isOfficialArduinoBoard() } returns true
122+ every { fakeDevice.isCloneArduinoBoard() } returns false
123+
124+ every { mockUsbUseCase.scanForUsbDevices() } returns listOf (fakeDevice)
125+
126+ // act
127+ sut.connect()
128+
129+ // assert
130+ verify(exactly = 1 ) { mockUsbUseCase.requestPermission(fakeDevice) }
131+ assertThat(sut.infoMessage.value).isEqualTo(" " )
132+ assertThat(sut.errorMessage.value).isEqualTo(" " )
133+ assertThat(sut.output.value).isEqualTo(" " )
134+ }
65135}
0 commit comments