import { describe, it, expect, vi, beforeEach } from "vitest"; import { AggregatorAdapter } from "../../../src/adapters/aggregators.js"; describe("Aggregator Adapter", () => { let adapter: AggregatorAdapter; let mockProvider: any; beforeEach(() => { mockProvider = { getNetwork: vi.fn().mockResolvedValue({ chainId: 1n }), call: vi.fn(), }; vi.spyOn(require("ethers"), "JsonRpcProvider").mockImplementation(() => mockProvider); vi.spyOn(require("ethers"), "Contract").mockImplementation(() => ({ swap: vi.fn(), transformERC20: vi.fn(), interface: { encodeFunctionData: vi.fn(), }, })); // Mock fetch global.fetch = vi.fn(); }); it("should get 1inch quote", async () => { adapter = new AggregatorAdapter("mainnet"); // Mock 1inch API response (global.fetch as any).mockResolvedValueOnce({ ok: true, json: async () => ({ toAmount: "1000000", }), }); (global.fetch as any).mockResolvedValueOnce({ ok: true, json: async () => ({ tx: { data: "0x1234", to: "0x1111111254EEB25477B68fb85Ed929f73A960582", }, }), }); const quote = await adapter.get1InchQuote( "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "0xdAC17F958D2ee523a2206206994597C13D831ec7", 1000000n, 50 ); expect(quote).toBeDefined(); expect(quote?.amountOut).toBeGreaterThan(0n); expect(quote?.data).toBeDefined(); }); it("should fallback when 1inch API fails", async () => { adapter = new AggregatorAdapter("mainnet"); // Mock API failure (global.fetch as any).mockResolvedValueOnce({ ok: false, }); const quote = await adapter.get1InchQuote( "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "0xdAC17F958D2ee523a2206206994597C13D831ec7", 1000000n, 50 ); // Should return fallback quote expect(quote).toBeDefined(); }); });