Removing daily limit refences in tests
This commit is contained in:
parent
15613c869d
commit
9b647a8e20
|
@ -1,6 +1,6 @@
|
||||||
// @flow
|
// @flow
|
||||||
import { makeSafe, type Safe } from '~/routes/safe/store/model/safe'
|
import { makeSafe, type Safe } from '~/routes/safe/store/model/safe'
|
||||||
import { buildOwnersFrom, buildDailyLimitFrom } from '~/routes/safe/store/actions'
|
import { buildOwnersFrom } from '~/routes/safe/store/actions'
|
||||||
|
|
||||||
class SafeBuilder {
|
class SafeBuilder {
|
||||||
safe: Safe
|
safe: Safe
|
||||||
|
@ -24,12 +24,6 @@ class SafeBuilder {
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
withDailyLimit(limit: number, spentToday: number = 0) {
|
|
||||||
const dailyLimit = buildDailyLimitFrom(limit, spentToday)
|
|
||||||
this.safe = this.safe.set('dailyLimit', dailyLimit)
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
withOwner(names: string[], adresses: string[]) {
|
withOwner(names: string[], adresses: string[]) {
|
||||||
const owners = buildOwnersFrom(names, adresses)
|
const owners = buildOwnersFrom(names, adresses)
|
||||||
this.safe = this.safe.set('owners', owners)
|
this.safe = this.safe.set('owners', owners)
|
||||||
|
@ -48,7 +42,6 @@ export class SafeFactory {
|
||||||
.withAddress('0x03db1a8b26d08df23337e9276a36b474510f0025')
|
.withAddress('0x03db1a8b26d08df23337e9276a36b474510f0025')
|
||||||
.withName('Adol ICO Safe')
|
.withName('Adol ICO Safe')
|
||||||
.withConfirmations(1)
|
.withConfirmations(1)
|
||||||
.withDailyLimit(10)
|
|
||||||
.withOwner(['Adol Metamask'], [ownerAddress])
|
.withOwner(['Adol Metamask'], [ownerAddress])
|
||||||
.get()
|
.get()
|
||||||
|
|
||||||
|
@ -60,19 +53,7 @@ export class SafeFactory {
|
||||||
['Adol Metamask', 'Tobias Metamask'],
|
['Adol Metamask', 'Tobias Metamask'],
|
||||||
[firstOwner, secondOwner],
|
[firstOwner, secondOwner],
|
||||||
)
|
)
|
||||||
.withDailyLimit(10, 1.34)
|
|
||||||
.get()
|
.get()
|
||||||
|
|
||||||
static dailyLimitSafe = (dailyLimit: number, spentToday: number) => aSafe()
|
|
||||||
.withAddress('0x03db1a8b26d08df23337e9276a36b474510f0027')
|
|
||||||
.withName('Adol & Tobias Safe')
|
|
||||||
.withConfirmations(2)
|
|
||||||
.withOwner(
|
|
||||||
['Adol Metamask', 'Tobias Metamask'],
|
|
||||||
['0x03db1a8b26d08df23337e9276a36b474510f0023', '0x03db1a8b26d08df23337e9276a36b474510f0024'],
|
|
||||||
)
|
|
||||||
.withDailyLimit(dailyLimit, spentToday)
|
|
||||||
.get()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default aSafe
|
export default aSafe
|
||||||
|
|
|
@ -34,7 +34,6 @@ const SafeTable = ({ safes }: Props) => (
|
||||||
<TableCell padding="none">{safe.get('address')}</TableCell>
|
<TableCell padding="none">{safe.get('address')}</TableCell>
|
||||||
<TableCell padding="none" numeric>{safe.get('threshold')}</TableCell>
|
<TableCell padding="none" numeric>{safe.get('threshold')}</TableCell>
|
||||||
<TableCell padding="none" numeric>{safe.get('owners').count()}</TableCell>
|
<TableCell padding="none" numeric>{safe.get('owners').count()}</TableCell>
|
||||||
<TableCell padding="none" numeric>{`${safe.get('dailyLimit').get('value')} ETH`}</TableCell>
|
|
||||||
</TableRow>
|
</TableRow>
|
||||||
))}
|
))}
|
||||||
</TableBody>
|
</TableBody>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// @flow
|
// @flow
|
||||||
import { makeSafe, type Safe } from '~/routes/safe/store/model/safe'
|
import { makeSafe, type Safe } from '~/routes/safe/store/model/safe'
|
||||||
import { buildOwnersFrom, buildDailyLimitFrom } from '~/routes/safe/store/actions'
|
import { buildOwnersFrom } from '~/routes/safe/store/actions'
|
||||||
import { FIELD_NAME, FIELD_CONFIRMATIONS, FIELD_OWNERS, getOwnerNameBy, getOwnerAddressBy, FIELD_DAILY_LIMIT } from '~/routes/open/components/fields'
|
import { FIELD_NAME, FIELD_CONFIRMATIONS, FIELD_OWNERS, getOwnerNameBy, getOwnerAddressBy, FIELD_DAILY_LIMIT } from '~/routes/open/components/fields'
|
||||||
import { getWeb3, getProviderInfo } from '~/logic/wallets/getWeb3'
|
import { getWeb3, getProviderInfo } from '~/logic/wallets/getWeb3'
|
||||||
import { promisify } from '~/utils/promisify'
|
import { promisify } from '~/utils/promisify'
|
||||||
|
@ -32,12 +32,6 @@ class SafeBuilder {
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
withDailyLimit(limit: number, spentToday: number = 0) {
|
|
||||||
const dailyLimit = buildDailyLimitFrom(limit, spentToday)
|
|
||||||
this.safe = this.safe.set('dailyLimit', dailyLimit)
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
withOwner(names: string[], adresses: string[]) {
|
withOwner(names: string[], adresses: string[]) {
|
||||||
const owners = buildOwnersFrom(names, adresses)
|
const owners = buildOwnersFrom(names, adresses)
|
||||||
this.safe = this.safe.set('owners', owners)
|
this.safe = this.safe.set('owners', owners)
|
||||||
|
@ -56,7 +50,6 @@ export class SafeFactory {
|
||||||
.withAddress('0x03db1a8b26d08df23337e9276a36b474510f0025')
|
.withAddress('0x03db1a8b26d08df23337e9276a36b474510f0025')
|
||||||
.withName('Adol ICO Safe')
|
.withName('Adol ICO Safe')
|
||||||
.withConfirmations(1)
|
.withConfirmations(1)
|
||||||
.withDailyLimit(10)
|
|
||||||
.withOwner(['Adol Metamask'], [ownerAddress])
|
.withOwner(['Adol Metamask'], [ownerAddress])
|
||||||
.get()
|
.get()
|
||||||
|
|
||||||
|
@ -68,19 +61,7 @@ export class SafeFactory {
|
||||||
['Adol Metamask', 'Tobias Metamask'],
|
['Adol Metamask', 'Tobias Metamask'],
|
||||||
[firstOwner, secondOwner],
|
[firstOwner, secondOwner],
|
||||||
)
|
)
|
||||||
.withDailyLimit(10, 1.34)
|
|
||||||
.get()
|
.get()
|
||||||
|
|
||||||
static dailyLimitSafe = (dailyLimit: number, spentToday: number) => aSafe()
|
|
||||||
.withAddress('0x03db1a8b26d08df23337e9276a36b474510f0027')
|
|
||||||
.withName('Adol & Tobias Safe')
|
|
||||||
.withConfirmations(2)
|
|
||||||
.withOwner(
|
|
||||||
['Adol Metamask', 'Tobias Metamask'],
|
|
||||||
['0x03db1a8b26d08df23337e9276a36b474510f0023', '0x03db1a8b26d08df23337e9276a36b474510f0024'],
|
|
||||||
)
|
|
||||||
.withDailyLimit(dailyLimit, spentToday)
|
|
||||||
.get()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const aMinedSafe = async (
|
export const aMinedSafe = async (
|
||||||
|
|
|
@ -1,33 +0,0 @@
|
||||||
// @flow
|
|
||||||
import { type Match } from 'react-router-dom'
|
|
||||||
import { aNewStore } from '~/store'
|
|
||||||
import { addEtherTo, executeWithdrawOn } from '~/test/utils/tokenMovements'
|
|
||||||
import { buildMathPropsFrom } from '~/test/utils/buildReactRouterProps'
|
|
||||||
import { safeSelector } from '~/routes/safe/store/selectors/index'
|
|
||||||
import { aMinedSafe } from '~/test/builder/safe.redux.builder'
|
|
||||||
|
|
||||||
describe('DailyLimit Blockchain Test', () => {
|
|
||||||
let store
|
|
||||||
beforeEach(async () => {
|
|
||||||
store = aNewStore()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('wihdrawn should return revert error if exceeded dailyLimit', async () => {
|
|
||||||
// GIVEN
|
|
||||||
const dailyLimitValue = 0.30
|
|
||||||
const safeAddress = await aMinedSafe(store, 1, 1, dailyLimitValue)
|
|
||||||
await addEtherTo(safeAddress, '0.7')
|
|
||||||
const value = 0.15
|
|
||||||
|
|
||||||
// WHEN
|
|
||||||
const match: Match = buildMathPropsFrom(safeAddress)
|
|
||||||
const safe = safeSelector(store.getState(), { match })
|
|
||||||
if (!safe) throw new Error()
|
|
||||||
|
|
||||||
await executeWithdrawOn(safe, value)
|
|
||||||
await executeWithdrawOn(safe, value)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
expect(executeWithdrawOn(safe, value)).rejects.toThrow('VM Exception while processing transaction: revert Daily limit has been reached')
|
|
||||||
})
|
|
||||||
})
|
|
|
@ -1,17 +1,16 @@
|
||||||
// @flow
|
// @flow
|
||||||
import TestUtils from 'react-dom/test-utils'
|
import TestUtils from 'react-dom/test-utils'
|
||||||
|
import { List } from 'immutable'
|
||||||
import Transaction from '~/routes/safe/component/Transactions/Transaction'
|
import Transaction from '~/routes/safe/component/Transactions/Transaction'
|
||||||
import { listTxsClickingOn, LIST_TXS_INDEX, ADD_OWNERS_INDEX, EXPAND_OWNERS_INDEX, EDIT_THRESHOLD_INDEX, WITHDRAW_INDEX, refreshTransactions, EXPAND_BALANCE_INDEX } from '~/test/builder/safe.dom.utils'
|
import { listTxsClickingOn, LIST_TXS_INDEX, ADD_OWNERS_INDEX, EXPAND_OWNERS_INDEX, EDIT_THRESHOLD_INDEX, refreshTransactions, EXPAND_BALANCE_INDEX } from '~/test/builder/safe.dom.utils'
|
||||||
import { renderSafeInDom, type DomSafe } from '~/test/builder/safe.dom.builder'
|
import { renderSafeInDom, type DomSafe } from '~/test/builder/safe.dom.builder'
|
||||||
import { sendMoveFundsForm, checkMinedMoveFundsTx, checkPendingMoveFundsTx } from '~/test/utils/transactions/moveFunds.helper'
|
import { sendMoveFundsForm, checkMinedMoveFundsTx, checkPendingMoveFundsTx } from '~/test/utils/transactions/moveFunds.helper'
|
||||||
import { sendAddOwnerForm, checkMinedAddOwnerTx, checkPendingAddOwnerTx } from '~/test/utils/transactions/addOwner.helper'
|
import { sendAddOwnerForm, checkMinedAddOwnerTx, checkPendingAddOwnerTx } from '~/test/utils/transactions/addOwner.helper'
|
||||||
import { sendRemoveOwnerForm, checkMinedRemoveOwnerTx, checkPendingRemoveOwnerTx } from '~/test/utils/transactions/removeOwner.helper'
|
import { sendRemoveOwnerForm, checkMinedRemoveOwnerTx, checkPendingRemoveOwnerTx } from '~/test/utils/transactions/removeOwner.helper'
|
||||||
import { checkMinedThresholdTx, sendChangeThresholdForm, checkThresholdOf } from '~/test/utils/transactions/threshold.helper'
|
import { checkMinedThresholdTx, sendChangeThresholdForm, checkThresholdOf } from '~/test/utils/transactions/threshold.helper'
|
||||||
import { sendWithdrawForm, checkMinedWithdrawTx } from '~/test/utils/transactions/withdraw.helper'
|
|
||||||
import { checkBalanceOf } from '~/test/utils/tokenMovements'
|
import { checkBalanceOf } from '~/test/utils/tokenMovements'
|
||||||
import { sleep } from '~/utils/timer'
|
import { sleep } from '~/utils/timer'
|
||||||
import { processTransaction } from '~/logic/safe/safeFrontendOperations'
|
import { processTransaction } from '~/logic/safe/safeFrontendOperations'
|
||||||
import { allowedModulesInTxHistoryService } from '~/config'
|
|
||||||
|
|
||||||
describe('DOM > Feature > SAFE MULTISIG Transactions', () => {
|
describe('DOM > Feature > SAFE MULTISIG Transactions', () => {
|
||||||
let domSafe: DomSafe
|
let domSafe: DomSafe
|
||||||
|
@ -24,12 +23,8 @@ describe('DOM > Feature > SAFE MULTISIG Transactions', () => {
|
||||||
address, safe: SafeDom, safeButtons, accounts, store,
|
address, safe: SafeDom, safeButtons, accounts, store,
|
||||||
} = domSafe
|
} = domSafe
|
||||||
|
|
||||||
const allowedModules = allowedModulesInTxHistoryService()
|
|
||||||
// WHEN
|
// WHEN
|
||||||
await sendMoveFundsForm(SafeDom, safeButtons[EXPAND_BALANCE_INDEX], '0.01', accounts[1])
|
await sendMoveFundsForm(SafeDom, safeButtons[EXPAND_BALANCE_INDEX], '0.01', accounts[1])
|
||||||
if (allowedModules) {
|
|
||||||
await sendWithdrawForm(SafeDom, safeButtons[WITHDRAW_INDEX], '0.01', accounts[3])
|
|
||||||
}
|
|
||||||
await sendAddOwnerForm(SafeDom, safeButtons[ADD_OWNERS_INDEX], 'Adol Metamask 2', accounts[1])
|
await sendAddOwnerForm(SafeDom, safeButtons[ADD_OWNERS_INDEX], 'Adol Metamask 2', accounts[1])
|
||||||
await sleep(1200)
|
await sleep(1200)
|
||||||
await sendChangeThresholdForm(SafeDom, safeButtons[EDIT_THRESHOLD_INDEX], '2')
|
await sendChangeThresholdForm(SafeDom, safeButtons[EDIT_THRESHOLD_INDEX], '2')
|
||||||
|
@ -39,14 +34,8 @@ describe('DOM > Feature > SAFE MULTISIG Transactions', () => {
|
||||||
const transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
const transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
||||||
|
|
||||||
checkMinedMoveFundsTx(transactions[0], 'Send 0.01 ETH to')
|
checkMinedMoveFundsTx(transactions[0], 'Send 0.01 ETH to')
|
||||||
if (allowedModules) {
|
checkMinedAddOwnerTx(transactions[1], 'Add Owner Adol Metamask 2')
|
||||||
await checkMinedWithdrawTx(transactions[1], 'Withdraw movement of 0.01', address, '0.08') // 0.1 - 0.01 tx - 0.01 withdraw
|
checkMinedThresholdTx(transactions[2], 'Change Safe\'s threshold')
|
||||||
checkMinedAddOwnerTx(transactions[2], 'Add Owner Adol Metamask 2')
|
|
||||||
checkMinedThresholdTx(transactions[3], 'Change Safe\'s threshold')
|
|
||||||
} else {
|
|
||||||
checkMinedAddOwnerTx(transactions[1], 'Add Owner Adol Metamask 2')
|
|
||||||
checkMinedThresholdTx(transactions[2], 'Change Safe\'s threshold')
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it.only('mines withdraw process correctly all multisig txs in a 2 owner & 2 threshold safe', async () => {
|
it.only('mines withdraw process correctly all multisig txs in a 2 owner & 2 threshold safe', async () => {
|
||||||
|
@ -55,30 +44,19 @@ describe('DOM > Feature > SAFE MULTISIG Transactions', () => {
|
||||||
address, safe: SafeDom, safeButtons, accounts, store,
|
address, safe: SafeDom, safeButtons, accounts, store,
|
||||||
} = domSafe
|
} = domSafe
|
||||||
|
|
||||||
const allowedModules = allowedModulesInTxHistoryService()
|
|
||||||
// WHEN
|
// WHEN
|
||||||
await sendMoveFundsForm(SafeDom, safeButtons[EXPAND_BALANCE_INDEX], '0.01', accounts[1])
|
await sendMoveFundsForm(SafeDom, safeButtons[EXPAND_BALANCE_INDEX], '0.01', accounts[1])
|
||||||
const increaseThreshold = true
|
const increaseThreshold = true
|
||||||
await sendAddOwnerForm(SafeDom, safeButtons[ADD_OWNERS_INDEX], 'Adol Metamask 3', accounts[2], increaseThreshold)
|
await sendAddOwnerForm(SafeDom, safeButtons[ADD_OWNERS_INDEX], 'Adol Metamask 3', accounts[2], increaseThreshold)
|
||||||
if (allowedModules) {
|
|
||||||
await sendWithdrawForm(SafeDom, safeButtons[WITHDRAW_INDEX], '0.01', accounts[3])
|
|
||||||
}
|
|
||||||
|
|
||||||
// THEN
|
// THEN
|
||||||
await listTxsClickingOn(store, safeButtons[LIST_TXS_INDEX], address)
|
await listTxsClickingOn(store, safeButtons[LIST_TXS_INDEX], address)
|
||||||
const transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
const transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
||||||
|
|
||||||
if (allowedModules) {
|
const statusses = ['Adol 1 Eth Account [Confirmed]']
|
||||||
const statusses = ['Adol 1 Eth Account [Confirmed]']
|
await checkPendingMoveFundsTx(transactions[3], 2, 'Send 0.01 ETH to', statusses)
|
||||||
await checkPendingMoveFundsTx(transactions[4], 2, 'Send 0.01 ETH to', statusses)
|
await checkPendingAddOwnerTx(transactions[4], 2, 'Add Owner Adol Metamask 3', statusses)
|
||||||
await checkPendingAddOwnerTx(transactions[5], 2, 'Add Owner Adol Metamask 3', statusses)
|
await checkBalanceOf(address, '0.09')
|
||||||
await checkMinedWithdrawTx(transactions[6], 'Withdraw movement of 0.01', address, '0.07')
|
|
||||||
} else {
|
|
||||||
const statusses = ['Adol 1 Eth Account [Confirmed]']
|
|
||||||
await checkPendingMoveFundsTx(transactions[3], 2, 'Send 0.01 ETH to', statusses)
|
|
||||||
await checkPendingAddOwnerTx(transactions[4], 2, 'Add Owner Adol Metamask 3', statusses)
|
|
||||||
await checkBalanceOf(address, '0.09')
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it.only('approves and executes pending transactions', async () => {
|
it.only('approves and executes pending transactions', async () => {
|
||||||
|
@ -87,103 +65,59 @@ describe('DOM > Feature > SAFE MULTISIG Transactions', () => {
|
||||||
address, safe: SafeDom, safeButtons, accounts, store,
|
address, safe: SafeDom, safeButtons, accounts, store,
|
||||||
} = domSafe
|
} = domSafe
|
||||||
|
|
||||||
const allowedModules = allowedModulesInTxHistoryService()
|
let transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
||||||
|
expect(transactions.length).toBe(5)
|
||||||
|
await checkThresholdOf(address, 2)
|
||||||
|
|
||||||
if (allowedModules) {
|
// WHEN... processing pending TXs
|
||||||
let transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
await processTransaction(address, transactions[3].props.transaction, 1, accounts[1], 2, List([accounts[0]]))
|
||||||
expect(transactions.length).toBe(7)
|
await processTransaction(address, transactions[4].props.transaction, 1, accounts[1], 2, List([accounts[0]]))
|
||||||
await checkThresholdOf(address, 3)
|
await refreshTransactions(store, address)
|
||||||
|
|
||||||
// WHEN... processing pending TXs
|
// THEN
|
||||||
await processTransaction(address, transactions[4].props.transaction, 1, accounts[1], 3)
|
checkMinedMoveFundsTx(transactions[3], 'Send 0.01 ETH to')
|
||||||
await processTransaction(address, transactions[5].props.transaction, 1, accounts[1], 3)
|
await checkBalanceOf(address, '0.08')
|
||||||
await refreshTransactions(store, address)
|
checkMinedAddOwnerTx(transactions[4], 'Add Owner Adol Metamask 3')
|
||||||
|
await checkThresholdOf(address, 3)
|
||||||
|
|
||||||
// THEN
|
// WHEN... reducing threshold
|
||||||
checkMinedMoveFundsTx(transactions[4], 'Send 0.01 ETH to')
|
await sendRemoveOwnerForm(SafeDom, safeButtons[EXPAND_OWNERS_INDEX])
|
||||||
await checkBalanceOf(address, '0.06')
|
|
||||||
checkMinedAddOwnerTx(transactions[5], 'Add Owner Adol Metamask 3')
|
|
||||||
await checkThresholdOf(address, 3)
|
|
||||||
|
|
||||||
// WHEN... reducing threshold
|
// THEN
|
||||||
await sendRemoveOwnerForm(SafeDom, safeButtons[EXPAND_OWNERS_INDEX])
|
await listTxsClickingOn(store, safeButtons[LIST_TXS_INDEX], address)
|
||||||
|
transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
||||||
|
expect(transactions.length).toBe(6)
|
||||||
|
let statusses = ['Adol 1 Eth Account [Confirmed]']
|
||||||
|
await checkPendingRemoveOwnerTx(transactions[5], 3, 'Remove Owner Adol Metamask 3', statusses)
|
||||||
|
|
||||||
// THEN
|
await processTransaction(address, transactions[5].props.transaction, 1, accounts[2], 3, List([accounts[0]]))
|
||||||
await listTxsClickingOn(store, safeButtons[LIST_TXS_INDEX], address)
|
await refreshTransactions(store, address)
|
||||||
transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
|
||||||
expect(transactions.length).toBe(8)
|
|
||||||
let statusses = ['Adol Metamask 3 [Not confirmed]', 'Adol Metamask 2 [Not confirmed]', 'Adol 1 Eth Account [Confirmed]']
|
|
||||||
await checkPendingRemoveOwnerTx(transactions[7], 3, 'Remove Owner Adol Metamask 3', statusses)
|
|
||||||
|
|
||||||
await processTransaction(address, transactions[7].props.transaction, 1, accounts[1], 3)
|
transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
||||||
await refreshTransactions(store, address)
|
statusses = ['Adol Metamask 3 [Confirmed]', 'Adol 1 Eth Account [Confirmed]']
|
||||||
transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
await checkPendingRemoveOwnerTx(transactions[5], 3, 'Remove Owner Adol Metamask 3', statusses)
|
||||||
statusses = ['Adol Metamask 3 [Not confirmed]', 'Adol Metamask 2 [Confirmed]', 'Adol 1 Eth Account [Confirmed]']
|
await checkThresholdOf(address, 3)
|
||||||
await checkPendingRemoveOwnerTx(transactions[7], 2, 'Remove Owner Adol Metamask 3', statusses)
|
await processTransaction(
|
||||||
await checkThresholdOf(address, 3)
|
address,
|
||||||
|
transactions[5].props.transaction,
|
||||||
|
2,
|
||||||
|
accounts[1],
|
||||||
|
3,
|
||||||
|
List([accounts[0], accounts[2]]),
|
||||||
|
)
|
||||||
|
|
||||||
await processTransaction(address, transactions[7].props.transaction, 2, accounts[2], 3)
|
await refreshTransactions(store, address)
|
||||||
await refreshTransactions(store, address)
|
await checkThresholdOf(address, 2)
|
||||||
await checkThresholdOf(address, 2)
|
transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
||||||
transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
await checkMinedRemoveOwnerTx(transactions[5], 'Remove Owner')
|
||||||
await checkMinedRemoveOwnerTx(transactions[7], 'Remove Owner')
|
|
||||||
|
|
||||||
// WHEN... changing threshold
|
// WHEN... changing threshold
|
||||||
await sendChangeThresholdForm(SafeDom, safeButtons[EDIT_THRESHOLD_INDEX], '1')
|
await sendChangeThresholdForm(SafeDom, safeButtons[EDIT_THRESHOLD_INDEX], '1')
|
||||||
await listTxsClickingOn(store, safeButtons[LIST_TXS_INDEX], address)
|
await listTxsClickingOn(store, safeButtons[LIST_TXS_INDEX], address)
|
||||||
|
|
||||||
// THEN
|
// THEN
|
||||||
transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
||||||
await processTransaction(address, transactions[8].props.transaction, 1, accounts[1], 2)
|
await processTransaction(address, transactions[6].props.transaction, 1, accounts[1], 2, List([accounts[0]]))
|
||||||
await checkThresholdOf(address, 1)
|
await checkThresholdOf(address, 1)
|
||||||
} else {
|
|
||||||
let transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
|
||||||
expect(transactions.length).toBe(5)
|
|
||||||
await checkThresholdOf(address, 2)
|
|
||||||
|
|
||||||
// WHEN... processing pending TXs
|
|
||||||
await processTransaction(address, transactions[3].props.transaction, 1, accounts[1], 2)
|
|
||||||
await processTransaction(address, transactions[4].props.transaction, 1, accounts[1], 2)
|
|
||||||
await refreshTransactions(store, address)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
checkMinedMoveFundsTx(transactions[3], 'Send 0.01 ETH to')
|
|
||||||
await checkBalanceOf(address, '0.08')
|
|
||||||
checkMinedAddOwnerTx(transactions[4], 'Add Owner Adol Metamask 3')
|
|
||||||
await checkThresholdOf(address, 3)
|
|
||||||
|
|
||||||
// WHEN... reducing threshold
|
|
||||||
await sendRemoveOwnerForm(SafeDom, safeButtons[EXPAND_OWNERS_INDEX])
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
await listTxsClickingOn(store, safeButtons[LIST_TXS_INDEX], address)
|
|
||||||
transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
|
||||||
expect(transactions.length).toBe(6)
|
|
||||||
let statusses = ['Adol 1 Eth Account [Confirmed]']
|
|
||||||
await checkPendingRemoveOwnerTx(transactions[5], 3, 'Remove Owner Adol Metamask 3', statusses)
|
|
||||||
|
|
||||||
await processTransaction(address, transactions[5].props.transaction, 1, accounts[2], 3)
|
|
||||||
await refreshTransactions(store, address)
|
|
||||||
|
|
||||||
transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
|
||||||
statusses = ['Adol Metamask 3 [Confirmed]', 'Adol 1 Eth Account [Confirmed]']
|
|
||||||
await checkPendingRemoveOwnerTx(transactions[5], 3, 'Remove Owner Adol Metamask 3', statusses)
|
|
||||||
await checkThresholdOf(address, 3)
|
|
||||||
await processTransaction(address, transactions[5].props.transaction, 2, accounts[1], 3)
|
|
||||||
|
|
||||||
await refreshTransactions(store, address)
|
|
||||||
await checkThresholdOf(address, 2)
|
|
||||||
transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
|
||||||
await checkMinedRemoveOwnerTx(transactions[5], 'Remove Owner')
|
|
||||||
|
|
||||||
// WHEN... changing threshold
|
|
||||||
await sendChangeThresholdForm(SafeDom, safeButtons[EDIT_THRESHOLD_INDEX], '1')
|
|
||||||
await listTxsClickingOn(store, safeButtons[LIST_TXS_INDEX], address)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
transactions = TestUtils.scryRenderedComponentsWithType(SafeDom, Transaction)
|
|
||||||
await processTransaction(address, transactions[6].props.transaction, 1, accounts[1], 2)
|
|
||||||
await checkThresholdOf(address, 1)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
// @flow
|
// @flow
|
||||||
|
import { List } from 'immutable'
|
||||||
import { aNewStore } from '~/store'
|
import { aNewStore } from '~/store'
|
||||||
import { getWeb3 } from '~/logic/wallets/getWeb3'
|
import { getWeb3 } from '~/logic/wallets/getWeb3'
|
||||||
import { promisify } from '~/utils/promisify'
|
import { promisify } from '~/utils/promisify'
|
||||||
|
@ -19,7 +20,7 @@ import { allowedRemoveSenderInTxHistoryService } from '~/config'
|
||||||
import { calculateValuesAfterRemoving } from '~/routes/open/components/SafeOwnersForm'
|
import { calculateValuesAfterRemoving } from '~/routes/open/components/SafeOwnersForm'
|
||||||
|
|
||||||
describe('React DOM TESTS > Add and remove owners', () => {
|
describe('React DOM TESTS > Add and remove owners', () => {
|
||||||
const processOwnerModification = async (store, safeAddress, executor, threshold) => {
|
const processOwnerModification = async (store, safeAddress, executor, threshold, alreadyConfirmed) => {
|
||||||
const reduxTransactions = safeTransactionsSelector(store.getState(), { safeAddress })
|
const reduxTransactions = safeTransactionsSelector(store.getState(), { safeAddress })
|
||||||
const tx = reduxTransactions.get(0)
|
const tx = reduxTransactions.get(0)
|
||||||
if (!tx) throw new Error()
|
if (!tx) throw new Error()
|
||||||
|
@ -30,7 +31,7 @@ describe('React DOM TESTS > Add and remove owners', () => {
|
||||||
expect(data).not.toBe(undefined)
|
expect(data).not.toBe(undefined)
|
||||||
expect(data).not.toBe('')
|
expect(data).not.toBe('')
|
||||||
|
|
||||||
return processTransaction(safeAddress, tx, confirmed, executor, threshold)
|
return processTransaction(safeAddress, tx, confirmed, executor, threshold, alreadyConfirmed)
|
||||||
}
|
}
|
||||||
|
|
||||||
const assureThresholdIs = async (gnosisSafe, threshold: number) => {
|
const assureThresholdIs = async (gnosisSafe, threshold: number) => {
|
||||||
|
@ -173,7 +174,7 @@ describe('React DOM TESTS > Add and remove owners', () => {
|
||||||
let safe = getSafeFrom(store.getState(), address)
|
let safe = getSafeFrom(store.getState(), address)
|
||||||
await removeOwner(values, safe, threshold, accounts[1], 'Adol Metamask 2', accounts[0])
|
await removeOwner(values, safe, threshold, accounts[1], 'Adol Metamask 2', accounts[0])
|
||||||
await store.dispatch(fetchTransactions(address))
|
await store.dispatch(fetchTransactions(address))
|
||||||
await processOwnerModification(store, address, accounts[1], 2)
|
await processOwnerModification(store, address, accounts[1], 2, List([accounts[0]]))
|
||||||
|
|
||||||
await assureThresholdIs(gnosisSafe, 1)
|
await assureThresholdIs(gnosisSafe, 1)
|
||||||
await assureOwnersAre(gnosisSafe, accounts[0])
|
await assureOwnersAre(gnosisSafe, accounts[0])
|
||||||
|
@ -198,7 +199,7 @@ describe('React DOM TESTS > Add and remove owners', () => {
|
||||||
let safe = getSafeFrom(store.getState(), address)
|
let safe = getSafeFrom(store.getState(), address)
|
||||||
await removeOwner(values, safe, threshold, accounts[2], 'Adol Metamask 3', accounts[0])
|
await removeOwner(values, safe, threshold, accounts[2], 'Adol Metamask 3', accounts[0])
|
||||||
await store.dispatch(fetchTransactions(address))
|
await store.dispatch(fetchTransactions(address))
|
||||||
await processOwnerModification(store, address, accounts[1], 2)
|
await processOwnerModification(store, address, accounts[1], 2, List([accounts[0]]))
|
||||||
|
|
||||||
await assureThresholdIs(gnosisSafe, 1)
|
await assureThresholdIs(gnosisSafe, 1)
|
||||||
await assureOwnersAre(gnosisSafe, accounts[0], accounts[1])
|
await assureOwnersAre(gnosisSafe, accounts[0], accounts[1])
|
||||||
|
@ -224,7 +225,7 @@ describe('React DOM TESTS > Add and remove owners', () => {
|
||||||
let safe = getSafeFrom(store.getState(), address)
|
let safe = getSafeFrom(store.getState(), address)
|
||||||
await removeOwner(values, safe, threshold, accounts[2], 'Adol Metamask 3', accounts[0])
|
await removeOwner(values, safe, threshold, accounts[2], 'Adol Metamask 3', accounts[0])
|
||||||
await store.dispatch(fetchTransactions(address))
|
await store.dispatch(fetchTransactions(address))
|
||||||
await processOwnerModification(store, address, accounts[1], 2)
|
await processOwnerModification(store, address, accounts[1], 2, List([accounts[0]]))
|
||||||
|
|
||||||
await assureThresholdIs(gnosisSafe, 2)
|
await assureThresholdIs(gnosisSafe, 2)
|
||||||
await assureOwnersAre(gnosisSafe, accounts[0], accounts[1])
|
await assureOwnersAre(gnosisSafe, accounts[0], accounts[1])
|
||||||
|
|
|
@ -1,84 +0,0 @@
|
||||||
// @flow
|
|
||||||
import * as React from 'react'
|
|
||||||
import TestUtils from 'react-dom/test-utils'
|
|
||||||
import { Provider } from 'react-redux'
|
|
||||||
import { ConnectedRouter } from 'react-router-redux'
|
|
||||||
import { aNewStore, history } from '~/store'
|
|
||||||
import { addEtherTo } from '~/test/utils/tokenMovements'
|
|
||||||
import { executeWithdrawOn } from '~/routes/safe/store/test/builder/deployedSafe.builder'
|
|
||||||
import { SAFELIST_ADDRESS } from '~/routes/routes'
|
|
||||||
import SafeView from '~/routes/safe/component/Safe'
|
|
||||||
import AppRoutes from '~/routes'
|
|
||||||
import { WITHDRAW_BUTTON_TEXT } from '~/routes/safe/component/Safe/DailyLimit'
|
|
||||||
import { getBalanceInEtherOf } from '~/logic/wallets/getWeb3'
|
|
||||||
import { sleep } from '~/utils/timer'
|
|
||||||
import { type DailyLimitProps } from '~/routes/safe/store/model/dailyLimit'
|
|
||||||
import { WITHDRAW_INDEX } from '~/test/builder/safe.dom.utils'
|
|
||||||
import { aMinedSafe } from '~/test/builder/safe.redux.builder'
|
|
||||||
import { getSafeFrom } from '~/test/utils/safeHelper'
|
|
||||||
import { filterMoveButtonsFrom } from '~/test/builder/safe.dom.builder'
|
|
||||||
import { fetchTokens } from '~/routes/tokens/store/actions/fetchTokens'
|
|
||||||
import { getDailyLimitFrom } from '~/logic/contracts/dailyLimitContracts'
|
|
||||||
|
|
||||||
describe('React DOM TESTS > Withdraw funds from safe', () => {
|
|
||||||
let store
|
|
||||||
let safeAddress: string
|
|
||||||
beforeEach(async () => {
|
|
||||||
store = aNewStore()
|
|
||||||
safeAddress = await aMinedSafe(store)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should withdraw funds under dailyLimit without needing confirmations', async () => {
|
|
||||||
// add funds to safe
|
|
||||||
await addEtherTo(safeAddress, '0.1')
|
|
||||||
|
|
||||||
const safe = getSafeFrom(store.getState(), safeAddress)
|
|
||||||
await executeWithdrawOn(safe, 0.01)
|
|
||||||
|
|
||||||
const safeBalance = await getBalanceInEtherOf(safeAddress)
|
|
||||||
expect(safeBalance).toBe('0.09')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('spentToday dailyLimitModule property is updated correctly', async () => {
|
|
||||||
// add funds to safe
|
|
||||||
await addEtherTo(safeAddress, '0.1')
|
|
||||||
|
|
||||||
const safe = getSafeFrom(store.getState(), safeAddress)
|
|
||||||
await executeWithdrawOn(safe, 0.01)
|
|
||||||
await executeWithdrawOn(safe, 0.01)
|
|
||||||
|
|
||||||
const ethAddress = 0
|
|
||||||
const dailyLimit: DailyLimitProps = await getDailyLimitFrom(safeAddress, ethAddress)
|
|
||||||
|
|
||||||
// THEN
|
|
||||||
expect(dailyLimit.value).toBe(0.5)
|
|
||||||
expect(dailyLimit.spentToday).toBe(0.02)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('Withdraw button disabled when balance is 0', async () => {
|
|
||||||
// navigate to SAFE route
|
|
||||||
history.push(`${SAFELIST_ADDRESS}/${safeAddress}`)
|
|
||||||
const SafeDom = TestUtils.renderIntoDocument((
|
|
||||||
<Provider store={store}>
|
|
||||||
<ConnectedRouter history={history}>
|
|
||||||
<AppRoutes />
|
|
||||||
</ConnectedRouter>
|
|
||||||
</Provider>
|
|
||||||
))
|
|
||||||
|
|
||||||
await sleep(300)
|
|
||||||
const Safe = TestUtils.findRenderedComponentWithType(SafeDom, SafeView)
|
|
||||||
// $FlowFixMe
|
|
||||||
const buttons = TestUtils.scryRenderedDOMComponentsWithTag(Safe, 'button')
|
|
||||||
const filteredButtons = filterMoveButtonsFrom(buttons)
|
|
||||||
const addWithdrawButton = filteredButtons[WITHDRAW_INDEX]
|
|
||||||
expect(addWithdrawButton.getElementsByTagName('span')[0].innerHTML).toEqual(WITHDRAW_BUTTON_TEXT)
|
|
||||||
expect(addWithdrawButton.hasAttribute('disabled')).toBe(true)
|
|
||||||
|
|
||||||
await addEtherTo(safeAddress, '0.1')
|
|
||||||
await store.dispatch(fetchTokens(safeAddress))
|
|
||||||
await sleep(150)
|
|
||||||
|
|
||||||
expect(addWithdrawButton.hasAttribute('disabled')).toBe(false)
|
|
||||||
})
|
|
||||||
})
|
|
|
@ -1,12 +1,9 @@
|
||||||
// @flow
|
// @flow
|
||||||
import contract from 'truffle-contract'
|
import contract from 'truffle-contract'
|
||||||
import { getProviderInfo, getBalanceInEtherOf, getWeb3 } from '~/logic/wallets/getWeb3'
|
import { getBalanceInEtherOf, getWeb3 } from '~/logic/wallets/getWeb3'
|
||||||
import { promisify } from '~/utils/promisify'
|
import { promisify } from '~/utils/promisify'
|
||||||
import { type Safe } from '~/routes/safe/store/model/safe'
|
|
||||||
import Token from '#/test/TestToken.json'
|
import Token from '#/test/TestToken.json'
|
||||||
import { ensureOnce } from '~/utils/singleton'
|
import { ensureOnce } from '~/utils/singleton'
|
||||||
import { DESTINATION_PARAM, VALUE_PARAM } from '~/routes/safe/component/Withdraw/WithdrawForm'
|
|
||||||
import { withdraw } from '~/logic/safe/safeFrontendOperations'
|
|
||||||
import { toNative } from '~/logic/wallets/tokens'
|
import { toNative } from '~/logic/wallets/tokens'
|
||||||
|
|
||||||
export const addEtherTo = async (address: string, eth: string) => {
|
export const addEtherTo = async (address: string, eth: string) => {
|
||||||
|
@ -16,18 +13,6 @@ export const addEtherTo = async (address: string, eth: string) => {
|
||||||
return promisify(cb => web3.eth.sendTransaction(txData, cb))
|
return promisify(cb => web3.eth.sendTransaction(txData, cb))
|
||||||
}
|
}
|
||||||
|
|
||||||
export const executeWithdrawOn = async (safe: Safe, value: number) => {
|
|
||||||
const providerInfo = await getProviderInfo()
|
|
||||||
const userAddress = providerInfo.account
|
|
||||||
|
|
||||||
const values = {
|
|
||||||
[DESTINATION_PARAM]: userAddress,
|
|
||||||
[VALUE_PARAM]: `${value}`,
|
|
||||||
}
|
|
||||||
|
|
||||||
return withdraw(values, safe, userAddress)
|
|
||||||
}
|
|
||||||
|
|
||||||
export const checkBalanceOf = async (addressToTest: string, value: string) => {
|
export const checkBalanceOf = async (addressToTest: string, value: string) => {
|
||||||
const safeBalance = await getBalanceInEtherOf(addressToTest)
|
const safeBalance = await getBalanceInEtherOf(addressToTest)
|
||||||
expect(safeBalance).toBe(value)
|
expect(safeBalance).toBe(value)
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
// @flow
|
|
||||||
import TestUtils from 'react-dom/test-utils'
|
|
||||||
import { sleep } from '~/utils/timer'
|
|
||||||
import { checkBalanceOf } from '~/test/utils/tokenMovements'
|
|
||||||
import { checkMinedTx } from '~/test/builder/safe.dom.utils'
|
|
||||||
import { whenExecuted } from '~/test/utils/logTransactions'
|
|
||||||
import Withdraw from '~/routes/safe/component/Withdraw'
|
|
||||||
|
|
||||||
export const sendWithdrawForm = async (
|
|
||||||
SafeDom: React$Component<any, any>,
|
|
||||||
withdrawButton: React$Component<any, any>,
|
|
||||||
amount: string,
|
|
||||||
destination: string,
|
|
||||||
) => {
|
|
||||||
// load add multisig form component
|
|
||||||
TestUtils.Simulate.click(withdrawButton)
|
|
||||||
// give time to re-render it
|
|
||||||
await sleep(400)
|
|
||||||
|
|
||||||
// fill the form
|
|
||||||
const inputs = TestUtils.scryRenderedDOMComponentsWithTag(SafeDom, 'input')
|
|
||||||
const amountInput = inputs[0]
|
|
||||||
const destinationInput = inputs[1]
|
|
||||||
TestUtils.Simulate.change(amountInput, { target: { value: amount } })
|
|
||||||
TestUtils.Simulate.change(destinationInput, { target: { value: destination } })
|
|
||||||
// $FlowFixMe
|
|
||||||
const form = TestUtils.findRenderedDOMComponentWithTag(SafeDom, 'form')
|
|
||||||
|
|
||||||
// submit it
|
|
||||||
TestUtils.Simulate.submit(form)
|
|
||||||
TestUtils.Simulate.submit(form)
|
|
||||||
|
|
||||||
return whenExecuted(SafeDom, Withdraw)
|
|
||||||
}
|
|
||||||
|
|
||||||
export const checkMinedWithdrawTx = async (
|
|
||||||
Transaction: React$Component<any, any>,
|
|
||||||
name: string,
|
|
||||||
address: string,
|
|
||||||
funds: string,
|
|
||||||
) => {
|
|
||||||
await checkBalanceOf(address, funds)
|
|
||||||
|
|
||||||
checkMinedTx(Transaction, name)
|
|
||||||
}
|
|
Loading…
Reference in New Issue