@@ -10,8 +10,10 @@ import io.mockk.unmockkStatic
1010import io.mockk.verify
1111import kotlinx.coroutines.Dispatchers
1212import kotlinx.coroutines.ExperimentalCoroutinesApi
13+ import kotlinx.coroutines.flow.MutableStateFlow
1314import kotlinx.coroutines.test.StandardTestDispatcher
1415import kotlinx.coroutines.test.TestDispatcher
16+ import kotlinx.coroutines.test.advanceUntilIdle
1517import kotlinx.coroutines.test.resetMain
1618import kotlinx.coroutines.test.runTest
1719import kotlinx.coroutines.test.setMain
@@ -135,4 +137,38 @@ internal class MainActivityViewModelTest {
135137 assertThat(sut.errorMessage.value).isEqualTo(" " )
136138 assertThat(sut.output.value).isEqualTo(" " )
137139 }
140+
141+ @Test
142+ fun `connectIfAlreadyHasPermission does nothing when no usb device exists` () =
143+ runTest {
144+ // arrange
145+ every { mockUsbUseCase.usbDevice } returns MutableStateFlow (null )
146+
147+ // act
148+ sut.connectIfAlreadyHasPermission()
149+
150+ // assert
151+ verify(exactly = 0 ) { mockUsbUseCase.hasPermission(any()) }
152+ verify(exactly = 0 ) { mockArduinoUsecase.openDeviceAndPort(any()) }
153+ }
154+
155+ @Test
156+ fun `connectIfAlreadyHasPermission calls hasPermission and openDeviceAndPort when usb device exists` () =
157+ runTest {
158+ // arrange
159+ val mockDevice: UsbDevice = mockk(relaxed = true )
160+ val fakeVendorId = 0x0043
161+ every { mockDevice.vendorId } returns fakeVendorId
162+ every { mockUsbUseCase.usbDevice } returns MutableStateFlow (mockDevice)
163+ every { mockUsbUseCase.hasPermission(mockDevice) } returns true
164+ every { mockArduinoUsecase.openDeviceAndPort(any()) } returns Unit
165+
166+ // act
167+ sut.connectIfAlreadyHasPermission()
168+ advanceUntilIdle()
169+
170+ // assert
171+ verify { mockUsbUseCase.hasPermission(mockDevice) }
172+ verify { mockArduinoUsecase.openDeviceAndPort(mockDevice) }
173+ }
138174}
0 commit comments