@frak-labs/react-sdk
Version:
React SDK of the Frak wallet, low level library to interact directly with the frak ecosystem.
203 lines (150 loc) • 5.62 kB
text/typescript
/**
* Tests for useOpenSso hook
* Tests TanStack Mutation wrapper for opening SSO
*/
import { vi } from "vitest";
vi.mock("@frak-labs/core-sdk/actions");
import type { OpenSsoReturnType } from "@frak-labs/core-sdk";
import { openSso } from "@frak-labs/core-sdk/actions";
import { ClientNotFound } from "@frak-labs/frame-connector";
import { renderHook, waitFor } from "@testing-library/react";
import { describe, expect, test } from "../../tests/vitest-fixtures";
import { useOpenSso } from "./useOpenSso";
describe("useOpenSso", () => {
test("should throw ClientNotFound when client is not available", async ({
queryWrapper,
}) => {
const { result } = renderHook(() => useOpenSso(), {
wrapper: queryWrapper.wrapper,
});
await waitFor(() => {
expect(result.current.mutate).toBeDefined();
});
result.current.mutate({});
await waitFor(() => {
expect(result.current.isError).toBe(true);
});
expect(result.current.error).toBeInstanceOf(ClientNotFound);
});
test("should open SSO successfully", async ({ mockFrakProviders }) => {
const mockResult = undefined as unknown as OpenSsoReturnType;
vi.mocked(openSso).mockResolvedValue(mockResult);
const { result } = renderHook(() => useOpenSso(), {
wrapper: mockFrakProviders,
});
result.current.mutate({});
await waitFor(() => {
expect(result.current.isSuccess).toBe(true);
});
expect(openSso).toHaveBeenCalledTimes(1);
});
test("should open SSO with redirectUrl", async ({ mockFrakProviders }) => {
const mockResult = undefined as unknown as OpenSsoReturnType;
vi.mocked(openSso).mockResolvedValue(mockResult);
const { result } = renderHook(() => useOpenSso(), {
wrapper: mockFrakProviders,
});
const redirectUrl = "https://example.com/callback";
result.current.mutate({
redirectUrl,
});
await waitFor(() => {
expect(result.current.isSuccess).toBe(true);
});
expect(openSso).toHaveBeenCalledWith(
expect.anything(),
expect.objectContaining({
redirectUrl,
})
);
});
test("should open SSO with metadata", async ({ mockFrakProviders }) => {
const mockResult = undefined as unknown as OpenSsoReturnType;
vi.mocked(openSso).mockResolvedValue(mockResult);
const { result } = renderHook(() => useOpenSso(), {
wrapper: mockFrakProviders,
});
const metadata = {
logoUrl: "https://example.com/logo.png",
homepageLink: "https://example.com",
};
result.current.mutate({
metadata,
directExit: true,
});
await waitFor(() => {
expect(result.current.isSuccess).toBe(true);
});
expect(openSso).toHaveBeenCalledWith(
expect.anything(),
expect.objectContaining({
metadata,
directExit: true,
})
);
});
test("should handle mutateAsync", async ({ mockFrakProviders }) => {
const mockResult = undefined as unknown as OpenSsoReturnType;
vi.mocked(openSso).mockResolvedValue(mockResult);
const { result } = renderHook(() => useOpenSso(), {
wrapper: mockFrakProviders,
});
await result.current.mutateAsync({
directExit: false,
});
await waitFor(() => {
expect(result.current.isSuccess).toBe(true);
});
});
test("should handle RPC errors", async ({ mockFrakProviders }) => {
const error = new Error("SSO open failed");
vi.mocked(openSso).mockRejectedValue(error);
const { result } = renderHook(() => useOpenSso(), {
wrapper: mockFrakProviders,
});
result.current.mutate({});
await waitFor(() => {
expect(result.current.isError).toBe(true);
});
expect(result.current.error).toEqual(error);
});
test("should handle mutation options", async ({ mockFrakProviders }) => {
const mockResult = undefined as unknown as OpenSsoReturnType;
vi.mocked(openSso).mockResolvedValue(mockResult);
const onSuccess = vi.fn();
const onError = vi.fn();
const { result } = renderHook(
() =>
useOpenSso({
mutations: {
onSuccess,
onError,
},
}),
{
wrapper: mockFrakProviders,
}
);
result.current.mutate({});
await waitFor(() => {
expect(result.current.isSuccess).toBe(true);
});
expect(onSuccess).toHaveBeenCalled();
expect(onError).not.toHaveBeenCalled();
});
test("should reset mutation state", async ({ mockFrakProviders }) => {
const mockResult = undefined as unknown as OpenSsoReturnType;
vi.mocked(openSso).mockResolvedValue(mockResult);
const { result } = renderHook(() => useOpenSso(), {
wrapper: mockFrakProviders,
});
result.current.mutate({});
await waitFor(() => {
expect(result.current.isSuccess).toBe(true);
});
result.current.reset();
await waitFor(() => {
expect(result.current.isIdle).toBe(true);
});
});
});