@@ -41,6 +41,7 @@ import kotlin.time.Clock
4141import kotlin.time.ExperimentalTime
4242
4343@OptIn(ExperimentalTime ::class )
44+ @Suppress(" LargeClass" )
4445class TrezorRepoTest : BaseUnitTest () {
4546
4647 companion object Fixtures {
@@ -120,17 +121,19 @@ class TrezorRepoTest : BaseUnitTest() {
120121 on { this .model }.thenReturn(model)
121122 }
122123
124+ @Suppress(" LongParameterList" )
123125 private fun mockKnownDevice (
124126 id : String = DEVICE_ID ,
125127 name : String? = DEVICE_NAME ,
126128 path : String = DEVICE_PATH ,
127129 label : String? = DEVICE_LABEL ,
128130 model : String? = DEVICE_MODEL ,
131+ transportType : TransportType = TransportType .USB ,
129132 ) = KnownDevice (
130133 id = id,
131134 name = name,
132135 path = path,
133- transportType = TransportType . USB ,
136+ transportType = transportType ,
134137 label = label,
135138 model = model,
136139 lastConnectedAt = 123L ,
@@ -214,7 +217,7 @@ class TrezorRepoTest : BaseUnitTest() {
214217
215218 @Test
216219 fun `transport restored auto-reconnects to a known device` () = test {
217- val transportRestored = MutableSharedFlow <Unit >()
220+ val transportRestored = MutableSharedFlow <TransportType >()
218221 val features = mockFeatures()
219222 val device = mockDeviceInfo()
220223 whenever(trezorTransport.transportRestored).thenReturn(transportRestored)
@@ -224,15 +227,15 @@ class TrezorRepoTest : BaseUnitTest() {
224227 whenever(trezorService.connect(eq(DEVICE_ID ), any())).thenReturn(features)
225228 sut = createSut()
226229
227- transportRestored.emit(Unit )
230+ transportRestored.emit(TransportType . USB )
228231 advanceUntilIdle()
229232
230233 assertNotNull(sut.state.value.connected)
231234 }
232235
233236 @Test
234237 fun `transport restored retries reconnect until the device is discoverable` () = test {
235- val transportRestored = MutableSharedFlow <Unit >()
238+ val transportRestored = MutableSharedFlow <TransportType >()
236239 val features = mockFeatures()
237240 val device = mockDeviceInfo()
238241 whenever(trezorTransport.transportRestored).thenReturn(transportRestored)
@@ -243,13 +246,36 @@ class TrezorRepoTest : BaseUnitTest() {
243246 whenever(trezorService.connect(eq(DEVICE_ID ), any())).thenReturn(features)
244247 sut = createSut()
245248
246- transportRestored.emit(Unit )
249+ transportRestored.emit(TransportType . USB )
247250 advanceUntilIdle()
248251
249252 assertNotNull(sut.state.value.connected)
250253 verify(trezorService, times(2 )).scan()
251254 }
252255
256+ @Test
257+ fun `reconnect prefers the transport that came back` () = test {
258+ val features = mockFeatures()
259+ val bleDevice = mockDeviceInfo(id = " ble-1" , transportType = TrezorTransportType .BLUETOOTH , path = " ble-path" )
260+ val usbDevice = mockDeviceInfo(id = " usb-1" , transportType = TrezorTransportType .USB , path = " usb-path" )
261+ whenever(hwWalletStore.loadKnownDevices()).thenReturn(
262+ listOf (
263+ mockKnownDevice(id = " ble-1" , transportType = TransportType .BLUETOOTH ),
264+ mockKnownDevice(id = " usb-1" ),
265+ ),
266+ )
267+ whenever(trezorService.isConnected()).thenReturn(false )
268+ whenever(trezorService.scan()).thenReturn(listOf (bleDevice, usbDevice))
269+ whenever(trezorService.connect(eq(" usb-1" ), any())).thenReturn(features)
270+ sut = createSut()
271+
272+ sut.onTransportRestored(TransportType .USB )
273+ advanceUntilIdle()
274+
275+ verify(trezorService).connect(eq(" usb-1" ), any())
276+ verify(trezorService, never()).connect(eq(" ble-1" ), any())
277+ }
278+
253279 @Test
254280 fun `repeated transport restored triggers run a single reconnect` () = test {
255281 val features = mockFeatures()
@@ -260,7 +286,7 @@ class TrezorRepoTest : BaseUnitTest() {
260286 whenever(trezorService.connect(eq(DEVICE_ID ), any())).thenReturn(features)
261287 sut = createSut()
262288
263- repeat(3 ) { sut.onTransportRestored() }
289+ repeat(3 ) { sut.onTransportRestored(TransportType . USB ) }
264290 advanceUntilIdle()
265291
266292 assertNotNull(sut.state.value.connected)
@@ -283,13 +309,13 @@ class TrezorRepoTest : BaseUnitTest() {
283309
284310 @Test
285311 fun `transport restored skips reconnect while device awaits pairing code` () = test {
286- val transportRestored = MutableSharedFlow <Unit >()
312+ val transportRestored = MutableSharedFlow <TransportType >()
287313 whenever(trezorTransport.transportRestored).thenReturn(transportRestored)
288314 whenever(trezorTransport.needsPairingCode).thenReturn(MutableStateFlow (true ))
289315 whenever(hwWalletStore.loadKnownDevices()).thenReturn(listOf (mockKnownDevice()))
290316 sut = createSut()
291317
292- transportRestored.emit(Unit )
318+ transportRestored.emit(TransportType . USB )
293319 advanceUntilIdle()
294320
295321 verify(trezorService, never()).disconnect()
@@ -306,7 +332,7 @@ class TrezorRepoTest : BaseUnitTest() {
306332 whenever(trezorService.connect(eq(DEVICE_ID ), any())).thenReturn(features)
307333 sut = createSut()
308334
309- sut.onTransportRestored()
335+ sut.onTransportRestored(TransportType . USB )
310336 advanceUntilIdle()
311337
312338 assertNotNull(sut.state.value.connected)
@@ -333,7 +359,7 @@ class TrezorRepoTest : BaseUnitTest() {
333359
334360 @Test
335361 fun `transport restored does not reconnect when a device is already connected` () = test {
336- val transportRestored = MutableSharedFlow <Unit >()
362+ val transportRestored = MutableSharedFlow <TransportType >()
337363 val features = mockFeatures()
338364 val device = mockDeviceInfo()
339365 whenever(trezorTransport.transportRestored).thenReturn(transportRestored)
@@ -343,7 +369,7 @@ class TrezorRepoTest : BaseUnitTest() {
343369 sut.scan()
344370 sut.connect(DEVICE_ID )
345371
346- transportRestored.emit(Unit )
372+ transportRestored.emit(TransportType . USB )
347373 advanceUntilIdle()
348374
349375 verify(trezorService, times(1 )).scan()
0 commit comments