@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
119 lines (96 loc) • 3.29 kB
text/typescript
/**
* @jest-environment jsdom
*/
import { renderHook } from "@testing-library/react";
import { useStablecoinTickers } from "../useStablecoinTickers";
import { useGetAssetsByCategoryQuery } from "../../state-manager/api";
import { AssetCategory } from "../../state-manager/types";
jest.mock("../../state-manager/api", () => ({
useGetAssetsByCategoryQuery: jest.fn(),
}));
const hookParams = {
product: "lld" as const,
version: "1.0.0" as const,
};
const mockUseGetAssetsByCategoryQuery = jest.mocked(useGetAssetsByCategoryQuery);
const defaultMockValues = {
data: undefined,
isLoading: false,
isFetching: false,
isSuccess: true,
isError: false,
isUninitialized: false,
error: undefined,
refetch: jest.fn(),
status: "fulfilled" as const,
currentData: undefined,
endpointName: "getAssetsByCategory" as const,
startedTimeStamp: 0,
fulfilledTimeStamp: 0,
requestId: "",
};
describe("useStablecoinTickers", () => {
beforeEach(() => {
jest.clearAllMocks();
});
it("should return empty set and loading true while fetching", () => {
mockUseGetAssetsByCategoryQuery.mockReturnValue({
...defaultMockValues,
isLoading: true,
isSuccess: false,
status: "pending" as const,
});
const { result } = renderHook(() =>
useStablecoinTickers(hookParams.product, hookParams.version),
);
expect(result.current.tickers.size).toBe(0);
expect(result.current.isLoading).toBe(true);
});
it("should return uppercased tickers when data is available", () => {
mockUseGetAssetsByCategoryQuery.mockReturnValue({
...defaultMockValues,
data: ["usdt", "usdc", "Dai"],
});
const { result } = renderHook(() =>
useStablecoinTickers(hookParams.product, hookParams.version),
);
expect(result.current.tickers).toEqual(new Set(["USDT", "USDC", "DAI"]));
expect(result.current.isLoading).toBe(false);
});
it("should return stable reference for empty set across renders", () => {
mockUseGetAssetsByCategoryQuery.mockReturnValue(defaultMockValues);
const { result, rerender } = renderHook(() =>
useStablecoinTickers(hookParams.product, hookParams.version),
);
const firstRef = result.current.tickers;
rerender();
expect(result.current.tickers).toBe(firstRef);
});
it("should pass AssetCategory.Stablecoins to the query", () => {
mockUseGetAssetsByCategoryQuery.mockReturnValue(defaultMockValues);
renderHook(() => useStablecoinTickers(hookParams.product, hookParams.version));
expect(mockUseGetAssetsByCategoryQuery).toHaveBeenCalledWith(
{
category: AssetCategory.Stablecoins,
product: hookParams.product,
version: hookParams.version,
},
{ skip: undefined },
);
});
it("should skip the query when skip is true", () => {
mockUseGetAssetsByCategoryQuery.mockReturnValue({
...defaultMockValues,
isUninitialized: true,
});
renderHook(() => useStablecoinTickers(hookParams.product, hookParams.version, true));
expect(mockUseGetAssetsByCategoryQuery).toHaveBeenCalledWith(
{
category: AssetCategory.Stablecoins,
product: hookParams.product,
version: hookParams.version,
},
{ skip: true },
);
});
});