import { fireEvent, render } from '@testing-library/react-native' import { buildApprovedNamespaces, getSdkError } from '@walletconnect/utils' import { Web3WalletTypes } from '@walletconnect/web3wallet' import * as React from 'react' import 'react-native' import { Provider } from 'react-redux' import { acceptSession, denySession } from 'src/walletConnect/actions' import { SupportedActions, SupportedEvents } from 'src/walletConnect/constants' import SessionRequest from 'src/walletConnect/screens/SessionRequest' import { createMockStore } from 'test/utils' import { mockAccount } from 'test/values' describe(SessionRequest, () => { const pendingSession: Web3WalletTypes.EventArguments['session_proposal'] = { id: 1690539550772665, params: { id: 1690539550772665, pairingTopic: 'b655eac1cf0cc18780a1c6503d7395f633b3d10791b7a628d9602d10b2fe3f26', expiryTimestamp: 1690539851, requiredNamespaces: { eip155: { methods: ['eth_sendTransaction', 'personal_sign'], chains: ['eip155:11155111', 'eip155:44787'], events: ['chainChanged', 'accountsChanged'], }, }, optionalNamespaces: {}, relays: [ { protocol: 'irn', }, ], proposer: { publicKey: 'd0d67fc544702f5b354130b0776801584e8eeabe208ab3e32ad438fd12e6063b', metadata: { description: 'React App for WalletConnect', url: 'https://react-app.walletconnect.com', icons: ['https://avatars.githubusercontent.com/u/37784886'], name: 'React App', verifyUrl: 'https://verify.walletconnect.com', }, }, }, verifyContext: { verified: { verifyUrl: 'https://verify.walletconnect.com', validation: 'VALID', origin: 'https://react-app.walletconnect.com', }, }, } const namespacesToApprove = buildApprovedNamespaces({ proposal: pendingSession.params, supportedNamespaces: { eip155: { chains: ['eip155:11155111', 'eip155:44787'], methods: Object.values(SupportedActions) as string[], events: Object.values(SupportedEvents) as string[], accounts: [`eip155:11155111:${mockAccount}`, `eip155:44787:${mockAccount}`], }, }, }) const supportedChains = ['eip155:44787'] const store = createMockStore({}) beforeEach(() => { store.clearActions() }) describe('new session', () => { it('renders the correct elements', () => { const { getByText, queryByText, queryByTestId } = render( ) expect(getByText('connectToWallet, {"dappName":"React App"}')).toBeTruthy() expect(getByText('shareInfo')).toBeTruthy() expect(getByText('walletConnectRequest.connectWalletAction')).toBeTruthy() expect(queryByText('dismiss')).toBeFalsy() const networkChips = queryByTestId('SessionRequest/NetworkChips') expect(networkChips?.children[0]).toHaveTextContent('Celo Alfajores') expect(networkChips?.children[1]).toHaveTextContent('Ethereum Sepolia') expect(getByText(mockAccount.toLowerCase())).toBeTruthy() }) it('dispatches the correct action on press connect wallet', () => { const { getByText } = render( ) fireEvent.press(getByText('walletConnectRequest.connectWalletAction')) expect(store.getActions()).toEqual([acceptSession(pendingSession, namespacesToApprove)]) }) it('dispatches the correct action on dismiss bottom sheet', () => { const { unmount } = render( ) unmount() expect(store.getActions()).toEqual([ denySession(pendingSession, getSdkError('USER_REJECTED')), ]) }) }) describe('no namespace to approve', () => { it('should show a warning', () => { const { getByText, queryByText } = render( ) expect(getByText('connectToWallet, {"dappName":"React App"}')).toBeTruthy() expect(getByText('shareInfo')).toBeTruthy() expect(queryByText('allow')).toBeFalsy() expect(getByText('dismiss')).toBeTruthy() expect(queryByText(mockAccount.toLowerCase())).toBeFalsy() expect( getByText( 'walletConnectRequest.session.failUnsupportedNamespace.title, {"dappName":"React App"}' ) ).toBeTruthy() }) it('dispatches the correct action on press dismiss', () => { const { getByText } = render( ) fireEvent.press(getByText('dismiss')) expect(store.getActions()).toEqual([ denySession(pendingSession, getSdkError('UNSUPPORTED_NAMESPACE_KEY')), ]) }) }) describe('unsupported chain', () => { it('should show a warning', () => { const { getByText, queryByText } = render( ) expect(getByText('connectToWallet, {"dappName":"React App"}')).toBeTruthy() expect(getByText('shareInfo')).toBeTruthy() // We still want to allow connection expect(getByText('walletConnectRequest.connectWalletAction')).toBeTruthy() expect(queryByText('dismiss')).toBeFalsy() expect(queryByText(mockAccount.toLowerCase())).toBeTruthy() expect( getByText( 'walletConnectRequest.session.warnUnsupportedChains.title, {"dappName":"React App"}' ) ).toBeTruthy() }) }) describe('unsupported method', () => { it('should show a warning', () => { const { getByText, queryByText } = render( ) expect(getByText('connectToWallet, {"dappName":"React App"}')).toBeTruthy() expect(getByText('shareInfo')).toBeTruthy() // We still want to allow connection expect(getByText('walletConnectRequest.connectWalletAction')).toBeTruthy() expect(queryByText('dismiss')).toBeFalsy() expect(queryByText(mockAccount.toLowerCase())).toBeTruthy() expect( getByText( 'walletConnectRequest.session.warnSomeUnsupportedMethods.title, {"dappName":"React App"}' ) ).toBeTruthy() }) }) describe('unsupported event', () => { it('should show a warning', () => { const { getByText, queryByText } = render( ) expect(getByText('connectToWallet, {"dappName":"React App"}')).toBeTruthy() expect(getByText('shareInfo')).toBeTruthy() // We still want to allow connection expect(getByText('walletConnectRequest.connectWalletAction')).toBeTruthy() expect(queryByText('dismiss')).toBeFalsy() expect(queryByText(mockAccount.toLowerCase())).toBeTruthy() expect( getByText( 'walletConnectRequest.session.warnSomeUnsupportedEvents.title, {"dappName":"React App"}' ) ).toBeTruthy() }) }) })