vega-frontend-monorepo/apps/governance-e2e/src/support/staking.functions.ts
Art e4a51061a3
chore(ci): bump typescript (#3444)
Co-authored-by: Mikołaj Młodzikowski <mikolaj.mlodzikowski@gmail.com>
2023-04-20 11:56:33 +00:00

255 lines
7.9 KiB
TypeScript

import { closeDialog } from './common.functions';
import { vegaWalletTeardown } from './wallet-teardown.functions';
const tokenAmountInputBox = '[data-testid="token-amount-input"]';
const tokenSubmitButton = '[data-testid="token-input-submit-button"]';
const tokenInputApprove = '[data-testid="token-input-approve-button"]';
const addStakeRadioButton = '[data-testid="add-stake-radio"]';
const removeStakeRadioButton = '[data-testid="remove-stake-radio"]';
const ethWalletAssociateButton = '[href="/token/associate"]:visible';
const ethWalletDissociateButton = '[href="/token/disassociate"]:visible';
const vegaWalletUnstakedBalance =
'[data-testid="vega-wallet-balance-unstaked"]:visible';
const vegaWalletAssociatedBalance = '[data-testid="currency-value"]';
const associateWalletRadioButton = '[data-testid="associate-radio-wallet"]';
const associateContractRadioButton = '[data-testid="associate-radio-contract"]';
const stakeMaximumTokens = '[data-testid="token-amount-use-maximum"]';
const stakeValidatorListPendingStake = '[col-id="pendingStake"]';
const stakeValidatorListTotalStake = 'total-stake';
const stakeValidatorListTotalShare = 'total-stake-share';
const stakeValidatorListName = '[col-id="validator"]';
const vegaKeySelector = '#vega-key-selector';
const txTimeout = Cypress.env('txTimeout');
const epochTimeout = Cypress.env('epochTimeout');
export function waitForBeginningOfEpoch() {
cy.contains('Waiting for next epoch to start', epochTimeout).should(
'not.exist'
);
cy.contains('Waiting for next epoch to start', epochTimeout).should(
'be.visible'
);
}
export function stakingValidatorPageAddStake(stake: string) {
cy.highlight(`Adding a stake of ${stake}`);
cy.get(addStakeRadioButton, epochTimeout).click({ force: true });
cy.get(tokenAmountInputBox).type(stake);
waitForBeginningOfEpoch();
cy.get(tokenSubmitButton, epochTimeout)
.should('be.enabled')
.and('contain', `Add ${stake} $VEGA tokens`)
.and('be.visible')
.click();
}
export function stakingValidatorPageRemoveStake(stake: string) {
cy.highlight(`Removing a stake of ${stake}`);
cy.get(removeStakeRadioButton, epochTimeout).click();
cy.get(tokenAmountInputBox).type(stake);
waitForBeginningOfEpoch();
cy.get(tokenSubmitButton)
.should('be.enabled', epochTimeout)
.and('contain', `Remove ${stake} $VEGA tokens at the end of epoch`)
.and('be.visible')
.click();
closeDialog();
}
export function stakingPageAssociateTokens(
amount: string,
options?: associateOptions
) {
const approve = options && options.approve ? options.approve : false;
const type = options && options.type ? options.type : 'wallet';
const skipConfirmation =
options && options.skipConfirmation ? options.skipConfirmation : false;
cy.highlight(`Associating ${amount} tokens from ${type}`);
cy.get(ethWalletAssociateButton).first().click();
if (type === 'wallet') {
cy.get(associateWalletRadioButton, { timeout: 30000 }).click();
} else if (type === 'contract') {
cy.get(associateContractRadioButton, { timeout: 30000 }).click();
} else {
cy.highlight(`${type} is not association option`);
}
cy.get(tokenAmountInputBox, epochTimeout).type(amount);
if (approve) {
cy.get(tokenInputApprove, txTimeout).should('be.enabled').click();
cy.contains('Approve $VEGA Tokens for staking on Vega').should(
'be.visible'
);
cy.contains('Approve $VEGA Tokens for staking on Vega', txTimeout).should(
'not.exist'
);
}
cy.get(tokenSubmitButton, txTimeout).should('be.enabled').click();
if (!skipConfirmation) {
cy.contains(
`Associating with Vega key. Waiting for ${Cypress.env(
'blockConfirmations'
)} more confirmations..`,
txTimeout
).should('be.visible');
cy.contains(
'can now participate in governance and nominate a validator',
txTimeout
).should('be.visible');
}
}
export function stakingPageDisassociateTokens(
amount: string,
options?: associateOptions
) {
const type = options && options.type ? options.type : 'wallet';
cy.highlight(
`Disassociating ${amount} tokens via Staking Page back to ${type}`
);
cy.get(ethWalletDissociateButton).first().click();
cy.get(vegaKeySelector, txTimeout)
.invoke('attr', 'disabled')
.then((disabled) => {
if (!disabled) {
cy.get(vegaKeySelector).select(
`${type}-${Cypress.env('vegaWalletPublicKey')}`
);
}
});
cy.get(tokenAmountInputBox, epochTimeout).type(amount);
cy.get(tokenSubmitButton, epochTimeout).should('be.enabled').click();
if (type === 'wallet') {
cy.contains(
`${amount} $VEGA tokens have been returned to Ethereum wallet`,
txTimeout
).should('be.visible');
} else if (type === 'contract') {
cy.contains(
`${amount} $VEGA tokens have been returned to Vesting contract`,
txTimeout
).should('be.visible');
}
}
export function stakingPageDisassociateAllTokens(type = 'wallet') {
cy.highlight(`Disassociating all tokens via Staking Page`);
cy.get(ethWalletDissociateButton).first().click();
cy.get(stakeMaximumTokens, epochTimeout).click();
cy.get(tokenSubmitButton, epochTimeout).click();
if (type === 'wallet') {
cy.contains(
`$VEGA tokens have been returned to Ethereum wallet`,
txTimeout
).should('be.visible');
} else if (type === 'contract') {
cy.contains(
`$VEGA tokens have been returned to Vesting contract`,
txTimeout
).should('be.visible');
}
}
export function clickOnValidatorFromList(
validatorNumber: number,
validatorName = null
) {
cy.contains('Loading...', epochTimeout).should('not.exist');
waitForBeginningOfEpoch();
// below is to ensure validator list is shown
cy.get(stakeValidatorListName, { timeout: 10000 }).should('exist');
cy.get(stakeValidatorListPendingStake, txTimeout).should(
'not.contain',
'2,000,000,000,000,000,000.00' // number due to bug #936
);
if (validatorName) {
cy.contains(validatorName).click();
} else {
cy.get(`[row-id="${validatorNumber}"]`)
.should('be.visible')
.find(stakeValidatorListName)
.click();
}
}
export function validateValidatorListTotalStakeAndShare(
positionOnList: string,
expectedTotalStake: string,
expectedTotalShare: string
) {
cy.contains('Loading...', epochTimeout).should('not.exist');
waitForBeginningOfEpoch();
cy.get(`[row-id="${positionOnList}"]:visible`)
.eq(1)
.within(() => {
cy.getByTestId(stakeValidatorListTotalStake, epochTimeout).should(
'have.text',
expectedTotalStake
);
cy.getByTestId(stakeValidatorListTotalShare, epochTimeout).should(
'have.text',
expectedTotalShare
);
});
}
export function ensureSpecifiedUnstakedTokensAreAssociated(
tokenAmount: string
) {
cy.highlight(`Ensuring ${tokenAmount} token(s) associated`);
cy.get(vegaWalletUnstakedBalance)
.children()
.children()
.eq(1)
.invoke('text')
.then((unstakedBalance) => {
if (parseFloat(unstakedBalance) != parseFloat(tokenAmount)) {
vegaWalletTeardown();
cy.get(vegaWalletAssociatedBalance, txTimeout).contains(
'0.00',
txTimeout
);
stakingPageAssociateTokens(tokenAmount);
}
});
}
export function closeStakingDialog() {
cy.get('[data-testid="dialog-title"]:visible').should(
'contain.text',
'At the beginning of the next epoch'
);
cy.get('[data-testid="dialog-content"]:visible')
.first()
.within(() => {
cy.get('a').should('have.text', 'Back to Staking').click();
});
}
export function validateWalletCurrency(
currencyTitle: string,
expectedAmount: string
) {
cy.get("[data-testid='currency-title']")
.contains(currencyTitle)
.parent()
.parent()
.within(() => {
cy.getByTestId('currency-value', txTimeout).should(
'have.text',
expectedAmount
);
});
}
interface associateOptions {
approve?: boolean;
type?: string;
skipConfirmation?: boolean;
}