diff --git a/src/routes/safe/store/selectors/index.js b/src/routes/safe/store/selectors/index.js index 4c403eb5..1bcd96f2 100644 --- a/src/routes/safe/store/selectors/index.js +++ b/src/routes/safe/store/selectors/index.js @@ -6,6 +6,7 @@ import { type GlobalState } from '~/store/index' import { SAFE_PARAM_ADDRESS } from '~/routes/routes' import { type Safe } from '~/routes/safe/store/model/safe' import { safesMapSelector } from '~/routes/safeList/store/selectors' +import { BALANCE_REDUCER_ID } from '~/routes/safe/store/reducer/balances' type RouterProps = { match: Match, @@ -13,6 +14,8 @@ type RouterProps = { const safeAddessSelector = (state: GlobalState, props: RouterProps) => props.match.params[SAFE_PARAM_ADDRESS] || '' +const balancesSelector = (state: GlobalState) => state[BALANCE_REDUCER_ID] + export type SafeSelectorProps = Safe | typeof undefined export const safeSelector: Selector = createSelector( @@ -27,6 +30,18 @@ export const safeSelector: Selector }, ) +export const balanceSelector: Selector = createSelector( + balancesSelector, + safeAddessSelector, + (balances: Map, address: string) => { + if (!address) { + return '0' + } + + return balances.get(address) || '0' + }, +) + export default createStructuredSelector({ safe: safeSelector, }) diff --git a/src/routes/safe/store/test/balance.selector.js b/src/routes/safe/store/test/balance.selector.js new file mode 100644 index 00000000..18da3b01 --- /dev/null +++ b/src/routes/safe/store/test/balance.selector.js @@ -0,0 +1,61 @@ +// @flow +import { type Match } from 'react-router-dom' +import addBalance from '~/routes/safe/store/actions/addBalance' +import { aNewStore } from '~/store' +import { balanceSelector } from '../selectors' + +const buildMathPropsFrom = (address): Match => ({ + params: { + address, + }, + isExact: true, + path: '', + url: '', +}) + +const balanceSelectorTests = () => { + describe('Safe Selector[balanceSelector]', () => { + it('should return 0 when safe address is not found', () => { + // GIVEN + const safeAddress = 'foo' + const match = buildMathPropsFrom(safeAddress) + const store = aNewStore() + + // WHEN + const balance = balanceSelector(store.getState(), { match }) + + // THEN + expect(balance).toBe('0') + }) + + it('should return 0 when safe has no funds', async () => { + // GIVEN + const safeAddress = 'foo' + const match = buildMathPropsFrom(safeAddress) + const store = aNewStore() + + // WHEN + await store.dispatch(addBalance('bar', '1')) + const balance = balanceSelector(store.getState(), { match }) + + // THEN + expect(balance).toBe('0') + }) + + it('should return safe funds', async () => { + // GIVEN + const safeAddress = 'foo' + const match = buildMathPropsFrom(safeAddress) + const store = aNewStore() + + // WHEN + await store.dispatch(addBalance(safeAddress, '1')) + const balance = balanceSelector(store.getState(), { match }) + + // THEN + expect(balance).toBe('1') + }) + }) +} + +export default balanceSelectorTests diff --git a/src/routes/safe/store/test/safe.spec.js b/src/routes/safe/store/test/safe.spec.js index df6e0259..ea07c3ee 100644 --- a/src/routes/safe/store/test/safe.spec.js +++ b/src/routes/safe/store/test/safe.spec.js @@ -1,6 +1,7 @@ // @flow import balanceReducerTests from './balance.reducer' import safeReducerTests from './safe.reducer' +import balanceSelectorTests from './balance.selector' import safeSelectorTests from './safe.selector' describe('Safe Test suite', () => { @@ -10,4 +11,7 @@ describe('Safe Test suite', () => { // SAFE SELECTOR safeSelectorTests() + + // BALANCE SELECTOR + balanceSelectorTests() }) diff --git a/src/store/index.js b/src/store/index.js index 7538a26d..882978f1 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -33,4 +33,5 @@ const initialState = { [SAFE_REDUCER_ID]: calculateInitialState() } export const store: Store = createStore(reducers, initialState, finalCreateStore) -export const aNewStore = (): Store => createStore(reducers, initialState, finalCreateStore) +export const aNewStore = (localState?: Object): Store => + createStore(reducers, localState, finalCreateStore)