From 9e181ef6ee4e4f24430fff0449138ce418b07784 Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Tue, 14 Jan 2025 23:19:01 -0700 Subject: [PATCH] feat: add utilities and first action proposal test --- .../actions/aibtc-action-send-message.test.ts | 26 ++++++++++++------- .../aibtc-onchain-messaging.test.ts | 11 +++++--- tests/error-codes.ts | 5 ++++ tests/test-utilities.ts | 18 +++++++++---- 4 files changed, 41 insertions(+), 19 deletions(-) diff --git a/tests/dao/extensions/actions/aibtc-action-send-message.test.ts b/tests/dao/extensions/actions/aibtc-action-send-message.test.ts index a34ba25..e4919af 100644 --- a/tests/dao/extensions/actions/aibtc-action-send-message.test.ts +++ b/tests/dao/extensions/actions/aibtc-action-send-message.test.ts @@ -1,16 +1,16 @@ import { Cl, cvToValue } from "@stacks/transactions"; import { describe, expect, it } from "vitest"; import { - actionProposalsContractName, constructDao, getDaoTokens, passActionProposal, } from "../../../test-utilities"; +import { ActionErrCode } from "../../../error-codes"; const accounts = simnet.getAccounts(); const deployer = accounts.get("deployer")!; -const address1 = accounts.get("address1")!; -const address2 = accounts.get("address2")!; +const address1 = accounts.get("wallet_1")!; +const address2 = accounts.get("wallet_2")!; const contractName = "aibtc-action-send-message"; const contractAddress = `${deployer}.${contractName}`; @@ -27,21 +27,23 @@ describe(`action extension: ${contractName}`, () => { }); it("run() fails if called directly", () => { + const message = "hello world"; const receipt = simnet.callPublicFn( contractAddress, "run", - [Cl.principal(deployer)], + [Cl.buffer(Cl.serialize(Cl.stringAscii(message)))], deployer ); - expect(receipt.result).toBeErr(Cl.uint(0)); + expect(receipt.result).toBeErr(Cl.uint(ActionErrCode.ERR_UNAUTHORIZED)); }); it("run() succeeds if called as a DAO action proposal", () => { + const message = "hello world"; // fund accounts for creating and voting on proposals const getDaoTokensReceipts = [ - getDaoTokens(deployer, deployer, 1000000000), // 1000 STX - getDaoTokens(deployer, address1, 500000000), // 500 STX - getDaoTokens(deployer, address2, 250000000), // 250 STX + getDaoTokens(deployer, deployer, 100000000), // 100 STX + getDaoTokens(deployer, address1, 50000000), // 50 STX + getDaoTokens(deployer, address2, 25000000), // 25 STX ]; const getAddressBalances = [ simnet.callReadOnlyFn( @@ -67,7 +69,7 @@ describe(`action extension: ${contractName}`, () => { const expectedBalance = parseInt( cvToValue(getAddressBalances[i].result).value ); - console.log(`expectedBalance: ${expectedBalance}`); + // console.log(`expectedBalance: ${expectedBalance}`); expect(getDaoTokensReceipts[i].result).toBeOk(Cl.uint(expectedBalance)); } @@ -81,19 +83,22 @@ describe(`action extension: ${contractName}`, () => { // pass action proposal const concludeProposalReceipt = passActionProposal( contractAddress, + Cl.stringAscii(message), deployer, deployer, [deployer, address1, address2] ); + /* console.log("==========================="); console.log("concludeProposalReceipt"); console.log(concludeProposalReceipt); + console.log("events:"); for (const event of concludeProposalReceipt.events) { const eventValue = cvToValue(event.data.value!); // if event value is an object stringify it console.log( - `- event: ${ + `${ typeof eventValue === "object" ? JSON.stringify(eventValue) : eventValue @@ -111,6 +116,7 @@ describe(`action extension: ${contractName}`, () => { console.log("==========================="); console.log("proposalDetails"); console.log(cvToValue(proposalDetails.result).value); + */ expect(concludeProposalReceipt.result).toBeOk(Cl.bool(true)); }); diff --git a/tests/dao/extensions/aibtc-onchain-messaging.test.ts b/tests/dao/extensions/aibtc-onchain-messaging.test.ts index 8616ace..3df7c57 100644 --- a/tests/dao/extensions/aibtc-onchain-messaging.test.ts +++ b/tests/dao/extensions/aibtc-onchain-messaging.test.ts @@ -56,9 +56,9 @@ describe(`extension: ${contractName}`, () => { // fund accounts for creating and voting on proposals const getDaoTokensReceipts = [ - getDaoTokens(deployer, deployer, 1000000000), // 1000 STX - getDaoTokens(deployer, address1, 500000000), // 500 STX - getDaoTokens(deployer, address2, 250000000), // 250 STX + getDaoTokens(deployer, deployer, 100000000), // 100 STX + getDaoTokens(deployer, address1, 50000000), // 50 STX + getDaoTokens(deployer, address2, 25000000), // 25 STX ]; const getAddressBalances = [ simnet.callReadOnlyFn( @@ -84,7 +84,7 @@ describe(`extension: ${contractName}`, () => { const expectedBalance = parseInt( cvToValue(getAddressBalances[i].result).value ); - console.log(`expectedBalance: ${expectedBalance}`); + // console.log(`expectedBalance: ${expectedBalance}`); expect(getDaoTokensReceipts[i].result).toBeOk(Cl.uint(expectedBalance)); } @@ -102,6 +102,7 @@ describe(`extension: ${contractName}`, () => { [deployer, address1, address2] ); + /* console.log("==========================="); console.log("concludeProposalReceipt"); console.log(concludeProposalReceipt); @@ -117,6 +118,7 @@ describe(`extension: ${contractName}`, () => { ); } + const proposalDetails = simnet.callReadOnlyFn( `${deployer}.aibtc-core-proposals`, "get-proposal", @@ -127,6 +129,7 @@ describe(`extension: ${contractName}`, () => { console.log("==========================="); console.log("proposalDetails"); console.log(cvToValue(proposalDetails.result).value); + */ expect(concludeProposalReceipt.result).toBeOk(Cl.bool(true)); }); diff --git a/tests/error-codes.ts b/tests/error-codes.ts index c9abad9..e6a8bb5 100644 --- a/tests/error-codes.ts +++ b/tests/error-codes.ts @@ -20,6 +20,11 @@ export enum ActionProposalsErrCode { ERR_INVALID_ACTION, } +export enum ActionErrCode { + ERR_UNAUTHORIZED = 10001, + ERR_INVALID_PARAMS, +} + export enum BankAccountErrCode { ERR_INVALID = 2000, ERR_UNAUTHORIZED, diff --git a/tests/test-utilities.ts b/tests/test-utilities.ts index 636e176..be45c68 100644 --- a/tests/test-utilities.ts +++ b/tests/test-utilities.ts @@ -1,4 +1,4 @@ -import { Cl } from "@stacks/transactions"; +import { Cl, ClarityValue } from "@stacks/transactions"; import { expect } from "vitest"; export const actionProposalsContractName = "aibtc-action-proposals"; @@ -24,7 +24,7 @@ export function getDaoTokens( const getDaoTokensReceipt = simnet.callPublicFn( tokenDexContractAddress, "buy", - [Cl.principal(tokenContractAddress), Cl.uint(stxAmount)], // 1000 STX buy test + [Cl.principal(tokenContractAddress), Cl.uint(stxAmount)], address ); @@ -85,15 +85,21 @@ export function passCoreProposal( export function passActionProposal( proposalContractAddress: string, + proposalParams: ClarityValue, deployer: string, sender: string, voters: string[] ) { + // TODO: hardcoded + const proposalId = 1; // propose-action const proposeActionReceipt = simnet.callPublicFn( `${deployer}.${actionProposalsContractName}`, "propose-action", - [Cl.principal(proposalContractAddress)], + [ + Cl.principal(proposalContractAddress), + Cl.buffer(Cl.serialize(proposalParams)), + ], sender ); expect(proposeActionReceipt.result).toBeOk(Cl.bool(true)); @@ -102,16 +108,18 @@ export function passActionProposal( const voteReceipt = simnet.callPublicFn( `${deployer}.${actionProposalsContractName}`, "vote-on-proposal", - [Cl.principal(proposalContractAddress), Cl.bool(true)], + [Cl.uint(proposalId), Cl.bool(true)], voter ); expect(voteReceipt.result).toBeOk(Cl.bool(true)); } + // progress past the end block + simnet.mineEmptyBlocks(votingPeriod); // conclude-proposal const concludeProposalReceipt = simnet.callPublicFn( `${deployer}.${actionProposalsContractName}`, "conclude-proposal", - [Cl.principal(proposalContractAddress)], + [Cl.uint(proposalId), Cl.principal(proposalContractAddress)], deployer ); // return final receipt for processing