UNPKG

@lukasrosario/account

Version:

Base Account SDK

155 lines (125 loc) 4.84 kB
import { waitFor } from '@testing-library/preact'; import { Mock, vi } from 'vitest'; import { PACKAGE_NAME, PACKAGE_VERSION } from ':core/constants.js'; import { getCrossOriginOpenerPolicy } from './checkCrossOriginOpenerPolicy.js'; import { closePopup, openPopup } from './web.js'; vi.mock('./checkCrossOriginOpenerPolicy'); (getCrossOriginOpenerPolicy as Mock).mockReturnValue('null'); // Mock Snackbar class const mockPresentItem = vi.fn().mockReturnValue(() => {}); const mockClear = vi.fn(); const mockAttach = vi.fn(); const mockInstance = { presentItem: mockPresentItem, clear: mockClear, attach: mockAttach, }; vi.mock(':ui/Dialog/index.js', () => ({ initDialog: vi.fn().mockImplementation(() => mockInstance), })); const mockOrigin = 'http://localhost'; vi.mock(':store/store.js', () => ({ store: { config: { get: vi.fn().mockReturnValue({ metadata: { appName: 'Test App' } }), }, }, })); describe('PopupManager', () => { beforeAll(() => { global.window = Object.create(window); Object.defineProperties(window, { innerWidth: { value: 1024 }, innerHeight: { value: 768 }, screenX: { value: 0 }, screenY: { value: 0 }, open: { value: vi.fn() }, close: { value: vi.fn() }, location: { value: { origin: mockOrigin } }, }); }); afterEach(() => { vi.clearAllMocks(); }); it('should open a popup with correct settings and focus it', async () => { const url = new URL('https://example.com'); (window.open as Mock).mockReturnValue({ focus: vi.fn() }); const popup = await openPopup(url); expect(window.open).toHaveBeenNthCalledWith( 1, url, expect.stringContaining('wallet_'), 'width=420, height=700, left=302, top=34' ); expect(popup.focus).toHaveBeenCalledTimes(1); expect(url.searchParams.get('sdkName')).toBe(PACKAGE_NAME); expect(url.searchParams.get('sdkVersion')).toBe(PACKAGE_VERSION); expect(url.searchParams.get('origin')).toBe(mockOrigin); expect(url.searchParams.get('coop')).toBe('null'); }); it('should not duplicate parameters when opening a popup with existing params', async () => { const url = new URL('https://example.com'); url.searchParams.append('sdkName', PACKAGE_NAME); url.searchParams.append('sdkVersion', PACKAGE_VERSION); url.searchParams.append('origin', mockOrigin); url.searchParams.append('coop', 'null'); (window.open as Mock).mockReturnValue({ focus: vi.fn() }); await openPopup(url); const paramCount = url.searchParams.toString().split('&').length; expect(paramCount).toBe(4); }); it('should show snackbar with retry button when popup is blocked and retry successfully', async () => { const url = new URL('https://example.com'); const mockPopup = { focus: vi.fn() }; (window.open as Mock).mockReturnValueOnce(null).mockReturnValueOnce(mockPopup); const promise = openPopup(url); await waitFor(() => { expect(mockPresentItem).toHaveBeenCalledWith( expect.objectContaining({ title: 'Test App wants to continue in Base Account', message: 'This action requires your permission to open a new window.', actionItems: expect.arrayContaining([ expect.objectContaining({ text: 'Try again', variant: 'primary', }), ]), }) ); }); const retryButton = mockPresentItem.mock.calls[0][0].actionItems[0]; retryButton.onClick(); const popup = await promise; expect(popup).toBe(mockPopup); expect(mockClear).toHaveBeenCalled(); expect(window.open).toHaveBeenCalledTimes(2); }); it('should show snackbar with retry button when popup is blocked and reject if retry fails', async () => { const url = new URL('https://example.com'); (window.open as Mock).mockReturnValue(null); const promise = openPopup(url); await waitFor(() => { expect(mockPresentItem).toHaveBeenCalledWith( expect.objectContaining({ title: 'Test App wants to continue in Base Account', message: 'This action requires your permission to open a new window.', actionItems: expect.arrayContaining([ expect.objectContaining({ text: 'Try again', variant: 'primary', }), ]), }) ); }); const retryButton = mockPresentItem.mock.calls[0][0].actionItems[0]; retryButton.onClick(); await expect(promise).rejects.toThrow('Popup window was blocked'); expect(mockClear).toHaveBeenCalled(); }); it('should close an open popup window', () => { const mockPopup = { close: vi.fn(), closed: false } as any as Window; closePopup(mockPopup); expect(mockPopup.close).toHaveBeenCalledTimes(1); }); });