Skip to content
This repository has been archived by the owner on Jan 15, 2025. It is now read-only.

Commit

Permalink
ensuring tests include calledWith(...)
Browse files Browse the repository at this point in the history
  • Loading branch information
stat committed Dec 3, 2024
1 parent f518a32 commit 60c297b
Show file tree
Hide file tree
Showing 7 changed files with 169 additions and 30 deletions.
17 changes: 10 additions & 7 deletions cdp-agentkit-core/src/actions/cdp/register_basename.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,19 @@ Do not suggest any alternatives and never try to register a Basename with anothe
Basename fails, you should prompt to try again with a more unique name.`;

// Contract addresses
const BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET = "0x4cCb0BB02FCABA27e82a56646E81d8c5bC4119a5";
const BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET = "0x49aE3cC2e3AA768B1e5654f5D3C6002144A59581";
const L2_RESOLVER_ADDRESS_MAINNET = "0xC6d566A56A1aFf6508b41f6c90ff131615583BCD";
const L2_RESOLVER_ADDRESS_TESTNET = "0x6533C94869D28fAA8dF77cc63f9e2b2D6Cf77eBA";
export const BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET =
"0x4cCb0BB02FCABA27e82a56646E81d8c5bC4119a5";
export const BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET =
"0x49aE3cC2e3AA768B1e5654f5D3C6002144A59581";

export const L2_RESOLVER_ADDRESS_MAINNET = "0xC6d566A56A1aFf6508b41f6c90ff131615583BCD";
export const L2_RESOLVER_ADDRESS_TESTNET = "0x6533C94869D28fAA8dF77cc63f9e2b2D6Cf77eBA";

// Default registration duration (1 year in seconds)
const REGISTRATION_DURATION = "31557600";
export const REGISTRATION_DURATION = "31557600";

// Relevant ABI for L2 Resolver Contract.
const L2_RESOLVER_ABI = [
export const L2_RESOLVER_ABI = [
{
inputs: [
{ internalType: "bytes32", name: "node", type: "bytes32" },
Expand All @@ -44,7 +47,7 @@ const L2_RESOLVER_ABI = [
];

// Relevant ABI for Basenames Registrar Controller Contract.
const REGISTRAR_ABI = [
export const REGISTRAR_ABI = [
{
inputs: [
{
Expand Down
19 changes: 18 additions & 1 deletion cdp-agentkit-core/src/tests/defi_wow_buy_token_test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import { Coinbase, ContractInvocation, Wallet } from "@coinbase/coinbase-sdk";

import { WOW_ABI } from "../actions/cdp/defi/wow/constants";
import { wowBuyToken, WowBuyTokenInput } from "../actions/cdp/defi/wow/actions/buy_token";
import { getBuyQuote } from "../actions/cdp/defi/wow/utils";
import { getHasGraduated } from "../actions/cdp/defi/wow/uniswap/utils";
Expand Down Expand Up @@ -73,7 +75,22 @@ describe("Wow Buy Token Action", () => {

const response = await wowBuyToken(mockWallet, args);

expect(mockWallet.invokeContract).toHaveBeenCalled();
expect(mockWallet.invokeContract).toHaveBeenCalledWith({
contractAddress: MOCK_CONTRACT_ADDRESS,
method: "buy",
abi: WOW_ABI,
args: {
recipient: expect.any(String),
refundRecipient: expect.any(String),
orderReferrer: "0x0000000000000000000000000000000000000000",
expectedMarketType: "1",
minOrderSize: expect.any(String),
sqrtPriceLimitX96: "0",
comment: "",
},
amount: BigInt(args.amountEthInWei),
assetId: "wei",
});
expect(getBuyQuote).toHaveBeenCalled();
expect(getHasGraduated).toHaveBeenCalled();
expect(response).toContain(
Expand Down
29 changes: 27 additions & 2 deletions cdp-agentkit-core/src/tests/defi_wow_create_token_test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
import { Coinbase, ContractInvocation, Wallet } from "@coinbase/coinbase-sdk";

import {
getFactoryAddress,
GENERIC_TOKEN_METADATA_URI,
WOW_FACTORY_ABI,
} from "../actions/cdp/defi/wow/constants";
import { wowCreateToken, WowCreateTokenInput } from "../actions/cdp/defi/wow/actions/create_token";

jest.mock("../actions/cdp/defi/wow/constants", () => ({
getFactoryAddress: jest.fn(),
}));

const MOCK_NAME = "Test Token";
const MOCK_SYMBOL = "TEST";
const MOCK_URI = "ipfs://QmY1GqprFYvojCcUEKgqHeDj9uhZD9jmYGrQTfA9vAE78J";
Expand Down Expand Up @@ -53,8 +63,10 @@ describe("Wow Create Token Input", () => {
});

describe("Wow Create Token Action", () => {
const CONTRACT_ADDRESS = "0xabcdef123456789";
const NETWORK_ID = Coinbase.networks.BaseSepolia;
const TRANSACTION_HASH = "0xghijkl987654321";
const WALLET_ID = "0x123456789abcdef";

let mockContractInvocation: jest.Mocked<ContractInvocation>;
let mockWallet: jest.Mocked<Wallet>;
Expand All @@ -63,7 +75,7 @@ describe("Wow Create Token Action", () => {
mockWallet = {
invokeContract: jest.fn(),
getDefaultAddress: jest.fn().mockResolvedValue({
getId: jest.fn().mockReturnValue(TRANSACTION_HASH),
getId: jest.fn().mockReturnValue(WALLET_ID),
}),
getNetworkId: jest.fn().mockReturnValue(NETWORK_ID),
} as unknown as jest.Mocked<Wallet>;
Expand All @@ -86,9 +98,22 @@ describe("Wow Create Token Action", () => {
tokenUri: MOCK_URI,
};

(getFactoryAddress as jest.Mock).mockReturnValue(CONTRACT_ADDRESS);

const response = await wowCreateToken(mockWallet, args);

expect(mockWallet.invokeContract).toHaveBeenCalled();
expect(mockWallet.invokeContract).toHaveBeenCalledWith({
contractAddress: CONTRACT_ADDRESS,
method: "deploy",
abi: WOW_FACTORY_ABI,
args: {
_tokenCreator: WALLET_ID,
_platformReferrer: "0x0000000000000000000000000000000000000000",
_tokenURI: args.tokenUri || GENERIC_TOKEN_METADATA_URI,
_name: args.name,
_symbol: args.symbol,
},
});
expect(mockContractInvocation.wait).toHaveBeenCalled();
expect(response).toContain(`Created WoW ERC20 memecoin ${MOCK_NAME}`);
expect(response).toContain(`with symbol ${MOCK_SYMBOL}`);
Expand Down
16 changes: 15 additions & 1 deletion cdp-agentkit-core/src/tests/defi_wow_sell_token_test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Coinbase, ContractInvocation, Wallet } from "@coinbase/coinbase-sdk";

import { WOW_ABI } from "../actions/cdp/defi/wow/constants";
import { wowSellToken, WowSellTokenInput } from "../actions/cdp/defi/wow/actions/sell_token";
import { getSellQuote } from "../actions/cdp/defi/wow/utils";
import { getHasGraduated } from "../actions/cdp/defi/wow/uniswap/utils";
Expand Down Expand Up @@ -98,7 +99,20 @@ describe("Wow Sell Token Action", () => {

const response = await wowSellToken(mockWallet, args);

expect(mockWallet.invokeContract).toHaveBeenCalled();
expect(mockWallet.invokeContract).toHaveBeenCalledWith({
contractAddress: MOCK_CONTRACT_ADDRESS,
method: "sell",
abi: WOW_ABI,
args: {
tokensToSell: MOCK_AMOUNT_TOKENS_IN_WEI,
recipient: expect.any(String),
orderReferrer: "0x0000000000000000000000000000000000000000",
comment: "",
expectedMarketType: "1",
minPayoutSize: expect.any(String),
sqrtPriceLimitX96: "0",
},
});
expect(getSellQuote).toHaveBeenCalled();
expect(getHasGraduated).toHaveBeenCalled();
expect(response).toContain(
Expand Down
9 changes: 8 additions & 1 deletion cdp-agentkit-core/src/tests/mint_nft_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,14 @@ describe("Mint NFT Action", () => {

const response = await mintNft(mockWallet, args);

expect(mockWallet.invokeContract).toHaveBeenCalled();
expect(mockWallet.invokeContract).toHaveBeenCalledWith({
contractAddress: MOCK_CONTRACT_ADDRESS,
method: "mint",
args: {
to: MOCK_CONTRACT_DESTINATION,
quantity: "1",
},
});
expect(mockContractInvocation.wait).toHaveBeenCalled();
expect(response).toContain(`Minted NFT from contract ${MOCK_CONTRACT_ADDRESS}`);
expect(response).toContain(`to address ${MOCK_CONTRACT_DESTINATION}`);
Expand Down
105 changes: 89 additions & 16 deletions cdp-agentkit-core/src/tests/register_basename_test.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,27 @@
import { Coinbase, ContractInvocation, Wallet } from "@coinbase/coinbase-sdk";

import { registerBasename, RegisterBasenameInput } from "../actions/cdp/register_basename";

const MOCK_AMMOUNT = "0.123";
import { Decimal } from "decimal.js";
import { encodeFunctionData, namehash } from "viem";

import {
registerBasename,
RegisterBasenameInput,
BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET,
BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET,
L2_RESOLVER_ABI,
L2_RESOLVER_ADDRESS_MAINNET,
L2_RESOLVER_ADDRESS_TESTNET,
REGISTRATION_DURATION,
REGISTRAR_ABI,
} from "../actions/cdp/register_basename";

const MOCK_AMOUNT = "0.123";
const MOCK_BASENAME = "test-basename";

describe("Register Basename Input", () => {
it("should successfully parse valid input", () => {
const validInput = {
amount: MOCK_AMMOUNT,
amount: MOCK_AMOUNT,
basename: MOCK_BASENAME,
};

Expand All @@ -30,12 +43,12 @@ describe("Register Basename Action", () => {
/**
* This is the default network.
*/
const MOCK_NETWORK_ID = Coinbase.networks.BaseMainnet;
const NETWORK_ID = Coinbase.networks.BaseMainnet;

/**
* This is a 40 character hexadecimal string that requires lowercase alpha characters.
*/
const MOCK_ADDRESS_ID = "0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83";
const ADDRESS_ID = "0xe6b2af36b3bb8d47206a129ff11d5a2de2a63c83";

let mockContractInvocation: jest.Mocked<ContractInvocation>;
let mockWallet: jest.Mocked<Wallet>;
Expand All @@ -47,48 +60,108 @@ describe("Register Basename Action", () => {

mockWallet = {
getDefaultAddress: jest.fn().mockResolvedValue({
getId: jest.fn().mockReturnValue(MOCK_ADDRESS_ID),
getId: jest.fn().mockReturnValue(ADDRESS_ID),
}),
getNetworkId: jest.fn().mockReturnValue(MOCK_NETWORK_ID),
getNetworkId: jest.fn().mockReturnValue(NETWORK_ID),
invokeContract: jest.fn(),
} as unknown as jest.Mocked<Wallet>;

mockWallet.invokeContract.mockResolvedValue(mockContractInvocation);
});

it(`should Successfully respond with ${MOCK_BASENAME}.base.eth for network: base-mainnet`, async () => {
it(`should Successfully respond with ${MOCK_BASENAME}.base.eth for network: ${Coinbase.networks.BaseMainnet}`, async () => {
const args = {
amount: MOCK_AMMOUNT,
amount: MOCK_AMOUNT,
basename: MOCK_BASENAME,
};

const name = `${MOCK_BASENAME}.base.eth`;

mockWallet.getNetworkId.mockReturnValue(Coinbase.networks.BaseMainnet);

const response = await registerBasename(mockWallet, args);

expect(mockWallet.invokeContract).toHaveBeenCalled();
expect(mockWallet.invokeContract).toHaveBeenCalledWith({
contractAddress: BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET,
method: "register",
args: {
request: [
MOCK_BASENAME,
ADDRESS_ID,
REGISTRATION_DURATION,
L2_RESOLVER_ADDRESS_MAINNET,
[
encodeFunctionData({
abi: L2_RESOLVER_ABI,
functionName: "setAddr",
args: [namehash(name), ADDRESS_ID],
}),
encodeFunctionData({
abi: L2_RESOLVER_ABI,
functionName: "setName",
args: [namehash(name), name],
}),
],
true,
],
},
abi: REGISTRAR_ABI,
amount: new Decimal(MOCK_AMOUNT),
assetId: "eth",
});
expect(mockContractInvocation.wait).toHaveBeenCalled();
expect(response).toContain(`Successfully registered basename ${MOCK_BASENAME}.base.eth`);
expect(response).toContain(`for address ${MOCK_ADDRESS_ID}`);
expect(response).toContain(`for address ${ADDRESS_ID}`);
});

it(`should Successfully respond with ${MOCK_BASENAME}.basetest.eth for any other network`, async () => {
const args = {
amount: MOCK_AMMOUNT,
amount: MOCK_AMOUNT,
basename: MOCK_BASENAME,
};

const name = `${MOCK_BASENAME}.basetest.eth`;

mockWallet.getNetworkId.mockReturnValue("anything-else");

const response = await registerBasename(mockWallet, args);

expect(mockWallet.invokeContract).toHaveBeenCalled();
expect(mockWallet.invokeContract).toHaveBeenCalledWith({
contractAddress: BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET,
method: "register",
args: {
request: [
MOCK_BASENAME,
ADDRESS_ID,
REGISTRATION_DURATION,
L2_RESOLVER_ADDRESS_TESTNET,
[
encodeFunctionData({
abi: L2_RESOLVER_ABI,
functionName: "setAddr",
args: [namehash(name), ADDRESS_ID],
}),
encodeFunctionData({
abi: L2_RESOLVER_ABI,
functionName: "setName",
args: [namehash(name), name],
}),
],
true,
],
},
abi: REGISTRAR_ABI,
amount: new Decimal(MOCK_AMOUNT),
assetId: "eth",
});
expect(mockContractInvocation.wait).toHaveBeenCalled();
expect(response).toContain(`Successfully registered basename ${MOCK_BASENAME}.basetest.eth`);
expect(response).toContain(`for address ${MOCK_ADDRESS_ID}`);
expect(response).toContain(`for address ${ADDRESS_ID}`);
});

it("should fail with an error", async () => {
const args = {
amount: MOCK_AMMOUNT,
amount: MOCK_AMOUNT,
basename: MOCK_BASENAME,
};

Expand Down
4 changes: 2 additions & 2 deletions cdp-agentkit-core/src/tests/transfer_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ describe("Transfer Action", () => {

const response = await createTransfer(mockWallet, args);

expect(mockWallet.createTransfer).toHaveBeenCalled();
expect(mockWallet.createTransfer).toHaveBeenCalledWith(args);
expect(mockTransfer.wait).toHaveBeenCalled();
expect(response).toContain(
`Transferred ${MOCK_AMOUNT} of ${MOCK_ASSET_ID} to ${MOCK_DESTINATION}`,
Expand All @@ -84,7 +84,7 @@ describe("Transfer Action", () => {

const response = await createTransfer(mockWallet, args);

expect(mockWallet.createTransfer).toHaveBeenCalled();
expect(mockWallet.createTransfer).toHaveBeenCalledWith(args);
expect(response).toContain(`Error transferring the asset: ${error}`);
});
});

0 comments on commit 60c297b

Please sign in to comment.