Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/seven-parents-judge.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@mimicprotocol/test-ts": patch
"@mimicprotocol/cli": patch
"@mimicprotocol/lib-ts": patch
---

add api query oracle mock to test
2 changes: 1 addition & 1 deletion packages/test-ts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
21 changes: 21 additions & 0 deletions packages/test-ts/src/processors/api.ts
Original file line number Diff line number Diff line change
@@ -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,
}
10 changes: 8 additions & 2 deletions packages/test-ts/src/processors/evm-call.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions packages/test-ts/src/processors/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './api'
export * from './evm-call'
export * from './price'
export * from './relevant-tokens'
Expand Down
5 changes: 4 additions & 1 deletion packages/test-ts/src/run-function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { runExecution } from '@mimicprotocol/runner-node'
import * as path from 'path'

import {
apiQueryProcessor,
evmCallQueryProcessor,
priceQueryProcessor,
relevantTokensQueryProcessor,
Expand Down Expand Up @@ -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,
}
}
8 changes: 8 additions & 0 deletions packages/test-ts/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import {
} from '@mimicprotocol/sdk'

import {
ApiQueryRequestValidator,
ApiQueryResponseValidator,
ContextValidator,
EvmCallRequestValidator,
EvmCallTypedValueValidator,
Expand Down Expand Up @@ -86,13 +88,19 @@ export type SubgraphQueryResponse = z.infer<typeof SubgraphQueryResponseValidato

export type SubgraphQueryMock = QueryMock<SubgraphQueryRequest, SubgraphQueryResponse>

export type ApiQueryRequest = z.infer<typeof ApiQueryRequestValidator>
export type ApiQueryResponse = z.infer<typeof ApiQueryResponseValidator>

export type ApiQueryMock = QueryMock<ApiQueryRequest, ApiQueryResponse>

export type GenerateMockParams = {
context: Context
inputs: Inputs
prices: TokenPriceQueryMock[]
relevantTokens: RelevantTokensQueryMock[]
calls: EvmCallQueryMock[]
subgraphQueries: SubgraphQueryMock[]
apiQueries: ApiQueryMock[]
showLogs: boolean
}

Expand Down
10 changes: 10 additions & 0 deletions packages/test-ts/src/validators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import {
AddressValidator,
ChainIdValidator,
HexValidator,
OracleApiRequestValidator,
OracleApiResultValidator,
OracleEvmCallRequestValidator,
OracleRelevantTokenResultValidator,
OracleRelevantTokensRequestValidator,
Expand Down Expand Up @@ -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
Loading