From 907c5517b66567c709ac681bcba9e8ca5afd9c11 Mon Sep 17 00:00:00 2001 From: MEGHA <100185149+Megha-Dev-19@users.noreply.github.com> Date: Mon, 10 Oct 2022 18:26:28 +0530 Subject: [PATCH 1/5] added test cases --- packages/web/test/mocks/myalgowallet-mock.ts | 91 +++++++++++++++++++ .../web/test/src/lib/myalgowallet-mode.ts | 60 ++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 packages/web/test/mocks/myalgowallet-mock.ts create mode 100644 packages/web/test/src/lib/myalgowallet-mode.ts diff --git a/packages/web/test/mocks/myalgowallet-mock.ts b/packages/web/test/mocks/myalgowallet-mock.ts new file mode 100644 index 000000000..2f084fdc6 --- /dev/null +++ b/packages/web/test/mocks/myalgowallet-mock.ts @@ -0,0 +1,91 @@ +import type { + Options, + Accounts, + Address, + AlgorandTxn, + Base64, + ConnectionSettings, + EncodedTransaction, + SignedTx, + SignTransactionOptions, +} from "@randlabs/myalgo-connect"; + +export default class MyAlgoConnectMock { + + /** + * @param {Options} options Override default popup options. + */ + constructor(options?: Options) { + + }; + + /** + * @async + * @description Receives user's accounts from MyAlgo. + * @param {ConnectionSettings} [settings] Connection settings + * @returns Returns an array of Algorand addresses. + */ + connect(settings?: ConnectionSettings): Promise { + return new Promise((resolve, reject) => { + return resolve([{ + address: "", + name: "" + }]); + }); + }; + + /** + * @async + * @description Sign an Algorand Transaction. + * @param transaction Expect a valid Algorand transaction + * @param signOptions Sign transactions options object. + * @returns Returns signed transaction + */ + signTransaction(transaction: AlgorandTxn | EncodedTransaction, signOptions?: SignTransactionOptions): Promise; + + /** + * @async + * @description Sign an Algorand Transaction. + * @param transaction Expect a valid Algorand transaction array. + * @param signOptions Sign transactions options object. + * @returns Returns signed an array of signed transactions. + */ + signTransaction(transaction: (AlgorandTxn | EncodedTransaction)[], signOptions?: SignTransactionOptions): Promise; + + signTransaction(transaction: AlgorandTxn | EncodedTransaction | (AlgorandTxn | EncodedTransaction)[], signOptions?: SignTransactionOptions): Promise { + return new Promise((resolve, reject) => { + return resolve([{ + blob: new Uint8Array(), + txID: "" + }]); + }); + } + + + /** + * @async + * @description Sign a teal program + * @param logic Teal program + * @param address Signer Address + * @returns Returns signed teal + */ + signLogicSig(logic: Uint8Array | Base64, address: Address): Promise { + return new Promise((resolve, reject) => { + return resolve(new Uint8Array()); + }); + }; + + /** + * @async + * @description Creates a signature the data that can later be verified by the contract through the ed25519verify opcode + * @param data Arbitrary data to sign + * @param contractAddress Contract address/TEAL program hash + * @param address Signer Address + * @returns Returns the data signature + */ + tealSign(data: Uint8Array | Base64, contractAddress: Address, address: Address): Promise { + return new Promise((resolve, reject) => { + return resolve(new Uint8Array()); + }); + }; +} diff --git a/packages/web/test/src/lib/myalgowallet-mode.ts b/packages/web/test/src/lib/myalgowallet-mode.ts new file mode 100644 index 000000000..6a8f03f38 --- /dev/null +++ b/packages/web/test/src/lib/myalgowallet-mode.ts @@ -0,0 +1,60 @@ +import MyAlgoConnect from "@randlabs/myalgo-connect"; +import algosdk, { Account } from "algosdk"; +import assert from "assert"; + +import { MyAlgoWalletSession, types } from "../../../src"; +import { algoexplorerAlgod, mkTxParams } from "../../../src/lib/api"; +import { mkTransaction } from "../../../src/lib/txn"; +import { HttpNetworkConfig } from "../../../src/types"; +import MyAlgoConnectMock from "../../mocks/myalgowallet-mock"; + +describe("Webmode - MyAlgo Wallet test cases ", () => { + let connector: MyAlgoWalletSession; + let sender: Account; + let receiver: Account; + let algodClient: algosdk.Algodv2; + const walletURL: HttpNetworkConfig = { + token: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + server: "http://localhost", + port: 4001, + } + algodClient = algoexplorerAlgod(walletURL); + + beforeEach(() => { + MyAlgoConnect + sender = algosdk.generateAccount(); + receiver = algosdk.generateAccount(); + connector = new MyAlgoWalletSession(walletURL, new MyAlgoConnectMock()); + + }); + + it("Should executeTx without throwing an error", async () => { + const txnParams: types.AlgoTransferParam = { + type: types.TransactionType.TransferAlgo, + sign: types.SignType.SecretKey, + fromAccount: sender, + toAccountAddr: receiver.addr, + amountMicroAlgos: 10000n, + payFlags: {}, + }; + + assert.doesNotThrow(async () => { + await connector.executeTx([txnParams]); + }); + }); + + it("Should signTx without throwing an error", async () => { + const txnParams: types.AlgoTransferParam = { + type: types.TransactionType.TransferAlgo, + sign: types.SignType.SecretKey, + fromAccount: sender, + toAccountAddr: receiver.addr, + amountMicroAlgos: 10000n, + payFlags: {}, + } + assert.doesNotThrow(async () => { + await connector.signTransaction(mkTransaction(txnParams, await mkTxParams(algodClient, txnParams.payFlags))); + }) + }); + +}); From f30c9c4fada59f177f4857a5b7bf14e6b7237eec Mon Sep 17 00:00:00 2001 From: MEGHA <100185149+Megha-Dev-19@users.noreply.github.com> Date: Tue, 11 Oct 2022 11:22:30 +0530 Subject: [PATCH 2/5] new tests added --- .../web/test/src/lib/myalgowallet-mode.ts | 81 +++++++++++++++---- 1 file changed, 66 insertions(+), 15 deletions(-) diff --git a/packages/web/test/src/lib/myalgowallet-mode.ts b/packages/web/test/src/lib/myalgowallet-mode.ts index 6a8f03f38..c811910c1 100644 --- a/packages/web/test/src/lib/myalgowallet-mode.ts +++ b/packages/web/test/src/lib/myalgowallet-mode.ts @@ -1,10 +1,9 @@ import MyAlgoConnect from "@randlabs/myalgo-connect"; -import algosdk, { Account } from "algosdk"; +import algosdk, { Account, Transaction } from "algosdk"; import assert from "assert"; import { MyAlgoWalletSession, types } from "../../../src"; -import { algoexplorerAlgod, mkTxParams } from "../../../src/lib/api"; -import { mkTransaction } from "../../../src/lib/txn"; +import { algoexplorerAlgod, getSuggestedParams } from "../../../src/lib/api"; import { HttpNetworkConfig } from "../../../src/types"; import MyAlgoConnectMock from "../../mocks/myalgowallet-mock"; @@ -43,18 +42,70 @@ describe("Webmode - MyAlgo Wallet test cases ", () => { }); }); - it("Should signTx without throwing an error", async () => { - const txnParams: types.AlgoTransferParam = { - type: types.TransactionType.TransferAlgo, - sign: types.SignType.SecretKey, - fromAccount: sender, - toAccountAddr: receiver.addr, - amountMicroAlgos: 10000n, - payFlags: {}, - } - assert.doesNotThrow(async () => { - await connector.signTransaction(mkTransaction(txnParams, await mkTxParams(algodClient, txnParams.payFlags))); - }) + describe("Helper functions", () => { + it("Should return a transaction object based on provided execParams", async function () { + const execParams: types.AlgoTransferParam = { + type: types.TransactionType.TransferAlgo, + sign: types.SignType.SecretKey, + fromAccount: sender, + toAccountAddr: receiver.addr, + amountMicroAlgos: 10000n, + payFlags: {}, + }; + const txnParams = await getSuggestedParams(algodClient); + const transactions: Transaction[] = connector.makeTx([execParams], txnParams); + assert.deepEqual(transactions[0].type, algosdk.TransactionType.pay); + assert.deepEqual(algosdk.encodeAddress(transactions[0].from.publicKey), sender.addr); + assert.deepEqual(algosdk.encodeAddress(transactions[0].to.publicKey), receiver.addr); + assert.deepEqual(transactions[0].amount, 10000n); + }); + + it("Should sign a transaction and return a SignedTransaction object", async function () { + const execParams: types.AlgoTransferParam = { + type: types.TransactionType.TransferAlgo, + sign: types.SignType.SecretKey, + fromAccount: sender, + toAccountAddr: receiver.addr, + amountMicroAlgos: 10000n, + payFlags: {}, + }; + const txnParams = await getSuggestedParams(algodClient); + const transactions: Transaction[] = connector.makeTx([execParams], txnParams); + assert.doesNotThrow(async () => { + await connector.signTx(transactions[0]); + }); + }); + + it("Should return a SignedTransaction object based on ExecParams", async function () { + const execParams: types.AlgoTransferParam = { + type: types.TransactionType.TransferAlgo, + sign: types.SignType.SecretKey, + fromAccount: sender, + toAccountAddr: receiver.addr, + amountMicroAlgos: 10000n, + payFlags: {}, + }; + const txnParams = await getSuggestedParams(algodClient); + assert.doesNotThrow(async () => { + await connector.makeAndSignTx([execParams], txnParams); + }); + }); + + it("Should send a signed transaction and wait specified rounds for confirmation", async function () { + const execParams: types.AlgoTransferParam = { + type: types.TransactionType.TransferAlgo, + sign: types.SignType.SecretKey, + fromAccount: sender, + toAccountAddr: receiver.addr, + amountMicroAlgos: 10000n, + payFlags: {}, + }; + const txnParams = await getSuggestedParams(algodClient); + const signedTx = await connector.makeAndSignTx([execParams], txnParams); + assert.doesNotThrow(async () => { + await connector.sendTxAndWait(signedTx); + }); + }); }); }); From 165c89554fb7ae0a9ad5e4ff455be4f76cef12be Mon Sep 17 00:00:00 2001 From: MEGHA <100185149+Megha-Dev-19@users.noreply.github.com> Date: Wed, 12 Oct 2022 12:32:15 +0530 Subject: [PATCH 3/5] suggestive changes --- packages/web/test/src/lib/myalgowallet-mode.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/web/test/src/lib/myalgowallet-mode.ts b/packages/web/test/src/lib/myalgowallet-mode.ts index c811910c1..661060155 100644 --- a/packages/web/test/src/lib/myalgowallet-mode.ts +++ b/packages/web/test/src/lib/myalgowallet-mode.ts @@ -1,4 +1,3 @@ -import MyAlgoConnect from "@randlabs/myalgo-connect"; import algosdk, { Account, Transaction } from "algosdk"; import assert from "assert"; @@ -20,7 +19,6 @@ describe("Webmode - MyAlgo Wallet test cases ", () => { algodClient = algoexplorerAlgod(walletURL); beforeEach(() => { - MyAlgoConnect sender = algosdk.generateAccount(); receiver = algosdk.generateAccount(); connector = new MyAlgoWalletSession(walletURL, new MyAlgoConnectMock()); @@ -33,7 +31,7 @@ describe("Webmode - MyAlgo Wallet test cases ", () => { sign: types.SignType.SecretKey, fromAccount: sender, toAccountAddr: receiver.addr, - amountMicroAlgos: 10000n, + amountMicroAlgos: 1e6, payFlags: {}, }; @@ -49,7 +47,7 @@ describe("Webmode - MyAlgo Wallet test cases ", () => { sign: types.SignType.SecretKey, fromAccount: sender, toAccountAddr: receiver.addr, - amountMicroAlgos: 10000n, + amountMicroAlgos: 1e6, payFlags: {}, }; const txnParams = await getSuggestedParams(algodClient); @@ -57,7 +55,7 @@ describe("Webmode - MyAlgo Wallet test cases ", () => { assert.deepEqual(transactions[0].type, algosdk.TransactionType.pay); assert.deepEqual(algosdk.encodeAddress(transactions[0].from.publicKey), sender.addr); assert.deepEqual(algosdk.encodeAddress(transactions[0].to.publicKey), receiver.addr); - assert.deepEqual(transactions[0].amount, 10000n); + assert.deepEqual(transactions[0].amount, 1e6); }); it("Should sign a transaction and return a SignedTransaction object", async function () { @@ -66,7 +64,7 @@ describe("Webmode - MyAlgo Wallet test cases ", () => { sign: types.SignType.SecretKey, fromAccount: sender, toAccountAddr: receiver.addr, - amountMicroAlgos: 10000n, + amountMicroAlgos: 1e6, payFlags: {}, }; const txnParams = await getSuggestedParams(algodClient); @@ -82,7 +80,7 @@ describe("Webmode - MyAlgo Wallet test cases ", () => { sign: types.SignType.SecretKey, fromAccount: sender, toAccountAddr: receiver.addr, - amountMicroAlgos: 10000n, + amountMicroAlgos: 1e6, payFlags: {}, }; const txnParams = await getSuggestedParams(algodClient); @@ -97,7 +95,7 @@ describe("Webmode - MyAlgo Wallet test cases ", () => { sign: types.SignType.SecretKey, fromAccount: sender, toAccountAddr: receiver.addr, - amountMicroAlgos: 10000n, + amountMicroAlgos: 1e6, payFlags: {}, }; const txnParams = await getSuggestedParams(algodClient); From 14a7d6f0b0566a0c051be80c97c59fcb91f562e9 Mon Sep 17 00:00:00 2001 From: MEGHA <100185149+Megha-Dev-19@users.noreply.github.com> Date: Wed, 12 Oct 2022 12:34:52 +0530 Subject: [PATCH 4/5] added testnet config --- packages/web/test/src/lib/myalgowallet-mode.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/web/test/src/lib/myalgowallet-mode.ts b/packages/web/test/src/lib/myalgowallet-mode.ts index 661060155..954aed732 100644 --- a/packages/web/test/src/lib/myalgowallet-mode.ts +++ b/packages/web/test/src/lib/myalgowallet-mode.ts @@ -1,7 +1,7 @@ import algosdk, { Account, Transaction } from "algosdk"; import assert from "assert"; -import { MyAlgoWalletSession, types } from "../../../src"; +import { MyAlgoWalletSession, testnetURL, types } from "../../../src"; import { algoexplorerAlgod, getSuggestedParams } from "../../../src/lib/api"; import { HttpNetworkConfig } from "../../../src/types"; import MyAlgoConnectMock from "../../mocks/myalgowallet-mock"; @@ -12,9 +12,9 @@ describe("Webmode - MyAlgo Wallet test cases ", () => { let receiver: Account; let algodClient: algosdk.Algodv2; const walletURL: HttpNetworkConfig = { - token: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - server: "http://localhost", - port: 4001, + token: "", + server: testnetURL, + port: "", } algodClient = algoexplorerAlgod(walletURL); From 27bd6e7553c488eabe481ebdbcd99dfc5efcbb35 Mon Sep 17 00:00:00 2001 From: MEGHA <100185149+Megha-Dev-19@users.noreply.github.com> Date: Wed, 12 Oct 2022 12:36:10 +0530 Subject: [PATCH 5/5] updated arrow fn --- packages/web/test/src/lib/myalgowallet-mode.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/web/test/src/lib/myalgowallet-mode.ts b/packages/web/test/src/lib/myalgowallet-mode.ts index 954aed732..2804150ee 100644 --- a/packages/web/test/src/lib/myalgowallet-mode.ts +++ b/packages/web/test/src/lib/myalgowallet-mode.ts @@ -25,7 +25,7 @@ describe("Webmode - MyAlgo Wallet test cases ", () => { }); - it("Should executeTx without throwing an error", async () => { + it("Should executeTx without throwing an error", async function () { const txnParams: types.AlgoTransferParam = { type: types.TransactionType.TransferAlgo, sign: types.SignType.SecretKey, @@ -40,7 +40,7 @@ describe("Webmode - MyAlgo Wallet test cases ", () => { }); }); - describe("Helper functions", () => { + describe("Helper functions", function () { it("Should return a transaction object based on provided execParams", async function () { const execParams: types.AlgoTransferParam = { type: types.TransactionType.TransferAlgo,