@bopen-io/wallet-toolbox 1.7.18
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/.claude/settings.local.json +10 -0
- package/.env.template +22 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
- package/.github/ISSUE_TEMPLATE/discussion.md +24 -0
- package/.github/pull_request_template.md +22 -0
- package/.github/workflows/push.yaml +145 -0
- package/.prettierrc +10 -0
- package/CHANGELOG.md +280 -0
- package/CONTRIBUTING.md +89 -0
- package/README.md +43 -0
- package/docs/README.md +85 -0
- package/docs/client.md +19627 -0
- package/docs/monitor.md +953 -0
- package/docs/open-rpc/index.html +46 -0
- package/docs/services.md +6377 -0
- package/docs/setup.md +1268 -0
- package/docs/storage.md +5367 -0
- package/docs/wallet.md +19626 -0
- package/jest.config.ts +25 -0
- package/license.md +28 -0
- package/out/tsconfig.all.tsbuildinfo +1 -0
- package/package.json +63 -0
- package/src/CWIStyleWalletManager.ts +1999 -0
- package/src/Setup.ts +579 -0
- package/src/SetupClient.ts +322 -0
- package/src/SetupWallet.ts +108 -0
- package/src/SimpleWalletManager.ts +526 -0
- package/src/Wallet.ts +1169 -0
- package/src/WalletAuthenticationManager.ts +153 -0
- package/src/WalletLogger.ts +213 -0
- package/src/WalletPermissionsManager.ts +3660 -0
- package/src/WalletSettingsManager.ts +114 -0
- package/src/__tests/CWIStyleWalletManager.test.d.ts.map +1 -0
- package/src/__tests/CWIStyleWalletManager.test.js.map +1 -0
- package/src/__tests/CWIStyleWalletManager.test.ts +675 -0
- package/src/__tests/WalletPermissionsManager.callbacks.test.ts +323 -0
- package/src/__tests/WalletPermissionsManager.checks.test.ts +844 -0
- package/src/__tests/WalletPermissionsManager.encryption.test.ts +412 -0
- package/src/__tests/WalletPermissionsManager.fixtures.ts +307 -0
- package/src/__tests/WalletPermissionsManager.flows.test.ts +462 -0
- package/src/__tests/WalletPermissionsManager.initialization.test.ts +300 -0
- package/src/__tests/WalletPermissionsManager.pmodules.test.ts +798 -0
- package/src/__tests/WalletPermissionsManager.proxying.test.ts +724 -0
- package/src/__tests/WalletPermissionsManager.tokens.test.ts +503 -0
- package/src/index.all.ts +27 -0
- package/src/index.client.ts +25 -0
- package/src/index.mobile.ts +21 -0
- package/src/index.ts +1 -0
- package/src/monitor/Monitor.ts +412 -0
- package/src/monitor/MonitorDaemon.ts +188 -0
- package/src/monitor/README.md +3 -0
- package/src/monitor/__test/MonitorDaemon.man.test.ts +45 -0
- package/src/monitor/tasks/TaskCheckForProofs.ts +243 -0
- package/src/monitor/tasks/TaskCheckNoSends.ts +73 -0
- package/src/monitor/tasks/TaskClock.ts +33 -0
- package/src/monitor/tasks/TaskFailAbandoned.ts +54 -0
- package/src/monitor/tasks/TaskMonitorCallHistory.ts +26 -0
- package/src/monitor/tasks/TaskNewHeader.ts +93 -0
- package/src/monitor/tasks/TaskPurge.ts +68 -0
- package/src/monitor/tasks/TaskReorg.ts +89 -0
- package/src/monitor/tasks/TaskReviewStatus.ts +48 -0
- package/src/monitor/tasks/TaskSendWaiting.ts +122 -0
- package/src/monitor/tasks/TaskSyncWhenIdle.ts +26 -0
- package/src/monitor/tasks/TaskUnFail.ts +151 -0
- package/src/monitor/tasks/WalletMonitorTask.ts +47 -0
- package/src/sdk/CertOpsWallet.ts +18 -0
- package/src/sdk/PrivilegedKeyManager.ts +372 -0
- package/src/sdk/README.md +13 -0
- package/src/sdk/WERR_errors.ts +234 -0
- package/src/sdk/WalletError.ts +170 -0
- package/src/sdk/WalletErrorFromJson.ts +80 -0
- package/src/sdk/WalletServices.interfaces.ts +700 -0
- package/src/sdk/WalletSigner.interfaces.ts +11 -0
- package/src/sdk/WalletStorage.interfaces.ts +606 -0
- package/src/sdk/__test/CertificateLifeCycle.test.ts +131 -0
- package/src/sdk/__test/PrivilegedKeyManager.test.ts +738 -0
- package/src/sdk/__test/WalletError.test.ts +318 -0
- package/src/sdk/__test/validationHelpers.test.ts +21 -0
- package/src/sdk/index.ts +10 -0
- package/src/sdk/types.ts +226 -0
- package/src/services/README.md +11 -0
- package/src/services/ServiceCollection.ts +248 -0
- package/src/services/Services.ts +603 -0
- package/src/services/__tests/ARC.man.test.ts +123 -0
- package/src/services/__tests/ARC.timeout.man.test.ts +79 -0
- package/src/services/__tests/ArcGorillaPool.man.test.ts +108 -0
- package/src/services/__tests/arcServices.test.ts +8 -0
- package/src/services/__tests/bitrails.test.ts +56 -0
- package/src/services/__tests/getMerklePath.test.ts +15 -0
- package/src/services/__tests/getRawTx.test.ts +13 -0
- package/src/services/__tests/postBeef.test.ts +104 -0
- package/src/services/__tests/verifyBeef.test.ts +50 -0
- package/src/services/chaintracker/BHServiceClient.ts +212 -0
- package/src/services/chaintracker/ChaintracksChainTracker.ts +71 -0
- package/src/services/chaintracker/__tests/ChaintracksChainTracker.test.ts +33 -0
- package/src/services/chaintracker/__tests/ChaintracksServiceClient.test.ts +29 -0
- package/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.ts +72 -0
- package/src/services/chaintracker/chaintracks/Api/BulkIngestorApi.ts +83 -0
- package/src/services/chaintracker/chaintracks/Api/BulkStorageApi.ts +92 -0
- package/src/services/chaintracker/chaintracks/Api/ChaintracksApi.ts +64 -0
- package/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.ts +189 -0
- package/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.ts +18 -0
- package/src/services/chaintracker/chaintracks/Api/ChaintracksFsApi.ts +58 -0
- package/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.ts +386 -0
- package/src/services/chaintracker/chaintracks/Api/LiveIngestorApi.ts +25 -0
- package/src/services/chaintracker/chaintracks/Chaintracks.ts +609 -0
- package/src/services/chaintracker/chaintracks/ChaintracksService.ts +199 -0
- package/src/services/chaintracker/chaintracks/ChaintracksServiceClient.ts +154 -0
- package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.ts +176 -0
- package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.ts +174 -0
- package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.ts +18 -0
- package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.ts +113 -0
- package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.ts +81 -0
- package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.ts +86 -0
- package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.ts +59 -0
- package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.ts +104 -0
- package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.ts +66 -0
- package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.ts +566 -0
- package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.ts +219 -0
- package/src/services/chaintracker/chaintracks/Ingest/__tests/BulkIngestorCDNBabbage.test.ts +54 -0
- package/src/services/chaintracker/chaintracks/Ingest/__tests/LiveIngestorWhatsOnChainPoll.test.ts +33 -0
- package/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.ts +124 -0
- package/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.ts +92 -0
- package/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.ts +104 -0
- package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.ts +382 -0
- package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.ts +574 -0
- package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.ts +438 -0
- package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageMemory.ts +29 -0
- package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.ts +304 -0
- package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageIdb.test.ts +102 -0
- package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageKnex.test.ts +45 -0
- package/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.ts +77 -0
- package/src/services/chaintracker/chaintracks/__tests/ChaintracksClientApi.test.ts +192 -0
- package/src/services/chaintracker/chaintracks/__tests/LocalCdnServer.ts +75 -0
- package/src/services/chaintracker/chaintracks/__tests/createIdbChaintracks.test.ts +62 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNetBlockHeaders.json +1 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_0.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_1.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_2.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_3.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNetBlockHeaders.json +1 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_0.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_1.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_2.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_3.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNetBlockHeaders.json +1 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_0.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_1.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_2.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_3.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNetBlockHeaders.json +1 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_0.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_1.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_2.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_3.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_4.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNetBlockHeaders.json +1 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_0.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_1.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_2.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_3.headers +0 -0
- package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_4.headers +0 -0
- package/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.ts +92 -0
- package/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.ts +111 -0
- package/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.ts +91 -0
- package/src/services/chaintracker/chaintracks/createIdbChaintracks.ts +60 -0
- package/src/services/chaintracker/chaintracks/createKnexChaintracks.ts +65 -0
- package/src/services/chaintracker/chaintracks/createNoDbChaintracks.ts +60 -0
- package/src/services/chaintracker/chaintracks/index.all.ts +12 -0
- package/src/services/chaintracker/chaintracks/index.client.ts +4 -0
- package/src/services/chaintracker/chaintracks/index.mobile.ts +37 -0
- package/src/services/chaintracker/chaintracks/util/BulkFileDataManager.ts +975 -0
- package/src/services/chaintracker/chaintracks/util/BulkFileDataReader.ts +60 -0
- package/src/services/chaintracker/chaintracks/util/BulkFilesReader.ts +336 -0
- package/src/services/chaintracker/chaintracks/util/BulkHeaderFile.ts +247 -0
- package/src/services/chaintracker/chaintracks/util/ChaintracksFetch.ts +69 -0
- package/src/services/chaintracker/chaintracks/util/ChaintracksFs.ts +141 -0
- package/src/services/chaintracker/chaintracks/util/HeightRange.ts +153 -0
- package/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.ts +76 -0
- package/src/services/chaintracker/chaintracks/util/__tests/BulkFileDataManager.test.ts +304 -0
- package/src/services/chaintracker/chaintracks/util/__tests/ChaintracksFetch.test.ts +60 -0
- package/src/services/chaintracker/chaintracks/util/__tests/HeightRange.test.ts +67 -0
- package/src/services/chaintracker/chaintracks/util/__tests/SingleWriterMultiReaderLock.test.ts +49 -0
- package/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.ts +573 -0
- package/src/services/chaintracker/chaintracks/util/dirtyHashes.ts +29 -0
- package/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.ts +432 -0
- package/src/services/chaintracker/index.all.ts +4 -0
- package/src/services/chaintracker/index.client.ts +4 -0
- package/src/services/chaintracker/index.mobile.ts +4 -0
- package/src/services/createDefaultWalletServicesOptions.ts +77 -0
- package/src/services/index.ts +1 -0
- package/src/services/processingErrors/arcSuccessError.json +76 -0
- package/src/services/providers/ARC.ts +350 -0
- package/src/services/providers/Bitails.ts +256 -0
- package/src/services/providers/SdkWhatsOnChain.ts +83 -0
- package/src/services/providers/WhatsOnChain.ts +883 -0
- package/src/services/providers/__tests/WhatsOnChain.test.ts +242 -0
- package/src/services/providers/__tests/exchangeRates.test.ts +18 -0
- package/src/services/providers/exchangeRates.ts +265 -0
- package/src/services/providers/getBeefForTxid.ts +369 -0
- package/src/signer/README.md +5 -0
- package/src/signer/WalletSigner.ts +17 -0
- package/src/signer/methods/acquireDirectCertificate.ts +52 -0
- package/src/signer/methods/buildSignableTransaction.ts +183 -0
- package/src/signer/methods/completeSignedTransaction.ts +117 -0
- package/src/signer/methods/createAction.ts +172 -0
- package/src/signer/methods/internalizeAction.ts +106 -0
- package/src/signer/methods/proveCertificate.ts +43 -0
- package/src/signer/methods/signAction.ts +54 -0
- package/src/storage/README.md +14 -0
- package/src/storage/StorageIdb.ts +2304 -0
- package/src/storage/StorageKnex.ts +1425 -0
- package/src/storage/StorageProvider.ts +810 -0
- package/src/storage/StorageReader.ts +194 -0
- package/src/storage/StorageReaderWriter.ts +432 -0
- package/src/storage/StorageSyncReader.ts +34 -0
- package/src/storage/WalletStorageManager.ts +943 -0
- package/src/storage/__test/StorageIdb.test.ts +43 -0
- package/src/storage/__test/WalletStorageManager.test.ts +275 -0
- package/src/storage/__test/adminStats.man.test.ts +89 -0
- package/src/storage/__test/getBeefForTransaction.test.ts +385 -0
- package/src/storage/index.all.ts +11 -0
- package/src/storage/index.client.ts +7 -0
- package/src/storage/index.mobile.ts +6 -0
- package/src/storage/methods/ListActionsSpecOp.ts +70 -0
- package/src/storage/methods/ListOutputsSpecOp.ts +129 -0
- package/src/storage/methods/__test/GenerateChange/generateChangeSdk.test.ts +1057 -0
- package/src/storage/methods/__test/GenerateChange/randomValsUsed1.ts +20 -0
- package/src/storage/methods/__test/offsetKey.test.ts +274 -0
- package/src/storage/methods/attemptToPostReqsToNetwork.ts +389 -0
- package/src/storage/methods/createAction.ts +947 -0
- package/src/storage/methods/generateChange.ts +556 -0
- package/src/storage/methods/getBeefForTransaction.ts +139 -0
- package/src/storage/methods/getSyncChunk.ts +293 -0
- package/src/storage/methods/internalizeAction.ts +562 -0
- package/src/storage/methods/listActionsIdb.ts +183 -0
- package/src/storage/methods/listActionsKnex.ts +226 -0
- package/src/storage/methods/listCertificates.ts +73 -0
- package/src/storage/methods/listOutputsIdb.ts +203 -0
- package/src/storage/methods/listOutputsKnex.ts +263 -0
- package/src/storage/methods/offsetKey.ts +89 -0
- package/src/storage/methods/processAction.ts +420 -0
- package/src/storage/methods/purgeData.ts +251 -0
- package/src/storage/methods/purgeDataIdb.ts +10 -0
- package/src/storage/methods/reviewStatus.ts +101 -0
- package/src/storage/methods/reviewStatusIdb.ts +43 -0
- package/src/storage/methods/utils.Buffer.ts +33 -0
- package/src/storage/methods/utils.ts +56 -0
- package/src/storage/remoting/StorageClient.ts +567 -0
- package/src/storage/remoting/StorageMobile.ts +544 -0
- package/src/storage/remoting/StorageServer.ts +291 -0
- package/src/storage/remoting/__test/StorageClient.test.ts +113 -0
- package/src/storage/schema/KnexMigrations.ts +489 -0
- package/src/storage/schema/StorageIdbSchema.ts +150 -0
- package/src/storage/schema/entities/EntityBase.ts +210 -0
- package/src/storage/schema/entities/EntityCertificate.ts +188 -0
- package/src/storage/schema/entities/EntityCertificateField.ts +136 -0
- package/src/storage/schema/entities/EntityCommission.ts +148 -0
- package/src/storage/schema/entities/EntityOutput.ts +290 -0
- package/src/storage/schema/entities/EntityOutputBasket.ts +153 -0
- package/src/storage/schema/entities/EntityOutputTag.ts +121 -0
- package/src/storage/schema/entities/EntityOutputTagMap.ts +123 -0
- package/src/storage/schema/entities/EntityProvenTx.ts +319 -0
- package/src/storage/schema/entities/EntityProvenTxReq.ts +580 -0
- package/src/storage/schema/entities/EntitySyncState.ts +389 -0
- package/src/storage/schema/entities/EntityTransaction.ts +306 -0
- package/src/storage/schema/entities/EntityTxLabel.ts +121 -0
- package/src/storage/schema/entities/EntityTxLabelMap.ts +123 -0
- package/src/storage/schema/entities/EntityUser.ts +112 -0
- package/src/storage/schema/entities/MergeEntity.ts +73 -0
- package/src/storage/schema/entities/__tests/CertificateFieldTests.test.ts +353 -0
- package/src/storage/schema/entities/__tests/CertificateTests.test.ts +354 -0
- package/src/storage/schema/entities/__tests/CommissionTests.test.ts +371 -0
- package/src/storage/schema/entities/__tests/OutputBasketTests.test.ts +278 -0
- package/src/storage/schema/entities/__tests/OutputTagMapTests.test.ts +242 -0
- package/src/storage/schema/entities/__tests/OutputTagTests.test.ts +288 -0
- package/src/storage/schema/entities/__tests/OutputTests.test.ts +464 -0
- package/src/storage/schema/entities/__tests/ProvenTxReqTests.test.ts +340 -0
- package/src/storage/schema/entities/__tests/ProvenTxTests.test.ts +504 -0
- package/src/storage/schema/entities/__tests/SyncStateTests.test.ts +288 -0
- package/src/storage/schema/entities/__tests/TransactionTests.test.ts +604 -0
- package/src/storage/schema/entities/__tests/TxLabelMapTests.test.ts +361 -0
- package/src/storage/schema/entities/__tests/TxLabelTests.test.ts +198 -0
- package/src/storage/schema/entities/__tests/stampLogTests.test.ts +90 -0
- package/src/storage/schema/entities/__tests/usersTests.test.ts +340 -0
- package/src/storage/schema/entities/index.ts +16 -0
- package/src/storage/schema/tables/TableCertificate.ts +21 -0
- package/src/storage/schema/tables/TableCertificateField.ts +12 -0
- package/src/storage/schema/tables/TableCommission.ts +13 -0
- package/src/storage/schema/tables/TableMonitorEvent.ts +9 -0
- package/src/storage/schema/tables/TableOutput.ts +64 -0
- package/src/storage/schema/tables/TableOutputBasket.ts +12 -0
- package/src/storage/schema/tables/TableOutputTag.ts +10 -0
- package/src/storage/schema/tables/TableOutputTagMap.ts +9 -0
- package/src/storage/schema/tables/TableProvenTx.ts +14 -0
- package/src/storage/schema/tables/TableProvenTxReq.ts +65 -0
- package/src/storage/schema/tables/TableSettings.ts +17 -0
- package/src/storage/schema/tables/TableSyncState.ts +18 -0
- package/src/storage/schema/tables/TableTransaction.ts +54 -0
- package/src/storage/schema/tables/TableTxLabel.ts +10 -0
- package/src/storage/schema/tables/TableTxLabelMap.ts +9 -0
- package/src/storage/schema/tables/TableUser.ts +16 -0
- package/src/storage/schema/tables/index.ts +16 -0
- package/src/storage/sync/StorageMySQLDojoReader.ts +696 -0
- package/src/storage/sync/index.ts +1 -0
- package/src/utility/Format.ts +133 -0
- package/src/utility/README.md +3 -0
- package/src/utility/ReaderUint8Array.ts +187 -0
- package/src/utility/ScriptTemplateBRC29.ts +73 -0
- package/src/utility/__tests/utilityHelpers.noBuffer.test.ts +109 -0
- package/src/utility/aggregateResults.ts +68 -0
- package/src/utility/identityUtils.ts +159 -0
- package/src/utility/index.all.ts +7 -0
- package/src/utility/index.client.ts +7 -0
- package/src/utility/parseTxScriptOffsets.ts +29 -0
- package/src/utility/stampLog.ts +69 -0
- package/src/utility/tscProofToMerklePath.ts +48 -0
- package/src/utility/utilityHelpers.buffer.ts +34 -0
- package/src/utility/utilityHelpers.noBuffer.ts +60 -0
- package/src/utility/utilityHelpers.ts +275 -0
- package/src/wab-client/WABClient.ts +94 -0
- package/src/wab-client/__tests/WABClient.man.test.ts +59 -0
- package/src/wab-client/auth-method-interactors/AuthMethodInteractor.ts +47 -0
- package/src/wab-client/auth-method-interactors/DevConsoleInteractor.ts +73 -0
- package/src/wab-client/auth-method-interactors/PersonaIDInteractor.ts +35 -0
- package/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.ts +72 -0
- package/syncVersions.js +71 -0
- package/test/Wallet/StorageClient/storageClient.man.test.ts +75 -0
- package/test/Wallet/action/abortAction.test.ts +47 -0
- package/test/Wallet/action/createAction.test.ts +299 -0
- package/test/Wallet/action/createAction2.test.ts +1273 -0
- package/test/Wallet/action/createActionToGenerateBeefs.man.test.ts +293 -0
- package/test/Wallet/action/internalizeAction.a.test.ts +286 -0
- package/test/Wallet/action/internalizeAction.test.ts +682 -0
- package/test/Wallet/action/relinquishOutput.test.ts +37 -0
- package/test/Wallet/certificate/acquireCertificate.test.ts +298 -0
- package/test/Wallet/certificate/listCertificates.test.ts +346 -0
- package/test/Wallet/construct/Wallet.constructor.test.ts +57 -0
- package/test/Wallet/get/getHeaderForHeight.test.ts +82 -0
- package/test/Wallet/get/getHeight.test.ts +52 -0
- package/test/Wallet/get/getKnownTxids.test.ts +86 -0
- package/test/Wallet/get/getNetwork.test.ts +27 -0
- package/test/Wallet/get/getVersion.test.ts +27 -0
- package/test/Wallet/list/listActions.test.ts +279 -0
- package/test/Wallet/list/listActions2.test.ts +1381 -0
- package/test/Wallet/list/listCertificates.test.ts +118 -0
- package/test/Wallet/list/listOutputs.test.ts +447 -0
- package/test/Wallet/live/walletLive.man.test.ts +521 -0
- package/test/Wallet/local/localWallet.man.test.ts +93 -0
- package/test/Wallet/local/localWallet2.man.test.ts +277 -0
- package/test/Wallet/signAction/mountaintop.man.test.ts +130 -0
- package/test/Wallet/specOps/specOps.man.test.ts +220 -0
- package/test/Wallet/support/janitor.man.test.ts +40 -0
- package/test/Wallet/support/operations.man.test.ts +407 -0
- package/test/Wallet/support/reqErrorReview.2025.05.06.man.test.ts +347 -0
- package/test/Wallet/sync/Wallet.sync.test.ts +215 -0
- package/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.ts +203 -0
- package/test/Wallet/sync/setActive.test.ts +170 -0
- package/test/WalletClient/LocalKVStore.man.test.ts +114 -0
- package/test/WalletClient/WERR.man.test.ts +35 -0
- package/test/bsv-ts-sdk/LocalKVStore.test.ts +102 -0
- package/test/checkDB.ts +57 -0
- package/test/checkdb +0 -0
- package/test/examples/backup.man.test.ts +59 -0
- package/test/examples/pushdrop.test.ts +282 -0
- package/test/monitor/Monitor.test.ts +620 -0
- package/test/services/Services.test.ts +263 -0
- package/test/storage/KnexMigrations.test.ts +86 -0
- package/test/storage/StorageMySQLDojoReader.man.test.ts +60 -0
- package/test/storage/count.test.ts +177 -0
- package/test/storage/find.test.ts +195 -0
- package/test/storage/findLegacy.test.ts +67 -0
- package/test/storage/idb/allocateChange.test.ts +251 -0
- package/test/storage/idb/count.test.ts +158 -0
- package/test/storage/idb/find.test.ts +177 -0
- package/test/storage/idb/idbSpeed.test.ts +36 -0
- package/test/storage/idb/insert.test.ts +268 -0
- package/test/storage/idb/transactionAbort.test.ts +108 -0
- package/test/storage/idb/update.test.ts +999 -0
- package/test/storage/insert.test.ts +278 -0
- package/test/storage/update.test.ts +1021 -0
- package/test/storage/update2.test.ts +897 -0
- package/test/utils/TestUtilsWalletStorage.ts +2526 -0
- package/test/utils/localWalletMethods.ts +363 -0
- package/test/utils/removeFailedFromDatabase.sql +17 -0
- package/ts2md.json +44 -0
- package/tsconfig.all.json +31 -0
- package/tsconfig.client.json +29 -0
- package/tsconfig.json +17 -0
- package/tsconfig.mobile.json +28 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import { EntityTxLabelMap } from '../EntityTxLabelMap'
|
|
2
|
+
import { createSyncMap, sdk, SyncMap, TableTxLabelMap } from '../../../../../src'
|
|
3
|
+
import { TestUtilsWalletStorage as _tu, TestWalletNoSetup } from '../../../../../test/utils/TestUtilsWalletStorage'
|
|
4
|
+
import { EntityTransaction } from '../EntityTransaction'
|
|
5
|
+
import { EntityTxLabel } from '../EntityTxLabel'
|
|
6
|
+
|
|
7
|
+
describe('TxLabelMap Class Tests', () => {
|
|
8
|
+
jest.setTimeout(99999999) // Extend timeout for database operations
|
|
9
|
+
|
|
10
|
+
const env = _tu.getEnv('test') // Test environment
|
|
11
|
+
const ctxs: TestWalletNoSetup[] = [] // Context for primary databases
|
|
12
|
+
const ctxs2: TestWalletNoSetup[] = [] // Context for secondary databases
|
|
13
|
+
|
|
14
|
+
beforeAll(async () => {
|
|
15
|
+
// Set up MySQL and SQLite databases for testing
|
|
16
|
+
if (env.runMySQL) {
|
|
17
|
+
ctxs.push(await _tu.createLegacyWalletMySQLCopy('txLabelMapTests_db1'))
|
|
18
|
+
ctxs2.push(await _tu.createLegacyWalletMySQLCopy('txLabelMapTests_db2'))
|
|
19
|
+
}
|
|
20
|
+
ctxs.push(await _tu.createLegacyWalletSQLiteCopy('txLabelMapTests_db1'))
|
|
21
|
+
ctxs2.push(await _tu.createLegacyWalletSQLiteCopy('txLabelMapTests_db2'))
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
afterAll(async () => {
|
|
25
|
+
// Clean up primary databases
|
|
26
|
+
for (const ctx of ctxs) {
|
|
27
|
+
await ctx.storage.destroy()
|
|
28
|
+
}
|
|
29
|
+
// Clean up secondary databases
|
|
30
|
+
for (const ctx of ctxs2) {
|
|
31
|
+
await ctx.storage.destroy()
|
|
32
|
+
}
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
// Test: Constructor with default values
|
|
36
|
+
test('1_creates_instance_with_default_values', () => {
|
|
37
|
+
const txLabelMap = new EntityTxLabelMap()
|
|
38
|
+
|
|
39
|
+
const now = new Date()
|
|
40
|
+
expect(txLabelMap.transactionId).toBe(0)
|
|
41
|
+
expect(txLabelMap.txLabelId).toBe(0)
|
|
42
|
+
expect(txLabelMap.isDeleted).toBe(false)
|
|
43
|
+
expect(txLabelMap.created_at).toBeInstanceOf(Date)
|
|
44
|
+
expect(txLabelMap.updated_at).toBeInstanceOf(Date)
|
|
45
|
+
expect(txLabelMap.created_at.getTime()).toBeLessThanOrEqual(now.getTime())
|
|
46
|
+
expect(txLabelMap.updated_at.getTime()).toBeLessThanOrEqual(now.getTime())
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
// Test: Constructor with provided API object
|
|
50
|
+
test('2_creates_instance_with_provided_api_object', () => {
|
|
51
|
+
const now = new Date()
|
|
52
|
+
const apiObject: TableTxLabelMap = {
|
|
53
|
+
transactionId: 123,
|
|
54
|
+
txLabelId: 456,
|
|
55
|
+
created_at: now,
|
|
56
|
+
updated_at: now,
|
|
57
|
+
isDeleted: true
|
|
58
|
+
}
|
|
59
|
+
const txLabelMap = new EntityTxLabelMap(apiObject)
|
|
60
|
+
|
|
61
|
+
expect(txLabelMap.transactionId).toBe(123)
|
|
62
|
+
expect(txLabelMap.txLabelId).toBe(456)
|
|
63
|
+
expect(txLabelMap.isDeleted).toBe(true)
|
|
64
|
+
expect(txLabelMap.created_at).toBe(now)
|
|
65
|
+
expect(txLabelMap.updated_at).toBe(now)
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
// Test: Getters and setters
|
|
69
|
+
test('3_getters_and_setters_work_correctly', () => {
|
|
70
|
+
const txLabelMap = new EntityTxLabelMap()
|
|
71
|
+
|
|
72
|
+
const now = new Date()
|
|
73
|
+
txLabelMap.transactionId = 1001
|
|
74
|
+
txLabelMap.txLabelId = 2002
|
|
75
|
+
txLabelMap.isDeleted = true
|
|
76
|
+
txLabelMap.created_at = now
|
|
77
|
+
txLabelMap.updated_at = now
|
|
78
|
+
|
|
79
|
+
expect(txLabelMap.transactionId).toBe(1001)
|
|
80
|
+
expect(txLabelMap.txLabelId).toBe(2002)
|
|
81
|
+
expect(txLabelMap.isDeleted).toBe(true)
|
|
82
|
+
expect(txLabelMap.created_at).toBe(now)
|
|
83
|
+
expect(txLabelMap.updated_at).toBe(now)
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
// Test: `updateApi` does nothing
|
|
87
|
+
test('4_updateApi_does_nothing', () => {
|
|
88
|
+
const txLabelMap = new EntityTxLabelMap()
|
|
89
|
+
expect(() => txLabelMap.updateApi()).not.toThrow() // Method does nothing, so no errors should occur
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
// Test: `id` getter throws an error
|
|
93
|
+
test('5_get_id_throws_error', () => {
|
|
94
|
+
const txLabelMap = new EntityTxLabelMap()
|
|
95
|
+
expect(() => txLabelMap.id).toThrow(sdk.WERR_INVALID_OPERATION) // Entity has no "id"
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
// Test: Equality check
|
|
99
|
+
test('6_equals_checks_equality_correctly', () => {
|
|
100
|
+
const syncMap: any = {
|
|
101
|
+
transaction: { idMap: { 123: 123 } },
|
|
102
|
+
txLabel: { idMap: { 456: 456 } }
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const txLabelMap = new EntityTxLabelMap({
|
|
106
|
+
transactionId: 123,
|
|
107
|
+
txLabelId: 456,
|
|
108
|
+
isDeleted: false,
|
|
109
|
+
created_at: new Date(),
|
|
110
|
+
updated_at: new Date()
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
const other = {
|
|
114
|
+
transactionId: 123, // Use mapped ID from syncMap
|
|
115
|
+
txLabelId: 456, // Use mapped ID from syncMap
|
|
116
|
+
isDeleted: false
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const result = txLabelMap.equals(other as TableTxLabelMap, syncMap)
|
|
120
|
+
expect(result).toBe(true)
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
// Test: `mergeFind` with storage
|
|
124
|
+
test('7_mergeFind_finds_or_creates_entity', async () => {
|
|
125
|
+
const storage: any = {
|
|
126
|
+
findTxLabelMaps: async () => [{ transactionId: 999, txLabelId: 888 }]
|
|
127
|
+
}
|
|
128
|
+
const syncMap: any = {
|
|
129
|
+
transaction: { idMap: { 123: 999 } },
|
|
130
|
+
txLabel: { idMap: { 456: 888 } }
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const ei = {
|
|
134
|
+
transactionId: 123,
|
|
135
|
+
txLabelId: 456
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const result = await EntityTxLabelMap.mergeFind(storage, 1, ei as TableTxLabelMap, syncMap)
|
|
139
|
+
expect(result.found).toBe(true)
|
|
140
|
+
expect(result.eo.transactionId).toBe(999)
|
|
141
|
+
expect(result.eo.txLabelId).toBe(888)
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
// Test: `mergeNew` inserts entity
|
|
145
|
+
test('8_mergeNew_inserts_entity', async () => {
|
|
146
|
+
const storage: any = {
|
|
147
|
+
insertTxLabelMap: jest.fn()
|
|
148
|
+
}
|
|
149
|
+
const syncMap: any = {
|
|
150
|
+
transaction: { idMap: { 123: 999 } },
|
|
151
|
+
txLabel: { idMap: { 456: 888 } }
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const txLabelMap = new EntityTxLabelMap({
|
|
155
|
+
transactionId: 123,
|
|
156
|
+
txLabelId: 456,
|
|
157
|
+
created_at: new Date(2022, 1, 1),
|
|
158
|
+
updated_at: new Date(2022, 1, 1),
|
|
159
|
+
isDeleted: false
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
await txLabelMap.mergeNew(storage, 1, syncMap)
|
|
163
|
+
expect(storage.insertTxLabelMap).toHaveBeenCalledWith(
|
|
164
|
+
expect.objectContaining({
|
|
165
|
+
transactionId: 999,
|
|
166
|
+
txLabelId: 888
|
|
167
|
+
}),
|
|
168
|
+
undefined
|
|
169
|
+
)
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
// Test: `mergeExisting` updates entity
|
|
173
|
+
test('9_mergeExisting_updates_entity', async () => {
|
|
174
|
+
const storage: any = {
|
|
175
|
+
updateTxLabelMap: jest.fn()
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const txLabelMap = new EntityTxLabelMap({
|
|
179
|
+
transactionId: 123,
|
|
180
|
+
txLabelId: 456,
|
|
181
|
+
created_at: new Date(2022, 1, 1),
|
|
182
|
+
updated_at: new Date(2022, 1, 1),
|
|
183
|
+
isDeleted: false
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
const ei: TableTxLabelMap = {
|
|
187
|
+
transactionId: 123,
|
|
188
|
+
txLabelId: 456,
|
|
189
|
+
isDeleted: true,
|
|
190
|
+
created_at: new Date(),
|
|
191
|
+
updated_at: new Date(2023, 1, 1)
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const syncMap: any = {
|
|
195
|
+
transaction: { idMap: { 123: 999 } },
|
|
196
|
+
txLabel: { idMap: { 456: 888 } }
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const result = await txLabelMap.mergeExisting(storage, new Date(), ei, syncMap)
|
|
200
|
+
expect(result).toBe(true)
|
|
201
|
+
expect(storage.updateTxLabelMap).toHaveBeenCalledWith(
|
|
202
|
+
123,
|
|
203
|
+
456,
|
|
204
|
+
expect.objectContaining({
|
|
205
|
+
isDeleted: true
|
|
206
|
+
}),
|
|
207
|
+
undefined
|
|
208
|
+
)
|
|
209
|
+
})
|
|
210
|
+
|
|
211
|
+
// Test: `entityName` getter
|
|
212
|
+
test('10_entityName_returns_correct_value', () => {
|
|
213
|
+
const txLabelMap = new EntityTxLabelMap()
|
|
214
|
+
expect(txLabelMap.entityName).toBe('txLabelMap') // Ensure entityName returns the correct string
|
|
215
|
+
})
|
|
216
|
+
|
|
217
|
+
// Test: `entityTable` getter
|
|
218
|
+
test('11_entityTable_returns_correct_value', () => {
|
|
219
|
+
const txLabelMap = new EntityTxLabelMap()
|
|
220
|
+
expect(txLabelMap.entityTable).toBe('tx_labels_map') // Ensure entityTable returns the correct table name
|
|
221
|
+
})
|
|
222
|
+
|
|
223
|
+
test('12_equals_identifies_matching_entities', async () => {
|
|
224
|
+
const ctx1 = ctxs[0]
|
|
225
|
+
const ctx2 = ctxs2[0]
|
|
226
|
+
|
|
227
|
+
// Insert necessary foreign key references into the first database
|
|
228
|
+
const tx1 = new EntityTransaction({
|
|
229
|
+
transactionId: 405,
|
|
230
|
+
userId: 1,
|
|
231
|
+
txid: 'txid1',
|
|
232
|
+
created_at: new Date('2023-01-01'),
|
|
233
|
+
updated_at: new Date('2023-01-02'),
|
|
234
|
+
status: 'completed',
|
|
235
|
+
reference: 'ref1',
|
|
236
|
+
isOutgoing: true,
|
|
237
|
+
satoshis: 789,
|
|
238
|
+
description: 'desc1',
|
|
239
|
+
version: 2,
|
|
240
|
+
lockTime: 500,
|
|
241
|
+
rawTx: [1, 2, 3],
|
|
242
|
+
inputBEEF: [4, 5, 6]
|
|
243
|
+
})
|
|
244
|
+
|
|
245
|
+
await ctx1.activeStorage.insertTransaction(tx1.toApi())
|
|
246
|
+
|
|
247
|
+
// Insert necessary foreign key references into the second database
|
|
248
|
+
const tx2 = new EntityTransaction({
|
|
249
|
+
transactionId: 406,
|
|
250
|
+
userId: 1,
|
|
251
|
+
txid: 'txid1',
|
|
252
|
+
created_at: new Date('2023-01-01'),
|
|
253
|
+
updated_at: new Date('2023-01-02'),
|
|
254
|
+
status: 'completed',
|
|
255
|
+
reference: 'ref1',
|
|
256
|
+
isOutgoing: true,
|
|
257
|
+
satoshis: 789,
|
|
258
|
+
description: 'desc1',
|
|
259
|
+
version: 2,
|
|
260
|
+
lockTime: 500,
|
|
261
|
+
rawTx: [1, 2, 3],
|
|
262
|
+
inputBEEF: [4, 5, 6]
|
|
263
|
+
})
|
|
264
|
+
|
|
265
|
+
await ctx2.activeStorage.insertTransaction(tx2.toApi())
|
|
266
|
+
|
|
267
|
+
// Insert a TxLabel into the first database
|
|
268
|
+
const txLabel1 = new EntityTxLabel({
|
|
269
|
+
txLabelId: 306,
|
|
270
|
+
userId: 1,
|
|
271
|
+
label: 'Label B',
|
|
272
|
+
isDeleted: true, // Different isDeleted value
|
|
273
|
+
created_at: new Date('2023-01-01'),
|
|
274
|
+
updated_at: new Date('2023-01-02')
|
|
275
|
+
})
|
|
276
|
+
|
|
277
|
+
await ctx1.activeStorage.insertTxLabel(txLabel1.toApi())
|
|
278
|
+
|
|
279
|
+
// Insert a matching TxLabel into the second database
|
|
280
|
+
const txLabel2 = new EntityTxLabel({
|
|
281
|
+
txLabelId: 307,
|
|
282
|
+
userId: 1,
|
|
283
|
+
label: 'Label B',
|
|
284
|
+
isDeleted: true, // Different isDeleted value
|
|
285
|
+
created_at: new Date('2023-01-01'),
|
|
286
|
+
updated_at: new Date('2023-01-02')
|
|
287
|
+
})
|
|
288
|
+
|
|
289
|
+
await ctx2.activeStorage.insertTxLabel(txLabel2.toApi())
|
|
290
|
+
|
|
291
|
+
// Insert a TxLabelMap into the first database
|
|
292
|
+
const txLabelMap1 = new EntityTxLabelMap({
|
|
293
|
+
transactionId: 405,
|
|
294
|
+
txLabelId: 306,
|
|
295
|
+
isDeleted: false,
|
|
296
|
+
created_at: new Date('2023-01-01'),
|
|
297
|
+
updated_at: new Date('2023-01-02')
|
|
298
|
+
})
|
|
299
|
+
|
|
300
|
+
await ctx1.activeStorage.insertTxLabelMap(txLabelMap1.toApi())
|
|
301
|
+
|
|
302
|
+
// Insert a matching TxLabelMap into the second database
|
|
303
|
+
const txLabelMap2 = new EntityTxLabelMap({
|
|
304
|
+
transactionId: 406, // Different transaction ID mapped in syncMap
|
|
305
|
+
txLabelId: 307, // Different label ID mapped in syncMap
|
|
306
|
+
isDeleted: false,
|
|
307
|
+
created_at: new Date('2023-01-01'),
|
|
308
|
+
updated_at: new Date('2023-01-02')
|
|
309
|
+
})
|
|
310
|
+
|
|
311
|
+
await ctx2.activeStorage.insertTxLabelMap(txLabelMap2.toApi())
|
|
312
|
+
|
|
313
|
+
const syncMap = createSyncMap()
|
|
314
|
+
syncMap.transaction.idMap = { 406: 405 }
|
|
315
|
+
syncMap.transaction.count = 1
|
|
316
|
+
syncMap.txLabel.idMap = { 307: 306 }
|
|
317
|
+
syncMap.txLabel.count = 1
|
|
318
|
+
|
|
319
|
+
// Verify the entities match
|
|
320
|
+
expect(txLabelMap1.equals(txLabelMap2.toApi(), syncMap)).toBe(true)
|
|
321
|
+
})
|
|
322
|
+
|
|
323
|
+
// Test: equals method identifies non-matching entities
|
|
324
|
+
test('13_equals_identifies_non_matching_entities', async () => {
|
|
325
|
+
const ctx1 = ctxs[0]
|
|
326
|
+
const ctx2 = ctxs2[0]
|
|
327
|
+
|
|
328
|
+
// Insert a TxLabelMap into the first database
|
|
329
|
+
const txLabelMap1 = new EntityTxLabelMap({
|
|
330
|
+
transactionId: 103,
|
|
331
|
+
txLabelId: 1,
|
|
332
|
+
isDeleted: false,
|
|
333
|
+
created_at: new Date('2023-01-01'),
|
|
334
|
+
updated_at: new Date('2023-01-02')
|
|
335
|
+
})
|
|
336
|
+
|
|
337
|
+
await ctx1.activeStorage.insertTxLabelMap(txLabelMap1.toApi())
|
|
338
|
+
|
|
339
|
+
// Insert a non-matching TxLabelMap into the second database
|
|
340
|
+
const txLabelMap2 = new EntityTxLabelMap({
|
|
341
|
+
transactionId: 104, // Different transaction ID not mapped in syncMap
|
|
342
|
+
txLabelId: 1, // Different label ID not mapped in syncMap
|
|
343
|
+
isDeleted: true, // Different isDeleted value
|
|
344
|
+
created_at: new Date('2023-01-01'),
|
|
345
|
+
updated_at: new Date('2023-01-02')
|
|
346
|
+
})
|
|
347
|
+
|
|
348
|
+
await ctx2.activeStorage.insertTxLabelMap(txLabelMap2.toApi())
|
|
349
|
+
|
|
350
|
+
const syncMap = createSyncMap()
|
|
351
|
+
syncMap.transaction.idMap = {
|
|
352
|
+
[txLabelMap1.transactionId]: txLabelMap2.transactionId
|
|
353
|
+
}
|
|
354
|
+
syncMap.transaction.count = 1
|
|
355
|
+
syncMap.txLabel.idMap = { [txLabelMap1.txLabelId]: txLabelMap2.txLabelId }
|
|
356
|
+
syncMap.txLabel.count = 1
|
|
357
|
+
|
|
358
|
+
// Verify the entities do not match
|
|
359
|
+
expect(txLabelMap1.equals(txLabelMap2.toApi(), syncMap)).toBe(false)
|
|
360
|
+
})
|
|
361
|
+
})
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { EntityTxLabel } from '../EntityTxLabel'
|
|
2
|
+
import { createSyncMap, sdk, SyncMap, TableTxLabel } from '../../../../../src'
|
|
3
|
+
import { TestUtilsWalletStorage as _tu, TestWalletNoSetup } from '../../../../../test/utils/TestUtilsWalletStorage'
|
|
4
|
+
|
|
5
|
+
describe('TxLabel Class Tests', () => {
|
|
6
|
+
jest.setTimeout(99999999) // Extend timeout for database operations
|
|
7
|
+
|
|
8
|
+
const env = _tu.getEnv('test') // Test environment
|
|
9
|
+
const ctxs: TestWalletNoSetup[] = [] // Context for primary databases
|
|
10
|
+
const ctxs2: TestWalletNoSetup[] = [] // Context for secondary databases
|
|
11
|
+
|
|
12
|
+
beforeAll(async () => {
|
|
13
|
+
// Set up MySQL and SQLite databases for testing
|
|
14
|
+
if (env.runMySQL) {
|
|
15
|
+
ctxs.push(await _tu.createLegacyWalletMySQLCopy('txLabelTests_db1'))
|
|
16
|
+
ctxs2.push(await _tu.createLegacyWalletMySQLCopy('txLabelTests_db2'))
|
|
17
|
+
}
|
|
18
|
+
ctxs.push(await _tu.createLegacyWalletSQLiteCopy('txLabelTests_db1'))
|
|
19
|
+
ctxs2.push(await _tu.createLegacyWalletSQLiteCopy('txLabelTests_db2'))
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
afterAll(async () => {
|
|
23
|
+
// Clean up primary databases
|
|
24
|
+
for (const ctx of ctxs) {
|
|
25
|
+
await ctx.storage.destroy()
|
|
26
|
+
}
|
|
27
|
+
// Clean up secondary databases
|
|
28
|
+
for (const ctx of ctxs2) {
|
|
29
|
+
await ctx.storage.destroy()
|
|
30
|
+
}
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
// Test: Default constructor behavior
|
|
34
|
+
test('1_creates_txLabel_with_default_values', () => {
|
|
35
|
+
const txLabel = new EntityTxLabel()
|
|
36
|
+
|
|
37
|
+
// Default values
|
|
38
|
+
expect(txLabel.txLabelId).toBe(0)
|
|
39
|
+
expect(txLabel.label).toBe('')
|
|
40
|
+
expect(txLabel.userId).toBe(0)
|
|
41
|
+
expect(txLabel.isDeleted).toBe(false)
|
|
42
|
+
expect(txLabel.created_at).toBeInstanceOf(Date)
|
|
43
|
+
expect(txLabel.updated_at).toBeInstanceOf(Date)
|
|
44
|
+
expect(txLabel.created_at <= txLabel.updated_at).toBe(true)
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
// Test: Constructor with provided API object
|
|
48
|
+
test('2_creates_txLabel_with_provided_api_object', () => {
|
|
49
|
+
const now = new Date()
|
|
50
|
+
const apiObject: TableTxLabel = {
|
|
51
|
+
txLabelId: 42,
|
|
52
|
+
label: 'Test Label',
|
|
53
|
+
userId: 101,
|
|
54
|
+
isDeleted: false,
|
|
55
|
+
created_at: now,
|
|
56
|
+
updated_at: now
|
|
57
|
+
}
|
|
58
|
+
const txLabel = new EntityTxLabel(apiObject)
|
|
59
|
+
|
|
60
|
+
// Verify all properties match the API object
|
|
61
|
+
expect(txLabel.txLabelId).toBe(42)
|
|
62
|
+
expect(txLabel.label).toBe('Test Label')
|
|
63
|
+
expect(txLabel.userId).toBe(101)
|
|
64
|
+
expect(txLabel.isDeleted).toBe(false)
|
|
65
|
+
expect(txLabel.created_at).toBe(now)
|
|
66
|
+
expect(txLabel.updated_at).toBe(now)
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
// Test: Getters and setters behavior
|
|
70
|
+
test('3_getters_and_setters_work_correctly', () => {
|
|
71
|
+
const txLabel = new EntityTxLabel()
|
|
72
|
+
|
|
73
|
+
const now = new Date()
|
|
74
|
+
txLabel.txLabelId = 1
|
|
75
|
+
txLabel.label = 'New Label'
|
|
76
|
+
txLabel.userId = 200
|
|
77
|
+
txLabel.isDeleted = true
|
|
78
|
+
txLabel.created_at = now
|
|
79
|
+
txLabel.updated_at = now
|
|
80
|
+
txLabel.id = 2
|
|
81
|
+
|
|
82
|
+
expect(txLabel.id).toBe(2)
|
|
83
|
+
expect(txLabel.entityName).toBe('txLabel')
|
|
84
|
+
expect(txLabel.entityTable).toBe('tx_labels')
|
|
85
|
+
expect(txLabel.txLabelId).toBe(2)
|
|
86
|
+
expect(txLabel.label).toBe('New Label')
|
|
87
|
+
expect(txLabel.userId).toBe(200)
|
|
88
|
+
expect(txLabel.isDeleted).toBe(true)
|
|
89
|
+
expect(txLabel.created_at).toBe(now)
|
|
90
|
+
expect(txLabel.updated_at).toBe(now)
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
// Test: mergeExisting does not update TxLabel when `ei.updated_at` is older
|
|
94
|
+
test('5_mergeExisting_does_not_update_txLabel_when_ei_updated_at_is_older', async () => {
|
|
95
|
+
for (const { activeStorage } of ctxs) {
|
|
96
|
+
const txLabel = new EntityTxLabel({
|
|
97
|
+
txLabelId: 302,
|
|
98
|
+
label: 'Original Label',
|
|
99
|
+
userId: 1,
|
|
100
|
+
isDeleted: false,
|
|
101
|
+
created_at: new Date('2023-01-01'),
|
|
102
|
+
updated_at: new Date('2023-02-01')
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
await activeStorage.insertTxLabel(txLabel.toApi())
|
|
106
|
+
|
|
107
|
+
const olderEi: TableTxLabel = {
|
|
108
|
+
txLabelId: 302,
|
|
109
|
+
label: 'Outdated Label',
|
|
110
|
+
userId: 1,
|
|
111
|
+
isDeleted: true,
|
|
112
|
+
created_at: new Date('2023-01-01'),
|
|
113
|
+
updated_at: new Date('2023-01-01')
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const result = await txLabel.mergeExisting(activeStorage, undefined, olderEi, {} as any)
|
|
117
|
+
|
|
118
|
+
const reloadedTxLabel = await activeStorage.findTxLabelById(txLabel.id)
|
|
119
|
+
|
|
120
|
+
expect(result).toBe(false)
|
|
121
|
+
expect(reloadedTxLabel?.label).toBe('Original Label')
|
|
122
|
+
expect(reloadedTxLabel?.isDeleted).toBe(false)
|
|
123
|
+
expect(reloadedTxLabel?.updated_at).toEqual(new Date('2023-02-01'))
|
|
124
|
+
}
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
test('6_equals_identifies_matching_entities', async () => {
|
|
128
|
+
const ctx1 = ctxs[0]
|
|
129
|
+
const ctx2 = ctxs2[0]
|
|
130
|
+
|
|
131
|
+
// Insert a TxLabel into the first database
|
|
132
|
+
const txLabel1 = new EntityTxLabel({
|
|
133
|
+
txLabelId: 303,
|
|
134
|
+
userId: 1,
|
|
135
|
+
label: 'Test Label',
|
|
136
|
+
isDeleted: false,
|
|
137
|
+
created_at: new Date('2023-01-01'),
|
|
138
|
+
updated_at: new Date('2023-01-02')
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
await ctx1.activeStorage.insertTxLabel(txLabel1.toApi())
|
|
142
|
+
|
|
143
|
+
// Insert a matching TxLabel into the second database
|
|
144
|
+
const txLabel2 = new EntityTxLabel({
|
|
145
|
+
txLabelId: 304,
|
|
146
|
+
userId: 1, // Different userId to simulate syncMap usage
|
|
147
|
+
label: 'Test Label',
|
|
148
|
+
isDeleted: false,
|
|
149
|
+
created_at: new Date('2023-01-01'),
|
|
150
|
+
updated_at: new Date('2023-01-02')
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
await ctx2.activeStorage.insertTxLabel(txLabel2.toApi())
|
|
154
|
+
|
|
155
|
+
const syncMap = createSyncMap()
|
|
156
|
+
syncMap.txLabel.idMap = { [txLabel2.userId]: txLabel1.userId }
|
|
157
|
+
syncMap.txLabel.count = 1
|
|
158
|
+
|
|
159
|
+
// Verify the entities match
|
|
160
|
+
expect(txLabel1.equals(txLabel2.toApi(), syncMap)).toBe(true)
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
test('7_equals_identifies_non_matching_entities', async () => {
|
|
164
|
+
const ctx1 = ctxs[0]
|
|
165
|
+
const ctx2 = ctxs2[0]
|
|
166
|
+
|
|
167
|
+
// Insert a TxLabel into the first database
|
|
168
|
+
const txLabel1 = new EntityTxLabel({
|
|
169
|
+
txLabelId: 305,
|
|
170
|
+
userId: 1,
|
|
171
|
+
label: 'Label A',
|
|
172
|
+
isDeleted: false,
|
|
173
|
+
created_at: new Date('2023-01-01'),
|
|
174
|
+
updated_at: new Date('2023-01-02')
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
await ctx1.activeStorage.insertTxLabel(txLabel1.toApi())
|
|
178
|
+
|
|
179
|
+
// Insert a non-matching TxLabel into the second database
|
|
180
|
+
const txLabel2 = new EntityTxLabel({
|
|
181
|
+
txLabelId: 306, // Different txLabelId
|
|
182
|
+
userId: 1, // Different userId
|
|
183
|
+
label: 'Label B', // Different label
|
|
184
|
+
isDeleted: true, // Different isDeleted value
|
|
185
|
+
created_at: new Date('2023-01-01'),
|
|
186
|
+
updated_at: new Date('2023-01-02')
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
await ctx2.activeStorage.insertTxLabel(txLabel2.toApi())
|
|
190
|
+
|
|
191
|
+
const syncMap = createSyncMap()
|
|
192
|
+
syncMap.txLabel.idMap = { [txLabel2.userId]: txLabel1.userId }
|
|
193
|
+
syncMap.txLabel.count = 1
|
|
194
|
+
|
|
195
|
+
// Verify the entities do not match
|
|
196
|
+
expect(txLabel1.equals(txLabel2.toApi(), syncMap)).toBe(false)
|
|
197
|
+
})
|
|
198
|
+
})
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { stampLog, stampLogFormat } from '../../../../../src/utility/stampLog'
|
|
2
|
+
import { TestUtilsWalletStorage as _tu, TestWalletNoSetup } from '../../../../../test/utils/TestUtilsWalletStorage'
|
|
3
|
+
|
|
4
|
+
describe('stampLog and stampLogFormat Tests', () => {
|
|
5
|
+
jest.setTimeout(99999999)
|
|
6
|
+
|
|
7
|
+
const ctxs: TestWalletNoSetup[] = []
|
|
8
|
+
|
|
9
|
+
beforeAll(async () => {
|
|
10
|
+
// Set up test contexts for MySQL and SQLite
|
|
11
|
+
ctxs.push(await _tu.createLegacyWalletSQLiteCopy('stampLogTests'))
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
afterAll(async () => {
|
|
15
|
+
for (const ctx of ctxs) {
|
|
16
|
+
await ctx.storage.destroy()
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
// Test: Appending to string logs
|
|
21
|
+
test('0_appends_to_string_log', async () => {
|
|
22
|
+
for (const { wallet } of ctxs) {
|
|
23
|
+
const initialLog = '2025-01-10T10:00:00.000Z Event 1\n'
|
|
24
|
+
const lineToAdd = 'Event 2'
|
|
25
|
+
const updatedLog = stampLog(initialLog, lineToAdd)
|
|
26
|
+
expect(updatedLog).toContain('Event 2')
|
|
27
|
+
expect(updatedLog).toMatch(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z Event 2\n$/)
|
|
28
|
+
}
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
// Test: Appending to object logs
|
|
32
|
+
test('1_appends_to_object_log', async () => {
|
|
33
|
+
for (const { wallet } of ctxs) {
|
|
34
|
+
const initialLog = { log: '2025-01-10T10:00:00.000Z Event 1\n' }
|
|
35
|
+
const lineToAdd = 'Event 2'
|
|
36
|
+
const updatedLog = stampLog(initialLog, lineToAdd)
|
|
37
|
+
expect(updatedLog).toContain('Event 2')
|
|
38
|
+
expect(updatedLog).toMatch(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z Event 2\n$/)
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
// Test: Returns undefined for invalid input
|
|
43
|
+
test('2_returns_undefined_for_invalid_input', async () => {
|
|
44
|
+
for (const { wallet } of ctxs) {
|
|
45
|
+
const updatedLog = stampLog(undefined, 'Event 1')
|
|
46
|
+
expect(updatedLog).toBeUndefined()
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
// Test: Formatting valid log without **NETWORK**
|
|
51
|
+
test('3_formats_valid_log_without_network', async () => {
|
|
52
|
+
for (const { wallet } of ctxs) {
|
|
53
|
+
const log = `2025-01-10T10:00:00.000Z Event 1\n2025-01-10T10:00:01.000Z Event 2\n2025-01-10T10:00:03.000Z Event 3`
|
|
54
|
+
const output = stampLogFormat(log)
|
|
55
|
+
expect(output).toContain('Total = 3000 msecs')
|
|
56
|
+
expect(output).toContain(' 1000 Event 2')
|
|
57
|
+
expect(output).toContain(' 2000 Event 3')
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
// Test: Formatting valid log with **NETWORK** entries
|
|
62
|
+
test('4_formats_log_with_network_entries', async () => {
|
|
63
|
+
for (const { wallet } of ctxs) {
|
|
64
|
+
const log = `2025-01-10T10:00:00.000Z Event 1\n2025-01-10T10:00:01.000Z **NETWORK**\n2025-01-10T10:00:02.000Z Event 2\n2025-01-10T10:00:03.000Z **NETWORK**\n2025-01-10T10:00:05.000Z Event 3`
|
|
65
|
+
const output = stampLogFormat(log)
|
|
66
|
+
expect(output).toContain('Total = 5000 msecs')
|
|
67
|
+
expect(output).toContain(' 1000 **NETWORK**')
|
|
68
|
+
expect(output).toContain(' 2000 Event 3')
|
|
69
|
+
}
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
// Test: Handles improperly formatted log entries
|
|
73
|
+
test('5_handles_invalid_log_entries_gracefully', async () => {
|
|
74
|
+
for (const { wallet } of ctxs) {
|
|
75
|
+
const log = `Invalid Timestamp Event 1\n2025-01-10T10:00:01.000Z Event 2`
|
|
76
|
+
|
|
77
|
+
// Expect the function to throw a RangeError due to invalid timestamp
|
|
78
|
+
expect(() => stampLogFormat(log)).toThrow(RangeError)
|
|
79
|
+
}
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
// Test: Handles non-string input
|
|
83
|
+
test('6_handles_non-string_log_gracefully', () => {
|
|
84
|
+
const nonStringInputs = [undefined, null, 123, {}, [], true] // Different non-string values
|
|
85
|
+
for (const input of nonStringInputs) {
|
|
86
|
+
const result = stampLogFormat(input as unknown as string)
|
|
87
|
+
expect(result).toBe('') // Should return an empty string for non-string inputs
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
})
|