UNPKG

wallet-storage

Version:

BRC100 conforming wallet, wallet storage and wallet signer components

423 lines 21.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const index_client_1 = require("../../../src/index.client"); const TestUtilsWalletStorage_1 = require("../../utils/TestUtilsWalletStorage"); describe("listActions tests", () => { jest.setTimeout(99999999); const storages = []; const chain = "test"; const setups = []; const env = TestUtilsWalletStorage_1._tu.getEnv("test"); const ctxs = []; const testName = () => expect.getState().currentTestName || "test"; beforeAll(async () => { if (!env.noMySQL) { ctxs.push(await TestUtilsWalletStorage_1._tu.createLegacyWalletMySQLCopy(testName())); } ctxs.push(await TestUtilsWalletStorage_1._tu.createLegacyWalletSQLiteCopy(testName())); const mockData = { actions: [ { txid: "tx", satoshis: 1, status: "completed", isOutgoing: true, description: "Transaction", version: 1, lockTime: 0, inputs: [ { sourceOutpoint: "0", sourceSatoshis: 1, sourceLockingScript: "0123456789abcdef", unlockingScript: "0123456789abcdef", inputDescription: "description", sequenceNumber: 0, }, ], labels: ["label", "label2"], outputs: [ { satoshis: 1, spendable: false, tags: ["tag"], outputIndex: 0, outputDescription: "description", basket: "basket", lockingScript: "0123456789abcdef", }, ], }, ], }; for (const ctx of ctxs) { const { activeStorage } = ctx; await activeStorage.dropAllData(); await activeStorage.migrate("insert tests", "3".repeat(64)); } expect(setups).toBeTruthy(); for (const { activeStorage: storage, identityKey } of ctxs) { // Setup test environment with mock data await TestUtilsWalletStorage_1._tu.createTestSetup2(storage, identityKey, mockData); } }); afterAll(async () => { for (const ctx of ctxs) { await ctx.storage.destroy(); } }); test("12_no labels default any", async () => { for (const { wallet } of ctxs) { const args = { labels: [], }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); test("13_no labels any", async () => { for (const { wallet } of ctxs) { const args = { labels: [], labelQueryMode: "any", }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); test("14_no labels all", async () => { for (const { wallet } of ctxs) { const args = { labels: [], labelQueryMode: "all", }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); test("15_empty label default any", async () => { for (const { wallet } of ctxs) { const args = { labels: [""], }; await (0, TestUtilsWalletStorage_1.expectToThrowWERR)(index_client_1.sdk.WERR_INVALID_PARAMETER, async () => await wallet.listActions(args)); } }); test("16_label is space character default any", async () => { for (const { wallet } of ctxs) { const args = { labels: [" "], }; await (0, TestUtilsWalletStorage_1.expectToThrowWERR)(index_client_1.sdk.WERR_INVALID_PARAMETER, async () => await wallet.listActions(args)); } }); test("17_label does not exist default any", async () => { for (const { wallet } of ctxs) { const args = { labels: ["nonexistantlabel"], // Testing with a non-existent label }; const expectedResult = JSON.parse('{"totalActions":0,"actions":[]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); test("18_label min 1 character default any", async () => { for (const { activeStorage: storage, wallet } of ctxs) { const minLengthLabel = "a"; await storage.updateTxLabel(1, { label: minLengthLabel }); const args = { labels: [minLengthLabel], }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); test("19_label max 300 spaces default any", async () => { for (const { wallet } of ctxs) { const maxLengthSpacesLabel = " ".repeat(300); const args = { labels: [maxLengthSpacesLabel], }; await (0, TestUtilsWalletStorage_1.expectToThrowWERR)(index_client_1.sdk.WERR_INVALID_PARAMETER, async () => await wallet.listActions(args)); } }); test("20_label max 300 normal characters default any", async () => { for (const { activeStorage: storage, wallet } of ctxs) { const maxLengthNormalLabel = "a".repeat(300); await storage.updateTxLabel(1, { label: maxLengthNormalLabel }); const args = { labels: [maxLengthNormalLabel], }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); test("21_label min 1 emoji default any", async () => { for (const { activeStorage: storage, wallet } of ctxs) { const minimumEmojiLabel = generateRandomEmojiString(4); await storage.updateTxLabel(1, { label: minimumEmojiLabel }); const args = { labels: [minimumEmojiLabel], }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); test("22_label max length 75 emojis default any", async () => { for (const { activeStorage: storage, wallet } of ctxs) { const maximumEmojisLabel = generateRandomEmojiString(300); await storage.updateTxLabel(1, { label: maximumEmojisLabel }); const args = { labels: [maximumEmojisLabel], }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); test("23_label exceeding max length 76 emojis default any", async () => { for (const { wallet } of ctxs) { const exceedingMaximumEmojisLabel = generateRandomEmojiString(304); const args = { labels: [exceedingMaximumEmojisLabel], }; await (0, TestUtilsWalletStorage_1.expectToThrowWERR)(index_client_1.sdk.WERR_INVALID_PARAMETER, async () => await wallet.listActions(args)); } }); test("24_normal label default any", async () => { for (const { activeStorage: storage, wallet } of ctxs) { const label = "label"; await storage.updateTxLabel(1, { label }); const args = { labels: [label], }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); test("25_normal label any", async () => { for (const { activeStorage: storage, wallet } of ctxs) { const label = "label"; await storage.updateTxLabel(1, { label }); const args = { labels: [label], labelQueryMode: "any", }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); test("26_normal label all", async () => { for (const { activeStorage: storage, wallet } of ctxs) { const label = "label"; await storage.updateTxLabel(1, { label }); const args = { labels: [label], labelQueryMode: "all", }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); // Can't test mixed case at storage level // test('27_label mixed case default any', async () => { // for (const { activeStorage: storage, wallet } of ctxs) { // const mixedCaseLabel = 'LAbEL' // await storage.updateTxLabel(1, { label: mixedCaseLabel }) // const args: bsv.ListActionsArgs = { // labels: [mixedCaseLabel] // } // const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}') // expect(await wallet.listActions(args)).toEqual(expectedResult) // } // }) test("28_label special characters default any", async () => { for (const { activeStorage: storage, wallet } of ctxs) { const specialCharsLabel = "@special#label!"; await storage.updateTxLabel(1, { label: specialCharsLabel }); const args = { labels: [specialCharsLabel], }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); // Can't test external whitespace at storage level // test('29_label leading and trailing whitespace default any', async () => { // for (const { activeStorage: storage, wallet } of ctxs) { // const leadTrailSpacesLabel = ' label ' // await storage.updateTxLabel(1, { label: leadTrailSpacesLabel }) // const args: bsv.ListActionsArgs = { // labels: [leadTrailSpacesLabel] // } // const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}') // expect(await wallet.listActions(args)).toEqual(expectedResult) // } // }) test("30_label numeric default any", async () => { for (const { activeStorage: storage, wallet } of ctxs) { const numericLabel = "12345"; await storage.updateTxLabel(1, { label: numericLabel }); const args = { labels: [numericLabel], }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); test("31_label alphanumeric default any", async () => { for (const { activeStorage: storage, wallet } of ctxs) { const alphaumericLabel = "abcde12345"; await storage.updateTxLabel(1, { label: alphaumericLabel }); const args = { labels: [alphaumericLabel], }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); test("32_label contains default any", async () => { for (const { activeStorage: storage, wallet } of ctxs) { const containsLabel = "label"; await storage.updateTxLabel(1, { label: containsLabel }); const args = { labels: ["labelone"], }; const expectedResult = JSON.parse('{"totalActions":0,"actions":[]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); // Can't test mixed case at storage level // test('33_label different case lower any', async () => { // for (const { wallet } of ctxs) { // const args: bsv.ListActionsArgs = { // labels: ['label'], // labelQueryMode: 'any' // } // const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}') // expect(await wallet.listActions(args)).toEqual(expectedResult) // } // }) // test('34_label different case upper any', async () => { // for (const { wallet } of ctxs) { // const args: bsv.ListActionsArgs = { // labels: ['LABEL'], // labelQueryMode: 'any' // } // const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}') // expect(await wallet.listActions(args)).toEqual(expectedResult) // } // }) test("35_label with whitespace default any", async () => { for (const { activeStorage: storage, wallet } of ctxs) { const spacedLabel = "lab el"; await storage.updateTxLabel(1, { label: spacedLabel }); const args = { labels: [spacedLabel], }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); // Can't test mixed case at storage level // test('36_label different case lower all', async () => { // for (const { wallet } of ctxs) { // const args: bsv.ListActionsArgs = { // labels: ['label'], // labelQueryMode: 'all' // } // const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}') // expect(await wallet.listActions(args)).toEqual(expectedResult) // } // }) // test('37_label different case upper all', async () => { // for (const { wallet } of ctxs) { // const args: bsv.ListActionsArgs = { // labels: ['LABEL'], // labelQueryMode: 'all' // } // const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}') // expect(await wallet.listActions(args)).toEqual(expectedResult) // } // }) // test('38_label duplicated default any', async () => { // for (const { activeStorage: storage, wallet } of ctxs) { // const pairSameLabels = ['label', 'label'] // await storage.updateTxLabel(1, { label: pairSameLabels[0] }) // await storage.updateTxLabel(2, { label: pairSameLabels[1] }) // const args: bsv.ListActionsArgs = { // labels: pairSameLabels // } // const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}') // expect(await wallet.listActions(args)).toEqual(expectedResult) // } // }) test("39_label requested default any", async () => { for (const { activeStorage: storage, wallet } of ctxs) { const label = "label"; await storage.updateTxLabel(1, { label }); await storage.updateTxLabel(2, { label: "label2" }); const args = { labels: [label], includeLabels: true, }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"labels":["label","label2"],"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); test("40_label not requested default any", async () => { for (const { activeStorage: storage, wallet } of ctxs) { const label = "label"; await storage.updateTxLabel(1, { label }); const args = { labels: [label], includeLabels: false, }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); test("41_label partial match default any", async () => { for (const { activeStorage: storage, wallet } of ctxs) { await storage.updateTxLabel(1, { label: "labels" }); await storage.updateTxLabel(2, { label: "label2" }); const args = { labels: ["label"], includeLabels: true, }; const expectedResult = JSON.parse('{"totalActions":0,"actions":[]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); test("42_label only one match default any", async () => { for (const { activeStorage: storage, wallet } of ctxs) { await storage.updateTxLabel(1, { label: "labels" }); await storage.updateTxLabel(2, { label: "label" }); const args = { labels: ["label"], }; const expectedResult = JSON.parse('{"totalActions":1,"actions":[{"txid":"tx","satoshis":1,"status":"completed","isOutgoing":true,"description":"Transaction","version":1,"lockTime":0}]}'); expect(await wallet.listActions(args)).toEqual(expectedResult); } }); }); const generateRandomEmojiString = (bytes) => { const emojiRange = [ "\u{1F600}", // Grinning face "\u{1F603}", // Smiling face "\u{1F604}", // Laughing face "\u{1F609}", // Winking face "\u{1F60A}", // Blushing face "\u{1F60D}", // Heart eyes "\u{1F618}", // Kissing face "\u{1F61C}", // Tongue out "\u{1F923}", // Rolling on the floor laughing "\u{1F44D}", // Thumbs up ]; const bytesPerEmoji = 4; // Each emoji is 4 bytes in UTF-8 const numEmojis = Math.floor(bytes / bytesPerEmoji); let result = ""; for (let i = 0; i < numEmojis; i++) { result += emojiRange[Math.floor(Math.random() * emojiRange.length)]; } return result; }; //# sourceMappingURL=listActions2.test.js.map