@ledgerhq/device-contacts-kit 0.0.0-develop-20261105000842 → 0.0.0-develop-20261107000805
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/package.json +1 -1
- package/lib/esm/package.json +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/lib/cjs/api/ContactsManagerBuilder.test.js +0 -2
- package/lib/cjs/api/ContactsManagerBuilder.test.js.map +0 -7
- package/lib/cjs/api/model/ContactsVersionRequirements.test.js +0 -2
- package/lib/cjs/api/model/ContactsVersionRequirements.test.js.map +0 -7
- package/lib/cjs/internal/DefaultContactsManager.test.js +0 -2
- package/lib/cjs/internal/DefaultContactsManager.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js +0 -2
- package/lib/cjs/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/command/EditExternalAddressScopeCommand.test.js +0 -2
- package/lib/cjs/internal/app-binder/command/EditExternalAddressScopeCommand.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/command/ProvideContactCommand.test.js +0 -2
- package/lib/cjs/internal/app-binder/command/ProvideContactCommand.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/command/RegisterIdentityCommand.test.js +0 -2
- package/lib/cjs/internal/app-binder/command/RegisterIdentityCommand.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/command/RenameContactCommand.test.js +0 -2
- package/lib/cjs/internal/app-binder/command/RenameContactCommand.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/contactsVersionGuards.test.js +0 -2
- package/lib/cjs/internal/app-binder/contactsVersionGuards.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +0 -7
- package/lib/cjs/internal/app-binder/model/contactsValidation.test.js +0 -2
- package/lib/cjs/internal/app-binder/model/contactsValidation.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/services/contactsTlvSerializer.test.js +0 -2
- package/lib/cjs/internal/app-binder/services/contactsTlvSerializer.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/services/provideContact.test.js +0 -2
- package/lib/cjs/internal/app-binder/services/provideContact.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/services/sendFramedContactsPayload.test.js +0 -2
- package/lib/cjs/internal/app-binder/services/sendFramedContactsPayload.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js +0 -2
- package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js +0 -2
- package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.test.js +0 -2
- package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js +0 -2
- package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js.map +0 -7
- package/lib/cjs/internal/di.test.js +0 -2
- package/lib/cjs/internal/di.test.js.map +0 -7
- package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js +0 -2
- package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js.map +0 -7
- package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.test.js +0 -2
- package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.test.js.map +0 -7
- package/lib/cjs/internal/use-cases/RegisterExternalAddressUseCase.test.js +0 -2
- package/lib/cjs/internal/use-cases/RegisterExternalAddressUseCase.test.js.map +0 -7
- package/lib/cjs/internal/use-cases/RenameContactUseCase.test.js +0 -2
- package/lib/cjs/internal/use-cases/RenameContactUseCase.test.js.map +0 -7
- package/lib/esm/api/ContactsManagerBuilder.test.js +0 -2
- package/lib/esm/api/ContactsManagerBuilder.test.js.map +0 -7
- package/lib/esm/api/model/ContactsVersionRequirements.test.js +0 -2
- package/lib/esm/api/model/ContactsVersionRequirements.test.js.map +0 -7
- package/lib/esm/internal/DefaultContactsManager.test.js +0 -2
- package/lib/esm/internal/DefaultContactsManager.test.js.map +0 -7
- package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js +0 -2
- package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js.map +0 -7
- package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.test.js +0 -2
- package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.test.js.map +0 -7
- package/lib/esm/internal/app-binder/command/ProvideContactCommand.test.js +0 -2
- package/lib/esm/internal/app-binder/command/ProvideContactCommand.test.js.map +0 -7
- package/lib/esm/internal/app-binder/command/RegisterIdentityCommand.test.js +0 -2
- package/lib/esm/internal/app-binder/command/RegisterIdentityCommand.test.js.map +0 -7
- package/lib/esm/internal/app-binder/command/RenameContactCommand.test.js +0 -2
- package/lib/esm/internal/app-binder/command/RenameContactCommand.test.js.map +0 -7
- package/lib/esm/internal/app-binder/contactsVersionGuards.test.js +0 -2
- package/lib/esm/internal/app-binder/contactsVersionGuards.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js +0 -2
- package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js +0 -2
- package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js +0 -2
- package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js +0 -2
- package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.js +0 -2
- package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.js +0 -2
- package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js +0 -2
- package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js +0 -2
- package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +0 -2
- package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js +0 -2
- package/lib/esm/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js +0 -2
- package/lib/esm/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js +0 -2
- package/lib/esm/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +0 -2
- package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +0 -7
- package/lib/esm/internal/app-binder/model/contactsValidation.test.js +0 -2
- package/lib/esm/internal/app-binder/model/contactsValidation.test.js.map +0 -7
- package/lib/esm/internal/app-binder/services/contactsTlvSerializer.test.js +0 -2
- package/lib/esm/internal/app-binder/services/contactsTlvSerializer.test.js.map +0 -7
- package/lib/esm/internal/app-binder/services/provideContact.test.js +0 -2
- package/lib/esm/internal/app-binder/services/provideContact.test.js.map +0 -7
- package/lib/esm/internal/app-binder/services/sendFramedContactsPayload.test.js +0 -2
- package/lib/esm/internal/app-binder/services/sendFramedContactsPayload.test.js.map +0 -7
- package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js +0 -2
- package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js.map +0 -7
- package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js +0 -2
- package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js.map +0 -7
- package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.test.js +0 -2
- package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +0 -7
- package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js +0 -2
- package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js.map +0 -7
- package/lib/esm/internal/di.test.js +0 -2
- package/lib/esm/internal/di.test.js.map +0 -7
- package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js +0 -2
- package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js.map +0 -7
- package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.test.js +0 -2
- package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.test.js.map +0 -7
- package/lib/esm/internal/use-cases/RegisterExternalAddressUseCase.test.js +0 -2
- package/lib/esm/internal/use-cases/RegisterExternalAddressUseCase.test.js.map +0 -7
- package/lib/esm/internal/use-cases/RenameContactUseCase.test.js +0 -2
- package/lib/esm/internal/use-cases/RenameContactUseCase.test.js.map +0 -7
- package/lib/types/api/ContactsManagerBuilder.test.d.ts +0 -2
- package/lib/types/api/ContactsManagerBuilder.test.d.ts.map +0 -1
- package/lib/types/api/model/ContactsVersionRequirements.test.d.ts +0 -2
- package/lib/types/api/model/ContactsVersionRequirements.test.d.ts.map +0 -1
- package/lib/types/internal/DefaultContactsManager.test.d.ts +0 -2
- package/lib/types/internal/DefaultContactsManager.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.d.ts +0 -2
- package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.test.d.ts +0 -2
- package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/command/ProvideContactCommand.test.d.ts +0 -2
- package/lib/types/internal/app-binder/command/ProvideContactCommand.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/command/RegisterIdentityCommand.test.d.ts +0 -2
- package/lib/types/internal/app-binder/command/RegisterIdentityCommand.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/command/RenameContactCommand.test.d.ts +0 -2
- package/lib/types/internal/app-binder/command/RenameContactCommand.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/contactsVersionGuards.test.d.ts +0 -2
- package/lib/types/internal/app-binder/contactsVersionGuards.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts +0 -4
- package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.d.ts +0 -12
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.d.ts +0 -17
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts +0 -15
- package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts.map +0 -1
- package/lib/types/internal/app-binder/model/contactsValidation.test.d.ts +0 -2
- package/lib/types/internal/app-binder/model/contactsValidation.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/services/contactsTlvSerializer.test.d.ts +0 -2
- package/lib/types/internal/app-binder/services/contactsTlvSerializer.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/services/provideContact.test.d.ts +0 -2
- package/lib/types/internal/app-binder/services/provideContact.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/services/sendFramedContactsPayload.test.d.ts +0 -2
- package/lib/types/internal/app-binder/services/sendFramedContactsPayload.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.d.ts +0 -2
- package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.test.d.ts +0 -2
- package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/task/SendRegisterIdentityTask.test.d.ts +0 -2
- package/lib/types/internal/app-binder/task/SendRegisterIdentityTask.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/task/SendRenameContactTask.test.d.ts +0 -2
- package/lib/types/internal/app-binder/task/SendRenameContactTask.test.d.ts.map +0 -1
- package/lib/types/internal/di.test.d.ts +0 -2
- package/lib/types/internal/di.test.d.ts.map +0 -1
- package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.test.d.ts +0 -2
- package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.test.d.ts.map +0 -1
- package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.test.d.ts +0 -2
- package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.test.d.ts.map +0 -1
- package/lib/types/internal/use-cases/RegisterExternalAddressUseCase.test.d.ts +0 -2
- package/lib/types/internal/use-cases/RegisterExternalAddressUseCase.test.d.ts.map +0 -1
- package/lib/types/internal/use-cases/RenameContactUseCase.test.d.ts +0 -2
- package/lib/types/internal/use-cases/RenameContactUseCase.test.d.ts.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{DeviceModelId as a,DeviceSessionStateType as d,DeviceStatus as l}from"@ledgerhq/device-management-kit";import{ETHEREUM_APP_NAME as u,resolveContactsVersionRequirements as h,SOLANA_APP_NAME as f,TRON_APP_NAME as A}from"../../api/model/ContactsVersionRequirements";import{isContactsAppVersionSupportedForSession as s,isContactsOsVersionSupportedForSession as i}from"./contactsVersionGuards";const m=(()=>{const e=h(a.FLEX);if(!e.supported)throw new Error("Flex must be supported");return e})(),p=m.minOsVersion,S=(()=>{const e=m.minAppVersion[u];if(e===void 0)throw new Error("Ethereum min version required");return e})(),c="0.0.1";function n({osVersion:e=p,modelId:r=a.FLEX}={}){return{sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:l.CONNECTED,installedApps:[],currentApp:{name:u,version:"0.0.0"},deviceModelId:r,firmwareVersion:{mcu:"1.0.0",bootloader:"1.0.0",os:e},isSecureConnectionAllowed:!1}}function t(e){return{getDeviceSessionState:()=>e}}function o(e=u,r=S){return{name:e,version:r}}describe("isContactsAppVersionSupportedForSession",()=>{it("returns true when the model and app version meet the minimums",()=>{const e=t(n());expect(s(e,o())).toBe(!0)}),it("returns true regardless of OS version, since app-owned operations are not gated by it",()=>{const e=t(n({osVersion:c}));expect(s(e,o())).toBe(!0)}),it("returns false on an unsupported device model",()=>{const e=t(n({modelId:a.NANO_S}));expect(s(e,o())).toBe(!1)}),it("returns false when the app version is below the minimum",()=>{const e=t(n());expect(s(e,o(u,c))).toBe(!1)}),it("returns false when the running app is unknown to Contacts",()=>{const e=t(n());expect(s(e,o("Bitcoin"))).toBe(!1)}),it.each([A,f])("returns true for the %s app at its minimum version",e=>{const r=m.minAppVersion[e];if(r===void 0)throw new Error(`${e} min version`);const v=t(n());expect(s(v,o(e,r))).toBe(!0)}),it("returns false for a Solana app below its minimum version",()=>{const e=t(n());expect(s(e,o(f,"1.16.0"))).toBe(!1)}),it("returns true for a prerelease build of the minimum app version",()=>{const e=t(n());expect(s(e,o(u,`${S}-rc2`))).toBe(!0)}),it("returns false when the device session has no running app",()=>{const e=t({sessionStateType:d.Connected,deviceStatus:l.CONNECTED,deviceModelId:a.FLEX});expect(s(e,o())).toBe(!1)})});describe("isContactsOsVersionSupportedForSession",()=>{it("returns true when the model and the caller's OS version meet the minimums",()=>{const e=t(n());expect(i(e,p)).toBe(!0)}),it("returns false on an unsupported device model",()=>{const e=t(n({modelId:a.NANO_S}));expect(i(e,p)).toBe(!1)}),it("returns false when the caller's OS version is below the minimum",()=>{const e=t(n());expect(i(e,c)).toBe(!1)}),it("returns true for a release candidate of the minimum OS version",()=>{const e=t(n());expect(i(e,`${p}-rc2`)).toBe(!0)}),it("returns false for a release candidate below the minimum OS version",()=>{const e=t(n());expect(i(e,`${c}-rc2`)).toBe(!1)}),it("never reads the OS version from the device session state",()=>{const e=t({sessionStateType:d.Connected,deviceStatus:l.CONNECTED,deviceModelId:a.FLEX});expect(i(e,p)).toBe(!0),expect(i(e,c)).toBe(!1)})});
|
|
2
|
-
//# sourceMappingURL=contactsVersionGuards.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/internal/app-binder/contactsVersionGuards.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n ETHEREUM_APP_NAME,\n resolveContactsVersionRequirements,\n SOLANA_APP_NAME,\n TRON_APP_NAME,\n} from \"@api/model/ContactsVersionRequirements\";\n\nimport {\n isContactsAppVersionSupportedForSession,\n isContactsOsVersionSupportedForSession,\n type RunningApp,\n} from \"./contactsVersionGuards\";\n\nconst flexSupport = (() => {\n const requirement = resolveContactsVersionRequirements(DeviceModelId.FLEX);\n if (!requirement.supported) throw new Error(\"Flex must be supported\");\n return requirement;\n})();\n\nconst MIN_OS_VERSION = flexSupport.minOsVersion;\nconst MIN_APP_VERSION = (() => {\n const version = flexSupport.minAppVersion[ETHEREUM_APP_NAME];\n if (version === undefined) throw new Error(\"Ethereum min version required\");\n return version;\n})();\nconst BELOW_ANY_VERSION = \"0.0.1\";\n\ntype ReadyStateOptions = {\n osVersion?: string;\n modelId?: DeviceModelId;\n};\n\nfunction createReadyState({\n osVersion = MIN_OS_VERSION,\n modelId = DeviceModelId.FLEX,\n}: ReadyStateOptions = {}) {\n return {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: ETHEREUM_APP_NAME, version: \"0.0.0\" },\n deviceModelId: modelId,\n firmwareVersion: { mcu: \"1.0.0\", bootloader: \"1.0.0\", os: osVersion },\n isSecureConnectionAllowed: false,\n };\n}\n\nfunction createInternalApi(deviceState: object): InternalApi {\n return {\n getDeviceSessionState: () => deviceState,\n } as unknown as InternalApi;\n}\n\n// The running app identity now comes from the caller (a fresh\n// WaitForAppAndVersion result), not the device session state.\nfunction runningApp(\n name = ETHEREUM_APP_NAME,\n version = MIN_APP_VERSION,\n): RunningApp {\n return { name, version };\n}\n\ndescribe(\"isContactsAppVersionSupportedForSession\", () => {\n it(\"returns true when the model and app version meet the minimums\", () => {\n const api = createInternalApi(createReadyState());\n expect(isContactsAppVersionSupportedForSession(api, runningApp())).toBe(\n true,\n );\n });\n\n it(\"returns true regardless of OS version, since app-owned operations are not gated by it\", () => {\n const api = createInternalApi(\n createReadyState({ osVersion: BELOW_ANY_VERSION }),\n );\n expect(isContactsAppVersionSupportedForSession(api, runningApp())).toBe(\n true,\n );\n });\n\n it(\"returns false on an unsupported device model\", () => {\n const api = createInternalApi(\n createReadyState({ modelId: DeviceModelId.NANO_S }),\n );\n expect(isContactsAppVersionSupportedForSession(api, runningApp())).toBe(\n false,\n );\n });\n\n it(\"returns false when the app version is below the minimum\", () => {\n const api = createInternalApi(createReadyState());\n expect(\n isContactsAppVersionSupportedForSession(\n api,\n runningApp(ETHEREUM_APP_NAME, BELOW_ANY_VERSION),\n ),\n ).toBe(false);\n });\n\n it(\"returns false when the running app is unknown to Contacts\", () => {\n const api = createInternalApi(createReadyState());\n expect(\n isContactsAppVersionSupportedForSession(api, runningApp(\"Bitcoin\")),\n ).toBe(false);\n });\n\n it.each([TRON_APP_NAME, SOLANA_APP_NAME])(\n \"returns true for the %s app at its minimum version\",\n (appName) => {\n const version = flexSupport.minAppVersion[appName];\n if (version === undefined) throw new Error(`${appName} min version`);\n const api = createInternalApi(createReadyState());\n expect(\n isContactsAppVersionSupportedForSession(\n api,\n runningApp(appName, version),\n ),\n ).toBe(true);\n },\n );\n\n it(\"returns false for a Solana app below its minimum version\", () => {\n const api = createInternalApi(createReadyState());\n expect(\n isContactsAppVersionSupportedForSession(\n api,\n runningApp(SOLANA_APP_NAME, \"1.16.0\"),\n ),\n ).toBe(false);\n });\n\n it(\"returns true for a prerelease build of the minimum app version\", () => {\n const api = createInternalApi(createReadyState());\n expect(\n isContactsAppVersionSupportedForSession(\n api,\n runningApp(ETHEREUM_APP_NAME, `${MIN_APP_VERSION}-rc2`),\n ),\n ).toBe(true);\n });\n\n it(\"returns false when the device session has no running app\", () => {\n const api = createInternalApi({\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: DeviceModelId.FLEX,\n });\n expect(isContactsAppVersionSupportedForSession(api, runningApp())).toBe(\n false,\n );\n });\n});\n\ndescribe(\"isContactsOsVersionSupportedForSession\", () => {\n it(\"returns true when the model and the caller's OS version meet the minimums\", () => {\n const api = createInternalApi(createReadyState());\n expect(isContactsOsVersionSupportedForSession(api, MIN_OS_VERSION)).toBe(\n true,\n );\n });\n\n it(\"returns false on an unsupported device model\", () => {\n const api = createInternalApi(\n createReadyState({ modelId: DeviceModelId.NANO_S }),\n );\n expect(isContactsOsVersionSupportedForSession(api, MIN_OS_VERSION)).toBe(\n false,\n );\n });\n\n it(\"returns false when the caller's OS version is below the minimum\", () => {\n const api = createInternalApi(createReadyState());\n expect(isContactsOsVersionSupportedForSession(api, BELOW_ANY_VERSION)).toBe(\n false,\n );\n });\n\n it(\"returns true for a release candidate of the minimum OS version\", () => {\n const api = createInternalApi(createReadyState());\n expect(\n isContactsOsVersionSupportedForSession(api, `${MIN_OS_VERSION}-rc2`),\n ).toBe(true);\n });\n\n it(\"returns false for a release candidate below the minimum OS version\", () => {\n const api = createInternalApi(createReadyState());\n expect(\n isContactsOsVersionSupportedForSession(api, `${BELOW_ANY_VERSION}-rc2`),\n ).toBe(false);\n });\n\n it(\"never reads the OS version from the device session state\", () => {\n // A session with no firmwareVersion at all: the guard must rely solely on\n // the caller-supplied version and still resolve support.\n const api = createInternalApi({\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n deviceModelId: DeviceModelId.FLEX,\n });\n expect(isContactsOsVersionSupportedForSession(api, MIN_OS_VERSION)).toBe(\n true,\n );\n expect(isContactsOsVersionSupportedForSession(api, BELOW_ANY_VERSION)).toBe(\n false,\n );\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "ETHEREUM_APP_NAME", "resolveContactsVersionRequirements", "SOLANA_APP_NAME", "TRON_APP_NAME", "isContactsAppVersionSupportedForSession", "isContactsOsVersionSupportedForSession", "flexSupport", "requirement", "MIN_OS_VERSION", "MIN_APP_VERSION", "version", "BELOW_ANY_VERSION", "createReadyState", "osVersion", "modelId", "createInternalApi", "deviceState", "runningApp", "name", "api", "appName"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{CommandResultFactory as V,DeviceActionStatus as e,DeviceModelId as S,DeviceSessionStateType as C,DeviceStatus as N,UnknownDAError as h,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{beforeEach as q,describe as w,it as c,vi as A}from"vitest";import{makeDeviceActionInternalApiMock as T}from"../../../app-binder/device-action/__test-utils__/makeInternalApi";import{setupOpenAppDAMock as p}from"../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock";import{setupWaitForAppAndVersionDAMock as D}from"../../../app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock";import{testDeviceActionStates as u}from"../../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{ContactsCommandError as F,ContactsVersionRequirementError as H}from"../../../app-binder/model/contactsErrors";import{EditExternalAddressIdentifierDeviceAction as M}from"./EditExternalAddressIdentifierDeviceAction";import{validateEditExternalAddressIdentifierInput as P}from"./validateEditExternalAddressIdentifierInput";A.mock("@ledgerhq/device-management-kit",async o=>({...await o(),OpenAppDeviceAction:A.fn(()=>({makeStateMachine:A.fn()})),WaitForAppAndVersionDeviceAction:A.fn(()=>({makeStateMachine:A.fn()}))}));const g={name:"Ethereum",version:"1.15.0"},U=new Uint8Array(64).fill(204),v=new Uint8Array(32).fill(221),k=new Uint8Array(32).fill(170),x=new Uint8Array(32).fill(136),O=new Uint8Array(20).fill(17),R=new Uint8Array(20).fill(34),W={hmacRest:x},l={contactName:"Alice",scope:"Eth main",previousIdentifier:O,newIdentifier:R,blockchainFamily:"ethereum",chainId:1n,groupHandle:U,hmacProof:v,hmacRest:k,appName:"Ethereum"},I={contactName:"Alice",scope:"Eth main",previousIdentifier:O,identifier:R,blockchainFamily:"ethereum",chainId:1n,groupHandle:U,hmacProof:v,hmacRest:x};w("EditExternalAddressIdentifierDeviceAction",()=>{let o,E,m;function y(){return{isSupported:E,editIdentifier:m}}q(()=>{o=T(),D(g),E=A.fn().mockReturnValue(!0),m=A.fn().mockResolvedValue(V({data:W})),o.getDeviceSessionState.mockReturnValue({sessionStateType:C.ReadyWithoutSecureChannel,deviceStatus:N.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:S.FLEX,isSecureConnectionAllowed:!0})});function s(i){const n=new M({input:i});return A.spyOn(n,"extractDependencies").mockReturnValue(y()),n}c("open-app path: OpenApp -> VersionGuard -> EditIdentifier -> Completed",()=>new Promise((i,n)=>{p();const r=s({...l,skipOpenApp:!1}),a=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:I,status:e.Completed}];u(r,a,o,{onDone:i,onError:n})})),c("skip-open-app path: VersionGuard -> EditIdentifier -> Completed, preserving the group proof",()=>new Promise((i,n)=>{p();const r=s({...l,skipOpenApp:!0}),a=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:I,status:e.Completed}];u(r,a,o,{onDone:()=>{try{expect(I.hmacProof).toBe(v),expect(I.hmacRest).toBe(x),expect(I.hmacRest).not.toBe(k),i()}catch(d){n(d)}},onError:n})})),c("version guard rejects on skip-open-app path without running EDIT IDENTIFIER",()=>new Promise((i,n)=>{p(),E.mockReturnValue(!1);const r=s({...l,skipOpenApp:!0}),a=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{error:new H,status:e.Error}];u(r,a,o,{onDone:i,onError:n}),expect(m).not.toHaveBeenCalled()})),c("surfaces an open-app failure as the device action error",()=>new Promise((i,n)=>{const r=new h("open app failed");p(r);const a=s({...l,skipOpenApp:!1}),d=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{error:r,status:e.Error}];u(a,d,o,{onDone:i,onError:n}),expect(E).not.toHaveBeenCalled()})),c("surfaces an Edit Identifier command error",()=>new Promise((i,n)=>{p();const r=new F({errorCode:"6982",message:"seed mismatch"});m.mockResolvedValue(V({error:r}));const a=s({...l,skipOpenApp:!0}),d=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{error:r,status:e.Error}];u(a,d,o,{onDone:i,onError:n})})),c("surfaces invalid input as a typed error state on the skip-open-app path",()=>new Promise((i,n)=>{p();const r={...l,skipOpenApp:!0,contactName:""},a=P(r),d=s(r),f=[{error:a,status:e.Error}];u(d,f,o,{onDone:i,onError:n}),expect(E).not.toHaveBeenCalled(),expect(m).not.toHaveBeenCalled()})),c("validates only after opening the app on the default path",()=>new Promise((i,n)=>{p();const r={...l,skipOpenApp:!1,contactName:""},a=P(r),d=s(r),f=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{error:a,status:e.Error}];u(d,f,o,{onDone:i,onError:n}),expect(m).not.toHaveBeenCalled()})),c("evaluates support from the fresh WaitForAppAndVersion result, not stale session state",()=>new Promise((i,n)=>{p();const r={name:"Ethereum",version:"9.9.9"};D(r);const a=s({...l,skipOpenApp:!0}),d=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:I,status:e.Completed}];u(a,d,o,{onDone:()=>{try{expect(E).toHaveBeenCalledWith(r),i()}catch(f){n(f)}},onError:n})})),c("surfaces a WaitForAppAndVersion failure as the device action error",()=>new Promise((i,n)=>{p();const r=new h("could not read app and version");D({error:r});const a=s({...l,skipOpenApp:!0}),d=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{error:r,status:e.Error}];u(a,d,o,{onDone:i,onError:n}),expect(E).not.toHaveBeenCalled(),expect(m).not.toHaveBeenCalled()})),c("propagates the UnlockDevice interaction emitted by WaitForAppAndVersion",()=>new Promise((i,n)=>{p(),D(g,t.UnlockDevice);const r=s({...l,skipOpenApp:!0}),a=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.UnlockDevice},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:I,status:e.Completed}];u(r,a,o,{onDone:i,onError:n})}))});
|
|
2
|
-
//# sourceMappingURL=EditExternalAddressIdentifierDeviceAction.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../src/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type EditExternalAddressIdentifierDAError,\n type EditExternalAddressIdentifierDAInput,\n type EditExternalAddressIdentifierDAIntermediateValue,\n type EditExternalAddressIdentifierDAOutput,\n} from \"@api/app-binder/EditExternalAddressIdentifierDeviceActionTypes\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { setupWaitForAppAndVersionDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport {\n ContactsCommandError,\n ContactsVersionRequirementError,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nimport { EditExternalAddressIdentifierDeviceAction } from \"./EditExternalAddressIdentifierDeviceAction\";\nimport { validateEditExternalAddressIdentifierInput } from \"./validateEditExternalAddressIdentifierInput\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n // eslint-disable-next-line @typescript-eslint/consistent-type-imports\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n WaitForAppAndVersionDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\nconst FRESH_APP = { name: \"Ethereum\", version: \"1.15.0\" };\n\nconst GROUP_HANDLE = new Uint8Array(64).fill(0xcc);\nconst HMAC_PROOF = new Uint8Array(32).fill(0xdd);\nconst HMAC_REST_OLD = new Uint8Array(32).fill(0xaa);\nconst HMAC_REST_NEW = new Uint8Array(32).fill(0x88);\nconst PREVIOUS_IDENTIFIER = new Uint8Array(20).fill(0x11);\nconst NEW_IDENTIFIER = new Uint8Array(20).fill(0x22);\n\nconst OK_PROOF = { hmacRest: HMAC_REST_NEW };\n\nconst BASE_INPUT = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n previousIdentifier: PREVIOUS_IDENTIFIER,\n newIdentifier: NEW_IDENTIFIER,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF,\n hmacRest: HMAC_REST_OLD,\n appName: \"Ethereum\",\n};\n\nconst EXPECTED_OUTPUT = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n previousIdentifier: PREVIOUS_IDENTIFIER,\n identifier: NEW_IDENTIFIER,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: GROUP_HANDLE,\n // Preserved: the group-level name proof is unchanged by an identifier edit.\n hmacProof: HMAC_PROOF,\n // Rotated: only the address-level proof changes.\n hmacRest: HMAC_REST_NEW,\n};\n\ndescribe(\"EditExternalAddressIdentifierDeviceAction\", () => {\n let apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\n let isSupportedMock: ReturnType<typeof vi.fn>;\n let editIdentifierMock: ReturnType<typeof vi.fn>;\n\n function extractDeps() {\n return {\n isSupported: isSupportedMock,\n editIdentifier: editIdentifierMock,\n };\n }\n\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n setupWaitForAppAndVersionDAMock(FRESH_APP);\n isSupportedMock = vi.fn().mockReturnValue(true);\n editIdentifierMock = vi\n .fn()\n .mockResolvedValue(CommandResultFactory({ data: OK_PROOF }));\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.15.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: true,\n });\n });\n\n function makeAction(input: EditExternalAddressIdentifierDAInput) {\n const action = new EditExternalAddressIdentifierDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n return action;\n }\n\n it(\"open-app path: OpenApp -> VersionGuard -> EditIdentifier -> Completed\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: false });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"skip-open-app path: VersionGuard -> EditIdentifier -> Completed, preserving the group proof\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n try {\n // The device rotates only the address-level hmac_rest; the contact\n // group's name proof passes through unchanged.\n expect(EXPECTED_OUTPUT.hmacProof).toBe(HMAC_PROOF);\n expect(EXPECTED_OUTPUT.hmacRest).toBe(HMAC_REST_NEW);\n expect(EXPECTED_OUTPUT.hmacRest).not.toBe(HMAC_REST_OLD);\n resolve();\n } catch (e) {\n reject(e as Error);\n }\n },\n onError: reject,\n });\n }));\n\n it(\"version guard rejects on skip-open-app path without running EDIT IDENTIFIER\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n isSupportedMock.mockReturnValue(false);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new ContactsVersionRequirementError(),\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(editIdentifierMock).not.toHaveBeenCalled();\n }));\n\n it(\"surfaces an open-app failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n const openAppError = new UnknownDAError(\"open app failed\");\n setupOpenAppDAMock(openAppError);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: false });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: openAppError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n }));\n\n it(\"surfaces an Edit Identifier command error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const commandError = new ContactsCommandError({\n errorCode: \"6982\",\n message: \"seed mismatch\",\n });\n editIdentifierMock.mockResolvedValue(\n CommandResultFactory({ error: commandError }),\n );\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: commandError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"surfaces invalid input as a typed error state on the skip-open-app path\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const invalidInput = {\n ...BASE_INPUT,\n skipOpenApp: true,\n contactName: \"\",\n };\n const validationError =\n validateEditExternalAddressIdentifierInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n expect(editIdentifierMock).not.toHaveBeenCalled();\n }));\n\n it(\"validates only after opening the app on the default path\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const invalidInput = {\n ...BASE_INPUT,\n skipOpenApp: false,\n contactName: \"\",\n };\n const validationError =\n validateEditExternalAddressIdentifierInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(editIdentifierMock).not.toHaveBeenCalled();\n }));\n\n it(\"evaluates support from the fresh WaitForAppAndVersion result, not stale session state\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const freshApp = { name: \"Ethereum\", version: \"9.9.9\" };\n setupWaitForAppAndVersionDAMock(freshApp);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n try {\n expect(isSupportedMock).toHaveBeenCalledWith(freshApp);\n resolve();\n } catch (e) {\n reject(e as Error);\n }\n },\n onError: reject,\n });\n }));\n\n it(\"surfaces a WaitForAppAndVersion failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const waitError = new UnknownDAError(\"could not read app and version\");\n setupWaitForAppAndVersionDAMock({ error: waitError });\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: waitError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n expect(editIdentifierMock).not.toHaveBeenCalled();\n }));\n\n it(\"propagates the UnlockDevice interaction emitted by WaitForAppAndVersion\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupWaitForAppAndVersionDAMock(\n FRESH_APP,\n UserInteractionRequired.UnlockDevice,\n );\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressIdentifierDAOutput,\n EditExternalAddressIdentifierDAError,\n EditExternalAddressIdentifierDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "UnknownDAError", "UserInteractionRequired", "beforeEach", "describe", "it", "vi", "makeDeviceActionInternalApiMock", "setupOpenAppDAMock", "setupWaitForAppAndVersionDAMock", "testDeviceActionStates", "ContactsCommandError", "ContactsVersionRequirementError", "EditExternalAddressIdentifierDeviceAction", "validateEditExternalAddressIdentifierInput", "importOriginal", "FRESH_APP", "GROUP_HANDLE", "HMAC_PROOF", "HMAC_REST_OLD", "HMAC_REST_NEW", "PREVIOUS_IDENTIFIER", "NEW_IDENTIFIER", "OK_PROOF", "BASE_INPUT", "EXPECTED_OUTPUT", "apiMock", "isSupportedMock", "editIdentifierMock", "extractDeps", "makeAction", "input", "action", "resolve", "reject", "expected", "e", "openAppError", "commandError", "invalidInput", "validationError", "freshApp", "waitError"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{ContactsValidationError as n}from"../../../app-binder/model/contactsValidation";import{validateEditExternalAddressIdentifierInput as t}from"./validateEditExternalAddressIdentifierInput";const r={contactName:"Alice",scope:"Eth main",previousIdentifier:new Uint8Array(20).fill(17),newIdentifier:new Uint8Array(20).fill(34),blockchainFamily:"ethereum",chainId:1n,groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221),hmacRest:new Uint8Array(32).fill(170)};describe("validateEditExternalAddressIdentifierInput",()=>{it("returns null for a valid input",()=>{expect(t(r)).toBeNull()}),it("rejects an empty contactName",()=>{const e=t({...r,contactName:""});expect(e).toBeInstanceOf(n)}),it("rejects a non-printable scope",()=>{const e=t({...r,scope:"caf\xE9"});expect(e).toBeInstanceOf(n)}),it("rejects an unsupported blockchain family",()=>{const e=t({...r,blockchainFamily:"dogecoin"});expect(e).toBeInstanceOf(n)}),it("rejects a previousIdentifier of the wrong length for Ethereum",()=>{const e=t({...r,previousIdentifier:new Uint8Array(19).fill(17)});expect(e).toBeInstanceOf(n)}),it("rejects a newIdentifier of the wrong length for Ethereum",()=>{const e=t({...r,newIdentifier:new Uint8Array(21).fill(34)});expect(e).toBeInstanceOf(n)}),it("requires chainId for the Ethereum family",()=>{const e=t({...r,chainId:void 0});expect(e).toBeInstanceOf(n)}),describe("Solana",()=>{const e={...r,previousIdentifier:new Uint8Array(32).fill(17),newIdentifier:new Uint8Array(32).fill(34),blockchainFamily:"solana",chainId:void 0};it("accepts 32-byte public keys without chainId",()=>{expect(t(e)).toBeNull()}),it.each(["previousIdentifier","newIdentifier"])("rejects a %s that is not 32 bytes",i=>{const a=t({...e,[i]:new Uint8Array(20)});expect(a).toBeInstanceOf(n),expect(a?.message).toContain(i)}),it("rejects a chainId",()=>{expect(t({...e,chainId:1n})).toBeInstanceOf(n)})}),it("rejects a groupHandle of the wrong length",()=>{const e=t({...r,groupHandle:new Uint8Array(63).fill(204)});expect(e).toBeInstanceOf(n)}),it("rejects an hmacProof of the wrong length",()=>{const e=t({...r,hmacProof:new Uint8Array(31).fill(221)});expect(e).toBeInstanceOf(n)}),it("rejects an hmacRest of the wrong length",()=>{const e=t({...r,hmacRest:new Uint8Array(33).fill(170)});expect(e).toBeInstanceOf(n)})});
|
|
2
|
-
//# sourceMappingURL=validateEditExternalAddressIdentifierInput.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../src/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { type EditExternalAddressIdentifierInput } from \"@api/model/EditExternalAddressIdentifier\";\nimport { ContactsValidationError } from \"@internal/app-binder/model/contactsValidation\";\n\nimport { validateEditExternalAddressIdentifierInput } from \"./validateEditExternalAddressIdentifierInput\";\n\nconst VALID_INPUT: EditExternalAddressIdentifierInput = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n previousIdentifier: new Uint8Array(20).fill(0x11),\n newIdentifier: new Uint8Array(20).fill(0x22),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n hmacRest: new Uint8Array(32).fill(0xaa),\n};\n\ndescribe(\"validateEditExternalAddressIdentifierInput\", () => {\n it(\"returns null for a valid input\", () => {\n expect(validateEditExternalAddressIdentifierInput(VALID_INPUT)).toBeNull();\n });\n\n it(\"rejects an empty contactName\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n contactName: \"\",\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a non-printable scope\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n scope: \"caf\u00E9\", // 0xC3 0xA9 is non-ASCII\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an unsupported blockchain family\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n blockchainFamily: \"dogecoin\",\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a previousIdentifier of the wrong length for Ethereum\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n previousIdentifier: new Uint8Array(19).fill(0x11),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a newIdentifier of the wrong length for Ethereum\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n newIdentifier: new Uint8Array(21).fill(0x22),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"requires chainId for the Ethereum family\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n chainId: undefined,\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n describe(\"Solana\", () => {\n const SOLANA_INPUT: EditExternalAddressIdentifierInput = {\n ...VALID_INPUT,\n previousIdentifier: new Uint8Array(32).fill(0x11),\n newIdentifier: new Uint8Array(32).fill(0x22),\n blockchainFamily: \"solana\",\n chainId: undefined,\n };\n\n it(\"accepts 32-byte public keys without chainId\", () => {\n expect(\n validateEditExternalAddressIdentifierInput(SOLANA_INPUT),\n ).toBeNull();\n });\n\n it.each([\"previousIdentifier\", \"newIdentifier\"] as const)(\n \"rejects a %s that is not 32 bytes\",\n (field) => {\n const error = validateEditExternalAddressIdentifierInput({\n ...SOLANA_INPUT,\n [field]: new Uint8Array(20),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n expect(error?.message).toContain(field);\n },\n );\n\n it(\"rejects a chainId\", () => {\n expect(\n validateEditExternalAddressIdentifierInput({\n ...SOLANA_INPUT,\n chainId: 1n,\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n });\n\n it(\"rejects a groupHandle of the wrong length\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n groupHandle: new Uint8Array(63).fill(0xcc),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an hmacProof of the wrong length\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n hmacProof: new Uint8Array(31).fill(0xdd),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an hmacRest of the wrong length\", () => {\n const error = validateEditExternalAddressIdentifierInput({\n ...VALID_INPUT,\n hmacRest: new Uint8Array(33).fill(0xaa),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["ContactsValidationError", "validateEditExternalAddressIdentifierInput", "VALID_INPUT", "error", "SOLANA_INPUT", "field"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{CommandResultFactory as V,DeviceActionStatus as e,DeviceModelId as C,DeviceSessionStateType as y,DeviceStatus as R,UnknownDAError as h,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{beforeEach as q,describe as N,it as c,vi as m}from"vitest";import{makeDeviceActionInternalApiMock as w}from"../../../app-binder/device-action/__test-utils__/makeInternalApi";import{setupOpenAppDAMock as p}from"../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock";import{setupWaitForAppAndVersionDAMock as v}from"../../../app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock";import{testDeviceActionStates as u}from"../../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{ContactsCommandError as H,ContactsVersionRequirementError as M}from"../../../app-binder/model/contactsErrors";import{EditExternalAddressScopeDeviceAction as T}from"./EditExternalAddressScopeDeviceAction";import{validateEditExternalAddressScopeInput as P}from"./validateEditExternalAddressScopeInput";m.mock("@ledgerhq/device-management-kit",async a=>({...await a(),OpenAppDeviceAction:m.fn(()=>({makeStateMachine:m.fn()})),WaitForAppAndVersionDeviceAction:m.fn(()=>({makeStateMachine:m.fn()}))}));const g={name:"Ethereum",version:"1.15.0"},k=new Uint8Array(64).fill(204),x=new Uint8Array(32).fill(221),U=new Uint8Array(32).fill(170),f=new Uint8Array(32).fill(136),I=new Uint8Array(20).fill(17),B={hmacRest:f},l={contactName:"Alice",previousScope:"Eth main",newScope:"Eth cold",identifier:I,blockchainFamily:"ethereum",chainId:1n,groupHandle:k,hmacProof:x,hmacRest:U,appName:"Ethereum"},E={contactName:"Alice",previousScope:"Eth main",scope:"Eth cold",identifier:I,blockchainFamily:"ethereum",chainId:1n,groupHandle:k,hmacProof:x,hmacRest:f};N("EditExternalAddressScopeDeviceAction",()=>{let a,A,D;function O(){return{isSupported:A,editScope:D}}q(()=>{a=w(),v(g),A=m.fn().mockReturnValue(!0),D=m.fn().mockResolvedValue(V({data:B})),a.getDeviceSessionState.mockReturnValue({sessionStateType:y.ReadyWithoutSecureChannel,deviceStatus:R.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:C.FLEX,isSecureConnectionAllowed:!0})});function d(o){const n=new T({input:o});return m.spyOn(n,"extractDependencies").mockReturnValue(O()),n}c("open-app path: OpenApp -> VersionGuard -> EditScope -> Completed",()=>new Promise((o,n)=>{p();const r=d({...l,skipOpenApp:!1}),i=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:E,status:e.Completed}];u(r,i,a,{onDone:o,onError:n})})),c("skip-open-app path: VersionGuard -> EditScope -> Completed, preserving the group proof and identifier",()=>new Promise((o,n)=>{p();const r=d({...l,skipOpenApp:!0}),i=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:E,status:e.Completed}];u(r,i,a,{onDone:()=>{try{expect(E.hmacProof).toBe(x),expect(E.identifier).toBe(I),expect(E.hmacRest).toBe(f),expect(E.hmacRest).not.toBe(U),o()}catch(s){n(s)}},onError:n})})),c("version guard rejects on skip-open-app path without running EDIT SCOPE",()=>new Promise((o,n)=>{p(),A.mockReturnValue(!1);const r=d({...l,skipOpenApp:!0}),i=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{error:new M,status:e.Error}];u(r,i,a,{onDone:o,onError:n}),expect(D).not.toHaveBeenCalled()})),c("surfaces an open-app failure as the device action error",()=>new Promise((o,n)=>{const r=new h("open app failed");p(r);const i=d({...l,skipOpenApp:!1}),s=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{error:r,status:e.Error}];u(i,s,a,{onDone:o,onError:n}),expect(A).not.toHaveBeenCalled()})),c("surfaces an Edit Scope command error",()=>new Promise((o,n)=>{p();const r=new H({errorCode:"6982",message:"seed mismatch"});D.mockResolvedValue(V({error:r}));const i=d({...l,skipOpenApp:!0}),s=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{error:r,status:e.Error}];u(i,s,a,{onDone:o,onError:n})})),c("surfaces invalid input as a typed error state on the skip-open-app path",()=>new Promise((o,n)=>{p();const r={...l,skipOpenApp:!0,contactName:""},i=P(r),s=d(r),S=[{error:i,status:e.Error}];u(s,S,a,{onDone:o,onError:n}),expect(A).not.toHaveBeenCalled(),expect(D).not.toHaveBeenCalled()})),c("validates only after opening the app on the default path",()=>new Promise((o,n)=>{p();const r={...l,skipOpenApp:!1,contactName:""},i=P(r),s=d(r),S=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{error:i,status:e.Error}];u(s,S,a,{onDone:o,onError:n}),expect(D).not.toHaveBeenCalled()})),c("evaluates support from the fresh WaitForAppAndVersion result, not stale session state",()=>new Promise((o,n)=>{p();const r={name:"Ethereum",version:"9.9.9"};v(r);const i=d({...l,skipOpenApp:!0}),s=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:E,status:e.Completed}];u(i,s,a,{onDone:()=>{try{expect(A).toHaveBeenCalledWith(r),o()}catch(S){n(S)}},onError:n})})),c("surfaces a WaitForAppAndVersion failure as the device action error",()=>new Promise((o,n)=>{p();const r=new h("could not read app and version");v({error:r});const i=d({...l,skipOpenApp:!0}),s=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{error:r,status:e.Error}];u(i,s,a,{onDone:o,onError:n}),expect(A).not.toHaveBeenCalled(),expect(D).not.toHaveBeenCalled()})),c("propagates the UnlockDevice interaction emitted by WaitForAppAndVersion",()=>new Promise((o,n)=>{p(),v(g,t.UnlockDevice);const r=d({...l,skipOpenApp:!0}),i=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.UnlockDevice},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:E,status:e.Completed}];u(r,i,a,{onDone:o,onError:n})}))});
|
|
2
|
-
//# sourceMappingURL=EditExternalAddressScopeDeviceAction.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../src/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type EditExternalAddressScopeDAError,\n type EditExternalAddressScopeDAInput,\n type EditExternalAddressScopeDAIntermediateValue,\n type EditExternalAddressScopeDAOutput,\n} from \"@api/app-binder/EditExternalAddressScopeDeviceActionTypes\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { setupWaitForAppAndVersionDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport {\n ContactsCommandError,\n ContactsVersionRequirementError,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nimport { EditExternalAddressScopeDeviceAction } from \"./EditExternalAddressScopeDeviceAction\";\nimport { validateEditExternalAddressScopeInput } from \"./validateEditExternalAddressScopeInput\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n // eslint-disable-next-line @typescript-eslint/consistent-type-imports\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n WaitForAppAndVersionDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\nconst FRESH_APP = { name: \"Ethereum\", version: \"1.15.0\" };\n\nconst GROUP_HANDLE = new Uint8Array(64).fill(0xcc);\nconst HMAC_PROOF = new Uint8Array(32).fill(0xdd);\nconst HMAC_REST_OLD = new Uint8Array(32).fill(0xaa);\nconst HMAC_REST_NEW = new Uint8Array(32).fill(0x88);\nconst IDENTIFIER = new Uint8Array(20).fill(0x11);\n\nconst OK_PROOF = { hmacRest: HMAC_REST_NEW };\n\nconst BASE_INPUT = {\n contactName: \"Alice\",\n previousScope: \"Eth main\",\n newScope: \"Eth cold\",\n identifier: IDENTIFIER,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF,\n hmacRest: HMAC_REST_OLD,\n appName: \"Ethereum\",\n};\n\nconst EXPECTED_OUTPUT = {\n contactName: \"Alice\",\n previousScope: \"Eth main\",\n scope: \"Eth cold\",\n identifier: IDENTIFIER,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: GROUP_HANDLE,\n // Preserved: the group-level name proof is unchanged by a scope edit.\n hmacProof: HMAC_PROOF,\n // Rotated: only the address-level proof changes.\n hmacRest: HMAC_REST_NEW,\n};\n\ndescribe(\"EditExternalAddressScopeDeviceAction\", () => {\n let apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\n let isSupportedMock: ReturnType<typeof vi.fn>;\n let editScopeMock: ReturnType<typeof vi.fn>;\n\n function extractDeps() {\n return {\n isSupported: isSupportedMock,\n editScope: editScopeMock,\n };\n }\n\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n setupWaitForAppAndVersionDAMock(FRESH_APP);\n isSupportedMock = vi.fn().mockReturnValue(true);\n editScopeMock = vi\n .fn()\n .mockResolvedValue(CommandResultFactory({ data: OK_PROOF }));\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.15.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: true,\n });\n });\n\n function makeAction(input: EditExternalAddressScopeDAInput) {\n const action = new EditExternalAddressScopeDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n return action;\n }\n\n it(\"open-app path: OpenApp -> VersionGuard -> EditScope -> Completed\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: false });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"skip-open-app path: VersionGuard -> EditScope -> Completed, preserving the group proof and identifier\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n try {\n // The device rotates only the address-level hmac_rest; the contact\n // group's name proof and the entry's identifier pass through\n // unchanged.\n expect(EXPECTED_OUTPUT.hmacProof).toBe(HMAC_PROOF);\n expect(EXPECTED_OUTPUT.identifier).toBe(IDENTIFIER);\n expect(EXPECTED_OUTPUT.hmacRest).toBe(HMAC_REST_NEW);\n expect(EXPECTED_OUTPUT.hmacRest).not.toBe(HMAC_REST_OLD);\n resolve();\n } catch (e) {\n reject(e as Error);\n }\n },\n onError: reject,\n });\n }));\n\n it(\"version guard rejects on skip-open-app path without running EDIT SCOPE\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n isSupportedMock.mockReturnValue(false);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new ContactsVersionRequirementError(),\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(editScopeMock).not.toHaveBeenCalled();\n }));\n\n it(\"surfaces an open-app failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n const openAppError = new UnknownDAError(\"open app failed\");\n setupOpenAppDAMock(openAppError);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: false });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: openAppError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n }));\n\n it(\"surfaces an Edit Scope command error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const commandError = new ContactsCommandError({\n errorCode: \"6982\",\n message: \"seed mismatch\",\n });\n editScopeMock.mockResolvedValue(\n CommandResultFactory({ error: commandError }),\n );\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: commandError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"surfaces invalid input as a typed error state on the skip-open-app path\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const invalidInput = {\n ...BASE_INPUT,\n skipOpenApp: true,\n contactName: \"\",\n };\n const validationError =\n validateEditExternalAddressScopeInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n expect(editScopeMock).not.toHaveBeenCalled();\n }));\n\n it(\"validates only after opening the app on the default path\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const invalidInput = {\n ...BASE_INPUT,\n skipOpenApp: false,\n contactName: \"\",\n };\n const validationError =\n validateEditExternalAddressScopeInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(editScopeMock).not.toHaveBeenCalled();\n }));\n\n it(\"evaluates support from the fresh WaitForAppAndVersion result, not stale session state\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const freshApp = { name: \"Ethereum\", version: \"9.9.9\" };\n setupWaitForAppAndVersionDAMock(freshApp);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n try {\n expect(isSupportedMock).toHaveBeenCalledWith(freshApp);\n resolve();\n } catch (e) {\n reject(e as Error);\n }\n },\n onError: reject,\n });\n }));\n\n it(\"surfaces a WaitForAppAndVersion failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const waitError = new UnknownDAError(\"could not read app and version\");\n setupWaitForAppAndVersionDAMock({ error: waitError });\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: waitError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n expect(editScopeMock).not.toHaveBeenCalled();\n }));\n\n it(\"propagates the UnlockDevice interaction emitted by WaitForAppAndVersion\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupWaitForAppAndVersionDAMock(\n FRESH_APP,\n UserInteractionRequired.UnlockDevice,\n );\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n EditExternalAddressScopeDAOutput,\n EditExternalAddressScopeDAError,\n EditExternalAddressScopeDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "UnknownDAError", "UserInteractionRequired", "beforeEach", "describe", "it", "vi", "makeDeviceActionInternalApiMock", "setupOpenAppDAMock", "setupWaitForAppAndVersionDAMock", "testDeviceActionStates", "ContactsCommandError", "ContactsVersionRequirementError", "EditExternalAddressScopeDeviceAction", "validateEditExternalAddressScopeInput", "importOriginal", "FRESH_APP", "GROUP_HANDLE", "HMAC_PROOF", "HMAC_REST_OLD", "HMAC_REST_NEW", "IDENTIFIER", "OK_PROOF", "BASE_INPUT", "EXPECTED_OUTPUT", "apiMock", "isSupportedMock", "editScopeMock", "extractDeps", "makeAction", "input", "action", "resolve", "reject", "expected", "e", "openAppError", "commandError", "invalidInput", "validationError", "freshApp", "waitError"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{ContactsValidationError as n}from"../../../app-binder/model/contactsValidation";import{validateEditExternalAddressScopeInput as t}from"./validateEditExternalAddressScopeInput";const r={contactName:"Alice",previousScope:"Eth main",newScope:"Eth cold",identifier:new Uint8Array(20).fill(17),blockchainFamily:"ethereum",chainId:1n,groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221),hmacRest:new Uint8Array(32).fill(170)};describe("validateEditExternalAddressScopeInput",()=>{it("returns null for a valid input",()=>{expect(t(r)).toBeNull()}),it("rejects an empty contactName",()=>{const e=t({...r,contactName:""});expect(e).toBeInstanceOf(n)}),it("rejects a non-printable previousScope",()=>{const e=t({...r,previousScope:"caf\xE9"});expect(e).toBeInstanceOf(n)}),it("rejects a non-printable newScope",()=>{const e=t({...r,newScope:"caf\xE9"});expect(e).toBeInstanceOf(n)}),it("rejects an unsupported blockchain family",()=>{const e=t({...r,blockchainFamily:"dogecoin"});expect(e).toBeInstanceOf(n)}),it("rejects an identifier of the wrong length for Ethereum",()=>{const e=t({...r,identifier:new Uint8Array(19).fill(17)});expect(e).toBeInstanceOf(n)}),it("requires chainId for the Ethereum family",()=>{const e=t({...r,chainId:void 0});expect(e).toBeInstanceOf(n)}),describe("Solana",()=>{const e={...r,identifier:new Uint8Array(32).fill(17),blockchainFamily:"solana",chainId:void 0};it("accepts a 32-byte public key without chainId",()=>{expect(t(e)).toBeNull()}),it("rejects an identifier that is not 32 bytes",()=>{expect(t({...e,identifier:new Uint8Array(20)})).toBeInstanceOf(n)}),it("rejects a chainId",()=>{expect(t({...e,chainId:1n})).toBeInstanceOf(n)})}),it("rejects a groupHandle of the wrong length",()=>{const e=t({...r,groupHandle:new Uint8Array(63).fill(204)});expect(e).toBeInstanceOf(n)}),it("rejects an hmacProof of the wrong length",()=>{const e=t({...r,hmacProof:new Uint8Array(31).fill(221)});expect(e).toBeInstanceOf(n)}),it("rejects an hmacRest of the wrong length",()=>{const e=t({...r,hmacRest:new Uint8Array(33).fill(170)});expect(e).toBeInstanceOf(n)})});
|
|
2
|
-
//# sourceMappingURL=validateEditExternalAddressScopeInput.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../src/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { type EditExternalAddressScopeInput } from \"@api/model/EditExternalAddressScope\";\nimport { ContactsValidationError } from \"@internal/app-binder/model/contactsValidation\";\n\nimport { validateEditExternalAddressScopeInput } from \"./validateEditExternalAddressScopeInput\";\n\nconst VALID_INPUT: EditExternalAddressScopeInput = {\n contactName: \"Alice\",\n previousScope: \"Eth main\",\n newScope: \"Eth cold\",\n identifier: new Uint8Array(20).fill(0x11),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n hmacRest: new Uint8Array(32).fill(0xaa),\n};\n\ndescribe(\"validateEditExternalAddressScopeInput\", () => {\n it(\"returns null for a valid input\", () => {\n expect(validateEditExternalAddressScopeInput(VALID_INPUT)).toBeNull();\n });\n\n it(\"rejects an empty contactName\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n contactName: \"\",\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a non-printable previousScope\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n previousScope: \"caf\u00E9\", // 0xC3 0xA9 is non-ASCII\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a non-printable newScope\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n newScope: \"caf\u00E9\",\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an unsupported blockchain family\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n blockchainFamily: \"dogecoin\",\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an identifier of the wrong length for Ethereum\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n identifier: new Uint8Array(19).fill(0x11),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"requires chainId for the Ethereum family\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n chainId: undefined,\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n describe(\"Solana\", () => {\n const SOLANA_INPUT: EditExternalAddressScopeInput = {\n ...VALID_INPUT,\n identifier: new Uint8Array(32).fill(0x11),\n blockchainFamily: \"solana\",\n chainId: undefined,\n };\n\n it(\"accepts a 32-byte public key without chainId\", () => {\n expect(validateEditExternalAddressScopeInput(SOLANA_INPUT)).toBeNull();\n });\n\n it(\"rejects an identifier that is not 32 bytes\", () => {\n expect(\n validateEditExternalAddressScopeInput({\n ...SOLANA_INPUT,\n identifier: new Uint8Array(20),\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects a chainId\", () => {\n expect(\n validateEditExternalAddressScopeInput({ ...SOLANA_INPUT, chainId: 1n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n });\n\n it(\"rejects a groupHandle of the wrong length\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n groupHandle: new Uint8Array(63).fill(0xcc),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an hmacProof of the wrong length\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n hmacProof: new Uint8Array(31).fill(0xdd),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"rejects an hmacRest of the wrong length\", () => {\n const error = validateEditExternalAddressScopeInput({\n ...VALID_INPUT,\n hmacRest: new Uint8Array(33).fill(0xaa),\n });\n expect(error).toBeInstanceOf(ContactsValidationError);\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["ContactsValidationError", "validateEditExternalAddressScopeInput", "VALID_INPUT", "error", "SOLANA_INPUT"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{CommandResultFactory as x,DeviceActionStatus as e,DeviceModelId as V,DeviceSessionStateType as k,DeviceStatus as P,UnknownDAError as R,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{beforeEach as y,describe as U,it as p,vi as m}from"vitest";import{makeDeviceActionInternalApiMock as O}from"../../../app-binder/device-action/__test-utils__/makeInternalApi";import{setupOpenAppDAMock as u}from"../../../app-binder/device-action/__test-utils__/setupOpenAppDAMock";import{setupWaitForAppAndVersionDAMock as v}from"../../../app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock";import{testDeviceActionStates as l}from"../../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{ContactsCommandError as C,ContactsVersionRequirementError as w}from"../../../app-binder/model/contactsErrors";import{RegisterExternalAddressDeviceAction as q}from"./RegisterExternalAddressDeviceAction";import{validateRegisterExternalAddressInput as f}from"./validateRegisterExternalAddressInput";m.mock("@ledgerhq/device-management-kit",async o=>({...await o(),OpenAppDeviceAction:m.fn(()=>({makeStateMachine:m.fn()})),WaitForAppAndVersionDeviceAction:m.fn(()=>({makeStateMachine:m.fn()}))}));const I={name:"Ethereum",version:"1.15.0"},D={groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221),hmacRest:new Uint8Array(32).fill(170)},s={contactName:"Alice",scope:"Eth main",identifier:new Uint8Array(20).fill(17),blockchainFamily:"ethereum",chainId:1n,appName:"Ethereum"};U("RegisterExternalAddressDeviceAction",()=>{let o,A,g;function h(){return{isSupported:A,registerIdentity:g}}y(()=>{o=O(),v(I),A=m.fn().mockReturnValue(!0),g=m.fn().mockResolvedValue(x({data:D})),o.getDeviceSessionState.mockReturnValue({sessionStateType:k.ReadyWithoutSecureChannel,deviceStatus:P.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:V.FLEX,isSecureConnectionAllowed:!0})});function c(i){const n=new q({input:i});return m.spyOn(n,"extractDependencies").mockReturnValue(h()),n}p("open-app path, new contact group: OpenApp -> VersionGuard -> RegisterIdentity -> Completed",()=>new Promise((i,n)=>{u();const r=c({...s,skipOpenApp:!1}),a=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:{mode:"newContactGroup",contactName:"Alice",scope:"Eth main",identifier:s.identifier,blockchainFamily:"ethereum",chainId:1n,...D},status:e.Completed}];l(r,a,o,{onDone:i,onError:n})})),p("skip-open-app path, existing contact group: VersionGuard -> RegisterIdentity -> Completed",()=>new Promise((i,n)=>{u();const r={groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221)},a=c({...s,skipOpenApp:!0,existingContactGroup:r}),d=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:{mode:"existingContactGroup",contactName:"Alice",scope:"Eth main",identifier:s.identifier,blockchainFamily:"ethereum",chainId:1n,...D},status:e.Completed}];l(a,d,o,{onDone:i,onError:n})})),p("version guard rejects on skip-open-app path without opening the app",()=>new Promise((i,n)=>{u(),A.mockReturnValue(!1);const r=c({...s,skipOpenApp:!0}),a=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{error:new w,status:e.Error}];l(r,a,o,{onDone:i,onError:n}),expect(g).not.toHaveBeenCalled()})),p("surfaces an open-app failure as the device action error",()=>new Promise((i,n)=>{const r=new R("open app failed");u(r);const a=c({...s,skipOpenApp:!1}),d=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{error:r,status:e.Error}];l(a,d,o,{onDone:i,onError:n}),expect(A).not.toHaveBeenCalled()})),p("surfaces a Register Identity command error",()=>new Promise((i,n)=>{u();const r=new C({errorCode:"6a80",message:"device rejected"});g.mockResolvedValue(x({error:r}));const a=c({...s,skipOpenApp:!0}),d=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{error:r,status:e.Error}];l(a,d,o,{onDone:i,onError:n})})),p("surfaces invalid input as a typed error state on the skip-open-app path",()=>new Promise((i,n)=>{u();const r={...s,skipOpenApp:!0,contactName:""},a=f(r),d=c(r),E=[{error:a,status:e.Error}];l(d,E,o,{onDone:i,onError:n}),expect(A).not.toHaveBeenCalled(),expect(g).not.toHaveBeenCalled()})),p("validates only after opening the app on the default path",()=>new Promise((i,n)=>{u();const r={...s,skipOpenApp:!1,contactName:""},a=f(r),d=c(r),E=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{error:a,status:e.Error}];l(d,E,o,{onDone:i,onError:n}),expect(g).not.toHaveBeenCalled()})),p("evaluates support from the fresh WaitForAppAndVersion result, not stale session state",()=>new Promise((i,n)=>{u();const r={name:"Ethereum",version:"9.9.9"};v(r);const a=c({...s,skipOpenApp:!0}),d=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:{mode:"newContactGroup",contactName:"Alice",scope:"Eth main",identifier:s.identifier,blockchainFamily:"ethereum",chainId:1n,...D},status:e.Completed}];l(a,d,o,{onDone:()=>{try{expect(A).toHaveBeenCalledWith(r),i()}catch(E){n(E)}},onError:n})})),p("surfaces a WaitForAppAndVersion failure as the device action error",()=>new Promise((i,n)=>{u();const r=new R("could not read app and version");v({error:r});const a=c({...s,skipOpenApp:!0}),d=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{error:r,status:e.Error}];l(a,d,o,{onDone:i,onError:n}),expect(A).not.toHaveBeenCalled(),expect(g).not.toHaveBeenCalled()})),p("propagates the UnlockDevice interaction emitted by WaitForAppAndVersion",()=>new Promise((i,n)=>{u(),v(I,t.UnlockDevice);const r=c({...s,skipOpenApp:!0}),a=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.UnlockDevice},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.RegisterWallet},status:e.Pending},{output:{mode:"newContactGroup",contactName:"Alice",scope:"Eth main",identifier:s.identifier,blockchainFamily:"ethereum",chainId:1n,...D},status:e.Completed}];l(r,a,o,{onDone:i,onError:n})}))});
|
|
2
|
-
//# sourceMappingURL=RegisterExternalAddressDeviceAction.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../src/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type RegisterExternalAddressDAError,\n type RegisterExternalAddressDAInput,\n type RegisterExternalAddressDAIntermediateValue,\n type RegisterExternalAddressDAOutput,\n} from \"@api/app-binder/RegisterExternalAddressDeviceActionTypes\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { setupWaitForAppAndVersionDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport {\n ContactsCommandError,\n ContactsVersionRequirementError,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nimport { RegisterExternalAddressDeviceAction } from \"./RegisterExternalAddressDeviceAction\";\nimport { validateRegisterExternalAddressInput } from \"./validateRegisterExternalAddressInput\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n // eslint-disable-next-line @typescript-eslint/consistent-type-imports\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n WaitForAppAndVersionDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\nconst FRESH_APP = { name: \"Ethereum\", version: \"1.15.0\" };\n\nconst OK_PROOFS = {\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n hmacRest: new Uint8Array(32).fill(0xaa),\n};\n\nconst BASE_INPUT = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: new Uint8Array(20).fill(0x11),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n appName: \"Ethereum\",\n};\n\ndescribe(\"RegisterExternalAddressDeviceAction\", () => {\n let apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\n let isSupportedMock: ReturnType<typeof vi.fn>;\n let registerIdentityMock: ReturnType<typeof vi.fn>;\n\n function extractDeps() {\n return {\n isSupported: isSupportedMock,\n registerIdentity: registerIdentityMock,\n };\n }\n\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n setupWaitForAppAndVersionDAMock(FRESH_APP);\n isSupportedMock = vi.fn().mockReturnValue(true);\n registerIdentityMock = vi\n .fn()\n .mockResolvedValue(CommandResultFactory({ data: OK_PROOFS }));\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.15.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: true,\n });\n });\n\n function makeAction(input: RegisterExternalAddressDAInput) {\n const action = new RegisterExternalAddressDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n return action;\n }\n\n it(\"open-app path, new contact group: OpenApp -> VersionGuard -> RegisterIdentity -> Completed\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: false });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n // WaitForAppAndVersion phase: entry reset, then the child's silent read\n // re-emits None through onSnapshot propagation.\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n mode: \"newContactGroup\",\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: BASE_INPUT.identifier,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n ...OK_PROOFS,\n },\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"skip-open-app path, existing contact group: VersionGuard -> RegisterIdentity -> Completed\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const existingContactGroup = {\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n };\n const action = makeAction({\n ...BASE_INPUT,\n skipOpenApp: true,\n existingContactGroup,\n });\n\n const expected = [\n // WaitForAppAndVersion phase: entry reset, then the child's silent read\n // re-emits None through onSnapshot propagation.\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n mode: \"existingContactGroup\",\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: BASE_INPUT.identifier,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n ...OK_PROOFS,\n },\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"version guard rejects on skip-open-app path without opening the app\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n isSupportedMock.mockReturnValue(false);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n // WaitForAppAndVersion phase (entry reset + child read) runs before the\n // guard; both reads emit None.\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new ContactsVersionRequirementError(),\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(registerIdentityMock).not.toHaveBeenCalled();\n }));\n\n it(\"surfaces an open-app failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n const openAppError = new UnknownDAError(\"open app failed\");\n setupOpenAppDAMock(openAppError);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: false });\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: openAppError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(isSupportedMock).not.toHaveBeenCalled();\n }));\n\n it(\"surfaces a Register Identity command error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const commandError = new ContactsCommandError({\n errorCode: \"6a80\",\n message: \"device rejected\",\n });\n registerIdentityMock.mockResolvedValue(\n CommandResultFactory({ error: commandError }),\n );\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n // WaitForAppAndVersion phase: entry reset, then the child's silent read\n // re-emits None through onSnapshot propagation.\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: commandError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"surfaces invalid input as a typed error state on the skip-open-app path\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const invalidInput = {\n ...BASE_INPUT,\n skipOpenApp: true,\n contactName: \"\",\n };\n const validationError =\n validateRegisterExternalAddressInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n // Validation fails before the version guard and before any APDU.\n expect(isSupportedMock).not.toHaveBeenCalled();\n expect(registerIdentityMock).not.toHaveBeenCalled();\n }));\n\n it(\"validates only after opening the app on the default path\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const invalidInput = {\n ...BASE_INPUT,\n skipOpenApp: false,\n contactName: \"\",\n };\n const validationError =\n validateRegisterExternalAddressInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n expect(registerIdentityMock).not.toHaveBeenCalled();\n }));\n\n it(\"evaluates support from the fresh WaitForAppAndVersion result, not stale session state\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n // Session state (from beforeEach) reports version 1.15.0; the fresh read\n // reports a different version, which is what the guard must use.\n const freshApp = { name: \"Ethereum\", version: \"9.9.9\" };\n setupWaitForAppAndVersionDAMock(freshApp);\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n // WaitForAppAndVersion phase: entry reset + child read, both None.\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n mode: \"newContactGroup\",\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: BASE_INPUT.identifier,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n ...OK_PROOFS,\n },\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n try {\n expect(isSupportedMock).toHaveBeenCalledWith(freshApp);\n resolve();\n } catch (e) {\n reject(e as Error);\n }\n },\n onError: reject,\n });\n }));\n\n it(\"surfaces a WaitForAppAndVersion failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n const waitError = new UnknownDAError(\"could not read app and version\");\n setupWaitForAppAndVersionDAMock({ error: waitError });\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n // WaitForAppAndVersion phase: entry reset + child read, both None,\n // before the child DA surfaces its failure.\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: waitError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n // The version guard and the APDU are never reached.\n expect(isSupportedMock).not.toHaveBeenCalled();\n expect(registerIdentityMock).not.toHaveBeenCalled();\n }));\n\n it(\"propagates the UnlockDevice interaction emitted by WaitForAppAndVersion\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n // Locked device: the child WaitForAppAndVersion DA requests an unlock\n // before it can read the app/version. The parent must surface it so a\n // consuming client can show a \"please unlock your device\" prompt.\n setupWaitForAppAndVersionDAMock(\n FRESH_APP,\n UserInteractionRequired.UnlockDevice,\n );\n const action = makeAction({ ...BASE_INPUT, skipOpenApp: true });\n\n const expected = [\n // Entry reset before the child DA runs.\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // Propagated from the child DA: the device needs to be unlocked.\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n mode: \"newContactGroup\",\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: BASE_INPUT.identifier,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n ...OK_PROOFS,\n },\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n RegisterExternalAddressDAOutput,\n RegisterExternalAddressDAError,\n RegisterExternalAddressDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "UnknownDAError", "UserInteractionRequired", "beforeEach", "describe", "it", "vi", "makeDeviceActionInternalApiMock", "setupOpenAppDAMock", "setupWaitForAppAndVersionDAMock", "testDeviceActionStates", "ContactsCommandError", "ContactsVersionRequirementError", "RegisterExternalAddressDeviceAction", "validateRegisterExternalAddressInput", "importOriginal", "FRESH_APP", "OK_PROOFS", "BASE_INPUT", "apiMock", "isSupportedMock", "registerIdentityMock", "extractDeps", "makeAction", "input", "action", "resolve", "reject", "expected", "existingContactGroup", "openAppError", "commandError", "invalidInput", "validationError", "freshApp", "e", "waitError"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{ContactsValidationError as t}from"../../../app-binder/model/contactsValidation";import{validateRegisterExternalAddressInput as e}from"./validateRegisterExternalAddressInput";const n={contactName:"Alice",scope:"Eth main",identifier:new Uint8Array(20).fill(17),blockchainFamily:"ethereum",chainId:1n};describe("validateRegisterExternalAddressInput",()=>{it("returns null for valid input",()=>{expect(e(n)).toBeNull()}),it("returns null for a valid existing-contact-group input",()=>{expect(e({...n,existingContactGroup:{groupHandle:new Uint8Array(64),hmacProof:new Uint8Array(32)}})).toBeNull()}),it("returns a ContactsValidationError for a non-printable contact name",()=>{expect(e({...n,contactName:"Am\xE9lie"})).toBeInstanceOf(t)}),it("returns an error for an Ethereum identifier of the wrong length",()=>{expect(e({...n,identifier:new Uint8Array(19)})).toBeInstanceOf(t)}),it("returns an error for an unsupported blockchain family",()=>{expect(e({...n,blockchainFamily:"dogecoin"})).toBeInstanceOf(t)}),it("returns an error when chainId is missing for the Ethereum family",()=>{expect(e({...n,chainId:void 0})).toBeInstanceOf(t)}),describe("Solana",()=>{const r={...n,identifier:new Uint8Array(32).fill(17),blockchainFamily:"solana",chainId:void 0};it("returns null for a 32-byte public key without chainId",()=>{expect(e(r)).toBeNull()}),it.each([31,33])("returns an error for a %i-byte identifier",i=>{expect(e({...r,identifier:new Uint8Array(i)})).toBeInstanceOf(t)}),it("returns an error when a chainId is given",()=>{expect(e({...r,chainId:1n})).toBeInstanceOf(t)})}),it("returns an error for a wrong-sized existing group handle",()=>{expect(e({...n,existingContactGroup:{groupHandle:new Uint8Array(32),hmacProof:new Uint8Array(32)}})).toBeInstanceOf(t)})});
|
|
2
|
-
//# sourceMappingURL=validateRegisterExternalAddressInput.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../src/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { type RegisterExternalAddressInput } from \"@api/model/RegisterExternalAddress\";\nimport { ContactsValidationError } from \"@internal/app-binder/model/contactsValidation\";\n\nimport { validateRegisterExternalAddressInput } from \"./validateRegisterExternalAddressInput\";\n\nconst VALID_INPUT: RegisterExternalAddressInput = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: new Uint8Array(20).fill(0x11),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n};\n\ndescribe(\"validateRegisterExternalAddressInput\", () => {\n it(\"returns null for valid input\", () => {\n expect(validateRegisterExternalAddressInput(VALID_INPUT)).toBeNull();\n });\n\n it(\"returns null for a valid existing-contact-group input\", () => {\n expect(\n validateRegisterExternalAddressInput({\n ...VALID_INPUT,\n existingContactGroup: {\n groupHandle: new Uint8Array(64),\n hmacProof: new Uint8Array(32),\n },\n }),\n ).toBeNull();\n });\n\n it(\"returns a ContactsValidationError for a non-printable contact name\", () => {\n expect(\n validateRegisterExternalAddressInput({\n ...VALID_INPUT,\n contactName: \"Am\u00E9lie\",\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error for an Ethereum identifier of the wrong length\", () => {\n expect(\n validateRegisterExternalAddressInput({\n ...VALID_INPUT,\n identifier: new Uint8Array(19),\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error for an unsupported blockchain family\", () => {\n expect(\n validateRegisterExternalAddressInput({\n ...VALID_INPUT,\n blockchainFamily: \"dogecoin\",\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error when chainId is missing for the Ethereum family\", () => {\n expect(\n validateRegisterExternalAddressInput({\n ...VALID_INPUT,\n chainId: undefined,\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n describe(\"Solana\", () => {\n const SOLANA_INPUT: RegisterExternalAddressInput = {\n ...VALID_INPUT,\n identifier: new Uint8Array(32).fill(0x11),\n blockchainFamily: \"solana\",\n chainId: undefined,\n };\n\n it(\"returns null for a 32-byte public key without chainId\", () => {\n expect(validateRegisterExternalAddressInput(SOLANA_INPUT)).toBeNull();\n });\n\n it.each([31, 33])(\"returns an error for a %i-byte identifier\", (length) => {\n expect(\n validateRegisterExternalAddressInput({\n ...SOLANA_INPUT,\n identifier: new Uint8Array(length),\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error when a chainId is given\", () => {\n expect(\n validateRegisterExternalAddressInput({ ...SOLANA_INPUT, chainId: 1n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n });\n\n it(\"returns an error for a wrong-sized existing group handle\", () => {\n expect(\n validateRegisterExternalAddressInput({\n ...VALID_INPUT,\n existingContactGroup: {\n groupHandle: new Uint8Array(32),\n hmacProof: new Uint8Array(32),\n },\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n});\n"],
|
|
5
|
-
"mappings": "AACA,OAAS,2BAAAA,MAA+B,gDAExC,OAAS,wCAAAC,MAA4C,yCAErD,MAAMC,EAA4C,CAChD,YAAa,QACb,MAAO,WACP,WAAY,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,EACxC,iBAAkB,WAClB,QAAS,EACX,EAEA,SAAS,uCAAwC,IAAM,CACrD,GAAG,+BAAgC,IAAM,CACvC,OAAOD,EAAqCC,CAAW,CAAC,EAAE,SAAS,CACrE,CAAC,EAED,GAAG,wDAAyD,IAAM,CAChE,OACED,EAAqC,CACnC,GAAGC,EACH,qBAAsB,CACpB,YAAa,IAAI,WAAW,EAAE,EAC9B,UAAW,IAAI,WAAW,EAAE,CAC9B,CACF,CAAC,CACH,EAAE,SAAS,CACb,CAAC,EAED,GAAG,qEAAsE,IAAM,CAC7E,OACED,EAAqC,CACnC,GAAGC,EACH,YAAa,WACf,CAAC,CACH,EAAE,eAAeF,CAAuB,CAC1C,CAAC,EAED,GAAG,kEAAmE,IAAM,CAC1E,OACEC,EAAqC,CACnC,GAAGC,EACH,WAAY,IAAI,WAAW,EAAE,CAC/B,CAAC,CACH,EAAE,eAAeF,CAAuB,CAC1C,CAAC,EAED,GAAG,wDAAyD,IAAM,CAChE,OACEC,EAAqC,CACnC,GAAGC,EACH,iBAAkB,UACpB,CAAC,CACH,EAAE,eAAeF,CAAuB,CAC1C,CAAC,EAED,GAAG,mEAAoE,IAAM,CAC3E,OACEC,EAAqC,CACnC,GAAGC,EACH,QAAS,MACX,CAAC,CACH,EAAE,eAAeF,CAAuB,CAC1C,CAAC,EAED,SAAS,SAAU,IAAM,CACvB,MAAMG,EAA6C,CACjD,GAAGD,EACH,WAAY,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,EACxC,iBAAkB,SAClB,QAAS,MACX,EAEA,GAAG,wDAAyD,IAAM,CAChE,OAAOD,EAAqCE,CAAY,CAAC,EAAE,SAAS,CACtE,CAAC,EAED,GAAG,KAAK,CAAC,GAAI,EAAE,CAAC,EAAE,4CAA8CC,GAAW,CACzE,OACEH,EAAqC,CACnC,GAAGE,EACH,WAAY,IAAI,WAAWC,CAAM,CACnC,CAAC,CACH,EAAE,eAAeJ,CAAuB,CAC1C,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,OACEC,EAAqC,CAAE,GAAGE,EAAc,QAAS,EAAG,CAAC,CACvE,EAAE,eAAeH,CAAuB,CAC1C,CAAC,CACH,CAAC,EAED,GAAG,2DAA4D,IAAM,CACnE,OACEC,EAAqC,CACnC,GAAGC,EACH,qBAAsB,CACpB,YAAa,IAAI,WAAW,EAAE,EAC9B,UAAW,IAAI,WAAW,EAAE,CAC9B,CACF,CAAC,CACH,EAAE,eAAeF,CAAuB,CAC1C,CAAC,CACH,CAAC",
|
|
6
|
-
"names": ["ContactsValidationError", "validateRegisterExternalAddressInput", "VALID_INPUT", "SOLANA_INPUT", "length"]
|
|
7
|
-
}
|
package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{CommandResultFactory as U,DeviceActionStatus as t,DeviceModelId as f,DeviceSessionStateType as g,DeviceStatus as h,GoToDashboardDeviceAction as O,OpenAppDeviceAction as E,UnknownDAError as w,UserInteractionRequired as e}from"@ledgerhq/device-management-kit";import{beforeEach as y,describe as N,expect as o,it as p,vi as u}from"vitest";import{makeDeviceActionInternalApiMock as B}from"../../../app-binder/device-action/__test-utils__/makeInternalApi";import{setupGoToDashboardDAMock as D}from"../../../app-binder/device-action/__test-utils__/setupGoToDashboardDAMock";import{testDeviceActionStates as C}from"../../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{ContactsCommandError as k,ContactsVersionRequirementError as H}from"../../../app-binder/model/contactsErrors";import{RenameContactDeviceAction as T}from"./RenameContactDeviceAction";import{validateRenameContactInput as b}from"./validateRenameContactInput";u.mock("@ledgerhq/device-management-kit",async i=>({...await i(),GoToDashboardDeviceAction:u.fn(()=>({makeStateMachine:u.fn()})),OpenAppDeviceAction:u.fn(()=>({makeStateMachine:u.fn()}))}));const S={hmacProof:new Uint8Array(32).fill(238)},R="1.7.0",s={previousContactName:"Alice",newContactName:"Bob",groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221)},V={previousContactName:"Alice",contactName:"Bob",groupHandle:s.groupHandle,hmacProof:S.hmacProof};N("RenameContactDeviceAction",()=>{let i,d,l,m;function P(){return{getOsVersion:d,isOsVersionSupported:l,renameContact:m}}y(()=>{u.clearAllMocks(),i=B(),d=u.fn().mockResolvedValue(U({data:{seVersion:R}})),l=u.fn().mockReturnValue(!0),m=u.fn().mockResolvedValue(U({data:S})),i.getDeviceSessionState.mockReturnValue({sessionStateType:g.ReadyWithoutSecureChannel,deviceStatus:h.CONNECTED,installedApps:[],currentApp:{name:"BOLOS",version:"1.7.0"},deviceModelId:f.FLEX,isSecureConnectionAllowed:!0})});function v(a){const r=new T({input:a});return u.spyOn(r,"extractDependencies").mockReturnValue(P()),r}p("navigates to the dashboard, reads the OS freshly, renames, and completes",()=>new Promise((a,r)=>{D({requiredUserInteraction:e.UnlockDevice});const n=v(s),c=[{intermediateValue:{requiredUserInteraction:e.None},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.UnlockDevice},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.None},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.RegisterWallet},status:t.Pending},{output:V,status:t.Completed}];C(n,c,i,{onDone:()=>{o(O).toHaveBeenCalled(),o(E).not.toHaveBeenCalled(),o(d).toHaveBeenCalled(),o(l).toHaveBeenCalledWith(R),a()},onError:r})})),p("succeeds when an app was open at start, gating on the freshly-read OS",()=>new Promise((a,r)=>{i.getDeviceSessionState.mockReturnValue({sessionStateType:g.ReadyWithoutSecureChannel,deviceStatus:h.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.23.0"},deviceModelId:f.FLEX,isSecureConnectionAllowed:!0}),D({requiredUserInteraction:e.UnlockDevice});const n=v(s),c=[{intermediateValue:{requiredUserInteraction:e.None},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.UnlockDevice},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.None},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.RegisterWallet},status:t.Pending},{output:V,status:t.Completed}];C(n,c,i,{onDone:()=>{o(d).toHaveBeenCalled(),o(l).toHaveBeenCalledWith(R),a()},onError:r})})),p("rejects on an unsupported OS version without sending the APDU",()=>new Promise((a,r)=>{D({requiredUserInteraction:e.UnlockDevice}),l.mockReturnValue(!1);const n=v(s),c=[{intermediateValue:{requiredUserInteraction:e.None},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.UnlockDevice},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.None},status:t.Pending},{error:new H,status:t.Error}];C(n,c,i,{onDone:()=>{o(d).toHaveBeenCalled(),o(l).toHaveBeenCalledWith(R),o(m).not.toHaveBeenCalled(),o(E).not.toHaveBeenCalled(),a()},onError:r})})),p("surfaces a go-to-dashboard failure as the device action error",()=>new Promise((a,r)=>{const n=new w("go to dashboard failed");D({error:n,requiredUserInteraction:e.UnlockDevice});const c=v(s),A=[{intermediateValue:{requiredUserInteraction:e.None},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.UnlockDevice},status:t.Pending},{error:n,status:t.Error}];C(c,A,i,{onDone:()=>{o(d).not.toHaveBeenCalled(),o(l).not.toHaveBeenCalled(),o(m).not.toHaveBeenCalled(),a()},onError:r})})),p("surfaces a rename command error (e.g. seed mismatch)",()=>new Promise((a,r)=>{D({requiredUserInteraction:e.UnlockDevice});const n=new k({errorCode:"6982",message:"wrong seed"});m.mockResolvedValue(U({error:n}));const c=v(s),A=[{intermediateValue:{requiredUserInteraction:e.None},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.UnlockDevice},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.None},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.RegisterWallet},status:t.Pending},{error:n,status:t.Error}];C(c,A,i,{onDone:a,onError:r})})),p("surfaces invalid input as a typed error after reaching the dashboard",()=>new Promise((a,r)=>{D({requiredUserInteraction:e.UnlockDevice});const n={...s,newContactName:""},c=b(n),A=v(n),q=[{intermediateValue:{requiredUserInteraction:e.None},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.UnlockDevice},status:t.Pending},{error:c,status:t.Error}];C(A,q,i,{onDone:()=>{o(d).not.toHaveBeenCalled(),o(l).not.toHaveBeenCalled(),o(m).not.toHaveBeenCalled(),a()},onError:r})})),p("surfaces a GetOsVersion failure as the command error, not a version error",()=>new Promise((a,r)=>{D({requiredUserInteraction:e.UnlockDevice});const n=new k({errorCode:"6f00",message:"GetOsVersion failed"});d.mockResolvedValue(U({error:n}));const c=v(s),A=[{intermediateValue:{requiredUserInteraction:e.None},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.UnlockDevice},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.None},status:t.Pending},{error:n,status:t.Error}];C(c,A,i,{onDone:()=>{o(l).not.toHaveBeenCalled(),o(m).not.toHaveBeenCalled(),a()},onError:r})}));const I=[{intermediateValue:{requiredUserInteraction:e.None},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.UnlockDevice},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.None},status:t.Pending},{intermediateValue:{requiredUserInteraction:e.RegisterWallet},status:t.Pending},{output:V,status:t.Completed}];p("sends the derivation path when the fresh OS is below the model cutoff (rc2)",()=>new Promise((a,r)=>{D({requiredUserInteraction:e.UnlockDevice}),d.mockResolvedValue(U({data:{seVersion:"1.7.0-rc2"}}));const n=v(s);C(n,I,i,{onDone:()=>{o(m).toHaveBeenCalledWith(s,!0),a()},onError:r})})),p("omits the derivation path when the fresh OS is at/after the cutoff (rc3/GA)",()=>new Promise((a,r)=>{D({requiredUserInteraction:e.UnlockDevice}),d.mockResolvedValue(U({data:{seVersion:"1.7.0-rc3"}}));const n=v(s);C(n,I,i,{onDone:()=>{o(m).toHaveBeenCalledWith(s,!1),a()},onError:r})}))});
|
|
2
|
-
//# sourceMappingURL=RenameContactDeviceAction.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../src/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n GoToDashboardDeviceAction,\n OpenAppDeviceAction,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport {\n type RenameContactDAError,\n type RenameContactDAInput,\n type RenameContactDAIntermediateValue,\n type RenameContactDAOutput,\n} from \"@api/app-binder/RenameContactDeviceActionTypes\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupGoToDashboardDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport {\n ContactsCommandError,\n ContactsVersionRequirementError,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nimport { RenameContactDeviceAction } from \"./RenameContactDeviceAction\";\nimport { validateRenameContactInput } from \"./validateRenameContactInput\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n // eslint-disable-next-line @typescript-eslint/consistent-type-imports\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n GoToDashboardDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\nconst OK_PROOF = { hmacProof: new Uint8Array(32).fill(0xee) };\n\n// The OS version the device returns freshly via GetOsVersion after the\n// dashboard is reached. The version guard must be fed *this*, not session state.\nconst FRESH_OS_VERSION = \"1.7.0\";\n\nconst BASE_INPUT: RenameContactDAInput = {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n};\n\nconst EXPECTED_OUTPUT: RenameContactDAOutput = {\n previousContactName: \"Alice\",\n contactName: \"Bob\",\n groupHandle: BASE_INPUT.groupHandle,\n hmacProof: OK_PROOF.hmacProof,\n};\n\ndescribe(\"RenameContactDeviceAction\", () => {\n let apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\n let getOsVersionMock: ReturnType<typeof vi.fn>;\n let isOsVersionSupportedMock: ReturnType<typeof vi.fn>;\n let renameContactMock: ReturnType<typeof vi.fn>;\n\n function extractDeps() {\n return {\n getOsVersion: getOsVersionMock,\n isOsVersionSupported: isOsVersionSupportedMock,\n renameContact: renameContactMock,\n };\n }\n\n beforeEach(() => {\n vi.clearAllMocks();\n apiMock = makeDeviceActionInternalApiMock();\n getOsVersionMock = vi\n .fn()\n .mockResolvedValue(\n CommandResultFactory({ data: { seVersion: FRESH_OS_VERSION } }),\n );\n isOsVersionSupportedMock = vi.fn().mockReturnValue(true);\n renameContactMock = vi\n .fn()\n .mockResolvedValue(CommandResultFactory({ data: OK_PROOF }));\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"BOLOS\", version: \"1.7.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: true,\n });\n });\n\n function makeAction(input: RenameContactDAInput) {\n const action = new RenameContactDeviceAction({ input });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n return action;\n }\n\n it(\"navigates to the dashboard, reads the OS freshly, renames, and completes\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n const action = makeAction(BASE_INPUT);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n // GetOsVersion clears the stale UnlockDevice interaction: one\n // `pending / none` step before the rename prompt.\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n // Rename is a dashboard op: it navigates to the dashboard and never\n // opens an app.\n expect(GoToDashboardDeviceAction).toHaveBeenCalled();\n expect(OpenAppDeviceAction).not.toHaveBeenCalled();\n // The OS version is read freshly and fed to the guard \u2014 not the\n // session state.\n expect(getOsVersionMock).toHaveBeenCalled();\n expect(isOsVersionSupportedMock).toHaveBeenCalledWith(\n FRESH_OS_VERSION,\n );\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"succeeds when an app was open at start, gating on the freshly-read OS\", () =>\n new Promise<void>((resolve, reject) => {\n // An app (Ethereum) is running when rename begins \u2014 the scenario that\n // left firmwareVersion absent and made the bug look intermittent. Rename\n // must still succeed by reading the OS version fresh after the dashboard.\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.23.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: true,\n });\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n const action = makeAction(BASE_INPUT);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: EXPECTED_OUTPUT,\n status: DeviceActionStatus.Completed,\n },\n ] as DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n expect(getOsVersionMock).toHaveBeenCalled();\n expect(isOsVersionSupportedMock).toHaveBeenCalledWith(\n FRESH_OS_VERSION,\n );\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"rejects on an unsupported OS version without sending the APDU\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n isOsVersionSupportedMock.mockReturnValue(false);\n const action = makeAction(BASE_INPUT);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new ContactsVersionRequirementError(),\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n // The fresh OS version was read and gated on.\n expect(getOsVersionMock).toHaveBeenCalled();\n expect(isOsVersionSupportedMock).toHaveBeenCalledWith(\n FRESH_OS_VERSION,\n );\n expect(renameContactMock).not.toHaveBeenCalled();\n expect(OpenAppDeviceAction).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"surfaces a go-to-dashboard failure as the device action error\", () =>\n new Promise<void>((resolve, reject) => {\n const dashboardError = new UnknownDAError(\"go to dashboard failed\");\n setupGoToDashboardDAMock({\n error: dashboardError,\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n const action = makeAction(BASE_INPUT);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: dashboardError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n expect(getOsVersionMock).not.toHaveBeenCalled();\n expect(isOsVersionSupportedMock).not.toHaveBeenCalled();\n expect(renameContactMock).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"surfaces a rename command error (e.g. seed mismatch)\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n const commandError = new ContactsCommandError({\n errorCode: \"6982\",\n message: \"wrong seed\",\n });\n renameContactMock.mockResolvedValue(\n CommandResultFactory({ error: commandError }),\n );\n const action = makeAction(BASE_INPUT);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: commandError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: resolve,\n onError: reject,\n });\n }));\n\n it(\"surfaces invalid input as a typed error after reaching the dashboard\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n const invalidInput = { ...BASE_INPUT, newContactName: \"\" };\n const validationError = validateRenameContactInput(invalidInput);\n const action = makeAction(invalidInput);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: validationError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n // Validation fails before the OS is read, the version guard, and any\n // APDU.\n expect(getOsVersionMock).not.toHaveBeenCalled();\n expect(isOsVersionSupportedMock).not.toHaveBeenCalled();\n expect(renameContactMock).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"surfaces a GetOsVersion failure as the command error, not a version error\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n const osVersionError = new ContactsCommandError({\n errorCode: \"6f00\",\n message: \"GetOsVersion failed\",\n });\n getOsVersionMock.mockResolvedValue(\n CommandResultFactory({ error: osVersionError }),\n );\n const action = makeAction(BASE_INPUT);\n\n const expected = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: osVersionError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n testDeviceActionStates(action, expected, apiMock, {\n onDone: () => {\n // The version guard is never consulted, and the rename APDU is never\n // sent: the raw command error propagates instead of a\n // ContactsVersionRequirementError.\n expect(isOsVersionSupportedMock).not.toHaveBeenCalled();\n expect(renameContactMock).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n });\n }));\n\n // DSDK-1481: the derivation-path flag is derived from the fresh OS version +\n // the (real) requirements table. deviceModelId is FLEX (cutoff 1.7.0-rc3).\n const SUCCESS_STATES = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.RegisterWallet,\n },\n status: DeviceActionStatus.Pending,\n },\n { output: EXPECTED_OUTPUT, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n >[];\n\n it(\"sends the derivation path when the fresh OS is below the model cutoff (rc2)\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n getOsVersionMock.mockResolvedValue(\n CommandResultFactory({ data: { seVersion: \"1.7.0-rc2\" } }),\n );\n const action = makeAction(BASE_INPUT);\n\n testDeviceActionStates(action, SUCCESS_STATES, apiMock, {\n onDone: () => {\n expect(renameContactMock).toHaveBeenCalledWith(BASE_INPUT, true);\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"omits the derivation path when the fresh OS is at/after the cutoff (rc3/GA)\", () =>\n new Promise<void>((resolve, reject) => {\n setupGoToDashboardDAMock({\n requiredUserInteraction: UserInteractionRequired.UnlockDevice,\n });\n getOsVersionMock.mockResolvedValue(\n CommandResultFactory({ data: { seVersion: \"1.7.0-rc3\" } }),\n );\n const action = makeAction(BASE_INPUT);\n\n testDeviceActionStates(action, SUCCESS_STATES, apiMock, {\n onDone: () => {\n expect(renameContactMock).toHaveBeenCalledWith(BASE_INPUT, false);\n resolve();\n },\n onError: reject,\n });\n }));\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "GoToDashboardDeviceAction", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "beforeEach", "describe", "expect", "it", "vi", "makeDeviceActionInternalApiMock", "setupGoToDashboardDAMock", "testDeviceActionStates", "ContactsCommandError", "ContactsVersionRequirementError", "RenameContactDeviceAction", "validateRenameContactInput", "importOriginal", "OK_PROOF", "FRESH_OS_VERSION", "BASE_INPUT", "EXPECTED_OUTPUT", "apiMock", "getOsVersionMock", "isOsVersionSupportedMock", "renameContactMock", "extractDeps", "makeAction", "input", "action", "resolve", "reject", "expected", "dashboardError", "commandError", "invalidInput", "validationError", "osVersionError", "SUCCESS_STATES"]
|
|
7
|
-
}
|
package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{ContactsValidationError as n}from"../../../app-binder/model/contactsValidation";import{validateRenameContactInput as t}from"./validateRenameContactInput";const e={previousContactName:"Alice",newContactName:"Bob",groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221)};describe("validateRenameContactInput",()=>{it("returns null for valid input",()=>{expect(t(e)).toBeNull()}),it("returns a ContactsValidationError for a non-printable new name",()=>{expect(t({...e,newContactName:"Am\xE9lie"})).toBeInstanceOf(n)}),it("returns a ContactsValidationError for a non-printable previous name",()=>{expect(t({...e,previousContactName:"Am\xE9lie"})).toBeInstanceOf(n)}),it("returns an error for an empty new name",()=>{expect(t({...e,newContactName:""})).toBeInstanceOf(n)}),it("returns an error for a group handle of the wrong length",()=>{expect(t({...e,groupHandle:new Uint8Array(63)})).toBeInstanceOf(n)}),it("returns an error for an hmac proof of the wrong length",()=>{expect(t({...e,hmacProof:new Uint8Array(31)})).toBeInstanceOf(n)})});
|
|
2
|
-
//# sourceMappingURL=validateRenameContactInput.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../src/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { type RenameContactInput } from \"@api/model/RenameContact\";\nimport { ContactsValidationError } from \"@internal/app-binder/model/contactsValidation\";\n\nimport { validateRenameContactInput } from \"./validateRenameContactInput\";\n\nconst VALID_INPUT: RenameContactInput = {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n};\n\ndescribe(\"validateRenameContactInput\", () => {\n it(\"returns null for valid input\", () => {\n expect(validateRenameContactInput(VALID_INPUT)).toBeNull();\n });\n\n it(\"returns a ContactsValidationError for a non-printable new name\", () => {\n expect(\n validateRenameContactInput({ ...VALID_INPUT, newContactName: \"Am\u00E9lie\" }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns a ContactsValidationError for a non-printable previous name\", () => {\n expect(\n validateRenameContactInput({\n ...VALID_INPUT,\n previousContactName: \"Am\u00E9lie\",\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error for an empty new name\", () => {\n expect(\n validateRenameContactInput({ ...VALID_INPUT, newContactName: \"\" }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error for a group handle of the wrong length\", () => {\n expect(\n validateRenameContactInput({\n ...VALID_INPUT,\n groupHandle: new Uint8Array(63),\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n\n it(\"returns an error for an hmac proof of the wrong length\", () => {\n expect(\n validateRenameContactInput({\n ...VALID_INPUT,\n hmacProof: new Uint8Array(31),\n }),\n ).toBeInstanceOf(ContactsValidationError);\n });\n});\n"],
|
|
5
|
-
"mappings": "AACA,OAAS,2BAAAA,MAA+B,gDAExC,OAAS,8BAAAC,MAAkC,+BAE3C,MAAMC,EAAkC,CACtC,oBAAqB,QACrB,eAAgB,MAChB,YAAa,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,EACzC,UAAW,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACzC,EAEA,SAAS,6BAA8B,IAAM,CAC3C,GAAG,+BAAgC,IAAM,CACvC,OAAOD,EAA2BC,CAAW,CAAC,EAAE,SAAS,CAC3D,CAAC,EAED,GAAG,iEAAkE,IAAM,CACzE,OACED,EAA2B,CAAE,GAAGC,EAAa,eAAgB,WAAS,CAAC,CACzE,EAAE,eAAeF,CAAuB,CAC1C,CAAC,EAED,GAAG,sEAAuE,IAAM,CAC9E,OACEC,EAA2B,CACzB,GAAGC,EACH,oBAAqB,WACvB,CAAC,CACH,EAAE,eAAeF,CAAuB,CAC1C,CAAC,EAED,GAAG,yCAA0C,IAAM,CACjD,OACEC,EAA2B,CAAE,GAAGC,EAAa,eAAgB,EAAG,CAAC,CACnE,EAAE,eAAeF,CAAuB,CAC1C,CAAC,EAED,GAAG,0DAA2D,IAAM,CAClE,OACEC,EAA2B,CACzB,GAAGC,EACH,YAAa,IAAI,WAAW,EAAE,CAChC,CAAC,CACH,EAAE,eAAeF,CAAuB,CAC1C,CAAC,EAED,GAAG,yDAA0D,IAAM,CACjE,OACEC,EAA2B,CACzB,GAAGC,EACH,UAAW,IAAI,WAAW,EAAE,CAC9B,CAAC,CACH,EAAE,eAAeF,CAAuB,CAC1C,CAAC,CACH,CAAC",
|
|
6
|
-
"names": ["ContactsValidationError", "validateRenameContactInput", "VALID_INPUT"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function n(){return{sendApdu:vi.fn(),sendCommand:vi.fn().mockResolvedValue(void 0),getDeviceModel:vi.fn(),getDeviceSessionState:vi.fn(),getDeviceSessionStateObservable:vi.fn(),setDeviceSessionState:vi.fn(),getManagerApiService:vi.fn(),getSecureChannelService:vi.fn(),loggerFactory:vi.fn(e=>({debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]}))}}export{n as makeDeviceActionInternalApiMock};
|
|
2
|
-
//# sourceMappingURL=makeInternalApi.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/makeInternalApi.ts"],
|
|
4
|
-
"sourcesContent": ["import { type InternalApi } from \"@ledgerhq/device-management-kit\";\nimport { type Mocked } from \"vitest\";\n\nexport function makeDeviceActionInternalApiMock(): Mocked<InternalApi> {\n return {\n sendApdu: vi.fn(),\n sendCommand: vi.fn().mockResolvedValue(undefined),\n getDeviceModel: vi.fn(),\n getDeviceSessionState: vi.fn(),\n getDeviceSessionStateObservable: vi.fn(),\n setDeviceSessionState: vi.fn(),\n getManagerApiService: vi.fn(),\n getSecureChannelService: vi.fn(),\n loggerFactory: vi.fn((_tag: string) => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n })),\n };\n}\n"],
|
|
5
|
-
"mappings": "AAGO,SAASA,GAAuD,CACrE,MAAO,CACL,SAAU,GAAG,GAAG,EAChB,YAAa,GAAG,GAAG,EAAE,kBAAkB,MAAS,EAChD,eAAgB,GAAG,GAAG,EACtB,sBAAuB,GAAG,GAAG,EAC7B,gCAAiC,GAAG,GAAG,EACvC,sBAAuB,GAAG,GAAG,EAC7B,qBAAsB,GAAG,GAAG,EAC5B,wBAAyB,GAAG,GAAG,EAC/B,cAAe,GAAG,GAAIC,IAAkB,CACtC,MAAO,GAAG,GAAG,EACb,KAAM,GAAG,GAAG,EACZ,KAAM,GAAG,GAAG,EACZ,MAAO,GAAG,GAAG,EACb,YAAa,CAAC,CAChB,EAAE,CACJ,CACF",
|
|
6
|
-
"names": ["makeDeviceActionInternalApiMock", "_tag"]
|
|
7
|
-
}
|
package/lib/esm/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{GoToDashboardDeviceAction as t,UserInteractionRequired as n}from"@ledgerhq/device-management-kit";import{Left as o,Right as i}from"purify-ts";import{assign as a,createMachine as c}from"xstate";const p=(e={})=>{const r=e.requiredUserInteraction??n.None;t.mockImplementation(()=>({makeStateMachine:vi.fn().mockImplementation(()=>c({initial:"pending",states:{pending:{entry:a({intermediateValue:{requiredUserInteraction:r}}),after:{0:"done"}},done:{type:"final"}},output:()=>e.error?o(e.error):i(void 0)}))}))};export{p as setupGoToDashboardDAMock};
|
|
2
|
-
//# sourceMappingURL=setupGoToDashboardDAMock.js.map
|
package/lib/esm/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n GoToDashboardDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { type Mock } from \"vitest\";\nimport { assign, createMachine } from \"xstate\";\n\n/**\n * Mock GoToDashboardDeviceAction to resolve immediately with either success\n * (default) or an error. Emits a single `requiredUserInteraction` snapshot\n * (default `None` \u2014 device assumed unlocked and already ready) so the parent\n * action can surface it, mirroring the real nested device action.\n */\nexport const setupGoToDashboardDAMock = (\n options: {\n error?: unknown;\n requiredUserInteraction?: UserInteractionRequired;\n } = {},\n) => {\n const interaction =\n options.requiredUserInteraction ?? UserInteractionRequired.None;\n (GoToDashboardDeviceAction as Mock).mockImplementation(() => ({\n makeStateMachine: vi.fn().mockImplementation(() =>\n createMachine({\n initial: \"pending\",\n states: {\n pending: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: interaction,\n },\n }),\n after: {\n 0: \"done\",\n },\n },\n done: {\n type: \"final\",\n },\n },\n output: () => (options.error ? Left(options.error) : Right(undefined)),\n }),\n ),\n }));\n};\n"],
|
|
5
|
-
"mappings": "AAAA,OACE,6BAAAA,EACA,2BAAAC,MACK,kCACP,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAE5B,OAAS,UAAAC,EAAQ,iBAAAC,MAAqB,SAQ/B,MAAMC,EAA2B,CACtCC,EAGI,CAAC,IACF,CACH,MAAMC,EACJD,EAAQ,yBAA2BN,EAAwB,KAC5DD,EAAmC,mBAAmB,KAAO,CAC5D,iBAAkB,GAAG,GAAG,EAAE,mBAAmB,IAC3CK,EAAc,CACZ,QAAS,UACT,OAAQ,CACN,QAAS,CACP,MAAOD,EAAO,CACZ,kBAAmB,CACjB,wBAAyBI,CAC3B,CACF,CAAC,EACD,MAAO,CACL,EAAG,MACL,CACF,EACA,KAAM,CACJ,KAAM,OACR,CACF,EACA,OAAQ,IAAOD,EAAQ,MAAQL,EAAKK,EAAQ,KAAK,EAAIJ,EAAM,MAAS,CACtE,CAAC,CACH,CACF,EAAE,CACJ",
|
|
6
|
-
"names": ["GoToDashboardDeviceAction", "UserInteractionRequired", "Left", "Right", "assign", "createMachine", "setupGoToDashboardDAMock", "options", "interaction"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{OpenAppDeviceAction as n,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{Left as i,Right as o}from"purify-ts";import{assign as p,createMachine as r}from"xstate";const f=e=>{n.mockImplementation(()=>({makeStateMachine:vi.fn().mockImplementation(()=>r({initial:"pending",states:{pending:{entry:p({intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp}}),after:{0:"done"}},done:{type:"final"}},output:()=>e?i(e):o(void 0)}))}))};export{f as setupOpenAppDAMock};
|
|
2
|
-
//# sourceMappingURL=setupOpenAppDAMock.js.map
|