diff --git a/.changeset/seven-parents-judge.md b/.changeset/seven-parents-judge.md new file mode 100644 index 00000000..87904273 --- /dev/null +++ b/.changeset/seven-parents-judge.md @@ -0,0 +1,7 @@ +--- +"@mimicprotocol/test-ts": patch +"@mimicprotocol/cli": patch +"@mimicprotocol/lib-ts": patch +--- + +add api query oracle mock to test diff --git a/packages/test-ts/README.md b/packages/test-ts/README.md index c3205c46..ff282da9 100644 --- a/packages/test-ts/README.md +++ b/packages/test-ts/README.md @@ -27,7 +27,7 @@ This package provides tooling and helpers to write and run tests for Mimic Protocol functions using TypeScript. It includes: -- Mocking of inputs, balances, prices, contract calls responses, and context variables +- Mocking of inputs, balances, prices, contract calls responses, api requests, and context variables - Simulated function execution with mocked environment - Structured function outputs to assert emitted intents using frameworks like Mocha and Chai diff --git a/packages/test-ts/src/processors/api.ts b/packages/test-ts/src/processors/api.ts new file mode 100644 index 00000000..9313705c --- /dev/null +++ b/packages/test-ts/src/processors/api.ts @@ -0,0 +1,21 @@ +import { OracleQueryParams, OracleQueryResult } from '@mimicprotocol/sdk' + +import { ApiQueryRequest, ApiQueryResponse, QueryProcessor } from '../types' +import { ApiQueryRequestValidator, ApiQueryResponseValidator } from '../validators' + +export const apiQueryProcessor: QueryProcessor< + ApiQueryRequest, + ApiQueryResponse, + OracleQueryParams<'ApiQuery'>, + OracleQueryResult<'ApiQuery'> +> = { + queryName: 'ApiQuery', + queryTypeLabel: 'api query entry', + requestValidator: ApiQueryRequestValidator, + responseValidator: ApiQueryResponseValidator, + transformParams: (req, timestamp) => ({ + ...req, + timestamp: req.timestamp ?? timestamp, + }), + transformResponse: (res) => res, +} diff --git a/packages/test-ts/src/processors/evm-call.ts b/packages/test-ts/src/processors/evm-call.ts index c53ddbd3..577c200b 100644 --- a/packages/test-ts/src/processors/evm-call.ts +++ b/packages/test-ts/src/processors/evm-call.ts @@ -15,8 +15,14 @@ export const evmCallQueryProcessor: QueryProcessor< requestValidator: EvmCallRequestValidator, responseValidator: EvmCallTypedValueValidator, transformParams: (req, timestamp) => { - const data = req.params - ? concat([req.fnSelector, ...req.params.map((p) => AbiCoder.defaultAbiCoder().encode([p.abiType], [p.value]))]) + const data = req.params?.length + ? concat([ + req.fnSelector, + AbiCoder.defaultAbiCoder().encode( + req.params.map((p) => p.abiType), + req.params.map((p) => p.value) + ), + ]) : req.fnSelector return { to: req.to, diff --git a/packages/test-ts/src/processors/index.ts b/packages/test-ts/src/processors/index.ts index f0964cfe..4c9db36c 100644 --- a/packages/test-ts/src/processors/index.ts +++ b/packages/test-ts/src/processors/index.ts @@ -1,3 +1,4 @@ +export * from './api' export * from './evm-call' export * from './price' export * from './relevant-tokens' diff --git a/packages/test-ts/src/run-function.ts b/packages/test-ts/src/run-function.ts index 19ac5a38..855140d2 100644 --- a/packages/test-ts/src/run-function.ts +++ b/packages/test-ts/src/run-function.ts @@ -2,6 +2,7 @@ import { runExecution } from '@mimicprotocol/runner-node' import * as path from 'path' import { + apiQueryProcessor, evmCallQueryProcessor, priceQueryProcessor, relevantTokensQueryProcessor, @@ -62,17 +63,19 @@ export async function runFunction( } function getOracleResponses(optional: RunFunctionOptionalParams, contextTimestamp: number) { - const { prices = [], relevantTokens = [], calls = [], subgraphQueries = [] } = optional + const { prices = [], relevantTokens = [], calls = [], subgraphQueries = [], apiQueries = [] } = optional const priceResponses = processQueries(prices, priceQueryProcessor, contextTimestamp) const relevantTokensResponses = processQueries(relevantTokens, relevantTokensQueryProcessor, contextTimestamp) const callsResponses = processQueries(calls, evmCallQueryProcessor, contextTimestamp) const subgraphQueriesResponses = processQueries(subgraphQueries, subgraphQueryProcessor, contextTimestamp) + const apiQueriesResponses = processQueries(apiQueries, apiQueryProcessor, contextTimestamp) return { ...priceResponses, ...relevantTokensResponses, ...callsResponses, ...subgraphQueriesResponses, + ...apiQueriesResponses, } } diff --git a/packages/test-ts/src/types.ts b/packages/test-ts/src/types.ts index 2df2a0cd..6c1ef66b 100644 --- a/packages/test-ts/src/types.ts +++ b/packages/test-ts/src/types.ts @@ -9,6 +9,8 @@ import { } from '@mimicprotocol/sdk' import { + ApiQueryRequestValidator, + ApiQueryResponseValidator, ContextValidator, EvmCallRequestValidator, EvmCallTypedValueValidator, @@ -86,6 +88,11 @@ export type SubgraphQueryResponse = z.infer +export type ApiQueryRequest = z.infer +export type ApiQueryResponse = z.infer + +export type ApiQueryMock = QueryMock + export type GenerateMockParams = { context: Context inputs: Inputs @@ -93,6 +100,7 @@ export type GenerateMockParams = { relevantTokens: RelevantTokensQueryMock[] calls: EvmCallQueryMock[] subgraphQueries: SubgraphQueryMock[] + apiQueries: ApiQueryMock[] showLogs: boolean } diff --git a/packages/test-ts/src/validators.ts b/packages/test-ts/src/validators.ts index c991c013..565b1142 100644 --- a/packages/test-ts/src/validators.ts +++ b/packages/test-ts/src/validators.ts @@ -2,6 +2,8 @@ import { AddressValidator, ChainIdValidator, HexValidator, + OracleApiRequestValidator, + OracleApiResultValidator, OracleEvmCallRequestValidator, OracleRelevantTokenResultValidator, OracleRelevantTokensRequestValidator, @@ -106,3 +108,11 @@ export const SubgraphQueryRequestValidator = OracleSubgraphQueryRequestValidator }) export const SubgraphQueryResponseValidator = OracleSubgraphQueryResultValidator + +// ========= Api Call ========= + +export const ApiQueryRequestValidator = OracleApiRequestValidator.omit({ timestamp: true }).extend({ + timestamp: PastTimestamp.optional(), +}) + +export const ApiQueryResponseValidator = OracleApiResultValidator