@reown/appkit-scaffold-ui
Version:
The full stack toolkit to build onchain app UX.
117 lines • 5.69 kB
JavaScript
import { elementUpdated, fixture } from '@open-wc/testing';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { html } from 'lit';
import { ConstantsUtil as CommonConstantsUtil } from '@reown/appkit-common';
import { ConnectorController, RouterController } from '@reown/appkit-controllers';
import { W3mConnectExternalWidget } from '../../src/partials/w3m-connect-external-widget';
import { HelpersUtil } from '../utils/HelpersUtil';
const MOCK_EXTERNAL_CONNECTOR = {
id: 'mockExternal',
name: 'Mock External Wallet',
type: 'EXTERNAL',
chain: CommonConstantsUtil.CHAIN.EVM,
provider: undefined
};
const MOCK_COINBASE_CONNECTOR = {
id: 'coinbaseWalletSDK',
name: 'Coinbase Wallet',
type: 'EXTERNAL',
chain: CommonConstantsUtil.CHAIN.EVM,
provider: undefined
};
describe('W3mConnectExternalWidget', () => {
beforeEach(() => {
vi.spyOn(ConnectorController, 'state', 'get').mockReturnValue({
...ConnectorController.state,
connectors: []
});
});
afterEach(() => {
vi.resetAllMocks();
});
it('should not render anything if there are no external connectors', async () => {
const element = await fixture(html `<w3m-connect-external-widget></w3m-connect-external-widget>`);
expect(element.style.display).toBe('none');
});
it('should not render anything if only Coinbase Wallet SDK is available', async () => {
vi.spyOn(ConnectorController, 'state', 'get').mockReturnValue({
...ConnectorController.state,
connectors: [MOCK_COINBASE_CONNECTOR]
});
const element = await fixture(html `<w3m-connect-external-widget></w3m-connect-external-widget>`);
expect(element.style.display).toBe('none');
});
it('should render external connectors excluding Coinbase Wallet', async () => {
vi.spyOn(ConnectorController, 'state', 'get').mockReturnValue({
...ConnectorController.state,
connectors: [MOCK_EXTERNAL_CONNECTOR, MOCK_COINBASE_CONNECTOR]
});
const element = await fixture(html `<w3m-connect-external-widget></w3m-connect-external-widget>`);
element.requestUpdate();
await elementUpdated(element);
const walletSelector = HelpersUtil.getByTestId(element, `wallet-selector-external-${MOCK_EXTERNAL_CONNECTOR.id}`);
expect(walletSelector).not.toBeNull();
expect(walletSelector?.getAttribute('name')).toBe(MOCK_EXTERNAL_CONNECTOR.name);
});
it('should handle unknown wallet names', async () => {
const unknownConnector = {
id: 'mockExternal',
type: 'EXTERNAL',
chain: CommonConstantsUtil.CHAIN.EVM,
provider: undefined
};
vi.spyOn(ConnectorController, 'state', 'get').mockReturnValue({
...ConnectorController.state,
connectors: [unknownConnector]
});
const element = await fixture(html `<w3m-connect-external-widget></w3m-connect-external-widget>`);
element.requestUpdate();
await elementUpdated(element);
const walletSelector = HelpersUtil.getByTestId(element, `wallet-selector-external-${unknownConnector.id}`);
expect(walletSelector?.getAttribute('name')).toBe('Unknown');
});
it('should route to ConnectingExternal when wallet is clicked', async () => {
vi.spyOn(ConnectorController, 'state', 'get').mockReturnValue({
...ConnectorController.state,
connectors: [MOCK_EXTERNAL_CONNECTOR]
});
const pushSpy = vi.spyOn(RouterController, 'push');
const element = await fixture(html `<w3m-connect-external-widget></w3m-connect-external-widget>`);
const walletSelector = HelpersUtil.getByTestId(element, `wallet-selector-external-${MOCK_EXTERNAL_CONNECTOR.id}`);
walletSelector?.click();
expect(pushSpy).toHaveBeenCalledWith('ConnectingExternal', {
connector: MOCK_EXTERNAL_CONNECTOR
});
});
it('should respect tabIdx property', async () => {
vi.spyOn(ConnectorController, 'state', 'get').mockReturnValue({
...ConnectorController.state,
connectors: [MOCK_EXTERNAL_CONNECTOR]
});
const element = await fixture(html `<w3m-connect-external-widget .tabIdx=${2}></w3m-connect-external-widget>`);
element.requestUpdate();
await elementUpdated(element);
const walletSelector = HelpersUtil.getByTestId(element, `wallet-selector-external-${MOCK_EXTERNAL_CONNECTOR.id}`);
expect(walletSelector?.getAttribute('tabIdx')).toBe('2');
});
it('should update when connectors change', async () => {
let subscriptionCallback = () => { };
vi.spyOn(ConnectorController, 'subscribeKey').mockImplementation((_, callback) => {
subscriptionCallback = callback;
return () => { };
});
const element = await fixture(html `<w3m-connect-external-widget></w3m-connect-external-widget>`);
await element.updateComplete;
expect(element.shadowRoot?.querySelectorAll('wui-list-wallet').length).toBe(0);
vi.spyOn(ConnectorController, 'state', 'get').mockReturnValue({
...ConnectorController.state,
connectors: [MOCK_EXTERNAL_CONNECTOR]
});
subscriptionCallback([MOCK_EXTERNAL_CONNECTOR]);
element.requestUpdate();
await element.updateComplete;
await elementUpdated(element);
expect(element.shadowRoot?.querySelectorAll('wui-list-wallet').length).toBe(1);
});
});
//# sourceMappingURL=w3m-connect-external-wdiget.test.js.map