import { describe, expect, it, vi } from "vitest";
import { render, screen, waitFor } from "~test/react-render.js";
import { TEST_CLIENT } from "~test/test-clients.js";
import { base } from "../../../../chains/chain-definitions/base.js";
import { ethereum } from "../../../../chains/chain-definitions/ethereum.js";
import { useActiveWalletChain } from "../../../../react/core/hooks/wallets/useActiveWalletChain.js";
import en from "./locale/en.js";
import {
ChainButton,
NetworkButton,
NetworkList,
type NetworkSelectorChainProps,
SectionLabel,
StyledMagnifyingGlassIcon,
TabButton,
} from "./NetworkSelector.js";
const client = TEST_CLIENT;
describe("NetworkSelector", () => {
it("StyledMagnifyingGlassIcon should render a svg element", () => {
const { container } = render();
const svg = container.querySelector("svg");
expect(svg).toBeTruthy();
});
it("NetworkButton should render a button", () => {
const { container } = render();
const button = container.querySelector("button");
expect(button).toBeTruthy();
});
it("SectionLabel should render a
", () => {
const { container } = render();
const p = container.querySelector("p");
expect(p).toBeTruthy();
});
it("TabButton should render a button", () => {
const { container } = render();
const button = container.querySelector("button");
expect(button).toBeTruthy();
});
it("ChainButton should render ChainIcon", async () => {
const { container } = render(
{}}
switchingFailed={false}
/>,
);
await waitFor(
() => {
const image = container.querySelector("img");
expect(image).toBeTruthy();
expect(
image?.src.includes("QmcxZHpyJa8T4i63xqjPYrZ6tKrt55tZJpbXcjSDKuKaf9"),
).toBe(true);
},
{
timeout: 10000,
},
);
});
it("ChainButton should render ChainName", async () => {
render(
{}}
switchingFailed={true}
/>,
);
await waitFor(
() =>
expect(
screen.getByText("Ethereum", {
exact: true,
selector: "span",
}),
).toBeInTheDocument(),
{ timeout: 2000 },
);
});
it("ChainButton should render ChainActiveDot if active prop is set to true", async () => {
vi.mock(
"../../../../react/core/hooks/wallets/useActiveWalletChain.js",
() => ({
useActiveWalletChain: vi.fn(),
}),
);
vi.mocked(useActiveWalletChain).mockReturnValue(ethereum);
const { container } = render(
{}}
switchingFailed={true}
/>,
);
await waitFor(() => {
const dot = container.querySelector(
".tw-chain-active-dot-button-network-selector",
);
expect(dot).toBeTruthy();
});
});
it("ChainButton should still render ChainName if both `confirming` and switchingFailed` are false", async () => {
const { container } = render(
{}}
switchingFailed={false}
/>,
);
await waitFor(
() => {
const element = container.querySelector(
".tw-chain-icon-none-confirming",
);
expect(element).toBeTruthy();
},
{ timeout: 1500 },
);
});
it("NetworkList should render ChainIcon by default", async () => {
render(
{}}
/>,
);
await waitFor(
() => {
expect(
screen.getByText("Ethereum", {
exact: true,
selector: "span",
}),
).toBeInTheDocument();
expect(
screen.getByText("Base", {
exact: true,
selector: "span",
}),
).toBeInTheDocument();
},
{ timeout: 3000 },
);
});
it("NetworkList should render the custom `renderChain`", () => {
const CustomRender: React.FC = (props) => {
return {props.chain.name};
};
const { container } = render(
{}}
renderChain={CustomRender}
/>,
);
const spans = container.querySelectorAll("span._test_");
expect(spans.length).toBe(2);
});
});