313e6e1217
* scaffold dealticket package, remove trading views from react-helpers * add deal ticket component, add intent utils, expand dialog and form group styles * add splash component, show market not found message if market doesnt exist * tidy up error handling * add handleError method for vega tx hook * add better testname for provider test, flesh out tests a bit more for deal ticket * Add unit tests for useVegaTransaction and useOrderSubmit hooks * add wrapper component for order dialog styles * add vega styled loader to ui toolkit and use in order dialog * add title prop to order dialog * split limit and market tickets into own files * add button radio component * revert dialog styles * move splash component to ui-toolkit, add story * convert intent to enum * Make button always type=button unless type prop is passed * inline filter logic for tif selector * add date-fns, add datetime to helpers * add order types to wallet package, make price undefined if order type is market * use enums in deal ticket logic * tidy up order state by moving submit and transaction hooks out of deal ticket * add comment for dialog styles * remove decimal from price input * add types package, delete old generated types from trading project * rename types package to graphql * update generate command to point to correct locations * fix use order submit test * use intent shadow helper * remove date-fns and format manually, update submit button error to use input-error * remove stray console.log
142 lines
4.0 KiB
TypeScript
142 lines
4.0 KiB
TypeScript
import '@testing-library/jest-dom';
|
|
import {
|
|
VegaWalletContext,
|
|
OrderTimeInForce,
|
|
OrderType,
|
|
} from '@vegaprotocol/wallet';
|
|
import { addDecimal } from '@vegaprotocol/react-helpers';
|
|
import { fireEvent, render, screen } from '@testing-library/react';
|
|
import { DealTicket, Market } from './deal-ticket';
|
|
import { Order } from './use-order-state';
|
|
|
|
const order: Order = {
|
|
type: OrderType.Market,
|
|
size: '100',
|
|
timeInForce: OrderTimeInForce.FOK,
|
|
side: null,
|
|
};
|
|
const market: Market = {
|
|
id: 'market-id',
|
|
decimalPlaces: 2,
|
|
tradingMode: 'Continuous',
|
|
state: 'Active',
|
|
tradableInstrument: {
|
|
instrument: {
|
|
product: {
|
|
quoteName: 'quote-name',
|
|
settlementAsset: {
|
|
id: 'asset-id',
|
|
symbol: 'asset-symbol',
|
|
name: 'asset-name',
|
|
},
|
|
},
|
|
},
|
|
},
|
|
depth: {
|
|
lastTrade: {
|
|
price: '100',
|
|
},
|
|
},
|
|
};
|
|
|
|
function generateJsx() {
|
|
return (
|
|
<VegaWalletContext.Provider value={{} as any}>
|
|
<DealTicket defaultOrder={order} market={market} />
|
|
</VegaWalletContext.Provider>
|
|
);
|
|
}
|
|
|
|
test('Deal ticket defaults', () => {
|
|
render(generateJsx());
|
|
|
|
// Assert defaults are used
|
|
expect(
|
|
screen.getByTestId(`order-type-${order.type}-selected`)
|
|
).toBeInTheDocument();
|
|
expect(
|
|
screen.queryByTestId('order-side-SIDE_BUY-selected')
|
|
).not.toBeInTheDocument();
|
|
expect(
|
|
screen.queryByTestId('order-side-SIDE_SELL-selected')
|
|
).not.toBeInTheDocument();
|
|
expect(screen.getByTestId('order-size')).toHaveDisplayValue(order.size);
|
|
expect(screen.getByTestId('order-tif')).toHaveValue(order.timeInForce);
|
|
|
|
// Assert last price is shown
|
|
expect(screen.getByTestId('last-price')).toHaveTextContent(
|
|
// eslint-disable-next-line
|
|
`~${addDecimal(market.depth.lastTrade!.price, market.decimalPlaces)} ${
|
|
market.tradableInstrument.instrument.product.quoteName
|
|
}`
|
|
);
|
|
});
|
|
|
|
test('Can edit deal ticket', () => {
|
|
render(generateJsx());
|
|
|
|
// Asssert changing values
|
|
fireEvent.click(screen.getByTestId('order-side-SIDE_BUY'));
|
|
expect(
|
|
screen.getByTestId('order-side-SIDE_BUY-selected')
|
|
).toBeInTheDocument();
|
|
|
|
fireEvent.change(screen.getByTestId('order-size'), {
|
|
target: { value: '200' },
|
|
});
|
|
expect(screen.getByTestId('order-size')).toHaveDisplayValue('200');
|
|
|
|
fireEvent.change(screen.getByTestId('order-tif'), {
|
|
target: { value: OrderTimeInForce.IOC },
|
|
});
|
|
expect(screen.getByTestId('order-tif')).toHaveValue(OrderTimeInForce.IOC);
|
|
|
|
// Switch to limit order
|
|
fireEvent.click(screen.getByTestId('order-type-TYPE_LIMIT'));
|
|
|
|
// Assert price input shown with default value
|
|
expect(screen.getByTestId('order-price')).toHaveDisplayValue('0');
|
|
|
|
// Check all TIF options shown
|
|
expect(screen.getByTestId('order-tif').children).toHaveLength(
|
|
Object.keys(OrderTimeInForce).length
|
|
);
|
|
});
|
|
|
|
test('Handles TIF select box dependent on order type', () => {
|
|
render(generateJsx());
|
|
|
|
// Check only IOC and
|
|
expect(
|
|
Array.from(screen.getByTestId('order-tif').children).map(
|
|
(o) => o.textContent
|
|
)
|
|
).toEqual(['IOC', 'FOK']);
|
|
|
|
// Switch to limit order and check all TIF options shown
|
|
fireEvent.click(screen.getByTestId('order-type-TYPE_LIMIT'));
|
|
expect(screen.getByTestId('order-tif').children).toHaveLength(
|
|
Object.keys(OrderTimeInForce).length
|
|
);
|
|
|
|
// Change to GTC
|
|
fireEvent.change(screen.getByTestId('order-tif'), {
|
|
target: { value: OrderTimeInForce.GTC },
|
|
});
|
|
expect(screen.getByTestId('order-tif')).toHaveValue(OrderTimeInForce.GTC);
|
|
|
|
// Switch back to market order and TIF should now be IOC
|
|
fireEvent.click(screen.getByTestId('order-type-TYPE_MARKET'));
|
|
expect(screen.getByTestId('order-tif')).toHaveValue(OrderTimeInForce.IOC);
|
|
|
|
// Switch tif to FOK
|
|
fireEvent.change(screen.getByTestId('order-tif'), {
|
|
target: { value: OrderTimeInForce.FOK },
|
|
});
|
|
expect(screen.getByTestId('order-tif')).toHaveValue(OrderTimeInForce.FOK);
|
|
|
|
// Change back to limit and check we are still on FOK
|
|
fireEvent.click(screen.getByTestId('order-type-TYPE_LIMIT'));
|
|
expect(screen.getByTestId('order-tif')).toHaveValue(OrderTimeInForce.FOK);
|
|
});
|