@frak-labs/core-sdk
Version:
Core SDK of the Frak wallet, low level library to interact directly with the frak ecosystem.
129 lines (111 loc) • 4.59 kB
text/typescript
import type { Address, Hex } from "viem";
import {
beforeEach,
describe,
expect,
it,
vi,
} from "../../tests/vitest-fixtures";
import type { FrakClient, GetMerchantInformationReturnType } from "../types";
import { clearAllCache } from "../utils/cache";
import { getMerchantInformation } from "./getMerchantInformation";
describe("getMerchantInformation", () => {
// Clear cache between tests to ensure isolation
beforeEach(() => {
clearAllCache();
});
describe("success cases", () => {
it("should call client.request with correct method", async () => {
const mockResponse: GetMerchantInformationReturnType = {
id: "0x1234567890123456789012345678901234567890123456789012345678901234" as Hex,
onChainMetadata: {
name: "Test Merchant",
domain: "example.com",
},
rewards: [],
};
const mockClient = {
request: vi.fn().mockResolvedValue(mockResponse),
} as unknown as FrakClient;
await getMerchantInformation(mockClient);
expect(mockClient.request).toHaveBeenCalledWith({
method: "frak_getMerchantInformation",
});
});
it("should return merchant information", async () => {
const mockResponse: GetMerchantInformationReturnType = {
id: "0x1234567890123456789012345678901234567890123456789012345678901234" as Hex,
onChainMetadata: {
name: "Test Merchant",
domain: "example.com",
},
rewards: [],
};
const mockClient = {
request: vi.fn().mockResolvedValue(mockResponse),
} as unknown as FrakClient;
const result = await getMerchantInformation(mockClient);
expect(result).toEqual(mockResponse);
});
it("should return merchant information with rewards", async () => {
const mockResponse: GetMerchantInformationReturnType = {
id: "0x1234567890123456789012345678901234567890123456789012345678901234" as Hex,
onChainMetadata: {
name: "Test Merchant",
domain: "example.com",
},
rewards: [
{
token: "0x1234567890123456789012345678901234567890" as Address,
campaignId: "campaign-1",
interactionTypeKey: "referral",
referrer: {
payoutType: "fixed",
amount: {
amount: 10,
eurAmount: 1,
usdAmount: 1.2,
gbpAmount: 0.9,
},
},
referee: {
payoutType: "fixed",
amount: {
amount: 5,
eurAmount: 0.5,
usdAmount: 0.6,
gbpAmount: 0.45,
},
},
},
],
};
const mockClient = {
request: vi.fn().mockResolvedValue(mockResponse),
} as unknown as FrakClient;
const result = await getMerchantInformation(mockClient);
expect(result).toEqual(mockResponse);
expect(result.rewards).toHaveLength(1);
});
});
describe("error handling", () => {
it("should propagate errors from client.request", async () => {
const error = new Error("RPC request failed");
const mockClient = {
request: vi.fn().mockRejectedValue(error),
} as unknown as FrakClient;
await expect(getMerchantInformation(mockClient)).rejects.toThrow(
"RPC request failed"
);
});
it("should handle network timeout errors", async () => {
const error = new Error("Request timeout");
const mockClient = {
request: vi.fn().mockRejectedValue(error),
} as unknown as FrakClient;
await expect(getMerchantInformation(mockClient)).rejects.toThrow(
"Request timeout"
);
});
});
});