f244cd07d4
* add web3 provider using web3-react package * add env setup, add guard for incorrect chain id * add lib for web3-provider * make wallet and ethereum connect dialogs look more consistent * add setup tests file for jest-dom * remove chain id config and just use appChainId prop, add disconnect button to invalid chainId state * switch handling of connect dialog state to the consuming app * rename web3-provider package to just web3 * envs for each environment so we can specify chainId * make web3container enforce connection before rendering childen * add web3 provider using web3-react package * make web3container enforce connection before rendering childen * add container for getting network params * Move ethereum config query to web3 container * add basic deposit form elements * add queries required for deposits, add asset default * add bridge contract and deposit transaction * break txhash * restrict etherscan link props, use etherscan link in transaction dialogs * use smart-contracts-sdk * split hooks and components into different files, fix find deposit logic, add styles and progress for tx dialogs * fix text colors for dark mode * improve tx dialogs, rename deposit query * position use buttons, fix select validation * fix type errors after not being in strict mode, add allowance checking * add deposit-limits component, fix types now that strict mode is enabled * make contract hooks have a single instance * split out dialogs into separate files, fix icon alignment * improve error types for use transaction hook, add number save min and max for the amount input * add validation for ethereum and vega addresses * add unit test for deposit form component * add icons and shared dialog styles so it better matches order transaction dialog * fix underline class, reset finalized deposit * fix type imports, use i18n function, regen types * only pass contract address to token contract hook * add vega env, refactor so retrieving asset contract address logic isn't duplicated * add faucet functionality, combine dialogs into single transaction-dialog * combine rendering logic into single func of transaction dialog, rever contract hooks to just useMemo * use to field rather than connected key * fix props and imports in deposit form test * share faucetable condition, pass it to token contract * pass contracts in as params to hooks to avoid multiple contract instances * refetch balance in wallet after deposit, add comments * use hook state for tracking deposit via partyid, add test for use ethereum transaction hook * add deposits lib * add last smart contract sdk package * fix asset import in test * tidy up ts-ignores * pass arg for faucetable token contract * add provider url to env vars and use in place of infura id, also update web3-connector to only allow the chain permitted by the app * add type guard for erc20 assets * fix intent shadow helper function, use arrow function for isEthereumError * update etherscan link to use env vars for url base * rename deposit related hooks to indicate read vs write calls * move ethereum error class and helpers to react-helpers * add use-ethereum-read-contract hook to contain fetch logic * remove unused import * move validation to lib, add hex check for vega public key * use map for transaction modal states, pass confirmed prop to transaction dialog for deposits * remove unused import for classnames
164 lines
4.2 KiB
TypeScript
164 lines
4.2 KiB
TypeScript
import { fireEvent, render, screen } from '@testing-library/react';
|
|
import type { MockedResponse } from '@apollo/client/testing';
|
|
import { MockedProvider } from '@apollo/client/testing';
|
|
import { NETWORK_PARAMS_QUERY, Web3Container } from './web3-container';
|
|
import type { NetworkParametersQuery } from '@vegaprotocol/graphql';
|
|
|
|
const defaultHookValue = {
|
|
isActive: false,
|
|
error: undefined,
|
|
connector: null,
|
|
chainId: 3,
|
|
};
|
|
let mockHookValue;
|
|
|
|
const mockEthereumConfig = {
|
|
network_id: '3',
|
|
chain_id: '3',
|
|
confirmations: 3,
|
|
collateral_bridge_contract: {
|
|
address: 'bridge address',
|
|
},
|
|
};
|
|
|
|
const networkParamsQueryMock: MockedResponse<NetworkParametersQuery> = {
|
|
request: {
|
|
query: NETWORK_PARAMS_QUERY,
|
|
},
|
|
result: {
|
|
data: {
|
|
networkParameters: [
|
|
{
|
|
__typename: 'NetworkParameter',
|
|
key: 'blockchains.ethereumConfig',
|
|
value: JSON.stringify(mockEthereumConfig),
|
|
},
|
|
],
|
|
},
|
|
},
|
|
};
|
|
|
|
jest.mock('@web3-react/core', () => {
|
|
const original = jest.requireActual('@web3-react/core');
|
|
return {
|
|
...original,
|
|
useWeb3React: jest.fn(() => mockHookValue),
|
|
};
|
|
});
|
|
|
|
function setup(mock = networkParamsQueryMock) {
|
|
return render(
|
|
<MockedProvider mocks={[mock]}>
|
|
<Web3Container>
|
|
{({ ethereumConfig }) => (
|
|
<div>
|
|
<div>Child</div>
|
|
<div>{ethereumConfig.collateral_bridge_contract.address}</div>
|
|
</div>
|
|
)}
|
|
</Web3Container>
|
|
</MockedProvider>
|
|
);
|
|
}
|
|
|
|
test('Prompt to connect opens dialog', async () => {
|
|
mockHookValue = defaultHookValue;
|
|
setup();
|
|
|
|
expect(screen.getByText('Loading...')).toBeInTheDocument();
|
|
expect(
|
|
await screen.findByText('Connect your Ethereum wallet')
|
|
).toBeInTheDocument();
|
|
|
|
expect(screen.queryByText('Child')).not.toBeInTheDocument();
|
|
expect(screen.queryByTestId('web3-connector-list')).not.toBeInTheDocument();
|
|
|
|
fireEvent.click(screen.getByText('Connect'));
|
|
expect(screen.getByTestId('web3-connector-list')).toBeInTheDocument();
|
|
});
|
|
|
|
test('Error message is shown', async () => {
|
|
const message = 'Opps! An error';
|
|
mockHookValue = { ...defaultHookValue, error: new Error(message) };
|
|
setup();
|
|
|
|
expect(screen.getByText('Loading...')).toBeInTheDocument();
|
|
expect(await screen.findByText(`Something went wrong: ${message}`));
|
|
expect(screen.queryByText('Child')).not.toBeInTheDocument();
|
|
});
|
|
|
|
test('Checks that chain ID matches app ID', async () => {
|
|
const expectedChainId = 4;
|
|
mockHookValue = {
|
|
...defaultHookValue,
|
|
isActive: true,
|
|
chainId: expectedChainId,
|
|
};
|
|
setup();
|
|
|
|
expect(screen.getByText('Loading...')).toBeInTheDocument();
|
|
expect(await screen.findByText(`This app only works on chain ID: 3`));
|
|
expect(screen.queryByText('Child')).not.toBeInTheDocument();
|
|
});
|
|
|
|
test('Passes ethereum config to children', async () => {
|
|
mockHookValue = {
|
|
...defaultHookValue,
|
|
isActive: true,
|
|
};
|
|
setup();
|
|
|
|
expect(screen.getByText('Loading...')).toBeInTheDocument();
|
|
expect(
|
|
await screen.findByText(
|
|
mockEthereumConfig.collateral_bridge_contract.address
|
|
)
|
|
).toBeInTheDocument();
|
|
});
|
|
|
|
test('Shows no config found message if the network parameter doesnt exist', async () => {
|
|
const mock: MockedResponse<NetworkParametersQuery> = {
|
|
request: {
|
|
query: NETWORK_PARAMS_QUERY,
|
|
},
|
|
result: {
|
|
data: {
|
|
networkParameters: [
|
|
{
|
|
__typename: 'NetworkParameter',
|
|
key: 'nope',
|
|
value: 'foo',
|
|
},
|
|
],
|
|
},
|
|
},
|
|
};
|
|
setup(mock);
|
|
expect(screen.getByText('Loading...')).toBeInTheDocument();
|
|
expect(
|
|
await screen.findByText('No ethereum config found')
|
|
).toBeInTheDocument();
|
|
});
|
|
|
|
test('Shows message if ethereum config could not be parsed', async () => {
|
|
const mock: MockedResponse<NetworkParametersQuery> = {
|
|
request: {
|
|
query: NETWORK_PARAMS_QUERY,
|
|
},
|
|
result: {
|
|
data: {
|
|
networkParameters: [
|
|
{
|
|
__typename: 'NetworkParameter',
|
|
key: 'blockchains.ethereumConfig',
|
|
value: '"something invalid }',
|
|
},
|
|
],
|
|
},
|
|
},
|
|
};
|
|
setup(mock);
|
|
expect(screen.getByText('Loading...')).toBeInTheDocument();
|
|
expect(await screen.findByText('Could not parse config')).toBeInTheDocument();
|
|
});
|