Skip to content

Commit 85525e9

Browse files
committed
fix: clear trezor state on disconnect
1 parent 879a3cc commit 85525e9

2 files changed

Lines changed: 48 additions & 6 deletions

File tree

app/src/main/java/to/bitkit/repositories/TrezorRepo.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -320,12 +320,12 @@ class TrezorRepo @Inject constructor(
320320
}
321321

322322
suspend fun disconnect(): Result<Unit> = withContext(ioDispatcher) {
323-
runCatching {
324-
TrezorDebugLog.log("DISCONNECT", "disconnect() called, connectedDeviceId=${_state.value.connectedDeviceId}")
325-
trezorService.disconnect()
326-
_state.update {
327-
it.copy(connectedDevice = null, connectedDeviceId = null, lastAddress = null, lastPublicKey = null)
328-
}
323+
TrezorDebugLog.log("DISCONNECT", "disconnect() called, connectedDeviceId=${_state.value.connectedDeviceId}")
324+
val result = runCatching { trezorService.disconnect() }
325+
_state.update {
326+
it.copy(connectedDevice = null, connectedDeviceId = null, lastAddress = null, lastPublicKey = null)
327+
}
328+
result.onSuccess {
329329
TrezorDebugLog.log("DISCONNECT", "disconnect() complete (credentials NOT cleared)")
330330
}.onFailure { e ->
331331
TrezorDebugLog.log("DISCONNECT", "FAILED: ${e.message}")

app/src/test/java/to/bitkit/repositories/TrezorRepoTest.kt

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,48 @@ class TrezorRepoTest : BaseUnitTest() {
218218
assertNull(sut.state.value.lastPublicKey)
219219
}
220220

221+
@Test
222+
fun `disconnect should clear connectedDevice state on service failure`() = test {
223+
val features = mockFeatures()
224+
val device = mockDeviceInfo()
225+
val addressResponse = mock<TrezorAddressResponse>()
226+
val publicKeyResponse = mock<TrezorPublicKeyResponse>()
227+
whenever(trezorService.connect(DEVICE_ID)).thenReturn(features)
228+
whenever(trezorService.scan()).thenReturn(listOf(device))
229+
whenever(trezorService.isConnected()).thenReturn(true)
230+
whenever(
231+
trezorService.getAddress(
232+
path = any(),
233+
coin = any(),
234+
showOnTrezor = any(),
235+
scriptType = anyOrNull(),
236+
)
237+
).thenReturn(addressResponse)
238+
whenever(
239+
trezorService.getPublicKey(
240+
path = any(),
241+
coin = any(),
242+
showOnTrezor = any(),
243+
)
244+
).thenReturn(publicKeyResponse)
245+
sut = createSut()
246+
247+
sut.scan()
248+
sut.connect(DEVICE_ID)
249+
sut.getAddress()
250+
sut.getPublicKey()
251+
whenever(trezorService.disconnect()).thenThrow(RuntimeException("disconnect failed"))
252+
253+
val result = sut.disconnect()
254+
255+
assertTrue(result.isFailure)
256+
assertNull(sut.state.value.connectedDevice)
257+
assertNull(sut.state.value.connectedDeviceId)
258+
assertNull(sut.state.value.lastAddress)
259+
assertNull(sut.state.value.lastPublicKey)
260+
assertEquals("disconnect failed", sut.state.value.error)
261+
}
262+
221263
// endregion
222264

223265
// region getAddress

0 commit comments

Comments
 (0)