Compare commits

...

1 Commits

Author SHA1 Message Date
jaredvu
c0a00acdc6
Add validationFn and update tests 2023-10-15 22:11:41 -07:00
9 changed files with 61 additions and 8 deletions

View File

@ -8,5 +8,5 @@ export const AVAILABLE_ENVIRONMENTS =
export const CURRENT_ABACUS_DEPLOYMENT = import.meta.env.MODE === 'production' ? 'TESTNET' : 'DEV'; export const CURRENT_ABACUS_DEPLOYMENT = import.meta.env.MODE === 'production' ? 'TESTNET' : 'DEV';
export const ENVIRONMENT_CONFIG_MAP = environments.environments; export const ENVIRONMENT_CONFIG_MAP = environments.environments;
export type DydxNetwork = keyof typeof ENVIRONMENT_CONFIG_MAP; export type DydxNetwork = (typeof AVAILABLE_ENVIRONMENTS.environments)[number];
export const DEFAULT_APP_ENVIRONMENT = AVAILABLE_ENVIRONMENTS.default as DydxNetwork; export const DEFAULT_APP_ENVIRONMENT = AVAILABLE_ENVIRONMENTS.default as DydxNetwork;

View File

@ -10,6 +10,7 @@ import { useLocalStorage } from '@/hooks';
import { initializeLocalization } from '@/state/app'; import { initializeLocalization } from '@/state/app';
import abacusStateManager from '@/lib/abacus'; import abacusStateManager from '@/lib/abacus';
import { validateAgainstAvailableEnvironments } from '@/lib/network';
export const useInitializePage = () => { export const useInitializePage = () => {
const dispatch = useDispatch(); const dispatch = useDispatch();
@ -18,6 +19,7 @@ export const useInitializePage = () => {
const [localStorageNetwork] = useLocalStorage<DydxNetwork>({ const [localStorageNetwork] = useLocalStorage<DydxNetwork>({
key: LocalStorageKey.SelectedNetwork, key: LocalStorageKey.SelectedNetwork,
defaultValue: DEFAULT_APP_ENVIRONMENT, defaultValue: DEFAULT_APP_ENVIRONMENT,
validateFn: validateAgainstAvailableEnvironments,
}); });
useEffect(() => { useEffect(() => {

View File

@ -9,6 +9,8 @@ import { useAccounts, useLocalStorage } from '@/hooks';
import { setSelectedNetwork } from '@/state/app'; import { setSelectedNetwork } from '@/state/app';
import { getSelectedNetwork } from '@/state/appSelectors'; import { getSelectedNetwork } from '@/state/appSelectors';
import { validateAgainstAvailableEnvironments } from '@/lib/network';
export const useSelectedNetwork = (): { export const useSelectedNetwork = (): {
switchNetwork: (network: DydxNetwork) => void; switchNetwork: (network: DydxNetwork) => void;
selectedNetwork: DydxNetwork; selectedNetwork: DydxNetwork;
@ -20,6 +22,7 @@ export const useSelectedNetwork = (): {
const [, setLocalStorageNetwork] = useLocalStorage<DydxNetwork>({ const [, setLocalStorageNetwork] = useLocalStorage<DydxNetwork>({
key: LocalStorageKey.SelectedNetwork, key: LocalStorageKey.SelectedNetwork,
defaultValue: DEFAULT_APP_ENVIRONMENT, defaultValue: DEFAULT_APP_ENVIRONMENT,
validateFn: validateAgainstAvailableEnvironments,
}); });
const switchNetwork = useCallback( const switchNetwork = useCallback(

View File

@ -0,0 +1,38 @@
import environments from '../../../public/configs/env.json';
import { validateAgainstAvailableEnvironments } from '../network';
describe('validateAgainstAvailableEnvironments', () => {
describe('production environment', () => {
beforeAll(() => {
jest.mock('../../constants/networks', () => ({
AVAILABLE_ENVIRONMENTS: {
environments: [],
default: 'dydxprotocol-testnet-dydx',
}, //environments.deployments.TESTNET,
}));
});
afterAll(() => {
jest.unmock('../../constants/networks');
});
it('Returns true for valid environments', () => {
expect(validateAgainstAvailableEnvironments('dydxprotocol-testnet-dydx')).toEqual(true);
});
it('Returns false for invalid environments', () => {
expect(validateAgainstAvailableEnvironments('dydxprotocol-dev')).toEqual(false);
});
});
describe('staging environment', () => {
it('Returns true for valid environments', () => {
expect(validateAgainstAvailableEnvironments('dydxprotocol-dev')).toEqual(true);
});
it('Returns false for invalid environments', () => {
expect(validateAgainstAvailableEnvironments('INVALID')).toEqual(false);
});
});
});

View File

@ -45,11 +45,15 @@ describe('getStringsForDateTimeDiff', () => {
describe('getStringsForTimeInterval', () => { describe('getStringsForTimeInterval', () => {
it.each([ it.each([
[Duration.fromObject({ months: 2 }), '2', 'MONTHS_ABBREVIATED'], [Duration.fromObject({ months: 2 }), '2', 'APP.GENERAL.TIME_STRINGS.MONTHS_ABBREVIATED'],
[Duration.fromObject({ weeks: 3, days: 2 }), '3', 'WEEKS_ABBREVIATED'], [Duration.fromObject({ weeks: 3, days: 2 }), '3', 'APP.GENERAL.TIME_STRINGS.WEEKS_ABBREVIATED'],
[Duration.fromObject({ days: 5, hours: 12 }), '6', 'DAYS_ABBREVIATED'], [Duration.fromObject({ days: 5, hours: 12 }), '6', 'APP.GENERAL.TIME_STRINGS.DAYS_ABBREVIATED'],
[Duration.fromObject({ hours: 8, minutes: 30 }), '9', 'HOURS_ABBREVIATED'], [
[Duration.fromObject({ minutes: 45 }), '45', 'MINUTES_ABBREVIATED'], Duration.fromObject({ hours: 8, minutes: 30 }),
'9',
'APP.GENERAL.TIME_STRINGS.HOURS_ABBREVIATED',
],
[Duration.fromObject({ minutes: 45 }), '45', 'APP.GENERAL.TIME_STRINGS.MINUTES_ABBREVIATED'],
])( ])(
'returns the correct timeString and unitStringKey', 'returns the correct timeString and unitStringKey',
(timeInterval, expectedTimeString, expectedUnitStringKey) => { (timeInterval, expectedTimeString, expectedUnitStringKey) => {

4
src/lib/network.ts Normal file
View File

@ -0,0 +1,4 @@
import { AVAILABLE_ENVIRONMENTS, type DydxNetwork } from '@/constants/networks';
export const validateAgainstAvailableEnvironments = (value: DydxNetwork) =>
AVAILABLE_ENVIRONMENTS.environments.includes(value);

View File

@ -10,7 +10,7 @@ export const getTimestamp = (value?: BigNumberish | null) =>
? value ? value
: typeof value === 'string' : typeof value === 'string'
? new Date(value).getTime() ? new Date(value).getTime()
: new Date(value.toString()).getTime() : new Date(value.toNumber()).getTime()
: undefined; : undefined;
export const getStringsForDateTimeDiff = (dateTime: DateTime) => { export const getStringsForDateTimeDiff = (dateTime: DateTime) => {
@ -77,4 +77,4 @@ export const formatSeconds = (seconds: number) => {
const minutes = Math.floor(seconds / 60); const minutes = Math.floor(seconds / 60);
const remainingSeconds = seconds % 60; const remainingSeconds = seconds % 60;
return `${getTimeString(minutes)}:${getTimeString(remainingSeconds)}`; return `${getTimeString(minutes)}:${getTimeString(remainingSeconds)}`;
} };

View File

@ -6,6 +6,7 @@ import { LocalStorageKey } from '@/constants/localStorage';
import { DEFAULT_APP_ENVIRONMENT, type DydxNetwork } from '@/constants/networks'; import { DEFAULT_APP_ENVIRONMENT, type DydxNetwork } from '@/constants/networks';
import { getLocalStorage } from '@/lib/localStorage'; import { getLocalStorage } from '@/lib/localStorage';
import { validateAgainstAvailableEnvironments } from '@/lib/network';
export interface AppState { export interface AppState {
apiState: AbacusApiState | undefined; apiState: AbacusApiState | undefined;
@ -19,6 +20,7 @@ const initialState: AppState = {
selectedNetwork: getLocalStorage({ selectedNetwork: getLocalStorage({
key: LocalStorageKey.SelectedNetwork, key: LocalStorageKey.SelectedNetwork,
defaultValue: DEFAULT_APP_ENVIRONMENT, defaultValue: DEFAULT_APP_ENVIRONMENT,
validateFn: validateAgainstAvailableEnvironments,
}), }),
}; };