From 12b77caa1ae94b811629da1f98ec395d5052c068 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Fri, 11 Dec 2020 14:08:14 +0000 Subject: [PATCH] stargate: Add tests for new searchTx queries --- .../src/stargateclient.searchtx.spec.ts | 153 +++++++++++++++++- packages/stargate/src/testutils.spec.ts | 6 + 2 files changed, 157 insertions(+), 2 deletions(-) diff --git a/packages/stargate/src/stargateclient.searchtx.spec.ts b/packages/stargate/src/stargateclient.searchtx.spec.ts index 06b12276..e22a1434 100644 --- a/packages/stargate/src/stargateclient.searchtx.spec.ts +++ b/packages/stargate/src/stargateclient.searchtx.spec.ts @@ -17,9 +17,16 @@ import { isBroadcastTxSuccess, StargateClient, } from "./stargateclient"; -import { faucet, makeRandomAddress, pendingWithoutSimapp, simapp, simappEnabled } from "./testutils.spec"; +import { + faucet, + fromOneElementArray, + makeRandomAddress, + pendingWithoutSimapp, + simapp, + simappEnabled, +} from "./testutils.spec"; -const { TxRaw } = cosmos.tx.v1beta1; +const { Tx, TxRaw } = cosmos.tx.v1beta1; interface TestTxSend { readonly sender: string; @@ -242,4 +249,146 @@ describe("StargateClient.searchTx", () => { ); }); }); + + describe("with SearchBySentFromOrToQuery", () => { + it("can search by sender", async () => { + pendingWithoutSimapp(); + assert(sendSuccessful, "value must be set in beforeAll()"); + const client = await StargateClient.connect(simapp.tendermintUrl); + const results = await client.searchTx({ sentFromOrTo: sendSuccessful.sender }); + expect(results.length).toBeGreaterThanOrEqual(1); + + // Check basic structure of all results + for (const result of results) { + const tx = Tx.decode(result.tx); + const filteredMsgs = tx.body!.messages!.filter(({ type_url: typeUrl, value }) => { + if (typeUrl !== "/cosmos.bank.v1beta1.MsgSend") return false; + const decoded = registry.decode({ typeUrl: typeUrl, value: value! }); + return decoded.fromAddress === sendSuccessful?.sender; + }); + expect(filteredMsgs.length).toBeGreaterThanOrEqual(1); + } + + // Check details of most recent result + expect(results[results.length - 1]).toEqual( + jasmine.objectContaining({ + height: sendSuccessful.height, + hash: sendSuccessful.hash, + tx: sendSuccessful.tx, + }), + ); + }); + + it("can search by recipient", async () => { + pendingWithoutSimapp(); + assert(sendSuccessful, "value must be set in beforeAll()"); + const client = await StargateClient.connect(simapp.tendermintUrl); + const results = await client.searchTx({ sentFromOrTo: sendSuccessful.recipient }); + expect(results.length).toBeGreaterThanOrEqual(1); + + // Check basic structure of all results + for (const result of results) { + const tx = Tx.decode(result.tx); + const filteredMsgs = tx.body!.messages!.filter(({ type_url: typeUrl, value }) => { + if (typeUrl !== "/cosmos.bank.v1beta1.MsgSend") return false; + const decoded = registry.decode({ typeUrl: typeUrl, value: value! }); + return decoded.toAddress === sendSuccessful?.recipient; + }); + expect(filteredMsgs.length).toBeGreaterThanOrEqual(1); + } + + // Check details of most recent result + expect(results[results.length - 1]).toEqual( + jasmine.objectContaining({ + height: sendSuccessful.height, + hash: sendSuccessful.hash, + tx: sendSuccessful.tx, + }), + ); + }); + + it("can search by recipient and filter by minHeight", async () => { + pendingWithoutSimapp(); + assert(sendSuccessful); + const client = await StargateClient.connect(simapp.tendermintUrl); + const query = { sentFromOrTo: sendSuccessful.recipient }; + + { + const result = await client.searchTx(query, { minHeight: 0 }); + expect(result.length).toEqual(1); + } + + { + const result = await client.searchTx(query, { minHeight: sendSuccessful.height - 1 }); + expect(result.length).toEqual(1); + } + + { + const result = await client.searchTx(query, { minHeight: sendSuccessful.height }); + expect(result.length).toEqual(1); + } + + { + const result = await client.searchTx(query, { minHeight: sendSuccessful.height + 1 }); + expect(result.length).toEqual(0); + } + }); + + it("can search by recipient and filter by maxHeight", async () => { + pendingWithoutSimapp(); + assert(sendSuccessful); + const client = await StargateClient.connect(simapp.tendermintUrl); + const query = { sentFromOrTo: sendSuccessful.recipient }; + + { + const result = await client.searchTx(query, { maxHeight: 9999999999999 }); + expect(result.length).toEqual(1); + } + + { + const result = await client.searchTx(query, { maxHeight: sendSuccessful.height + 1 }); + expect(result.length).toEqual(1); + } + + { + const result = await client.searchTx(query, { maxHeight: sendSuccessful.height }); + expect(result.length).toEqual(1); + } + + { + const result = await client.searchTx(query, { maxHeight: sendSuccessful.height - 1 }); + expect(result.length).toEqual(0); + } + }); + }); + + describe("with SearchByTagsQuery", () => { + it("can search by transfer.recipient", async () => { + pendingWithoutSimapp(); + assert(sendSuccessful, "value must be set in beforeAll()"); + const client = await StargateClient.connect(simapp.tendermintUrl); + const results = await client.searchTx({ + tags: [{ key: "transfer.recipient", value: sendSuccessful.recipient }], + }); + expect(results.length).toBeGreaterThanOrEqual(1); + + // Check basic structure of all results + for (const result of results) { + const tx = Tx.decode(result.tx); + const { type_url: typeUrl, value } = fromOneElementArray(tx.body!.messages!); + expect(typeUrl).toEqual("/cosmos.bank.v1beta1.MsgSend"); + const decoded = registry.decode({ typeUrl: typeUrl!, value: value! }); + expect(decoded.toAddress).toEqual(sendSuccessful.recipient); + } + + // Check details of most recent result + expect(results[results.length - 1]).toEqual( + jasmine.objectContaining({ + height: sendSuccessful.height, + hash: sendSuccessful.hash, + tx: sendSuccessful.tx, + }), + ); + }); + }); }); diff --git a/packages/stargate/src/testutils.spec.ts b/packages/stargate/src/testutils.spec.ts index 21497e27..9d2f4f14 100644 --- a/packages/stargate/src/testutils.spec.ts +++ b/packages/stargate/src/testutils.spec.ts @@ -32,6 +32,12 @@ export function makeRandomAddress(): string { return Bech32.encode("cosmos", makeRandomAddressBytes()); } +/** Returns first element. Throws if array has a different length than 1. */ +export function fromOneElementArray(elements: ArrayLike): T { + if (elements.length !== 1) throw new Error(`Expected exactly one element but got ${elements.length}`); + return elements[0]; +} + export const simapp = { tendermintUrl: "localhost:26658", tendermintUrlWs: "ws://localhost:26658",