From 8f29824f9eb7b26e6f5060b5fec0a2dabe7bf9c9 Mon Sep 17 00:00:00 2001 From: Joe Tsang <30622993+jtsang586@users.noreply.github.com> Date: Fri, 16 Jun 2023 17:45:19 +0100 Subject: [PATCH] chore(governance): update staking acs (#4123) --- .../src/integration/flow/staking-flow.cy.ts | 51 ++- .../src/integration/view/validators.cy.ts | 404 +++++++++--------- 2 files changed, 238 insertions(+), 217 deletions(-) diff --git a/apps/governance-e2e/src/integration/flow/staking-flow.cy.ts b/apps/governance-e2e/src/integration/flow/staking-flow.cy.ts index a5e572eab..88410e2c3 100644 --- a/apps/governance-e2e/src/integration/flow/staking-flow.cy.ts +++ b/apps/governance-e2e/src/integration/flow/staking-flow.cy.ts @@ -54,7 +54,7 @@ context( 'Staking Tab - with eth and vega wallets connected', { tags: '@slow' }, function () { - // 2001-STKE-002, 2001-STKE-032 + // 1002-STKE-002, 1002-STKE-032 before('visit staking tab and connect vega wallet', function () { cy.visit('/'); ethereumWalletConnect(); @@ -77,25 +77,41 @@ context( } ); + // 1002-STKE-035 1002-STKE-036 + it('Unable to stake against a validator with less than minimum and more than associated amount', function () { + ensureSpecifiedUnstakedTokensAreAssociated('3'); + verifyUnstakedBalance(3.0); + verifyEthWalletTotalAssociatedBalance('3.0'); + verifyEthWalletAssociatedBalance('3.0'); + cy.get('button').contains('Select a validator to nominate').click(); + clickOnValidatorFromList(0); + cy.getByTestId(stakeAddStakeRadioButton, epochTimeout).click({ + force: true, + }); + cy.getByTestId(stakeTokenAmountInputBox).type('0.001'); + cy.getByTestId(stakeTokenSubmitButton).should('be.disabled'); + cy.getByTestId(stakeTokenAmountInputBox).clear().type('4'); + cy.getByTestId(stakeTokenSubmitButton).should('be.disabled'); + }); it('Able to stake against a validator - using vega from wallet', function () { ensureSpecifiedUnstakedTokensAreAssociated('3'); verifyUnstakedBalance(3.0); verifyEthWalletTotalAssociatedBalance('3.0'); verifyEthWalletAssociatedBalance('3.0'); cy.get('button').contains('Select a validator to nominate').click(); - // 2001-STKE-031 + // 1002-STKE-031 clickOnValidatorFromList(0); - // 2001-STKE-033, 2001-STKE-034, 2001-STKE-037 + // 1002-STKE-033, 1002-STKE-034, 1002-STKE-037 stakingValidatorPageAddStake('2'); verifyUnstakedBalance(1.0); - // 2001-STKE-039 + // 1002-STKE-039 verifyStakedBalance(2.0); - verifyNextEpochValue(2.0); // 2001-STKE-016 2001-STKE-038 - verifyThisEpochValue(2.0); // 2001-STKE-013 + verifyNextEpochValue(2.0); // 1002-STKE-016 1002-STKE-038 + verifyThisEpochValue(2.0); // 1002-STKE-013 closeStakingDialog(); navigateTo(navigation.validators); - // 2002-SINC-007 + // 2002-SINC-007 1002-STKE-015 1002-STKE-017 1002-STKE-052 validateValidatorListTotalStakeAndShare('0', '3,002.00', '50.02%'); }); @@ -218,7 +234,7 @@ context( }); }); - // 2001-STKE-041 + // 1002-STKE-041 1002-STKE-053 it( 'Able to remove part of a stake against a validator', { tags: '@smoke' }, @@ -231,11 +247,11 @@ context( verifyUnstakedBalance(1.0); closeStakingDialog(); navigateTo(navigation.validators); - // 2001-STKE-040 + // 1002-STKE-040 clickOnValidatorFromList(0); - // 2001-STKE-044, 2001-STKE-048 + // 1002-STKE-044, 1002-STKE-048 stakingValidatorPageRemoveStake('1'); - // 2001-STKE-049 + // 1002-STKE-049 verifyNextEpochValue(2.0); verifyUnstakedBalance(2.0); verifyStakedBalance(2.0); @@ -255,7 +271,7 @@ context( } ); - // 2001-STKE-045 + // 1002-STKE-045 it('Able to remove a full stake against a validator', function () { stakingPageAssociateTokens('3'); verifyUnstakedBalance(3.0); @@ -303,6 +319,7 @@ context( .and('be.visible'); }); + // 1002-STKE-046 1002-STKE-047 it('Unable to remove a stake greater than staked amount next epoch for a validator', function () { stakingPageAssociateTokens('3'); verifyUnstakedBalance(3.0); @@ -405,7 +422,7 @@ context( }); it('Associating wallet tokens - when some already staked - auto stakes tokens to staked validator', function () { - // 2001-STKE-004 + // 1002-STKE-004 stakingPageAssociateTokens('3'); verifyUnstakedBalance(3.0); cy.get('button').contains('Select a validator to nominate').click(); @@ -419,7 +436,7 @@ context( }); it('Associating vesting contract tokens - when some already staked - auto stakes tokens to staked validator', function () { - // 2001-STKE-004 + // 1002-STKE-004 stakingPageAssociateTokens('3', { type: 'contract' }); verifyUnstakedBalance(3.0); cy.get('button').contains('Select a validator to nominate').click(); @@ -433,7 +450,7 @@ context( }); it('Associating vesting contract tokens - when wallet tokens already staked - auto stakes tokens to staked validator', function () { - // 2001-STKE-004 + // 1002-STKE-004 stakingPageAssociateTokens('3', { type: 'wallet' }); verifyUnstakedBalance(3.0); cy.get('button').contains('Select a validator to nominate').click(); @@ -447,7 +464,7 @@ context( }); it('Associating tokens - with multiple validators already staked - auto stakes to staked validators - abiding by existing stake ratio', function () { - // 2001-STKE-004 + // 1002-STKE-004 stakingPageAssociateTokens('6'); verifyUnstakedBalance(6.0); cy.get('button').contains('Select a validator to nominate').click(); @@ -500,7 +517,7 @@ context( } function verifyThisEpochValue(amount: number) { - cy.getByTestId('stake-this-epoch', epochTimeout) // 2001-STKE-013 + cy.getByTestId('stake-this-epoch', epochTimeout) // 1002-STKE-013 .contains(amount, epochTimeout) .should('be.visible'); } diff --git a/apps/governance-e2e/src/integration/view/validators.cy.ts b/apps/governance-e2e/src/integration/view/validators.cy.ts index d0b2370a1..10d400bcc 100644 --- a/apps/governance-e2e/src/integration/view/validators.cy.ts +++ b/apps/governance-e2e/src/integration/view/validators.cy.ts @@ -40,209 +40,213 @@ context('Validators Page - verify elements on page', function () { }); describe('with wallets disconnected', { tags: '@smoke' }, function () { - describe('description section', function () { - it('Should have validators tab highlighted', function () { - verifyTabHighlighted(navigation.validators); - }); - - it('Should have validators ON VEGA header visible', function () { - verifyPageHeader('Validators'); - }); - - it('Should have Staking Guide link visible', function () { - // 2001-STKE-003 - cy.get(guideLink) - .should('be.visible') - .and('have.text', 'Read more about staking on Vega') - .and( - 'have.attr', - 'href', - 'https://docs.vega.xyz/mainnet/concepts/vega-chain/#staking-on-vega' - ); - }); + it('Should have validators tab highlighted', function () { + verifyTabHighlighted(navigation.validators); }); - describe( - 'Should be able to see validator list from the staking page', - { tags: '@regression' }, - function () { - // 2001-STKE-050 - it('Should be able to see validator names', function () { - cy.get('[col-id="validator"] > div > span') - .should('have.length.at.least', 1) - .each(($name) => { - cy.wrap($name).should('not.be.empty'); - }); - }); - it('Should be able to see validator stake', function () { - cy.getByTestId('total-stake') - .should('have.length.at.least', 1) - .each(($stake) => { - cy.wrap($stake).should('not.be.empty'); - }); - }); + it('Should have validators ON VEGA header visible', function () { + verifyPageHeader('Validators'); + }); - it('Should be able to see validator stake tooltip', function () { - waitForBeginningOfEpoch(); - cy.getByTestId('total-stake').first().realHover(); + it('Should have Staking Guide link visible', function () { + // 1002-STKE-003 + cy.get(guideLink) + .should('be.visible') + .and('have.text', 'Read more about staking on Vega') + .and( + 'have.attr', + 'href', + 'https://docs.vega.xyz/mainnet/concepts/vega-chain/#staking-on-vega' + ); + }); - cy.get(stakedByOperatorToolTip) - .invoke('text') - .should('contain', 'Staked by operator: 3,000.00'); - cy.get(stakedByDelegatesToolTip) - .invoke('text') - .should('contain', 'Staked by delegates: 0.00'); - cy.get(totalStakedToolTip) - .invoke('text') - .should('contain', 'Total stake: 3,000.00'); - }); - - it('Should be able to see validator normalised voting power', function () { - cy.getByTestId('normalised-voting-power') - .should('have.length.at.least', 1) - .each(($vPower) => { - cy.wrap($vPower).should('not.be.empty'); - }); - }); - - it('Should be able to see validator normalised voting power tooltip', function () { - waitForBeginningOfEpoch(); - cy.getByTestId('normalised-voting-power').first().realHover(); - - cy.get(unnormalisedVotingPowerToolTip) - .invoke('text') - .should('contain', 'Unnormalised voting power: 20.00%'); - cy.get(normalisedVotingPowerToolTip) - .invoke('text') - .should('contain', 'Normalised voting power: 50.00%'); - }); - - // 2002-SINC-018 - it('Should be able to see validator total penalties', function () { - cy.getByTestId('total-penalty') - .should('have.length.at.least', 1) - .each(($penalties) => { - cy.wrap($penalties).should('contain.text', '0%'); - }); - }); - - it('Should be able to see validator penalties tooltip', function () { - waitForBeginningOfEpoch(); - cy.getByTestId('total-penalty').realHover(); - - cy.get(performancePenaltyToolTip) - .invoke('text') - .should('contain', 'Performance penalty: 0.00%'); - cy.get(overstakedPenaltyToolTip) - .invoke('text') - .should('contain', 'Overstaked penalty: 60.00%'); // value not asserted due to #2886 - cy.get(totalPenaltyToolTip) - .invoke('text') - .should('contain', 'Total penalties: 60.00%'); - }); - - it('Should be able to see validator pending stake', function () { - cy.getByTestId('total-pending-stake') - .should('have.length.at.least', 1) - .each(($pendingStake) => { - cy.wrap($pendingStake).should('contain.text', '0.00'); - }); - }); - } - ); - - // 2001-STKE-050 - describe( - 'Should be able to see static information about a validator', - { tags: '@smoke' }, - function () { - before('connect wallets and click on validator', function () { - cy.connectVegaWallet(); - clickOnValidatorFromList(0); - }); - - // 2001-STKE-006 - it('Should be able to see validator name', function () { - cy.get(validatorTitle).should('not.be.empty'); - }); - - // 2001-STKE-007 - it('Should be able to see validator id', function () { - cy.get(validatorId).should('not.be.empty'); - }); - - // 2001-STKE-008 - it('Should be able to see validator public key', function () { - cy.get(validatorPubKey).should('not.be.empty'); - }); - - // 2001-STKE-010 - it('Should be able to see Ethereum address', function () { - cy.get(ethAddressLink) - .should('not.be.empty') - .and('have.attr', 'href'); - }); - // TODO validators missing url for more information about them 2001-STKE-09 - - it('Should be able to see validator status', function () { - cy.get(validatorStatus).should('have.text', 'Consensus'); - }); - - // 2001-STKE-012 - it('Should be able to see total stake', function () { - cy.get(totalStake).invoke('text').should('match', stakeNumberRegex); - }); - - it('Should be able to see pending stake', function () { - cy.get(pendingStake).invoke('text').should('match', stakeNumberRegex); - }); - - it('Should be able to see staked by operator', function () { - cy.get(stakedByOperator) - .invoke('text') - .should('match', stakeNumberRegex); - }); - - it('Should be able to see staked by delegates', function () { - cy.get(stakedByDelegates) - .invoke('text') - .should('match', stakeNumberRegex); - }); - - // 2001-STKE-051 - it('Should be able to see stake share in percentage', function () { - cy.get(stakeShare) - .invoke('text') - .then(($stakePercentage) => { - // The pattern must start at a word boundary (\b). - // The pattern cannot be immediately preceded by a dot ((? { - cy.get(epochTitle).should('not.be.empty'); - cy.get(nextEpochInfo).should('contain.text', 'Next epoch'); - }); - }); - } - ); + // 1002-STKE-032 + it('Should have button to connect vega wallet in validator page', function () { + clickOnValidatorFromList(0); + cy.getByTestId('connect-to-vega-wallet-btn').should('be.visible'); + cy.visit('/validators'); + }); }); + // 1002-STKE-020 1002-STKE-021 1002-STKE-022 1002-STKE-023 1002-STKE-024 + describe( + 'Should be able to see validator list from the staking page', + { tags: '@regression' }, + function () { + // 1002-STKE-050 + it('Should be able to see validator names', function () { + cy.get('[col-id="validator"] > div > span') + .should('have.length.at.least', 1) + .each(($name) => { + cy.wrap($name).should('not.be.empty'); + }); + }); + + it('Should be able to see validator stake', function () { + cy.getByTestId('total-stake') + .should('have.length.at.least', 1) + .each(($stake) => { + cy.wrap($stake).should('not.be.empty'); + }); + }); + + it('Should be able to see validator stake tooltip', function () { + waitForBeginningOfEpoch(); + cy.getByTestId('total-stake').first().realHover(); + + cy.get(stakedByOperatorToolTip) + .invoke('text') + .should('contain', 'Staked by operator: 3,000.00'); + cy.get(stakedByDelegatesToolTip) + .invoke('text') + .should('contain', 'Staked by delegates: 0.00'); + cy.get(totalStakedToolTip) + .invoke('text') + .should('contain', 'Total stake: 3,000.00'); + }); + + it('Should be able to see validator normalised voting power', function () { + cy.getByTestId('normalised-voting-power') + .should('have.length.at.least', 1) + .each(($vPower) => { + cy.wrap($vPower).should('not.be.empty'); + }); + }); + + it('Should be able to see validator normalised voting power tooltip', function () { + waitForBeginningOfEpoch(); + cy.getByTestId('normalised-voting-power').first().realHover(); + + cy.get(unnormalisedVotingPowerToolTip) + .invoke('text') + .should('contain', 'Unnormalised voting power: 20.00%'); + cy.get(normalisedVotingPowerToolTip) + .invoke('text') + .should('contain', 'Normalised voting power: 50.00%'); + }); + + // 2002-SINC-018 + it('Should be able to see validator total penalties', function () { + cy.getByTestId('total-penalty') + .should('have.length.at.least', 1) + .each(($penalties) => { + cy.wrap($penalties).should('contain.text', '0%'); + }); + }); + + it('Should be able to see validator penalties tooltip', function () { + waitForBeginningOfEpoch(); + cy.getByTestId('total-penalty').realHover(); + + cy.get(performancePenaltyToolTip) + .invoke('text') + .should('contain', 'Performance penalty: 0.00%'); + cy.get(overstakedPenaltyToolTip) + .invoke('text') + .should('contain', 'Overstaked penalty: 60.00%'); // value not asserted due to #2886 + cy.get(totalPenaltyToolTip) + .invoke('text') + .should('contain', 'Total penalties: 60.00%'); + }); + + it('Should be able to see validator pending stake', function () { + cy.getByTestId('total-pending-stake') + .should('have.length.at.least', 1) + .each(($pendingStake) => { + cy.wrap($pendingStake).should('contain.text', '0.00'); + }); + }); + } + ); + + // 1002-STKE-050 + describe( + 'Should be able to see static information about a validator', + { tags: '@smoke' }, + function () { + before('connect wallets and click on validator', function () { + cy.connectVegaWallet(); + clickOnValidatorFromList(0); + }); + + // 1002-STKE-006 + it('Should be able to see validator name', function () { + cy.get(validatorTitle).should('not.be.empty'); + }); + + // 1002-STKE-007 + it('Should be able to see validator id', function () { + cy.get(validatorId).should('not.be.empty'); + }); + + // 1002-STKE-008 + it('Should be able to see validator public key', function () { + cy.get(validatorPubKey).should('not.be.empty'); + }); + + // 1002-STKE-010 + it('Should be able to see Ethereum address', function () { + cy.get(ethAddressLink).should('not.be.empty').and('have.attr', 'href'); + }); + // TODO validators missing url for more information about them 1002-STKE-09 + + it('Should be able to see validator status', function () { + cy.get(validatorStatus).should('have.text', 'Consensus'); + }); + + // 1002-STKE-012 + it('Should be able to see total stake', function () { + cy.get(totalStake).invoke('text').should('match', stakeNumberRegex); + }); + + it('Should be able to see pending stake', function () { + cy.get(pendingStake).invoke('text').should('match', stakeNumberRegex); + }); + + it('Should be able to see staked by operator', function () { + cy.get(stakedByOperator) + .invoke('text') + .should('match', stakeNumberRegex); + }); + + it('Should be able to see staked by delegates', function () { + cy.get(stakedByDelegates) + .invoke('text') + .should('match', stakeNumberRegex); + }); + + // 1002-STKE-051 + it('Should be able to see stake share in percentage', function () { + cy.get(stakeShare) + .invoke('text') + .then(($stakePercentage) => { + // The pattern must start at a word boundary (\b). + // The pattern cannot be immediately preceded by a dot ((? { + cy.get(epochTitle).should('not.be.empty'); + cy.get(nextEpochInfo).should('contain.text', 'Next epoch'); + }); + }); + } + ); });