Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ed2c82487d | ||
|
|
55143331f1 | ||
|
|
cafb3b1c57 | ||
|
|
019b2d7d89 | ||
|
|
de0dc4af8e | ||
|
|
6765f4d03a | ||
|
|
7bea90e4d1 |
@@ -6,6 +6,8 @@ on:
|
|||||||
- release/*
|
- release/*
|
||||||
- develop
|
- develop
|
||||||
- main
|
- main
|
||||||
|
# uncomment pull_request and comment pull_request_target to test CI changes against feature branch not target branch (develop)
|
||||||
|
# pull_request:
|
||||||
pull_request_target:
|
pull_request_target:
|
||||||
types:
|
types:
|
||||||
- opened
|
- opened
|
||||||
@@ -47,7 +49,7 @@ jobs:
|
|||||||
|
|
||||||
lint-pr-title:
|
lint-pr-title:
|
||||||
needs: node-modules
|
needs: node-modules
|
||||||
if: ${{ github.event_name == 'pull_request' }}
|
if: ${{ github.event_name == 'pull_request' || github.event_name == 'pull_request_target' }}
|
||||||
name: Verify PR title
|
name: Verify PR title
|
||||||
uses: ./.github/workflows/lint-pr.yml
|
uses: ./.github/workflows/lint-pr.yml
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
@@ -110,65 +112,82 @@ jobs:
|
|||||||
echo "Branch slug: ${branch_slug}"
|
echo "Branch slug: ${branch_slug}"
|
||||||
echo ">>>> eof debug"
|
echo ">>>> eof debug"
|
||||||
|
|
||||||
projects_e2e=""
|
projects_array=()
|
||||||
|
|
||||||
preview_governance="not deployed"
|
preview_governance="not deployed"
|
||||||
preview_trading="not deployed"
|
preview_trading="not deployed"
|
||||||
preview_explorer="not deployed"
|
preview_explorer="not deployed"
|
||||||
preview_tools="not deployed"
|
preview_tools="not deployed"
|
||||||
|
|
||||||
|
# parse if affected is any of three main applications, if none - use all of them
|
||||||
if echo "$affected" | grep -q governance; then
|
if echo "$affected" | grep -q governance; then
|
||||||
echo "Governance is affected"
|
echo "Governance is affected"
|
||||||
projects_e2e+='"governance-e2e" '
|
projects_array+=("governance")
|
||||||
preview_governance=$(printf "https://%s.%s.vega.rocks" "governance" "$branch_slug")
|
preview_governance=$(printf "https://%s.%s.vega.rocks" "governance" "$branch_slug")
|
||||||
fi
|
fi
|
||||||
if echo "$affected" | grep -q trading; then
|
if echo "$affected" | grep -q trading; then
|
||||||
echo "Trading is affected"
|
echo "Trading is affected"
|
||||||
projects_e2e+='"trading-e2e" '
|
projects_array+=("trading")
|
||||||
preview_trading=$(printf "https://%s.%s.vega.rocks" "trading" "$branch_slug")
|
preview_trading=$(printf "https://%s.%s.vega.rocks" "trading" "$branch_slug")
|
||||||
fi
|
fi
|
||||||
if echo "$affected" | grep -q explorer; then
|
if echo "$affected" | grep -q explorer; then
|
||||||
echo "Explorer is affected"
|
echo "Explorer is affected"
|
||||||
projects_e2e+='"explorer-e2e" '
|
projects_array+=("explorer")
|
||||||
preview_explorer=$(printf "https://%s.%s.vega.rocks" "explorer" "$branch_slug")
|
preview_explorer=$(printf "https://%s.%s.vega.rocks" "explorer" "$branch_slug")
|
||||||
fi
|
fi
|
||||||
if [[ -z "$projects_e2e" ]]; then
|
if [[ ${#projects_array[@]} -eq 0 ]]; then
|
||||||
projects_e2e+='"governance-e2e" "trading-e2e" "explorer-e2e" '
|
projects_array=("governance" "trading" "explorer")
|
||||||
preview_governance=$(printf "https://%s.%s.vega.rocks" "governance" "$branch_slug")
|
preview_governance=$(printf "https://%s.%s.vega.rocks" "governance" "$branch_slug")
|
||||||
preview_trading=$(printf "https://%s.%s.vega.rocks" "trading" "$branch_slug")
|
preview_trading=$(printf "https://%s.%s.vega.rocks" "trading" "$branch_slug")
|
||||||
preview_explorer=$(printf "https://%s.%s.vega.rocks" "explorer" "$branch_slug")
|
preview_explorer=$(printf "https://%s.%s.vega.rocks" "explorer" "$branch_slug")
|
||||||
fi
|
fi
|
||||||
projects="$(echo $projects_e2e | sed 's|-e2e||g')"
|
|
||||||
|
# applications parsed before this loop are applicable for running e2e-tests
|
||||||
|
projects_e2e_array=()
|
||||||
|
for project in "${projects_array[@]}"; do
|
||||||
|
projects_e2e_array+=("${project}-e2e")
|
||||||
|
done
|
||||||
|
# all applications below this loop are not applicable for running e2e-test
|
||||||
|
|
||||||
|
# check if pull request event to deploy tools
|
||||||
if [[ "${{ github.event_name }}" = "pull_request" ]]; then
|
if [[ "${{ github.event_name }}" = "pull_request" ]]; then
|
||||||
if echo "$affected" | grep -q multisig-signer; then
|
if echo "$affected" | grep -q multisig-signer; then
|
||||||
echo "Tools are affected"
|
echo "Tools are affected"
|
||||||
# tools are only applicable to check previews or deploy from develop to mainnet
|
|
||||||
echo "Deploying tools on preview"
|
echo "Deploying tools on preview"
|
||||||
preview_tools=$(printf "https://%s.%s.vega.rocks" "tools" "$branch_slug")
|
preview_tools=$(printf "https://%s.%s.vega.rocks" "tools" "$branch_slug")
|
||||||
projects+=' "multisig-signer" '
|
|
||||||
|
projects_array+=("multisig-signer")
|
||||||
fi
|
fi
|
||||||
|
# those apps deploy only from develop to mainnet
|
||||||
elif [[ "${{ github.ref }}" =~ .*develop$ ]]; then
|
elif [[ "${{ github.ref }}" =~ .*develop$ ]]; then
|
||||||
if echo "$affected" | grep -q multisig-signer; then
|
if echo "$affected" | grep -q multisig-signer; then
|
||||||
echo "Tools are affected"
|
echo "Tools are affected"
|
||||||
# tools are only applicable to check previews or deploy from develop to mainnet
|
|
||||||
echo "Deploying tools on s3"
|
echo "Deploying tools on s3"
|
||||||
projects+=' "multisig-signer" '
|
|
||||||
|
projects_array+=("multisig-signer")
|
||||||
fi
|
fi
|
||||||
if echo "$affected" | grep -q static; then
|
if echo "$affected" | grep -q static; then
|
||||||
echo "static is affected"
|
echo "static is affected"
|
||||||
echo "Deploying static on s3"
|
echo "Deploying static on s3"
|
||||||
projects+=' "static" '
|
|
||||||
|
projects_array+=("static")
|
||||||
fi
|
fi
|
||||||
if echo "$affected" | grep -q ui-toolkit; then
|
if echo "$affected" | grep -q ui-toolkit; then
|
||||||
echo "ui-toolkit is affected"
|
echo "ui-toolkit is affected"
|
||||||
echo "Deploying ui-toolkit on s3"
|
echo "Deploying ui-toolkit on s3"
|
||||||
projects+=' "ui-toolkit" '
|
|
||||||
|
projects_array+=("ui-toolkit")
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
projects_e2e=${projects_e2e%?}
|
echo "Projects: ${projects_array[@]}"
|
||||||
projects_e2e=[${projects_e2e// /,}]
|
echo "Projects E2E: ${projects_e2e_array[@]}"
|
||||||
projects=[${projects// /,}]
|
projects_json=$(jq -M --compact-output --null-input '$ARGS.positional' --args -- "${projects_array[@]}")
|
||||||
echo PROJECTS_E2E=$projects_e2e >> $GITHUB_ENV
|
projects_e2e_json=$(jq -M --compact-output --null-input '$ARGS.positional' --args -- "${projects_e2e_array[@]}")
|
||||||
echo PROJECTS=$projects >> $GITHUB_ENV
|
|
||||||
|
echo PROJECTS_E2E=$projects_e2e_json >> $GITHUB_ENV
|
||||||
|
echo PROJECTS=$projects_json >> $GITHUB_ENV
|
||||||
|
|
||||||
echo PREVIEW_GOVERNANCE=$preview_governance >> $GITHUB_ENV
|
echo PREVIEW_GOVERNANCE=$preview_governance >> $GITHUB_ENV
|
||||||
echo PREVIEW_TRADING=$preview_trading >> $GITHUB_ENV
|
echo PREVIEW_TRADING=$preview_trading >> $GITHUB_ENV
|
||||||
echo PREVIEW_EXPLORER=$preview_explorer >> $GITHUB_ENV
|
echo PREVIEW_EXPLORER=$preview_explorer >> $GITHUB_ENV
|
||||||
@@ -185,7 +204,7 @@ jobs:
|
|||||||
cypress:
|
cypress:
|
||||||
needs: lint-test-build
|
needs: lint-test-build
|
||||||
name: '(CI) cypress'
|
name: '(CI) cypress'
|
||||||
if: ${{ needs.lint-test-build.outputs.projects-e2e != '[]' }}
|
# if: ${{ needs.lint-test-build.outputs.projects-e2e != '[]' }}
|
||||||
uses: ./.github/workflows/cypress-run.yml
|
uses: ./.github/workflows/cypress-run.yml
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
with:
|
with:
|
||||||
@@ -195,7 +214,7 @@ jobs:
|
|||||||
publish-dist:
|
publish-dist:
|
||||||
needs: lint-test-build
|
needs: lint-test-build
|
||||||
name: '(CD) publish dist'
|
name: '(CD) publish dist'
|
||||||
if: ${{ needs.lint-test-build.outputs.projects != '[]' }}
|
# if: ${{ needs.lint-test-build.outputs.projects != '[]' }}
|
||||||
uses: ./.github/workflows/publish-dist.yml
|
uses: ./.github/workflows/publish-dist.yml
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
with:
|
with:
|
||||||
@@ -206,7 +225,7 @@ jobs:
|
|||||||
needs:
|
needs:
|
||||||
- publish-dist
|
- publish-dist
|
||||||
- lint-test-build
|
- lint-test-build
|
||||||
if: ${{ github.event_name == 'pull_request' }}
|
if: ${{ github.event_name == 'pull_request' || github.event_name == 'pull_request_target' }}
|
||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
name: '(CD) comment preview links'
|
name: '(CD) comment preview links'
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ jobs:
|
|||||||
uses: docker/setup-buildx-action@v2
|
uses: docker/setup-buildx-action@v2
|
||||||
|
|
||||||
- name: Log in to the Container registry (ghcr)
|
- name: Log in to the Container registry (ghcr)
|
||||||
if: ${{ github.event_name == 'pull_request' }}
|
if: ${{ github.event_name == 'pull_request' || github.event_name == 'pull_request_target' }}
|
||||||
uses: docker/login-action@v2
|
uses: docker/login-action@v2
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
@@ -145,7 +145,7 @@ jobs:
|
|||||||
ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:local
|
ghcr.io/vegaprotocol/frontend/${{ matrix.app }}:local
|
||||||
|
|
||||||
- name: Image digest
|
- name: Image digest
|
||||||
if: ${{ github.event_name == 'pull_request' }}
|
if: ${{ github.event_name == 'pull_request' || github.event_name == 'pull_request_target' }}
|
||||||
run: echo ${{ steps.docker_build.outputs.digest }}
|
run: echo ${{ steps.docker_build.outputs.digest }}
|
||||||
|
|
||||||
- name: Sanity check docker image
|
- name: Sanity check docker image
|
||||||
@@ -160,7 +160,7 @@ jobs:
|
|||||||
uses: docker/build-push-action@v3
|
uses: docker/build-push-action@v3
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
id: ghcr-push
|
id: ghcr-push
|
||||||
if: ${{ github.event_name == 'pull_request' }}
|
if: ${{ github.event_name == 'pull_request' || github.event_name == 'pull_request_target' }}
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: docker/node-outside-docker.Dockerfile
|
file: docker/node-outside-docker.Dockerfile
|
||||||
@@ -230,7 +230,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Add preview label
|
- name: Add preview label
|
||||||
uses: actions-ecosystem/action-add-labels@v1
|
uses: actions-ecosystem/action-add-labels@v1
|
||||||
if: ${{ github.event_name == 'pull_request' }}
|
if: ${{ github.event_name == 'pull_request' || github.event_name == 'pull_request_target' }}
|
||||||
with:
|
with:
|
||||||
labels: ${{ matrix.app }}-preview
|
labels: ${{ matrix.app }}-preview
|
||||||
number: ${{ github.event.number }}
|
number: ${{ github.event.number }}
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
import { render } from '@testing-library/react';
|
||||||
|
import { TxDetailsLiquidityAmendment } from './tx-liquidity-amend';
|
||||||
|
import type { TendermintBlocksResponse } from '../../../routes/blocks/tendermint-blocks-response';
|
||||||
|
import type { BlockExplorerTransactionResult } from '../../../routes/types/block-explorer-response';
|
||||||
|
import { MockedProvider } from '@apollo/client/testing';
|
||||||
|
import { MemoryRouter } from 'react-router-dom';
|
||||||
|
|
||||||
|
describe('TxDetailsLiquidityAmendment', () => {
|
||||||
|
const mockTxData = {
|
||||||
|
hash: 'test',
|
||||||
|
command: {
|
||||||
|
liquidityProvisionAmendment: {
|
||||||
|
marketId: 'BTC-USD',
|
||||||
|
commitmentAmount: 100,
|
||||||
|
fee: '0.01',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const mockPubKey = '123';
|
||||||
|
const mockBlockData = {
|
||||||
|
result: {
|
||||||
|
block: {
|
||||||
|
header: {
|
||||||
|
height: '123',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
it('should render the component with correct data', () => {
|
||||||
|
const { getByText } = render(
|
||||||
|
<MockedProvider>
|
||||||
|
<MemoryRouter>
|
||||||
|
<TxDetailsLiquidityAmendment
|
||||||
|
txData={mockTxData as BlockExplorerTransactionResult}
|
||||||
|
pubKey={mockPubKey}
|
||||||
|
blockData={mockBlockData as TendermintBlocksResponse}
|
||||||
|
/>
|
||||||
|
</MemoryRouter>
|
||||||
|
</MockedProvider>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(getByText('Market')).toBeInTheDocument();
|
||||||
|
expect(getByText('BTC-USD')).toBeInTheDocument();
|
||||||
|
expect(getByText('Commitment amount')).toBeInTheDocument();
|
||||||
|
expect(getByText('100')).toBeInTheDocument();
|
||||||
|
expect(getByText('Fee')).toBeInTheDocument();
|
||||||
|
expect(getByText('1%')).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should display awaiting message when tx data is undefined', () => {
|
||||||
|
const { getByText } = render(
|
||||||
|
<MockedProvider>
|
||||||
|
<MemoryRouter>
|
||||||
|
<TxDetailsLiquidityAmendment
|
||||||
|
txData={undefined}
|
||||||
|
pubKey={mockPubKey}
|
||||||
|
blockData={mockBlockData as TendermintBlocksResponse}
|
||||||
|
/>
|
||||||
|
</MemoryRouter>
|
||||||
|
</MockedProvider>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
getByText('Awaiting Block Explorer transaction details')
|
||||||
|
).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should display awaiting message when liquidityProvisionAmendment is undefined', () => {
|
||||||
|
const { getByText } = render(
|
||||||
|
<MockedProvider>
|
||||||
|
<MemoryRouter>
|
||||||
|
<TxDetailsLiquidityAmendment
|
||||||
|
txData={{ command: {} } as BlockExplorerTransactionResult}
|
||||||
|
pubKey={mockPubKey}
|
||||||
|
blockData={mockBlockData as TendermintBlocksResponse}
|
||||||
|
/>
|
||||||
|
</MemoryRouter>
|
||||||
|
</MockedProvider>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
getByText('Awaiting Block Explorer transaction details')
|
||||||
|
).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -7,6 +7,7 @@ import { TableCell, TableRow, TableWithTbody } from '../../table';
|
|||||||
import type { components } from '../../../../types/explorer';
|
import type { components } from '../../../../types/explorer';
|
||||||
import { LiquidityProvisionDetails } from './liquidity-provision/liquidity-provision-details';
|
import { LiquidityProvisionDetails } from './liquidity-provision/liquidity-provision-details';
|
||||||
import PriceInMarket from '../../price-in-market/price-in-market';
|
import PriceInMarket from '../../price-in-market/price-in-market';
|
||||||
|
import BigNumber from 'bignumber.js';
|
||||||
|
|
||||||
export type LiquidityAmendment =
|
export type LiquidityAmendment =
|
||||||
components['schemas']['v1LiquidityProvisionAmendment'];
|
components['schemas']['v1LiquidityProvisionAmendment'];
|
||||||
@@ -34,6 +35,10 @@ export const TxDetailsLiquidityAmendment = ({
|
|||||||
txData.command.liquidityProvisionAmendment;
|
txData.command.liquidityProvisionAmendment;
|
||||||
const marketId: string = amendment.marketId || '-';
|
const marketId: string = amendment.marketId || '-';
|
||||||
|
|
||||||
|
const fee = amendment.fee
|
||||||
|
? new BigNumber(amendment.fee).times(100).toString()
|
||||||
|
: '-';
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<TableWithTbody className="mb-8" allowWrap={true}>
|
<TableWithTbody className="mb-8" allowWrap={true}>
|
||||||
@@ -63,7 +68,7 @@ export const TxDetailsLiquidityAmendment = ({
|
|||||||
{amendment.fee ? (
|
{amendment.fee ? (
|
||||||
<TableRow modifier="bordered">
|
<TableRow modifier="bordered">
|
||||||
<TableCell>{t('Fee')}</TableCell>
|
<TableCell>{t('Fee')}</TableCell>
|
||||||
<TableCell>{amendment.fee}%</TableCell>
|
<TableCell>{fee}%</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
) : null}
|
) : null}
|
||||||
</TableWithTbody>
|
</TableWithTbody>
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
import { render } from '@testing-library/react';
|
||||||
|
import { TxDetailsLiquiditySubmission } from './tx-liquidity-submission';
|
||||||
|
import type { TendermintBlocksResponse } from '../../../routes/blocks/tendermint-blocks-response';
|
||||||
|
import type { BlockExplorerTransactionResult } from '../../../routes/types/block-explorer-response';
|
||||||
|
import { MockedProvider } from '@apollo/client/testing';
|
||||||
|
import { MemoryRouter } from 'react-router-dom';
|
||||||
|
|
||||||
|
describe('TxDetailsLiquiditySubmission', () => {
|
||||||
|
const mockTxData = {
|
||||||
|
hash: 'test',
|
||||||
|
command: {
|
||||||
|
liquidityProvisionSubmission: {
|
||||||
|
marketId: 'BTC-USD',
|
||||||
|
commitmentAmount: 100,
|
||||||
|
fee: '0.01',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const mockPubKey = '123';
|
||||||
|
const mockBlockData = {
|
||||||
|
result: {
|
||||||
|
block: {
|
||||||
|
header: {
|
||||||
|
height: '123',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
it('should render the component with correct data', () => {
|
||||||
|
const { getByText } = render(
|
||||||
|
<MockedProvider>
|
||||||
|
<MemoryRouter>
|
||||||
|
<TxDetailsLiquiditySubmission
|
||||||
|
txData={mockTxData as BlockExplorerTransactionResult}
|
||||||
|
pubKey={mockPubKey}
|
||||||
|
blockData={mockBlockData as TendermintBlocksResponse}
|
||||||
|
/>
|
||||||
|
</MemoryRouter>
|
||||||
|
</MockedProvider>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(getByText('Market')).toBeInTheDocument();
|
||||||
|
expect(getByText('BTC-USD')).toBeInTheDocument();
|
||||||
|
expect(getByText('Commitment amount')).toBeInTheDocument();
|
||||||
|
expect(getByText('100')).toBeInTheDocument();
|
||||||
|
expect(getByText('Fee')).toBeInTheDocument();
|
||||||
|
expect(getByText('1%')).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should display awaiting message when tx data is undefined', () => {
|
||||||
|
const { getByText } = render(
|
||||||
|
<MockedProvider>
|
||||||
|
<MemoryRouter>
|
||||||
|
<TxDetailsLiquiditySubmission
|
||||||
|
txData={undefined}
|
||||||
|
pubKey={mockPubKey}
|
||||||
|
blockData={mockBlockData as TendermintBlocksResponse}
|
||||||
|
/>
|
||||||
|
</MemoryRouter>
|
||||||
|
</MockedProvider>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
getByText('Awaiting Block Explorer transaction details')
|
||||||
|
).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should display awaiting message when liquidityProvisionSubmission is undefined', () => {
|
||||||
|
const { getByText } = render(
|
||||||
|
<MockedProvider>
|
||||||
|
<MemoryRouter>
|
||||||
|
<TxDetailsLiquiditySubmission
|
||||||
|
txData={{ command: {} } as BlockExplorerTransactionResult}
|
||||||
|
pubKey={mockPubKey}
|
||||||
|
blockData={mockBlockData as TendermintBlocksResponse}
|
||||||
|
/>
|
||||||
|
</MemoryRouter>
|
||||||
|
</MockedProvider>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
getByText('Awaiting Block Explorer transaction details')
|
||||||
|
).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -7,6 +7,7 @@ import { TableCell, TableRow, TableWithTbody } from '../../table';
|
|||||||
import type { components } from '../../../../types/explorer';
|
import type { components } from '../../../../types/explorer';
|
||||||
import { LiquidityProvisionDetails } from './liquidity-provision/liquidity-provision-details';
|
import { LiquidityProvisionDetails } from './liquidity-provision/liquidity-provision-details';
|
||||||
import PriceInMarket from '../../price-in-market/price-in-market';
|
import PriceInMarket from '../../price-in-market/price-in-market';
|
||||||
|
import BigNumber from 'bignumber.js';
|
||||||
|
|
||||||
export type LiquiditySubmission =
|
export type LiquiditySubmission =
|
||||||
components['schemas']['v1LiquidityProvisionSubmission'];
|
components['schemas']['v1LiquidityProvisionSubmission'];
|
||||||
@@ -33,6 +34,10 @@ export const TxDetailsLiquiditySubmission = ({
|
|||||||
txData.command.liquidityProvisionSubmission;
|
txData.command.liquidityProvisionSubmission;
|
||||||
const marketId: string = submission.marketId || '-';
|
const marketId: string = submission.marketId || '-';
|
||||||
|
|
||||||
|
const fee = submission.fee
|
||||||
|
? new BigNumber(submission.fee).times(100).toString()
|
||||||
|
: '-';
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<TableWithTbody className="mb-8" allowWrap={true}>
|
<TableWithTbody className="mb-8" allowWrap={true}>
|
||||||
@@ -62,7 +67,7 @@ export const TxDetailsLiquiditySubmission = ({
|
|||||||
{submission.fee ? (
|
{submission.fee ? (
|
||||||
<TableRow modifier="bordered">
|
<TableRow modifier="bordered">
|
||||||
<TableCell>{t('Fee')}</TableCell>
|
<TableCell>{t('Fee')}</TableCell>
|
||||||
<TableCell>{submission.fee}%</TableCell>
|
<TableCell>{fee}%</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
) : null}
|
) : null}
|
||||||
</TableWithTbody>
|
</TableWithTbody>
|
||||||
|
|||||||
@@ -28,18 +28,17 @@ import type { testFreeformProposal } from '../../support/common-interfaces';
|
|||||||
import { formatDateWithLocalTimezone } from '@vegaprotocol/utils';
|
import { formatDateWithLocalTimezone } from '@vegaprotocol/utils';
|
||||||
|
|
||||||
const proposalVoteProgressForPercentage =
|
const proposalVoteProgressForPercentage =
|
||||||
'[data-testid="vote-progress-indicator-percentage-for"]';
|
'vote-progress-indicator-percentage-for';
|
||||||
const proposalVoteProgressAgainstPercentage =
|
const proposalVoteProgressAgainstPercentage =
|
||||||
'[data-testid="vote-progress-indicator-percentage-against"]';
|
'vote-progress-indicator-percentage-against';
|
||||||
const proposalVoteProgressForTokens =
|
const proposalVoteProgressForTokens = 'vote-progress-indicator-tokens-for';
|
||||||
'[data-testid="vote-progress-indicator-tokens-for"]';
|
|
||||||
const proposalVoteProgressAgainstTokens =
|
const proposalVoteProgressAgainstTokens =
|
||||||
'[data-testid="vote-progress-indicator-tokens-against"]';
|
'vote-progress-indicator-tokens-against';
|
||||||
const changeVoteButton = '[data-testid="change-vote-button"]';
|
const changeVoteButton = 'change-vote-button';
|
||||||
const proposalDetailsTitle = '[data-testid="proposal-title"]';
|
const proposalDetailsTitle = 'proposal-title';
|
||||||
const proposalDetailsDescription = '[data-testid="proposal-description"]';
|
const proposalDetailsDescription = 'proposal-description';
|
||||||
const openProposals = '[data-testid="open-proposals"]';
|
const openProposals = 'open-proposals';
|
||||||
const viewProposalButton = '[data-testid="view-proposal-btn"]';
|
const viewProposalButton = 'view-proposal-btn';
|
||||||
const proposalDescriptionToggle = 'proposal-description-toggle';
|
const proposalDescriptionToggle = 'proposal-description-toggle';
|
||||||
const voteBreakdownToggle = 'vote-breakdown-toggle';
|
const voteBreakdownToggle = 'vote-breakdown-toggle';
|
||||||
const proposalTermsToggle = 'proposal-json-toggle';
|
const proposalTermsToggle = 'proposal-json-toggle';
|
||||||
@@ -72,18 +71,18 @@ describe(
|
|||||||
|
|
||||||
createRawProposal();
|
createRawProposal();
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
||||||
cy.get(openProposals).within(() => {
|
cy.getByTestId(openProposals).within(() => {
|
||||||
getProposalFromTitle(rawProposal.rationale.title).within(() => {
|
getProposalFromTitle(rawProposal.rationale.title).within(() => {
|
||||||
cy.get(viewProposalButton).should('be.visible').click();
|
cy.getByTestId(viewProposalButton).should('be.visible').click();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.get(proposalDetailsTitle).should(
|
cy.getByTestId(proposalDetailsTitle).should(
|
||||||
'contain.text',
|
'contain.text',
|
||||||
rawProposal.rationale.title
|
rawProposal.rationale.title
|
||||||
);
|
);
|
||||||
cy.getByTestId(proposalDescriptionToggle).click();
|
cy.getByTestId(proposalDescriptionToggle).click();
|
||||||
cy.getByTestId('proposal-description-toggle');
|
cy.getByTestId('proposal-description-toggle');
|
||||||
cy.get(proposalDetailsDescription)
|
cy.getByTestId(proposalDetailsDescription)
|
||||||
.find('p')
|
.find('p')
|
||||||
.should('have.text', proposalDescription);
|
.should('have.text', proposalDescription);
|
||||||
});
|
});
|
||||||
@@ -117,7 +116,7 @@ describe(
|
|||||||
});
|
});
|
||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
getProposalFromTitle(proposalTitle).within(() =>
|
getProposalFromTitle(proposalTitle).within(() =>
|
||||||
cy.get(viewProposalButton).click()
|
cy.getByTestId(viewProposalButton).click()
|
||||||
);
|
);
|
||||||
cy.wrap(
|
cy.wrap(
|
||||||
formatDateWithLocalTimezone(new Date(proposalTimeStamp * 1000))
|
formatDateWithLocalTimezone(new Date(proposalTimeStamp * 1000))
|
||||||
@@ -139,7 +138,7 @@ describe(
|
|||||||
createRawProposal();
|
createRawProposal();
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
||||||
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
||||||
cy.get(viewProposalButton).click()
|
cy.getByTestId(viewProposalButton).click()
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
cy.contains('Participation: Not Met 0.00 0.00%(0.00% Required)').should(
|
cy.contains('Participation: Not Met 0.00 0.00%(0.00% Required)').should(
|
||||||
@@ -166,7 +165,7 @@ describe(
|
|||||||
createRawProposal();
|
createRawProposal();
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
||||||
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
||||||
cy.get(viewProposalButton).click()
|
cy.getByTestId(viewProposalButton).click()
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
// 3001-VOTE-080
|
// 3001-VOTE-080
|
||||||
@@ -183,14 +182,16 @@ describe(
|
|||||||
.contains(votedDate)
|
.contains(votedDate)
|
||||||
.should('be.visible');
|
.should('be.visible');
|
||||||
});
|
});
|
||||||
cy.get(proposalVoteProgressForPercentage) // 3001-VOTE-072
|
cy.getByTestId(proposalVoteProgressForPercentage) // 3001-VOTE-072
|
||||||
.contains('100.00%')
|
.contains('100.00%')
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
cy.get(proposalVoteProgressAgainstPercentage)
|
cy.getByTestId(proposalVoteProgressAgainstPercentage)
|
||||||
.contains('0.00%')
|
.contains('0.00%')
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
cy.get(proposalVoteProgressForTokens).contains('1.00').and('be.visible');
|
cy.getByTestId(proposalVoteProgressForTokens)
|
||||||
cy.get(proposalVoteProgressAgainstTokens)
|
.contains('1.00')
|
||||||
|
.and('be.visible');
|
||||||
|
cy.getByTestId(proposalVoteProgressAgainstTokens)
|
||||||
.contains('0.00')
|
.contains('0.00')
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
cy.getByTestId(voteBreakdownToggle).click();
|
cy.getByTestId(voteBreakdownToggle).click();
|
||||||
@@ -211,15 +212,15 @@ describe(
|
|||||||
getProposalInformationFromTable('Number of voting parties')
|
getProposalInformationFromTable('Number of voting parties')
|
||||||
.should('have.text', '1')
|
.should('have.text', '1')
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
cy.get(changeVoteButton).should('be.visible').click();
|
cy.getByTestId(changeVoteButton).should('be.visible').click();
|
||||||
voteForProposal('for');
|
voteForProposal('for');
|
||||||
// 3001-VOTE-064
|
// 3001-VOTE-064
|
||||||
getProposalInformationFromTable('Tokens for proposal')
|
getProposalInformationFromTable('Tokens for proposal')
|
||||||
.should('have.text', (1).toFixed(2))
|
.should('have.text', (1).toFixed(2))
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
cy.get(changeVoteButton).should('be.visible').click();
|
cy.getByTestId(changeVoteButton).should('be.visible').click();
|
||||||
voteForProposal('against');
|
voteForProposal('against');
|
||||||
cy.get(proposalVoteProgressAgainstPercentage)
|
cy.getByTestId(proposalVoteProgressAgainstPercentage)
|
||||||
.contains('100.00%')
|
.contains('100.00%')
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
getProposalInformationFromTable('Tokens against proposal')
|
getProposalInformationFromTable('Tokens against proposal')
|
||||||
@@ -236,13 +237,15 @@ describe(
|
|||||||
createRawProposal();
|
createRawProposal();
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
||||||
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
||||||
cy.get(viewProposalButton).click()
|
cy.getByTestId(viewProposalButton).click()
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
voteForProposal('for');
|
voteForProposal('for');
|
||||||
// 3001-VOTE-079
|
// 3001-VOTE-079
|
||||||
cy.contains('You voted: For').should('be.visible');
|
cy.contains('You voted: For').should('be.visible');
|
||||||
cy.get(proposalVoteProgressForTokens).contains('1').and('be.visible');
|
cy.getByTestId(proposalVoteProgressForTokens)
|
||||||
|
.contains('1')
|
||||||
|
.and('be.visible');
|
||||||
cy.getByTestId(voteBreakdownToggle).click();
|
cy.getByTestId(voteBreakdownToggle).click();
|
||||||
getProposalInformationFromTable('Total Supply')
|
getProposalInformationFromTable('Total Supply')
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
@@ -258,22 +261,22 @@ describe(
|
|||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
||||||
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
||||||
cy.get(viewProposalButton).click()
|
cy.getByTestId(viewProposalButton).click()
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
cy.get(proposalVoteProgressForPercentage)
|
cy.getByTestId(proposalVoteProgressForPercentage)
|
||||||
.contains('100.00%')
|
.contains('100.00%')
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
cy.get(proposalVoteProgressAgainstPercentage)
|
cy.getByTestId(proposalVoteProgressAgainstPercentage)
|
||||||
.contains('0.00%')
|
.contains('0.00%')
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
// 3001-VOTE-065
|
// 3001-VOTE-065
|
||||||
cy.get(changeVoteButton).should('be.visible').click();
|
cy.getByTestId(changeVoteButton).should('be.visible').click();
|
||||||
voteForProposal('for');
|
voteForProposal('for');
|
||||||
cy.get(proposalVoteProgressForTokens)
|
cy.getByTestId(proposalVoteProgressForTokens)
|
||||||
.contains(tokensRequiredToAchieveResult)
|
.contains(tokensRequiredToAchieveResult)
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
cy.get(proposalVoteProgressAgainstTokens)
|
cy.getByTestId(proposalVoteProgressAgainstTokens)
|
||||||
.contains('0.00')
|
.contains('0.00')
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
cy.getByTestId(voteBreakdownToggle).click();
|
cy.getByTestId(voteBreakdownToggle).click();
|
||||||
@@ -310,7 +313,7 @@ describe(
|
|||||||
createRawProposal();
|
createRawProposal();
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
||||||
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
||||||
cy.get(viewProposalButton).click()
|
cy.getByTestId(viewProposalButton).click()
|
||||||
);
|
);
|
||||||
voteForProposal('for');
|
voteForProposal('for');
|
||||||
cy.contains('You voted: For').should('be.visible');
|
cy.contains('You voted: For').should('be.visible');
|
||||||
@@ -319,13 +322,16 @@ describe(
|
|||||||
stakingPageAssociateTokens('2');
|
stakingPageAssociateTokens('2');
|
||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
||||||
cy.get(viewProposalButton).click()
|
cy.getByTestId(viewProposalButton).click()
|
||||||
);
|
);
|
||||||
cy.getByTestId('you-voted').should('not.exist');
|
cy.getByTestId('you-voted').should('not.exist');
|
||||||
voteForProposal('against');
|
voteForProposal('against');
|
||||||
cy.contains('You voted: Against').should('be.visible');
|
cy.contains('You voted: Against').should('be.visible');
|
||||||
switchVegaWalletPubKey();
|
switchVegaWalletPubKey();
|
||||||
cy.get(proposalVoteProgressForTokens).should('contain.text', '1.00');
|
cy.getByTestId(proposalVoteProgressForTokens).should(
|
||||||
|
'contain.text',
|
||||||
|
'1.00'
|
||||||
|
);
|
||||||
// Checking vote status for different public keys is displayed correctly
|
// Checking vote status for different public keys is displayed correctly
|
||||||
cy.contains('You voted: For').should('be.visible');
|
cy.contains('You voted: For').should('be.visible');
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -19,13 +19,13 @@ import { ethereumWalletConnect } from '../../support/wallet-eth.functions';
|
|||||||
import { vegaWalletSetSpecifiedApprovalAmount } from '../../support/wallet-functions';
|
import { vegaWalletSetSpecifiedApprovalAmount } from '../../support/wallet-functions';
|
||||||
|
|
||||||
const proposalListItem = '[data-testid="proposals-list-item"]';
|
const proposalListItem = '[data-testid="proposals-list-item"]';
|
||||||
const closedProposals = '[data-testid="closed-proposals"]';
|
const closedProposals = 'closed-proposals';
|
||||||
const proposalStatus = '[data-testid="proposal-status"]';
|
const proposalStatus = 'proposal-status';
|
||||||
const viewProposalButton = '[data-testid="view-proposal-btn"]';
|
const viewProposalButton = 'view-proposal-btn';
|
||||||
const votesTable = '[data-testid="votes-table"]';
|
const votesTable = 'votes-table';
|
||||||
const openProposals = '[data-testid="open-proposals"]';
|
const openProposals = 'open-proposals';
|
||||||
const proposalVoteProgressForPercentage =
|
const proposalVoteProgressForPercentage =
|
||||||
'[data-testid="vote-progress-indicator-percentage-for"]';
|
'vote-progress-indicator-percentage-for';
|
||||||
const proposalTimeout = { timeout: 8000 };
|
const proposalTimeout = { timeout: 8000 };
|
||||||
|
|
||||||
context(
|
context(
|
||||||
@@ -55,18 +55,18 @@ context(
|
|||||||
cy.createMarket();
|
cy.createMarket();
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.get(closedProposals).within(() => {
|
cy.getByTestId(closedProposals).within(() => {
|
||||||
cy.contains(proposalTitle)
|
cy.contains(proposalTitle)
|
||||||
.parentsUntil(proposalListItem)
|
.parentsUntil(proposalListItem)
|
||||||
.last()
|
.last()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(proposalStatus).should('have.text', 'Enacted');
|
cy.getByTestId(proposalStatus).should('have.text', 'Enacted');
|
||||||
cy.get(viewProposalButton).click();
|
cy.getByTestId(viewProposalButton).click();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.getByTestId('proposal-type').should('have.text', 'New market');
|
cy.getByTestId('proposal-type').should('have.text', 'New market');
|
||||||
cy.get(proposalStatus).should('have.text', 'Enacted');
|
cy.getByTestId(proposalStatus).should('have.text', 'Enacted');
|
||||||
cy.get(votesTable).within(() => {
|
cy.getByTestId(votesTable).within(() => {
|
||||||
cy.contains('Vote passed.').should('be.visible');
|
cy.contains('Vote passed.').should('be.visible');
|
||||||
cy.contains('Voting has ended.').should('be.visible');
|
cy.contains('Voting has ended.').should('be.visible');
|
||||||
});
|
});
|
||||||
@@ -81,27 +81,27 @@ context(
|
|||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.get(openProposals).within(() => {
|
cy.getByTestId(openProposals).within(() => {
|
||||||
cy.contains(proposalTitle)
|
cy.contains(proposalTitle)
|
||||||
.parentsUntil(proposalListItem)
|
.parentsUntil(proposalListItem)
|
||||||
.last()
|
.last()
|
||||||
.within(() => cy.get(viewProposalButton).click());
|
.within(() => cy.getByTestId(viewProposalButton).click());
|
||||||
});
|
});
|
||||||
cy.get(proposalStatus).should('have.text', 'Open');
|
cy.getByTestId(proposalStatus).should('have.text', 'Open');
|
||||||
voteForProposal('for');
|
voteForProposal('for');
|
||||||
cy.get(proposalStatus, proposalTimeout)
|
cy.getByTestId(proposalStatus, proposalTimeout)
|
||||||
.should('have.text', 'Passed')
|
.should('have.text', 'Passed')
|
||||||
.then(() => {
|
.then(() => {
|
||||||
cy.get(proposalStatus, proposalTimeout).should(
|
cy.getByTestId(proposalStatus, proposalTimeout).should(
|
||||||
'have.text',
|
'have.text',
|
||||||
'Enacted'
|
'Enacted'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
cy.get(votesTable).within(() => {
|
cy.getByTestId(votesTable).within(() => {
|
||||||
cy.contains('Vote passed.').should('be.visible');
|
cy.contains('Vote passed.').should('be.visible');
|
||||||
cy.contains('Voting has ended.').should('be.visible');
|
cy.contains('Voting has ended.').should('be.visible');
|
||||||
});
|
});
|
||||||
cy.get(proposalVoteProgressForPercentage)
|
cy.getByTestId(proposalVoteProgressForPercentage)
|
||||||
.contains('100.00%')
|
.contains('100.00%')
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
});
|
});
|
||||||
@@ -115,15 +115,18 @@ context(
|
|||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.get(openProposals, { timeout: 6000 }).within(() => {
|
cy.getByTestId(openProposals, { timeout: 6000 }).within(() => {
|
||||||
cy.contains(proposalTitle)
|
cy.contains(proposalTitle)
|
||||||
.parentsUntil(proposalListItem)
|
.parentsUntil(proposalListItem)
|
||||||
.last()
|
.last()
|
||||||
.within(() => cy.get(viewProposalButton).click());
|
.within(() => cy.getByTestId(viewProposalButton).click());
|
||||||
});
|
});
|
||||||
cy.get(proposalStatus).should('have.text', 'Open');
|
cy.getByTestId(proposalStatus).should('have.text', 'Open');
|
||||||
voteForProposal('for');
|
voteForProposal('for');
|
||||||
cy.get(proposalStatus, proposalTimeout).should('have.text', 'Enacted');
|
cy.getByTestId(proposalStatus, proposalTimeout).should(
|
||||||
|
'have.text',
|
||||||
|
'Enacted'
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 3001-VOTE-048 3001-VOTE-049 3001-VOTE-050
|
// 3001-VOTE-048 3001-VOTE-049 3001-VOTE-050
|
||||||
@@ -134,14 +137,17 @@ context(
|
|||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.get(openProposals).within(() => {
|
cy.getByTestId(openProposals).within(() => {
|
||||||
cy.contains(proposalTitle)
|
cy.contains(proposalTitle)
|
||||||
.parentsUntil(proposalListItem)
|
.parentsUntil(proposalListItem)
|
||||||
.last()
|
.last()
|
||||||
.within(() => cy.get(viewProposalButton).click());
|
.within(() => cy.getByTestId(viewProposalButton).click());
|
||||||
});
|
});
|
||||||
cy.get(proposalStatus).should('have.text', 'Open');
|
cy.getByTestId(proposalStatus).should('have.text', 'Open');
|
||||||
cy.get(proposalStatus, proposalTimeout).should('have.text', 'Declined');
|
cy.getByTestId(proposalStatus, proposalTimeout).should(
|
||||||
|
'have.text',
|
||||||
|
'Declined'
|
||||||
|
);
|
||||||
getProposalInformationFromTable('Rejection reason')
|
getProposalInformationFromTable('Rejection reason')
|
||||||
.contains('PROPOSAL_ERROR_PARTICIPATION_THRESHOLD_NOT_REACHED')
|
.contains('PROPOSAL_ERROR_PARTICIPATION_THRESHOLD_NOT_REACHED')
|
||||||
.and('be.visible');
|
.and('be.visible');
|
||||||
|
|||||||
@@ -36,20 +36,19 @@ import {
|
|||||||
import { ethereumWalletConnect } from '../../support/wallet-eth.functions';
|
import { ethereumWalletConnect } from '../../support/wallet-eth.functions';
|
||||||
import type { testFreeformProposal } from '../../support/common-interfaces';
|
import type { testFreeformProposal } from '../../support/common-interfaces';
|
||||||
|
|
||||||
const vegaWalletStakedBalances =
|
const vegaWalletStakedBalances = 'vega-wallet-balance-staked-validators';
|
||||||
'[data-testid="vega-wallet-balance-staked-validators"]';
|
const vegaWalletAssociatedBalance = 'associated-amount';
|
||||||
const vegaWalletAssociatedBalance = '[data-testid="associated-amount"]';
|
const vegaWalletNameElement = 'wallet-name';
|
||||||
const vegaWalletNameElement = '[data-testid="wallet-name"]';
|
const vegaWallet = 'vega-wallet';
|
||||||
const vegaWallet = '[data-testid="vega-wallet"]';
|
const connectToVegaWalletButton = 'connect-to-vega-wallet-btn';
|
||||||
const connectToVegaWalletButton = '[data-testid="connect-to-vega-wallet-btn"]';
|
const newProposalSubmitButton = 'proposal-submit';
|
||||||
const newProposalSubmitButton = '[data-testid="proposal-submit"]';
|
const viewProposalButton = 'view-proposal-btn';
|
||||||
const viewProposalButton = '[data-testid="view-proposal-btn"]';
|
const rawProposalData = 'proposal-data';
|
||||||
const rawProposalData = '[data-testid="proposal-data"]';
|
const voteButtons = 'vote-buttons';
|
||||||
const voteButtons = '[data-testid="vote-buttons"]';
|
|
||||||
const rejectProposalsLink = '[href="/proposals/rejected"]';
|
const rejectProposalsLink = '[href="/proposals/rejected"]';
|
||||||
const feedbackError = '[data-testid="Error"]';
|
const feedbackError = 'Error';
|
||||||
const noOpenProposals = '[data-testid="no-open-proposals"]';
|
const noOpenProposals = 'no-open-proposals';
|
||||||
const noClosedProposals = '[data-testid="no-closed-proposals"]';
|
const noClosedProposals = 'no-closed-proposals';
|
||||||
const txTimeout = Cypress.env('txTimeout');
|
const txTimeout = Cypress.env('txTimeout');
|
||||||
const epochTimeout = Cypress.env('epochTimeout');
|
const epochTimeout = Cypress.env('epochTimeout');
|
||||||
const proposalTimeout = { timeout: 14000 };
|
const proposalTimeout = { timeout: 14000 };
|
||||||
@@ -93,10 +92,10 @@ context(
|
|||||||
// Test can only pass if run before other proposal tests.
|
// Test can only pass if run before other proposal tests.
|
||||||
it.skip('Should be able to see that no proposals exist', function () {
|
it.skip('Should be able to see that no proposals exist', function () {
|
||||||
// 3001-VOTE-003
|
// 3001-VOTE-003
|
||||||
cy.get(noOpenProposals)
|
cy.getByTestId(noOpenProposals)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'There are no open or yet to enact proposals');
|
.and('have.text', 'There are no open or yet to enact proposals');
|
||||||
cy.get(noClosedProposals)
|
cy.getByTestId(noClosedProposals)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'There are no enacted or rejected proposals');
|
.and('have.text', 'There are no enacted or rejected proposals');
|
||||||
});
|
});
|
||||||
@@ -126,7 +125,10 @@ context(
|
|||||||
stakingValidatorPageAddStake('2');
|
stakingValidatorPageAddStake('2');
|
||||||
closeStakingDialog();
|
closeStakingDialog();
|
||||||
|
|
||||||
cy.get(vegaWalletStakedBalances, txTimeout).should('contain', '2');
|
cy.getByTestId(vegaWalletStakedBalances, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
'2'
|
||||||
|
);
|
||||||
createRawProposal();
|
createRawProposal();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -168,7 +170,7 @@ context(
|
|||||||
getProposalFromTitle(rawProposal.rationale.title).within(() => {
|
getProposalFromTitle(rawProposal.rationale.title).within(() => {
|
||||||
cy.contains('Rejected').should('be.visible');
|
cy.contains('Rejected').should('be.visible');
|
||||||
cy.contains('Close time too late').should('be.visible');
|
cy.contains('Close time too late').should('be.visible');
|
||||||
cy.get(viewProposalButton).click();
|
cy.getByTestId(viewProposalButton).click();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.getByTestId('proposal-status').should('have.text', 'Rejected');
|
cy.getByTestId('proposal-status').should('have.text', 'Rejected');
|
||||||
@@ -185,14 +187,14 @@ context(
|
|||||||
const errorMsg =
|
const errorMsg =
|
||||||
'Network error: the network blocked the transaction through the spam protection: party has insufficient associated governance tokens in their staking account to submit proposal request (ABCI code 89)';
|
'Network error: the network blocked the transaction through the spam protection: party has insufficient associated governance tokens in their staking account to submit proposal request (ABCI code 89)';
|
||||||
vegaWalletTeardown();
|
vegaWalletTeardown();
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).contains(
|
cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).contains(
|
||||||
'0.00',
|
'0.00',
|
||||||
txTimeout
|
txTimeout
|
||||||
);
|
);
|
||||||
goToMakeNewProposal(governanceProposalType.RAW);
|
goToMakeNewProposal(governanceProposalType.RAW);
|
||||||
enterRawProposalBody(createTenDigitUnixTimeStampForSpecifiedDays(8));
|
enterRawProposalBody(createTenDigitUnixTimeStampForSpecifiedDays(8));
|
||||||
cy.contains('Transaction failed', proposalTimeout).should('be.visible');
|
cy.contains('Transaction failed', proposalTimeout).should('be.visible');
|
||||||
cy.get(feedbackError).should('have.text', errorMsg);
|
cy.getByTestId(feedbackError).should('have.text', errorMsg);
|
||||||
closeDialog();
|
closeDialog();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -205,7 +207,7 @@ context(
|
|||||||
goToMakeNewProposal(governanceProposalType.RAW);
|
goToMakeNewProposal(governanceProposalType.RAW);
|
||||||
enterRawProposalBody(createTenDigitUnixTimeStampForSpecifiedDays(8));
|
enterRawProposalBody(createTenDigitUnixTimeStampForSpecifiedDays(8));
|
||||||
cy.contains('Transaction failed', proposalTimeout).should('be.visible');
|
cy.contains('Transaction failed', proposalTimeout).should('be.visible');
|
||||||
cy.get(feedbackError).should('have.text', errorMsg);
|
cy.getByTestId(feedbackError).should('have.text', errorMsg);
|
||||||
closeDialog();
|
closeDialog();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -221,17 +223,17 @@ context(
|
|||||||
createTenDigitUnixTimeStampForSpecifiedDays(8);
|
createTenDigitUnixTimeStampForSpecifiedDays(8);
|
||||||
freeformProposal.unexpected = `i shouldn't be here`;
|
freeformProposal.unexpected = `i shouldn't be here`;
|
||||||
const proposalPayload = JSON.stringify(freeformProposal);
|
const proposalPayload = JSON.stringify(freeformProposal);
|
||||||
cy.get(rawProposalData).type(proposalPayload, {
|
cy.getByTestId(rawProposalData).type(proposalPayload, {
|
||||||
parseSpecialCharSequences: false,
|
parseSpecialCharSequences: false,
|
||||||
delay: 2,
|
delay: 2,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.get(newProposalSubmitButton).should('be.visible').click();
|
cy.getByTestId(newProposalSubmitButton).should('be.visible').click();
|
||||||
|
|
||||||
cy.contains('Transaction failed', proposalTimeout).should('be.visible');
|
cy.contains('Transaction failed', proposalTimeout).should('be.visible');
|
||||||
cy.get(feedbackError).should('have.text', errorMsg);
|
cy.getByTestId(feedbackError).should('have.text', errorMsg);
|
||||||
closeDialog();
|
closeDialog();
|
||||||
cy.get(rawProposalData)
|
cy.getByTestId(rawProposalData)
|
||||||
.invoke('val')
|
.invoke('val')
|
||||||
.should('contain', "i shouldn't be here");
|
.should('contain', "i shouldn't be here");
|
||||||
});
|
});
|
||||||
@@ -249,15 +251,15 @@ context(
|
|||||||
rawProposal.terms.unexpectedField = `i shouldn't be here`;
|
rawProposal.terms.unexpectedField = `i shouldn't be here`;
|
||||||
const proposalPayload = JSON.stringify(rawProposal);
|
const proposalPayload = JSON.stringify(rawProposal);
|
||||||
|
|
||||||
cy.get(rawProposalData).type(proposalPayload, {
|
cy.getByTestId(rawProposalData).type(proposalPayload, {
|
||||||
parseSpecialCharSequences: false,
|
parseSpecialCharSequences: false,
|
||||||
delay: 2,
|
delay: 2,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.get(newProposalSubmitButton).should('be.visible').click();
|
cy.getByTestId(newProposalSubmitButton).should('be.visible').click();
|
||||||
|
|
||||||
cy.contains('Transaction failed', proposalTimeout).should('be.visible');
|
cy.contains('Transaction failed', proposalTimeout).should('be.visible');
|
||||||
cy.get(feedbackError).should('have.text', errorMsg);
|
cy.getByTestId(feedbackError).should('have.text', errorMsg);
|
||||||
closeDialog();
|
closeDialog();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -265,10 +267,10 @@ context(
|
|||||||
// 3006-PASC-006 3006-PASC-007 3008-PFRO-018 3008-PFRO-019 3003-PMAN-006 3003-PMAN-007
|
// 3006-PASC-006 3006-PASC-007 3008-PFRO-018 3008-PFRO-019 3003-PMAN-006 3003-PMAN-007
|
||||||
it('Unable to submit proposal without valid json', function () {
|
it('Unable to submit proposal without valid json', function () {
|
||||||
goToMakeNewProposal(governanceProposalType.RAW);
|
goToMakeNewProposal(governanceProposalType.RAW);
|
||||||
cy.get(newProposalSubmitButton).click();
|
cy.getByTestId(newProposalSubmitButton).click();
|
||||||
cy.getByTestId('input-error-text').should('have.text', 'Required');
|
cy.getByTestId('input-error-text').should('have.text', 'Required');
|
||||||
cy.get(rawProposalData).type('Not a valid json string');
|
cy.getByTestId(rawProposalData).type('Not a valid json string');
|
||||||
cy.get(newProposalSubmitButton).click();
|
cy.getByTestId(newProposalSubmitButton).click();
|
||||||
cy.getByTestId('input-error-text').should(
|
cy.getByTestId('input-error-text').should(
|
||||||
'have.text',
|
'have.text',
|
||||||
'Must be valid JSON'
|
'Must be valid JSON'
|
||||||
@@ -283,22 +285,22 @@ context(
|
|||||||
submitUniqueRawProposal({ proposalTitle: proposalTitle });
|
submitUniqueRawProposal({ proposalTitle: proposalTitle });
|
||||||
ethereumWalletConnect();
|
ethereumWalletConnect();
|
||||||
stakingPageDisassociateTokens('0.0001');
|
stakingPageDisassociateTokens('0.0001');
|
||||||
cy.get(vegaWallet)
|
cy.getByTestId(vegaWallet)
|
||||||
.first()
|
.first()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should(
|
cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
'contain',
|
'contain',
|
||||||
'0.9999'
|
'0.9999'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
getProposalFromTitle(proposalTitle).within(() =>
|
getProposalFromTitle(proposalTitle).within(() =>
|
||||||
cy.get(viewProposalButton).click()
|
cy.getByTestId(viewProposalButton).click()
|
||||||
);
|
);
|
||||||
cy.contains('Vote breakdown').should('be.visible', {
|
cy.contains('Vote breakdown').should('be.visible', {
|
||||||
timeout: 10000,
|
timeout: 10000,
|
||||||
});
|
});
|
||||||
cy.get(voteButtons).should('not.exist');
|
cy.getByTestId(voteButtons).should('not.exist');
|
||||||
cy.getByTestId('min-proposal-requirements').should(
|
cy.getByTestId('min-proposal-requirements').should(
|
||||||
'have.text',
|
'have.text',
|
||||||
`You must have at least ${this.minVoterBalance} VEGA associated to vote on this proposal`
|
`You must have at least ${this.minVoterBalance} VEGA associated to vote on this proposal`
|
||||||
@@ -311,20 +313,20 @@ context(
|
|||||||
cy.get('[data-testid="disconnect"]').click();
|
cy.get('[data-testid="disconnect"]').click();
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
||||||
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
getProposalFromTitle(rawProposal.rationale.title).within(() =>
|
||||||
cy.get(viewProposalButton).click()
|
cy.getByTestId(viewProposalButton).click()
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
// 3001-VOTE-075
|
// 3001-VOTE-075
|
||||||
// 3001-VOTE-076
|
// 3001-VOTE-076
|
||||||
cy.get(connectToVegaWalletButton)
|
cy.getByTestId(connectToVegaWalletButton)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Connect Vega wallet')
|
.and('have.text', 'Connect Vega wallet')
|
||||||
.click();
|
.click();
|
||||||
cy.getByTestId('connector-jsonRpc').click();
|
cy.getByTestId('connector-jsonRpc').click();
|
||||||
cy.get(vegaWalletNameElement).should('be.visible');
|
cy.getByTestId(vegaWalletNameElement).should('be.visible');
|
||||||
cy.get(connectToVegaWalletButton).should('not.exist');
|
cy.getByTestId(connectToVegaWalletButton).should('not.exist');
|
||||||
// 3001-VOTE-100
|
// 3001-VOTE-100
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).contains(
|
cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).contains(
|
||||||
'1.00',
|
'1.00',
|
||||||
txTimeout
|
txTimeout
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -31,27 +31,25 @@ import {
|
|||||||
} from '../../support/wallet-functions';
|
} from '../../support/wallet-functions';
|
||||||
|
|
||||||
const proposalListItem = '[data-testid="proposals-list-item"]';
|
const proposalListItem = '[data-testid="proposals-list-item"]';
|
||||||
const openProposals = '[data-testid="open-proposals"]';
|
const openProposals = 'open-proposals';
|
||||||
const proposalType = '[data-testid="proposal-type"]';
|
const proposalType = 'proposal-type';
|
||||||
const proposalDetails = '[data-testid="proposal-details"]';
|
const proposalDetails = 'proposal-details';
|
||||||
const newProposalSubmitButton = '[data-testid="proposal-submit"]';
|
const newProposalSubmitButton = 'proposal-submit';
|
||||||
const proposalVoteDeadline = '[data-testid="proposal-vote-deadline"]';
|
const proposalVoteDeadline = 'proposal-vote-deadline';
|
||||||
const proposalParameterSelect = '[data-testid="proposal-parameter-select"]';
|
const proposalParameterSelect = 'proposal-parameter-select';
|
||||||
const proposalMarketSelect = '[data-testid="proposal-market-select"]';
|
const proposalMarketSelect = 'proposal-market-select';
|
||||||
const newProposalTitle = '[data-testid="proposal-title"]';
|
const newProposalTitle = 'proposal-title';
|
||||||
const newProposalDescription = '[data-testid="proposal-description"]';
|
const newProposalDescription = 'proposal-description';
|
||||||
const newProposalTerms = '[data-testid="proposal-terms"]';
|
const newProposalTerms = 'proposal-terms';
|
||||||
const newProposedParameterValue =
|
const newProposedParameterValue = 'selected-proposal-param-new-value';
|
||||||
'[data-testid="selected-proposal-param-new-value"]';
|
const minVoteDeadline = 'min-vote';
|
||||||
const minVoteDeadline = '[data-testid="min-vote"]';
|
const maxVoteDeadline = 'max-vote';
|
||||||
const maxVoteDeadline = '[data-testid="max-vote"]';
|
const minValidationDeadline = 'min-validation';
|
||||||
const minValidationDeadline = '[data-testid="min-validation"]';
|
const minEnactDeadline = 'min-enactment';
|
||||||
const minEnactDeadline = '[data-testid="min-enactment"]';
|
const maxEnactDeadline = 'max-enactment';
|
||||||
const maxEnactDeadline = '[data-testid="max-enactment"]';
|
const inputError = 'input-error-text';
|
||||||
const inputError = '[data-testid="input-error-text"]';
|
const enactmentDeadlineError = 'enactment-before-voting-deadline';
|
||||||
const enactmentDeadlineError =
|
const proposalDownloadBtn = 'proposal-download-json';
|
||||||
'[data-testid="enactment-before-voting-deadline"]';
|
|
||||||
const proposalDownloadBtn = '[data-testid="proposal-download-json"]';
|
|
||||||
const feedbackError = '[data-testid="Error"]';
|
const feedbackError = '[data-testid="Error"]';
|
||||||
const viewProposalBtn = 'view-proposal-btn';
|
const viewProposalBtn = 'view-proposal-btn';
|
||||||
const liquidityVoteStatus = 'liquidity-votes-status';
|
const liquidityVoteStatus = 'liquidity-votes-status';
|
||||||
@@ -88,18 +86,20 @@ context(
|
|||||||
it('Unable to submit network parameter with missing/invalid fields', function () {
|
it('Unable to submit network parameter with missing/invalid fields', function () {
|
||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
goToMakeNewProposal(governanceProposalType.NETWORK_PARAMETER);
|
goToMakeNewProposal(governanceProposalType.NETWORK_PARAMETER);
|
||||||
cy.get(proposalDownloadBtn).click();
|
cy.getByTestId(proposalDownloadBtn).click();
|
||||||
cy.get(inputError).should('have.length', 3);
|
cy.getByTestId(inputError).should('have.length', 3);
|
||||||
cy.get(newProposalTitle).type(
|
cy.getByTestId(newProposalTitle).type(
|
||||||
'Invalid update network parameter proposal'
|
'Invalid update network parameter proposal'
|
||||||
);
|
);
|
||||||
cy.get(newProposalDescription).type('E2E invalid test for proposals');
|
cy.getByTestId(newProposalDescription).type(
|
||||||
cy.get(proposalParameterSelect).select(
|
'E2E invalid test for proposals'
|
||||||
|
);
|
||||||
|
cy.getByTestId(proposalParameterSelect).select(
|
||||||
'spam_protection_proposal_min_tokens'
|
'spam_protection_proposal_min_tokens'
|
||||||
);
|
);
|
||||||
cy.get(newProposedParameterValue).type('0');
|
cy.getByTestId(newProposedParameterValue).type('0');
|
||||||
cy.get(proposalVoteDeadline).clear().type('0');
|
cy.getByTestId(proposalVoteDeadline).clear().type('0');
|
||||||
cy.get(proposalDownloadBtn)
|
cy.getByTestId(proposalDownloadBtn)
|
||||||
.click()
|
.click()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
cy.wrap(
|
cy.wrap(
|
||||||
@@ -109,7 +109,7 @@ context(
|
|||||||
submitUniqueRawProposal({ proposalBody: filePath, submit: false });
|
submitUniqueRawProposal({ proposalBody: filePath, submit: false });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.get(newProposalSubmitButton).click();
|
cy.getByTestId(newProposalSubmitButton).click();
|
||||||
validateDialogContentMsg('PROPOSAL_ERROR_CLOSE_TIME_TOO_SOON');
|
validateDialogContentMsg('PROPOSAL_ERROR_CLOSE_TIME_TOO_SOON');
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -117,29 +117,33 @@ context(
|
|||||||
it('Able to download and submit network param proposal', function () {
|
it('Able to download and submit network param proposal', function () {
|
||||||
goToMakeNewProposal(governanceProposalType.NETWORK_PARAMETER);
|
goToMakeNewProposal(governanceProposalType.NETWORK_PARAMETER);
|
||||||
// 3007-PNEC-006
|
// 3007-PNEC-006
|
||||||
cy.get(newProposalTitle)
|
cy.getByTestId(newProposalTitle)
|
||||||
.siblings()
|
.siblings()
|
||||||
.should('contain.text', '(100 characters or less)');
|
.should('contain.text', '(100 characters or less)');
|
||||||
// 3007-PNEC-004 3007-PNEC-005
|
// 3007-PNEC-004 3007-PNEC-005
|
||||||
cy.get(newProposalTitle).type('Test update network parameter proposal');
|
cy.getByTestId(newProposalTitle).type(
|
||||||
|
'Test update network parameter proposal'
|
||||||
|
);
|
||||||
// 3007-PNEC-009
|
// 3007-PNEC-009
|
||||||
cy.get(newProposalDescription)
|
cy.getByTestId(newProposalDescription)
|
||||||
.siblings()
|
.siblings()
|
||||||
.should('contain.text', '(20,000 characters or less)');
|
.should('contain.text', '(20,000 characters or less)');
|
||||||
// 3007-PNEC-007 3007-PNEC-008
|
// 3007-PNEC-007 3007-PNEC-008
|
||||||
cy.get(newProposalDescription).type('E2E test for downloading proposals');
|
cy.getByTestId(newProposalDescription).type(
|
||||||
|
'E2E test for downloading proposals'
|
||||||
|
);
|
||||||
// 3007-PNEC-010
|
// 3007-PNEC-010
|
||||||
cy.get(proposalParameterSelect).select(
|
cy.getByTestId(proposalParameterSelect).select(
|
||||||
'governance_proposal_asset_minClose'
|
'governance_proposal_asset_minClose'
|
||||||
);
|
);
|
||||||
// 3007-PNEC-011
|
// 3007-PNEC-011
|
||||||
cy.get(newProposedParameterValue).type('10s');
|
cy.getByTestId(newProposedParameterValue).type('10s');
|
||||||
// 3007-PNEC-012
|
// 3007-PNEC-012
|
||||||
cy.get(proposalVoteDeadline).clear().type('2');
|
cy.getByTestId(proposalVoteDeadline).clear().type('2');
|
||||||
// 3007-PNEC-013 3007-PNEC-014
|
// 3007-PNEC-013 3007-PNEC-014
|
||||||
cy.getByTestId('voting-date').invoke('text').should('not.be.empty');
|
cy.getByTestId('voting-date').invoke('text').should('not.be.empty');
|
||||||
// 3007-PNEC-015
|
// 3007-PNEC-015
|
||||||
cy.get(maxEnactDeadline).click();
|
cy.getByTestId(maxEnactDeadline).click();
|
||||||
// 3007-PNEC-016
|
// 3007-PNEC-016
|
||||||
cy.getByTestId('enactment-date').invoke('text').should('not.be.empty');
|
cy.getByTestId('enactment-date').invoke('text').should('not.be.empty');
|
||||||
// 3007-PNEC-017
|
// 3007-PNEC-017
|
||||||
@@ -148,7 +152,7 @@ context(
|
|||||||
).should('be.visible');
|
).should('be.visible');
|
||||||
// 3007-PNE-018
|
// 3007-PNE-018
|
||||||
cy.log('Download updated proposal file');
|
cy.log('Download updated proposal file');
|
||||||
cy.get(proposalDownloadBtn)
|
cy.getByTestId(proposalDownloadBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.click()
|
.click()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -178,19 +182,21 @@ context(
|
|||||||
it('Unable to submit network parameter proposal with vote deadline above enactment deadline', function () {
|
it('Unable to submit network parameter proposal with vote deadline above enactment deadline', function () {
|
||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
goToMakeNewProposal(governanceProposalType.NETWORK_PARAMETER);
|
goToMakeNewProposal(governanceProposalType.NETWORK_PARAMETER);
|
||||||
cy.get(newProposalTitle).type('Test update network parameter proposal');
|
cy.getByTestId(newProposalTitle).type(
|
||||||
cy.get(newProposalDescription).type('invalid deadlines');
|
'Test update network parameter proposal'
|
||||||
cy.get(proposalParameterSelect).select(
|
);
|
||||||
|
cy.getByTestId(newProposalDescription).type('invalid deadlines');
|
||||||
|
cy.getByTestId(proposalParameterSelect).select(
|
||||||
'spam_protection_proposal_min_tokens'
|
'spam_protection_proposal_min_tokens'
|
||||||
);
|
);
|
||||||
cy.get(newProposedParameterValue).type('0');
|
cy.getByTestId(newProposedParameterValue).type('0');
|
||||||
cy.get(proposalVoteDeadline).clear().type('0');
|
cy.getByTestId(proposalVoteDeadline).clear().type('0');
|
||||||
cy.get(maxVoteDeadline).click();
|
cy.getByTestId(maxVoteDeadline).click();
|
||||||
cy.get(enactmentDeadlineError).should(
|
cy.getByTestId(enactmentDeadlineError).should(
|
||||||
'have.text',
|
'have.text',
|
||||||
'The proposal will fail if enactment is earlier than the voting deadline'
|
'The proposal will fail if enactment is earlier than the voting deadline'
|
||||||
);
|
);
|
||||||
cy.get(proposalDownloadBtn)
|
cy.getByTestId(proposalDownloadBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.click()
|
.click()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -201,7 +207,7 @@ context(
|
|||||||
submitUniqueRawProposal({ proposalBody: filePath, submit: false });
|
submitUniqueRawProposal({ proposalBody: filePath, submit: false });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.get(newProposalSubmitButton).click();
|
cy.getByTestId(newProposalSubmitButton).click();
|
||||||
validateFeedBackMsg(
|
validateFeedBackMsg(
|
||||||
'Invalid params: proposal_submission.terms.closing_timestamp (cannot be after enactment time)'
|
'Invalid params: proposal_submission.terms.closing_timestamp (cannot be after enactment time)'
|
||||||
);
|
);
|
||||||
@@ -214,16 +220,16 @@ context(
|
|||||||
function () {
|
function () {
|
||||||
const proposalTitle = 'Test new market proposal';
|
const proposalTitle = 'Test new market proposal';
|
||||||
goToMakeNewProposal(governanceProposalType.NEW_MARKET);
|
goToMakeNewProposal(governanceProposalType.NEW_MARKET);
|
||||||
cy.get(newProposalTitle).type('Test new market proposal');
|
cy.getByTestId(newProposalTitle).type('Test new market proposal');
|
||||||
cy.get(newProposalDescription).type('E2E test for proposals');
|
cy.getByTestId(newProposalDescription).type('E2E test for proposals');
|
||||||
cy.fixture('/proposals/new-market').then((newMarketProposal) => {
|
cy.fixture('/proposals/new-market').then((newMarketProposal) => {
|
||||||
const newMarketPayload = JSON.stringify(newMarketProposal);
|
const newMarketPayload = JSON.stringify(newMarketProposal);
|
||||||
cy.get(newProposalTerms).type(newMarketPayload, {
|
cy.getByTestId(newProposalTerms).type(newMarketPayload, {
|
||||||
parseSpecialCharSequences: false,
|
parseSpecialCharSequences: false,
|
||||||
delay: 2,
|
delay: 2,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.get(proposalDownloadBtn)
|
cy.getByTestId(proposalDownloadBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.click()
|
.click()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -259,19 +265,19 @@ context(
|
|||||||
'Invalid params: the transaction does not use a valid Vega command: unknown field "invalid" in vega.NewMarket';
|
'Invalid params: the transaction does not use a valid Vega command: unknown field "invalid" in vega.NewMarket';
|
||||||
|
|
||||||
goToMakeNewProposal(governanceProposalType.NEW_MARKET);
|
goToMakeNewProposal(governanceProposalType.NEW_MARKET);
|
||||||
cy.get(proposalDownloadBtn).should('be.visible').click();
|
cy.getByTestId(proposalDownloadBtn).should('be.visible').click();
|
||||||
cy.get(inputError).should('have.length', 3);
|
cy.getByTestId(inputError).should('have.length', 3);
|
||||||
cy.get(newProposalTitle).type('Test new market proposal');
|
cy.getByTestId(newProposalTitle).type('Test new market proposal');
|
||||||
cy.get(newProposalDescription).type('E2E test for proposals');
|
cy.getByTestId(newProposalDescription).type('E2E test for proposals');
|
||||||
cy.fixture('/proposals/new-market').then((newMarketProposal) => {
|
cy.fixture('/proposals/new-market').then((newMarketProposal) => {
|
||||||
newMarketProposal.invalid = 'I am an invalid field';
|
newMarketProposal.invalid = 'I am an invalid field';
|
||||||
const newMarketPayload = JSON.stringify(newMarketProposal);
|
const newMarketPayload = JSON.stringify(newMarketProposal);
|
||||||
cy.get(newProposalTerms).type(newMarketPayload, {
|
cy.getByTestId(newProposalTerms).type(newMarketPayload, {
|
||||||
parseSpecialCharSequences: false,
|
parseSpecialCharSequences: false,
|
||||||
delay: 2,
|
delay: 2,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.get(proposalDownloadBtn)
|
cy.getByTestId(proposalDownloadBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.click()
|
.click()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -282,7 +288,7 @@ context(
|
|||||||
submitUniqueRawProposal({ proposalBody: filePath, submit: false });
|
submitUniqueRawProposal({ proposalBody: filePath, submit: false });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.get(newProposalSubmitButton).should('be.visible').click();
|
cy.getByTestId(newProposalSubmitButton).should('be.visible').click();
|
||||||
cy.contains('Transaction failed', proposalTimeout).should('be.visible');
|
cy.contains('Transaction failed', proposalTimeout).should('be.visible');
|
||||||
validateFeedBackMsg(errorMsg);
|
validateFeedBackMsg(errorMsg);
|
||||||
});
|
});
|
||||||
@@ -293,17 +299,19 @@ context(
|
|||||||
switchVegaWalletPubKey();
|
switchVegaWalletPubKey();
|
||||||
stakingPageAssociateTokens('1');
|
stakingPageAssociateTokens('1');
|
||||||
goToMakeNewProposal(governanceProposalType.UPDATE_MARKET);
|
goToMakeNewProposal(governanceProposalType.UPDATE_MARKET);
|
||||||
cy.get(newProposalTitle).type('Test update market proposal - rejected');
|
cy.getByTestId(newProposalTitle).type(
|
||||||
cy.get(newProposalDescription).type('E2E test for proposals');
|
'Test update market proposal - rejected'
|
||||||
cy.get(proposalMarketSelect).select('Test market 1');
|
);
|
||||||
|
cy.getByTestId(newProposalDescription).type('E2E test for proposals');
|
||||||
|
cy.getByTestId(proposalMarketSelect).select('Test market 1');
|
||||||
cy.fixture('/proposals/update-market').then((updateMarketProposal) => {
|
cy.fixture('/proposals/update-market').then((updateMarketProposal) => {
|
||||||
const newUpdateMarketProposal = JSON.stringify(updateMarketProposal);
|
const newUpdateMarketProposal = JSON.stringify(updateMarketProposal);
|
||||||
cy.get(newProposalTerms).type(newUpdateMarketProposal, {
|
cy.getByTestId(newProposalTerms).type(newUpdateMarketProposal, {
|
||||||
parseSpecialCharSequences: false,
|
parseSpecialCharSequences: false,
|
||||||
delay: 2,
|
delay: 2,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.get(proposalDownloadBtn)
|
cy.getByTestId(proposalDownloadBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.click()
|
.click()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -314,7 +322,7 @@ context(
|
|||||||
submitUniqueRawProposal({ proposalBody: filePath, submit: false });
|
submitUniqueRawProposal({ proposalBody: filePath, submit: false });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.get(newProposalSubmitButton).should('be.visible').click();
|
cy.getByTestId(newProposalSubmitButton).should('be.visible').click();
|
||||||
cy.contains('Proposal rejected', proposalTimeout).should('be.visible');
|
cy.contains('Proposal rejected', proposalTimeout).should('be.visible');
|
||||||
validateDialogContentMsg('PROPOSAL_ERROR_INSUFFICIENT_EQUITY_LIKE_SHARE');
|
validateDialogContentMsg('PROPOSAL_ERROR_INSUFFICIENT_EQUITY_LIKE_SHARE');
|
||||||
closeDialog();
|
closeDialog();
|
||||||
@@ -332,17 +340,19 @@ context(
|
|||||||
vegaWalletPublicKey
|
vegaWalletPublicKey
|
||||||
);
|
);
|
||||||
goToMakeNewProposal(governanceProposalType.UPDATE_MARKET);
|
goToMakeNewProposal(governanceProposalType.UPDATE_MARKET);
|
||||||
cy.get(newProposalTitle).type('Test update market proposal - rejected');
|
cy.getByTestId(newProposalTitle).type(
|
||||||
cy.get(newProposalDescription).type('E2E test for proposals');
|
'Test update market proposal - rejected'
|
||||||
cy.get(proposalMarketSelect).select('Test market 1');
|
);
|
||||||
|
cy.getByTestId(newProposalDescription).type('E2E test for proposals');
|
||||||
|
cy.getByTestId(proposalMarketSelect).select('Test market 1');
|
||||||
cy.fixture('/proposals/update-market').then((updateMarketProposal) => {
|
cy.fixture('/proposals/update-market').then((updateMarketProposal) => {
|
||||||
const newUpdateMarketProposal = JSON.stringify(updateMarketProposal);
|
const newUpdateMarketProposal = JSON.stringify(updateMarketProposal);
|
||||||
cy.get(newProposalTerms).type(newUpdateMarketProposal, {
|
cy.getByTestId(newProposalTerms).type(newUpdateMarketProposal, {
|
||||||
parseSpecialCharSequences: false,
|
parseSpecialCharSequences: false,
|
||||||
delay: 2,
|
delay: 2,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.get(proposalDownloadBtn)
|
cy.getByTestId(proposalDownloadBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.click()
|
.click()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -353,7 +363,7 @@ context(
|
|||||||
submitUniqueRawProposal({ proposalBody: filePath, submit: false });
|
submitUniqueRawProposal({ proposalBody: filePath, submit: false });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.get(newProposalSubmitButton).should('be.visible').click();
|
cy.getByTestId(newProposalSubmitButton).should('be.visible').click();
|
||||||
cy.contains('Transaction failed', proposalTimeout).should('be.visible');
|
cy.contains('Transaction failed', proposalTimeout).should('be.visible');
|
||||||
validateFeedBackMsg(
|
validateFeedBackMsg(
|
||||||
'Network error: the network blocked the transaction through the spam protection: party has insufficient associated governance tokens in their staking account to submit proposal request (ABCI code 89)'
|
'Network error: the network blocked the transaction through the spam protection: party has insufficient associated governance tokens in their staking account to submit proposal request (ABCI code 89)'
|
||||||
@@ -368,9 +378,9 @@ context(
|
|||||||
vegaWalletPublicKey
|
vegaWalletPublicKey
|
||||||
);
|
);
|
||||||
goToMakeNewProposal(governanceProposalType.UPDATE_MARKET);
|
goToMakeNewProposal(governanceProposalType.UPDATE_MARKET);
|
||||||
cy.get(newProposalTitle).type('Test update market proposal');
|
cy.getByTestId(newProposalTitle).type('Test update market proposal');
|
||||||
cy.get(newProposalDescription).type('E2E test for proposals');
|
cy.getByTestId(newProposalDescription).type('E2E test for proposals');
|
||||||
cy.get(proposalMarketSelect).select('Test market 1');
|
cy.getByTestId(proposalMarketSelect).select('Test market 1');
|
||||||
cy.get('[data-testid="update-market-details"]').within(() => {
|
cy.get('[data-testid="update-market-details"]').within(() => {
|
||||||
cy.get('dd').eq(0).should('have.text', 'Test market 1');
|
cy.get('dd').eq(0).should('have.text', 'Test market 1');
|
||||||
cy.get('dd').eq(1).should('have.text', 'TEST.24h');
|
cy.get('dd').eq(1).should('have.text', 'TEST.24h');
|
||||||
@@ -385,12 +395,12 @@ context(
|
|||||||
});
|
});
|
||||||
cy.fixture('/proposals/update-market').then((updateMarketProposal) => {
|
cy.fixture('/proposals/update-market').then((updateMarketProposal) => {
|
||||||
const newUpdateMarketProposal = JSON.stringify(updateMarketProposal);
|
const newUpdateMarketProposal = JSON.stringify(updateMarketProposal);
|
||||||
cy.get(newProposalTerms).type(newUpdateMarketProposal, {
|
cy.getByTestId(newProposalTerms).type(newUpdateMarketProposal, {
|
||||||
parseSpecialCharSequences: false,
|
parseSpecialCharSequences: false,
|
||||||
delay: 2,
|
delay: 2,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.get(proposalDownloadBtn)
|
cy.getByTestId(proposalDownloadBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.click()
|
.click()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -437,19 +447,19 @@ context(
|
|||||||
it('Able to submit new asset proposal using min deadlines', function () {
|
it('Able to submit new asset proposal using min deadlines', function () {
|
||||||
const proposalTitle = 'Test new asset proposal';
|
const proposalTitle = 'Test new asset proposal';
|
||||||
goToMakeNewProposal(governanceProposalType.NEW_ASSET);
|
goToMakeNewProposal(governanceProposalType.NEW_ASSET);
|
||||||
cy.get(newProposalTitle).type(proposalTitle);
|
cy.getByTestId(newProposalTitle).type(proposalTitle);
|
||||||
cy.get(newProposalDescription).type('E2E test for proposals');
|
cy.getByTestId(newProposalDescription).type('E2E test for proposals');
|
||||||
cy.fixture('/proposals/new-asset').then((newAssetProposal) => {
|
cy.fixture('/proposals/new-asset').then((newAssetProposal) => {
|
||||||
const newAssetPayload = JSON.stringify(newAssetProposal);
|
const newAssetPayload = JSON.stringify(newAssetProposal);
|
||||||
cy.get(newProposalTerms).type(newAssetPayload, {
|
cy.getByTestId(newProposalTerms).type(newAssetPayload, {
|
||||||
parseSpecialCharSequences: false,
|
parseSpecialCharSequences: false,
|
||||||
delay: 2,
|
delay: 2,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.get(minVoteDeadline).click();
|
cy.getByTestId(minVoteDeadline).click();
|
||||||
cy.get(minValidationDeadline).click();
|
cy.getByTestId(minValidationDeadline).click();
|
||||||
cy.get(minEnactDeadline).click();
|
cy.getByTestId(minEnactDeadline).click();
|
||||||
cy.get(proposalDownloadBtn)
|
cy.getByTestId(proposalDownloadBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.click()
|
.click()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -460,9 +470,9 @@ context(
|
|||||||
submitUniqueRawProposal({ proposalBody: filePath, submit: false }); // 3005-PASN-003
|
submitUniqueRawProposal({ proposalBody: filePath, submit: false }); // 3005-PASN-003
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
cy.get(newProposalSubmitButton).should('be.visible').click();
|
cy.getByTestId(newProposalSubmitButton).should('be.visible').click();
|
||||||
closeDialog();
|
closeDialog();
|
||||||
cy.get(newProposalSubmitButton).should('be.visible').click();
|
cy.getByTestId(newProposalSubmitButton).should('be.visible').click();
|
||||||
// cannot submit a proposal with ERC20 address already in use
|
// cannot submit a proposal with ERC20 address already in use
|
||||||
cy.contains('Proposal rejected', proposalTimeout).should('be.visible');
|
cy.contains('Proposal rejected', proposalTimeout).should('be.visible');
|
||||||
validateDialogContentMsg('PROPOSAL_ERROR_ERC20_ADDRESS_ALREADY_IN_USE');
|
validateDialogContentMsg('PROPOSAL_ERROR_ERC20_ADDRESS_ALREADY_IN_USE');
|
||||||
@@ -483,8 +493,8 @@ context(
|
|||||||
|
|
||||||
it('Unable to submit new asset proposal with missing/invalid fields', function () {
|
it('Unable to submit new asset proposal with missing/invalid fields', function () {
|
||||||
goToMakeNewProposal(governanceProposalType.NEW_ASSET);
|
goToMakeNewProposal(governanceProposalType.NEW_ASSET);
|
||||||
cy.get(proposalDownloadBtn).should('be.visible').click();
|
cy.getByTestId(proposalDownloadBtn).should('be.visible').click();
|
||||||
cy.get(inputError).should('have.length', 3);
|
cy.getByTestId(inputError).should('have.length', 3);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Able to submit update asset proposal using min deadline', function () {
|
it('Able to submit update asset proposal using min deadline', function () {
|
||||||
@@ -493,9 +503,9 @@ context(
|
|||||||
|
|
||||||
goToMakeNewProposal(governanceProposalType.UPDATE_ASSET);
|
goToMakeNewProposal(governanceProposalType.UPDATE_ASSET);
|
||||||
enterUpdateAssetProposalDetails();
|
enterUpdateAssetProposalDetails();
|
||||||
cy.get(minVoteDeadline).click();
|
cy.getByTestId(minVoteDeadline).click();
|
||||||
cy.get(minEnactDeadline).click();
|
cy.getByTestId(minEnactDeadline).click();
|
||||||
cy.get(proposalDownloadBtn)
|
cy.getByTestId(proposalDownloadBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.click()
|
.click()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -507,13 +517,16 @@ context(
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
cy.get(openProposals).within(() => {
|
cy.getByTestId(openProposals).within(() => {
|
||||||
cy.get(proposalType)
|
cy.getByTestId(proposalType)
|
||||||
.contains('Update asset')
|
.contains('Update asset')
|
||||||
.parentsUntil(proposalListItem)
|
.parentsUntil(proposalListItem)
|
||||||
.last()
|
.last()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(proposalDetails).should('contain.text', assetId.slice(0, 6)); // 3001-VOTE-029
|
cy.getByTestId(proposalDetails).should(
|
||||||
|
'contain.text',
|
||||||
|
assetId.slice(0, 6)
|
||||||
|
); // 3001-VOTE-029
|
||||||
cy.getByTestId(viewProposalBtn).click();
|
cy.getByTestId(viewProposalBtn).click();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -533,9 +546,9 @@ context(
|
|||||||
it('Able to submit update asset proposal using max deadline', function () {
|
it('Able to submit update asset proposal using max deadline', function () {
|
||||||
goToMakeNewProposal(governanceProposalType.UPDATE_ASSET);
|
goToMakeNewProposal(governanceProposalType.UPDATE_ASSET);
|
||||||
enterUpdateAssetProposalDetails();
|
enterUpdateAssetProposalDetails();
|
||||||
cy.get(maxVoteDeadline).click();
|
cy.getByTestId(maxVoteDeadline).click();
|
||||||
cy.get(maxEnactDeadline).click();
|
cy.getByTestId(maxEnactDeadline).click();
|
||||||
cy.get(proposalDownloadBtn)
|
cy.getByTestId(proposalDownloadBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.click()
|
.click()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -550,36 +563,36 @@ context(
|
|||||||
|
|
||||||
it('Unable to submit edit asset proposal with missing/invalid fields', function () {
|
it('Unable to submit edit asset proposal with missing/invalid fields', function () {
|
||||||
goToMakeNewProposal(governanceProposalType.UPDATE_ASSET);
|
goToMakeNewProposal(governanceProposalType.UPDATE_ASSET);
|
||||||
cy.get(proposalDownloadBtn).should('be.visible').click();
|
cy.getByTestId(proposalDownloadBtn).should('be.visible').click();
|
||||||
cy.get(inputError).should('have.length', 3);
|
cy.getByTestId(inputError).should('have.length', 3);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Able to download and submit freeform proposal', function () {
|
it('Able to download and submit freeform proposal', function () {
|
||||||
goToMakeNewProposal(governanceProposalType.FREEFORM);
|
goToMakeNewProposal(governanceProposalType.FREEFORM);
|
||||||
// 3008-PFRO-006
|
// 3008-PFRO-006
|
||||||
cy.get(newProposalTitle)
|
cy.getByTestId(newProposalTitle)
|
||||||
.siblings()
|
.siblings()
|
||||||
.should('contain.text', '(100 characters or less)'); // 3008-PFRO-007
|
.should('contain.text', '(100 characters or less)'); // 3008-PFRO-007
|
||||||
// 3008-PFRO-005
|
// 3008-PFRO-005
|
||||||
cy.get(newProposalTitle).type('Test freeform proposal form');
|
cy.getByTestId(newProposalTitle).type('Test freeform proposal form');
|
||||||
// 3008-PFRO-009
|
// 3008-PFRO-009
|
||||||
cy.get(newProposalDescription)
|
cy.getByTestId(newProposalDescription)
|
||||||
.siblings()
|
.siblings()
|
||||||
.should('contain.text', '(20,000 characters or less)'); // 3008-PFRO-010
|
.should('contain.text', '(20,000 characters or less)'); // 3008-PFRO-010
|
||||||
// 3008-PFRO-008 3002-PROP-012 3002-PROP-016
|
// 3008-PFRO-008 3002-PROP-012 3002-PROP-016
|
||||||
cy.get(newProposalDescription).type(
|
cy.getByTestId(newProposalDescription).type(
|
||||||
'E2E test for downloading freeform proposal'
|
'E2E test for downloading freeform proposal'
|
||||||
);
|
);
|
||||||
// 3008-PFRO-012
|
// 3008-PFRO-012
|
||||||
cy.get(minVoteDeadline).should('exist'); // 3002-PROP-008
|
cy.getByTestId(minVoteDeadline).should('exist'); // 3002-PROP-008
|
||||||
cy.get(maxVoteDeadline).should('exist');
|
cy.getByTestId(maxVoteDeadline).should('exist');
|
||||||
// 3008-PFRO-011
|
// 3008-PFRO-011
|
||||||
cy.get(proposalVoteDeadline).clear().type('2');
|
cy.getByTestId(proposalVoteDeadline).clear().type('2');
|
||||||
// 3008-PFRO-013 3008-PFRO-014
|
// 3008-PFRO-013 3008-PFRO-014
|
||||||
cy.getByTestId('voting-date').invoke('text').should('not.be.empty');
|
cy.getByTestId('voting-date').invoke('text').should('not.be.empty');
|
||||||
// 3008-PFRO-015
|
// 3008-PFRO-015
|
||||||
cy.log('Download updated proposal file');
|
cy.log('Download updated proposal file');
|
||||||
cy.get(proposalDownloadBtn)
|
cy.getByTestId(proposalDownloadBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.click()
|
.click()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -613,11 +626,11 @@ context(
|
|||||||
}
|
}
|
||||||
|
|
||||||
function enterUpdateAssetProposalDetails() {
|
function enterUpdateAssetProposalDetails() {
|
||||||
cy.get(newProposalTitle).type('Test update asset proposal');
|
cy.getByTestId(newProposalTitle).type('Test update asset proposal');
|
||||||
cy.get(newProposalDescription).type('E2E test for proposals');
|
cy.getByTestId(newProposalDescription).type('E2E test for proposals');
|
||||||
cy.fixture('/proposals/update-asset').then((newAssetProposal) => {
|
cy.fixture('/proposals/update-asset').then((newAssetProposal) => {
|
||||||
const newAssetPayload = JSON.stringify(newAssetProposal);
|
const newAssetPayload = JSON.stringify(newAssetProposal);
|
||||||
cy.get(newProposalTerms).type(newAssetPayload, {
|
cy.getByTestId(newProposalTerms).type(newAssetPayload, {
|
||||||
parseSpecialCharSequences: false,
|
parseSpecialCharSequences: false,
|
||||||
delay: 2,
|
delay: 2,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -24,12 +24,12 @@ import { ethereumWalletConnect } from '../../support/wallet-eth.functions';
|
|||||||
import { vegaWalletSetSpecifiedApprovalAmount } from '../../support/wallet-functions';
|
import { vegaWalletSetSpecifiedApprovalAmount } from '../../support/wallet-functions';
|
||||||
|
|
||||||
const proposalListItem = 'proposals-list-item';
|
const proposalListItem = 'proposals-list-item';
|
||||||
const openProposals = '[data-testid="open-proposals"]';
|
const openProposals = 'open-proposals';
|
||||||
const voteStatus = 'vote-status';
|
const voteStatus = 'vote-status';
|
||||||
const proposalType = 'proposal-type';
|
const proposalType = 'proposal-type';
|
||||||
const proposalStatus = 'proposal-status';
|
const proposalStatus = 'proposal-status';
|
||||||
const proposalClosingDate = '[data-testid="vote-details"]';
|
const proposalClosingDate = 'vote-details';
|
||||||
const viewProposalButton = '[data-testid="view-proposal-btn"]';
|
const viewProposalButton = 'view-proposal-btn';
|
||||||
const voteBreakDownToggle = 'vote-breakdown-toggle';
|
const voteBreakDownToggle = 'vote-breakdown-toggle';
|
||||||
|
|
||||||
describe('Governance flow for proposal list', { tags: '@slow' }, function () {
|
describe('Governance flow for proposal list', { tags: '@slow' }, function () {
|
||||||
@@ -62,13 +62,13 @@ describe('Governance flow for proposal list', { tags: '@slow' }, function () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
cy.get(openProposals).within(() => {
|
cy.getByTestId(openProposals).within(() => {
|
||||||
cy.get(proposalClosingDate)
|
cy.getByTestId(proposalClosingDate)
|
||||||
.first()
|
.first()
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('match', /days|minutes/);
|
.should('match', /days|minutes/);
|
||||||
cy.get(proposalClosingDate).should('contain.text', 'months');
|
cy.getByTestId(proposalClosingDate).should('contain.text', 'months');
|
||||||
cy.get(proposalClosingDate).last().should('contain.text', 'year');
|
cy.getByTestId(proposalClosingDate).last().should('contain.text', 'year');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ describe('Governance flow for proposal list', { tags: '@slow' }, function () {
|
|||||||
const proposalTitle = generateFreeFormProposalTitle();
|
const proposalTitle = generateFreeFormProposalTitle();
|
||||||
|
|
||||||
submitUniqueRawProposal({ proposalTitle: proposalTitle });
|
submitUniqueRawProposal({ proposalTitle: proposalTitle });
|
||||||
cy.get('[data-testid="set-proposals-filter-visible"]').click();
|
cy.get('[data-testid="proposal-filter-toggle"]').click();
|
||||||
cy.get('[data-testid="filter-input"]').type(proposerId);
|
cy.get('[data-testid="filter-input"]').type(proposerId);
|
||||||
// cy.get(`#${proposalId}`).should('contain', proposalId);
|
// cy.get(`#${proposalId}`).should('contain', proposalId);
|
||||||
cy.contains(proposalTitle).should('be.visible');
|
cy.contains(proposalTitle).should('be.visible');
|
||||||
@@ -106,7 +106,7 @@ describe('Governance flow for proposal list', { tags: '@slow' }, function () {
|
|||||||
createRawProposal(this.minProposerBalance);
|
createRawProposal(this.minProposerBalance);
|
||||||
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
cy.get<testFreeformProposal>('@rawProposal').then((rawProposal) => {
|
||||||
getProposalFromTitle(rawProposal.rationale.title).within(() => {
|
getProposalFromTitle(rawProposal.rationale.title).within(() => {
|
||||||
cy.get(viewProposalButton).should('be.visible');
|
cy.getByTestId(viewProposalButton).should('be.visible');
|
||||||
cy.getByTestId(proposalType).should('have.text', 'Freeform');
|
cy.getByTestId(proposalType).should('have.text', 'Freeform');
|
||||||
cy.getByTestId(proposalStatus).should('have.text', 'Open');
|
cy.getByTestId(proposalStatus).should('have.text', 'Open');
|
||||||
});
|
});
|
||||||
@@ -124,13 +124,13 @@ describe('Governance flow for proposal list', { tags: '@slow' }, function () {
|
|||||||
'have.text',
|
'have.text',
|
||||||
'Participation not reached'
|
'Participation not reached'
|
||||||
);
|
);
|
||||||
cy.get(viewProposalButton).click();
|
cy.getByTestId(viewProposalButton).click();
|
||||||
});
|
});
|
||||||
voteForProposal('for');
|
voteForProposal('for');
|
||||||
navigateTo(navigation.proposals);
|
navigateTo(navigation.proposals);
|
||||||
getProposalFromTitle(proposalTitle).within(() => {
|
getProposalFromTitle(proposalTitle).within(() => {
|
||||||
cy.getByTestId(voteStatus).should('have.text', 'Set to pass');
|
cy.getByTestId(voteStatus).should('have.text', 'Set to pass');
|
||||||
cy.get(viewProposalButton).click();
|
cy.getByTestId(viewProposalButton).click();
|
||||||
});
|
});
|
||||||
cy.getByTestId(voteBreakDownToggle).click();
|
cy.getByTestId(voteBreakDownToggle).click();
|
||||||
getProposalInformationFromTable('Token participation met')
|
getProposalInformationFromTable('Token participation met')
|
||||||
|
|||||||
@@ -17,8 +17,7 @@ import {
|
|||||||
} from '../../support/wallet-functions';
|
} from '../../support/wallet-functions';
|
||||||
|
|
||||||
const vegaAssetAddress = '0x67175Da1D5e966e40D11c4B2519392B2058373de';
|
const vegaAssetAddress = '0x67175Da1D5e966e40D11c4B2519392B2058373de';
|
||||||
const vegaWalletUnstakedBalance =
|
const vegaWalletUnstakedBalance = 'vega-wallet-balance-unstaked';
|
||||||
'[data-testid="vega-wallet-balance-unstaked"]';
|
|
||||||
const rewardsTable = 'epoch-total-rewards-table';
|
const rewardsTable = 'epoch-total-rewards-table';
|
||||||
const txTimeout = Cypress.env('txTimeout');
|
const txTimeout = Cypress.env('txTimeout');
|
||||||
const rewardsTimeOut = { timeout: 60000 };
|
const rewardsTimeOut = { timeout: 60000 };
|
||||||
@@ -40,7 +39,7 @@ context('rewards - flow', { tags: '@slow' }, function () {
|
|||||||
cy.associateTokensToVegaWallet('6000');
|
cy.associateTokensToVegaWallet('6000');
|
||||||
navigateTo(navigation.validators);
|
navigateTo(navigation.validators);
|
||||||
cy.VegaWalletTopUpRewardsPool();
|
cy.VegaWalletTopUpRewardsPool();
|
||||||
cy.get(vegaWalletUnstakedBalance, txTimeout).should(
|
cy.getByTestId(vegaWalletUnstakedBalance, txTimeout).should(
|
||||||
'contain',
|
'contain',
|
||||||
'6,000.0',
|
'6,000.0',
|
||||||
txTimeout
|
txTimeout
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import {
|
|||||||
verifyStakedBalance,
|
verifyStakedBalance,
|
||||||
verifyEthWalletTotalAssociatedBalance,
|
verifyEthWalletTotalAssociatedBalance,
|
||||||
verifyEthWalletAssociatedBalance,
|
verifyEthWalletAssociatedBalance,
|
||||||
waitForSpinner,
|
|
||||||
navigateTo,
|
navigateTo,
|
||||||
navigation,
|
navigation,
|
||||||
turnTelemetryOff,
|
turnTelemetryOff,
|
||||||
@@ -58,6 +57,7 @@ context(
|
|||||||
before('visit staking tab and connect vega wallet', function () {
|
before('visit staking tab and connect vega wallet', function () {
|
||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
ethereumWalletConnect();
|
ethereumWalletConnect();
|
||||||
|
cy.connectVegaWallet();
|
||||||
vegaWalletSetSpecifiedApprovalAmount('1000');
|
vegaWalletSetSpecifiedApprovalAmount('1000');
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -67,10 +67,9 @@ context(
|
|||||||
function () {
|
function () {
|
||||||
cy.clearLocalStorage();
|
cy.clearLocalStorage();
|
||||||
turnTelemetryOff();
|
turnTelemetryOff();
|
||||||
cy.reload();
|
// Go to homepage to allow wallet teardown without epoch timer refreshing page
|
||||||
waitForSpinner();
|
navigateTo(navigation.home);
|
||||||
cy.connectVegaWallet();
|
vegaWalletTeardown();
|
||||||
ethereumWalletConnect();
|
|
||||||
navigateTo(navigation.validators);
|
navigateTo(navigation.validators);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -128,6 +127,7 @@ context(
|
|||||||
cy.getByTestId('staked-by-user-tooltip')
|
cy.getByTestId('staked-by-user-tooltip')
|
||||||
.first()
|
.first()
|
||||||
.should('have.text', 'Staked by me: 2.00');
|
.should('have.text', 'Staked by me: 2.00');
|
||||||
|
waitForBeginningOfEpoch();
|
||||||
cy.getByTestId('total-pending-stake').first().realHover();
|
cy.getByTestId('total-pending-stake').first().realHover();
|
||||||
cy.getByTestId('pending-user-stake-tooltip')
|
cy.getByTestId('pending-user-stake-tooltip')
|
||||||
.first()
|
.first()
|
||||||
@@ -398,6 +398,7 @@ context(
|
|||||||
vegaWalletSetSpecifiedApprovalAmount('1000');
|
vegaWalletSetSpecifiedApprovalAmount('1000');
|
||||||
cy.reload();
|
cy.reload();
|
||||||
ethereumWalletConnect();
|
ethereumWalletConnect();
|
||||||
|
cy.connectVegaWallet();
|
||||||
stakingPageAssociateTokens('3');
|
stakingPageAssociateTokens('3');
|
||||||
verifyUnstakedBalance(3.0);
|
verifyUnstakedBalance(3.0);
|
||||||
cy.get('button').contains('Select a validator to nominate').click();
|
cy.get('button').contains('Select a validator to nominate').click();
|
||||||
@@ -503,11 +504,6 @@ context(
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach('Teardown Wallet', function () {
|
|
||||||
navigateTo(navigation.home);
|
|
||||||
vegaWalletTeardown();
|
|
||||||
});
|
|
||||||
|
|
||||||
function verifyNextEpochValue(amount: number) {
|
function verifyNextEpochValue(amount: number) {
|
||||||
cy.getByTestId('stake-next-epoch', epochTimeout)
|
cy.getByTestId('stake-next-epoch', epochTimeout)
|
||||||
.contains(amount, epochTimeout)
|
.contains(amount, epochTimeout)
|
||||||
|
|||||||
@@ -21,25 +21,24 @@ import {
|
|||||||
vegaWalletTeardown,
|
vegaWalletTeardown,
|
||||||
} from '../../support/wallet-functions';
|
} from '../../support/wallet-functions';
|
||||||
|
|
||||||
const ethWalletContainer = '[data-testid="ethereum-wallet"]';
|
const ethWalletContainer = 'ethereum-wallet';
|
||||||
const vegaWalletAssociatedBalance = '[data-testid="currency-value"]';
|
const vegaWalletAssociatedBalance = 'currency-value';
|
||||||
const vegaWalletUnstakedBalance =
|
const vegaWalletUnstakedBalance = 'vega-wallet-balance-unstaked';
|
||||||
'[data-testid="vega-wallet-balance-unstaked"]';
|
|
||||||
const txTimeout = Cypress.env('txTimeout');
|
|
||||||
const vegaWalletPublicKeyShort = Cypress.env('vegaWalletPublicKeyShort');
|
|
||||||
const ethWalletAssociateButton = '[data-testid="associate-btn"]:visible';
|
const ethWalletAssociateButton = '[data-testid="associate-btn"]:visible';
|
||||||
const associateWalletRadioButton = '[data-testid="associate-radio-wallet"]';
|
const associateWalletRadioButton = 'associate-radio-wallet';
|
||||||
const tokenAmountInputBox = '[data-testid="token-amount-input"]';
|
const tokenAmountInputBox = 'token-amount-input';
|
||||||
const tokenSubmitButton = '[data-testid="token-input-submit-button"]';
|
const tokenSubmitButton = 'token-input-submit-button';
|
||||||
const ethWalletDissociateButton = '[href="/token/disassociate"]:visible';
|
const ethWalletDissociateButton = '[href="/token/disassociate"]:visible';
|
||||||
const vestingContractSection = '[data-testid="vega-in-vesting-contract"]';
|
const vestingContractSection = 'vega-in-vesting-contract';
|
||||||
const vegaInWalletSection = '[data-testid="vega-in-wallet"]';
|
const vegaInWalletSection = 'vega-in-wallet';
|
||||||
const connectedVegaKey = '[data-testid="connected-vega-key"]';
|
const connectedVegaKey = 'connected-vega-key';
|
||||||
const associatedKey = '[data-testid="associated-key"]';
|
const associatedKey = 'associated-key';
|
||||||
const associatedAmount = '[data-testid="associated-amount"]';
|
const associatedAmount = 'associated-amount';
|
||||||
const associateCompleteText = '[data-testid="transaction-complete-body"]';
|
const associateCompleteText = 'transaction-complete-body';
|
||||||
const disassociationWarning = '[data-testid="disassociation-warning"]';
|
const disassociationWarning = 'disassociation-warning';
|
||||||
const vegaWallet = 'aside [data-testid="vega-wallet"]';
|
const vegaWallet = 'aside [data-testid="vega-wallet"]';
|
||||||
|
const vegaWalletPublicKeyShort = Cypress.env('vegaWalletPublicKeyShort');
|
||||||
|
const txTimeout = Cypress.env('txTimeout');
|
||||||
|
|
||||||
context(
|
context(
|
||||||
'Token association flow - with eth and vega wallets connected',
|
'Token association flow - with eth and vega wallets connected',
|
||||||
@@ -89,12 +88,15 @@ context(
|
|||||||
verifyEthWalletAssociatedBalance('2.0');
|
verifyEthWalletAssociatedBalance('2.0');
|
||||||
verifyEthWalletTotalAssociatedBalance('2.0');
|
verifyEthWalletTotalAssociatedBalance('2.0');
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet).within(() => {
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should(
|
cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
'contain',
|
'contain',
|
||||||
2.0
|
2.0
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
cy.get(vegaWalletUnstakedBalance, txTimeout).should('contain', 2.0);
|
cy.getByTestId(vegaWalletUnstakedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
2.0
|
||||||
|
);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -127,7 +129,7 @@ context(
|
|||||||
verifyEthWalletAssociatedBalance('1,001.00');
|
verifyEthWalletAssociatedBalance('1,001.00');
|
||||||
verifyEthWalletTotalAssociatedBalance('7,001.00');
|
verifyEthWalletTotalAssociatedBalance('7,001.00');
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet).within(() => {
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should(
|
cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
'contain',
|
'contain',
|
||||||
'1,001.00'
|
'1,001.00'
|
||||||
);
|
);
|
||||||
@@ -137,14 +139,20 @@ context(
|
|||||||
it('Able to disassociate a partial amount of tokens currently associated', function () {
|
it('Able to disassociate a partial amount of tokens currently associated', function () {
|
||||||
stakingPageAssociateTokens('2');
|
stakingPageAssociateTokens('2');
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet).within(() => {
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 2.0);
|
cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
2.0
|
||||||
|
);
|
||||||
});
|
});
|
||||||
cy.get('button').contains('Select a validator to nominate').click();
|
cy.get('button').contains('Select a validator to nominate').click();
|
||||||
cy.getByTestId('epoch-countdown').should('be.visible');
|
cy.getByTestId('epoch-countdown').should('be.visible');
|
||||||
stakingPageDisassociateTokens('1');
|
stakingPageDisassociateTokens('1');
|
||||||
verifyEthWalletAssociatedBalance('1.0');
|
verifyEthWalletAssociatedBalance('1.0');
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet).within(() => {
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 1.0);
|
cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
1.0
|
||||||
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -154,21 +162,24 @@ context(
|
|||||||
'Warning: Any tokens that have been nominated to a node will sacrifice rewards they are due for the current epoch. If you do not wish to sacrifice these, you should remove stake from a node at the end of an epoch before disassociation.';
|
'Warning: Any tokens that have been nominated to a node will sacrifice rewards they are due for the current epoch. If you do not wish to sacrifice these, you should remove stake from a node at the end of an epoch before disassociation.';
|
||||||
stakingPageAssociateTokens('2');
|
stakingPageAssociateTokens('2');
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet).within(() => {
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 2.0);
|
cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
2.0
|
||||||
|
);
|
||||||
});
|
});
|
||||||
cy.get('button').contains('Select a validator to nominate').click();
|
cy.get('button').contains('Select a validator to nominate').click();
|
||||||
cy.getByTestId('epoch-countdown').should('be.visible');
|
cy.getByTestId('epoch-countdown').should('be.visible');
|
||||||
cy.get(ethWalletDissociateButton).click();
|
cy.get(ethWalletDissociateButton).click();
|
||||||
cy.get(disassociationWarning).should('contain', warningText);
|
cy.getByTestId(disassociationWarning).should('contain', warningText);
|
||||||
stakingPageDisassociateAllTokens();
|
stakingPageDisassociateAllTokens();
|
||||||
cy.get(ethWalletContainer)
|
cy.getByTestId(ethWalletContainer)
|
||||||
.first()
|
.first()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.contains(vegaWalletPublicKeyShort, { timeout: 20000 }).should(
|
cy.contains(vegaWalletPublicKeyShort, { timeout: 20000 }).should(
|
||||||
'not.exist'
|
'not.exist'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
cy.get(ethWalletContainer)
|
cy.getByTestId(ethWalletContainer)
|
||||||
.first()
|
.first()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.contains(vegaWalletPublicKeyShort, { timeout: 20000 }).should(
|
cy.contains(vegaWalletPublicKeyShort, { timeout: 20000 }).should(
|
||||||
@@ -176,7 +187,10 @@ context(
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet).within(() => {
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 0.0);
|
cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
0.0
|
||||||
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -198,9 +212,15 @@ context(
|
|||||||
verifyEthWalletAssociatedBalance('2.0');
|
verifyEthWalletAssociatedBalance('2.0');
|
||||||
verifyEthWalletTotalAssociatedBalance('2.0');
|
verifyEthWalletTotalAssociatedBalance('2.0');
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet).within(() => {
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 2.0);
|
cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
2.0
|
||||||
|
);
|
||||||
});
|
});
|
||||||
cy.get(vegaWalletUnstakedBalance, txTimeout).should('contain', 2.0);
|
cy.getByTestId(vegaWalletUnstakedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
2.0
|
||||||
|
);
|
||||||
stakingPageDisassociateTokens('1', {
|
stakingPageDisassociateTokens('1', {
|
||||||
type: 'contract',
|
type: 'contract',
|
||||||
skipConfirmation: true,
|
skipConfirmation: true,
|
||||||
@@ -221,45 +241,54 @@ context(
|
|||||||
cy.get('button').contains('Select a validator to nominate').click();
|
cy.get('button').contains('Select a validator to nominate').click();
|
||||||
cy.getByTestId('epoch-countdown').should('be.visible');
|
cy.getByTestId('epoch-countdown').should('be.visible');
|
||||||
stakingPageAssociateTokens('37', { type: 'contract' });
|
stakingPageAssociateTokens('37', { type: 'contract' });
|
||||||
cy.get(vestingContractSection)
|
cy.getByTestId(vestingContractSection)
|
||||||
.first()
|
.first()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(associatedKey).should(
|
cy.getByTestId(associatedKey).should(
|
||||||
'contain',
|
'contain',
|
||||||
Cypress.env('vegaWalletPublicKeyShort')
|
Cypress.env('vegaWalletPublicKeyShort')
|
||||||
);
|
);
|
||||||
cy.get(associatedAmount, txTimeout).should('contain', 37);
|
cy.getByTestId(associatedAmount, txTimeout).should('contain', 37);
|
||||||
});
|
});
|
||||||
cy.get(vegaInWalletSection)
|
cy.getByTestId(vegaInWalletSection)
|
||||||
.first()
|
.first()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(associatedKey).should(
|
cy.getByTestId(associatedKey).should(
|
||||||
'contain',
|
'contain',
|
||||||
Cypress.env('vegaWalletPublicKeyShort')
|
Cypress.env('vegaWalletPublicKeyShort')
|
||||||
);
|
);
|
||||||
cy.get(associatedAmount, txTimeout).should('contain', 21);
|
cy.getByTestId(associatedAmount, txTimeout).should('contain', 21);
|
||||||
});
|
});
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet).within(() => {
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 58);
|
cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
58
|
||||||
|
);
|
||||||
});
|
});
|
||||||
stakingPageDisassociateTokens('6', { type: 'contract' });
|
stakingPageDisassociateTokens('6', { type: 'contract' });
|
||||||
cy.get(vestingContractSection)
|
cy.getByTestId(vestingContractSection)
|
||||||
.first()
|
.first()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(associatedAmount, txTimeout).should('contain', 31);
|
cy.getByTestId(associatedAmount, txTimeout).should('contain', 31);
|
||||||
});
|
});
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet).within(() => {
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 52);
|
cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
52
|
||||||
|
);
|
||||||
});
|
});
|
||||||
navigateTo(navigation.validators);
|
navigateTo(navigation.validators);
|
||||||
stakingPageDisassociateTokens('9', { type: 'wallet' });
|
stakingPageDisassociateTokens('9', { type: 'wallet' });
|
||||||
cy.get(vegaInWalletSection)
|
cy.getByTestId(vegaInWalletSection)
|
||||||
.first()
|
.first()
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(associatedAmount, txTimeout).should('contain', 12);
|
cy.getByTestId(associatedAmount, txTimeout).should('contain', 12);
|
||||||
});
|
});
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet).within(() => {
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 43);
|
cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
43
|
||||||
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -268,10 +297,10 @@ context(
|
|||||||
// 1004-ASSO-010
|
// 1004-ASSO-010
|
||||||
// No warning visible as described in AC, but the button is disabled
|
// No warning visible as described in AC, but the button is disabled
|
||||||
cy.get(ethWalletAssociateButton).click();
|
cy.get(ethWalletAssociateButton).click();
|
||||||
cy.get(associateWalletRadioButton, { timeout: 30000 }).click();
|
cy.getByTestId(associateWalletRadioButton, { timeout: 30000 }).click();
|
||||||
cy.get(tokenSubmitButton, txTimeout).should('be.disabled'); // button disabled with no input
|
cy.getByTestId(tokenSubmitButton, txTimeout).should('be.disabled'); // button disabled with no input
|
||||||
cy.get(tokenAmountInputBox, { timeout: 10000 }).type('6500000');
|
cy.getByTestId(tokenAmountInputBox, { timeout: 10000 }).type('6500000');
|
||||||
cy.get(tokenSubmitButton, txTimeout).should('be.disabled');
|
cy.getByTestId(tokenSubmitButton, txTimeout).should('be.disabled');
|
||||||
});
|
});
|
||||||
|
|
||||||
// 1004-ASSO-004
|
// 1004-ASSO-004
|
||||||
@@ -296,22 +325,25 @@ context(
|
|||||||
|
|
||||||
it('Able to associate tokens to different public key of connected vega wallet', function () {
|
it('Able to associate tokens to different public key of connected vega wallet', function () {
|
||||||
cy.get(ethWalletAssociateButton).click();
|
cy.get(ethWalletAssociateButton).click();
|
||||||
cy.get(associateWalletRadioButton).click();
|
cy.getByTestId(associateWalletRadioButton).click();
|
||||||
cy.get(connectedVegaKey).should(
|
cy.getByTestId(connectedVegaKey).should(
|
||||||
'have.text',
|
'have.text',
|
||||||
Cypress.env('vegaWalletPublicKey')
|
Cypress.env('vegaWalletPublicKey')
|
||||||
);
|
);
|
||||||
|
|
||||||
switchVegaWalletPubKey();
|
switchVegaWalletPubKey();
|
||||||
cy.get(connectedVegaKey).should(
|
cy.getByTestId(connectedVegaKey).should(
|
||||||
'have.text',
|
'have.text',
|
||||||
Cypress.env('vegaWalletPublicKey2')
|
Cypress.env('vegaWalletPublicKey2')
|
||||||
);
|
);
|
||||||
stakingPageAssociateTokens('2');
|
stakingPageAssociateTokens('2');
|
||||||
cy.get(vegaWallet).within(() => {
|
cy.get(vegaWallet).within(() => {
|
||||||
cy.get(vegaWalletAssociatedBalance, txTimeout).should('contain', 2.0);
|
cy.getByTestId(vegaWalletAssociatedBalance, txTimeout).should(
|
||||||
|
'contain',
|
||||||
|
2.0
|
||||||
|
);
|
||||||
});
|
});
|
||||||
cy.get(associateCompleteText).should(
|
cy.getByTestId(associateCompleteText).should(
|
||||||
'have.text',
|
'have.text',
|
||||||
`Vega key ${Cypress.env(
|
`Vega key ${Cypress.env(
|
||||||
'vegaWalletPublicKey2Short'
|
'vegaWalletPublicKey2Short'
|
||||||
|
|||||||
@@ -10,9 +10,10 @@ import {
|
|||||||
} from '../../support/governance.functions';
|
} from '../../support/governance.functions';
|
||||||
import { mockNetworkUpgradeProposal } from '../../support/proposal.functions';
|
import { mockNetworkUpgradeProposal } from '../../support/proposal.functions';
|
||||||
|
|
||||||
const proposalDocumentationLink = '[data-testid="proposal-documentation-link"]';
|
const proposalDocsLink = 'proposal-docs-link';
|
||||||
|
const proposalDocumentationLink = 'proposal-documentation-link';
|
||||||
|
const connectToVegaWalletButton = 'connect-to-vega-wallet-btn';
|
||||||
const governanceDocsUrl = 'https://vega.xyz/governance';
|
const governanceDocsUrl = 'https://vega.xyz/governance';
|
||||||
const connectToVegaWalletButton = '[data-testid="connect-to-vega-wallet-btn"]';
|
|
||||||
|
|
||||||
context(
|
context(
|
||||||
'Governance Page - verify elements on page',
|
'Governance Page - verify elements on page',
|
||||||
@@ -41,7 +42,7 @@ context(
|
|||||||
|
|
||||||
it('should be able to see a working link for - find out more about Vega governance', function () {
|
it('should be able to see a working link for - find out more about Vega governance', function () {
|
||||||
// 3001-VOTE-001
|
// 3001-VOTE-001
|
||||||
cy.get(proposalDocumentationLink)
|
cy.getByTestId(proposalDocumentationLink)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Find out more about Vega governance')
|
.and('have.text', 'Find out more about Vega governance')
|
||||||
.and('have.attr', 'href')
|
.and('have.attr', 'href')
|
||||||
@@ -64,7 +65,7 @@ context(
|
|||||||
// 3007-PNE-021
|
// 3007-PNE-021
|
||||||
it('should have documentation links for network parameter proposal', function () {
|
it('should have documentation links for network parameter proposal', function () {
|
||||||
goToMakeNewProposal(governanceProposalType.NETWORK_PARAMETER);
|
goToMakeNewProposal(governanceProposalType.NETWORK_PARAMETER);
|
||||||
cy.getByTestId('proposal-docs-link')
|
cy.getByTestId(proposalDocsLink)
|
||||||
.find('a')
|
.find('a')
|
||||||
.should('have.attr', 'href')
|
.should('have.attr', 'href')
|
||||||
.and('contain', '/tutorials/proposals/network-parameter-proposal');
|
.and('contain', '/tutorials/proposals/network-parameter-proposal');
|
||||||
@@ -73,7 +74,7 @@ context(
|
|||||||
// 3003-PMAN-002 3003-PMAN-005
|
// 3003-PMAN-002 3003-PMAN-005
|
||||||
it('should have documentation links for new market proposal', function () {
|
it('should have documentation links for new market proposal', function () {
|
||||||
goToMakeNewProposal(governanceProposalType.NEW_MARKET);
|
goToMakeNewProposal(governanceProposalType.NEW_MARKET);
|
||||||
cy.getByTestId('proposal-docs-link')
|
cy.getByTestId(proposalDocsLink)
|
||||||
.find('a')
|
.find('a')
|
||||||
.should('have.attr', 'href')
|
.should('have.attr', 'href')
|
||||||
.and('contain', '/tutorials/proposals/new-market-proposal');
|
.and('contain', '/tutorials/proposals/new-market-proposal');
|
||||||
@@ -82,7 +83,7 @@ context(
|
|||||||
// 3004-PMAC-005
|
// 3004-PMAC-005
|
||||||
it('should have documentation links for update market proposal', function () {
|
it('should have documentation links for update market proposal', function () {
|
||||||
goToMakeNewProposal(governanceProposalType.UPDATE_MARKET);
|
goToMakeNewProposal(governanceProposalType.UPDATE_MARKET);
|
||||||
cy.getByTestId('proposal-docs-link')
|
cy.getByTestId(proposalDocsLink)
|
||||||
.find('a')
|
.find('a')
|
||||||
.should('have.attr', 'href')
|
.should('have.attr', 'href')
|
||||||
.and('contain', '/tutorials/proposals/update-market-proposal');
|
.and('contain', '/tutorials/proposals/update-market-proposal');
|
||||||
@@ -91,7 +92,7 @@ context(
|
|||||||
// 3005-PASN-002 005-PASN-005
|
// 3005-PASN-002 005-PASN-005
|
||||||
it('should have documentation links for new asset proposal', function () {
|
it('should have documentation links for new asset proposal', function () {
|
||||||
goToMakeNewProposal(governanceProposalType.NEW_ASSET);
|
goToMakeNewProposal(governanceProposalType.NEW_ASSET);
|
||||||
cy.getByTestId('proposal-docs-link')
|
cy.getByTestId(proposalDocsLink)
|
||||||
.find('a')
|
.find('a')
|
||||||
.should('have.attr', 'href')
|
.should('have.attr', 'href')
|
||||||
.and('contain', '/tutorials/proposals/new-asset-proposal');
|
.and('contain', '/tutorials/proposals/new-asset-proposal');
|
||||||
@@ -100,7 +101,7 @@ context(
|
|||||||
// 3006-PASC-002 3006-PASC-005
|
// 3006-PASC-002 3006-PASC-005
|
||||||
it('should have documentation links for update asset proposal', function () {
|
it('should have documentation links for update asset proposal', function () {
|
||||||
goToMakeNewProposal(governanceProposalType.UPDATE_ASSET);
|
goToMakeNewProposal(governanceProposalType.UPDATE_ASSET);
|
||||||
cy.getByTestId('proposal-docs-link')
|
cy.getByTestId(proposalDocsLink)
|
||||||
.find('a')
|
.find('a')
|
||||||
.should('have.attr', 'href')
|
.should('have.attr', 'href')
|
||||||
.and('contain', '/tutorials/proposals/update-asset-proposal');
|
.and('contain', '/tutorials/proposals/update-asset-proposal');
|
||||||
@@ -109,7 +110,7 @@ context(
|
|||||||
// 3008-PFRO-003 3008-PFRO-017
|
// 3008-PFRO-003 3008-PFRO-017
|
||||||
it('should have documentation links for freeform proposal', function () {
|
it('should have documentation links for freeform proposal', function () {
|
||||||
goToMakeNewProposal(governanceProposalType.FREEFORM);
|
goToMakeNewProposal(governanceProposalType.FREEFORM);
|
||||||
cy.getByTestId('proposal-docs-link')
|
cy.getByTestId(proposalDocsLink)
|
||||||
.find('a')
|
.find('a')
|
||||||
.should('have.attr', 'href')
|
.should('have.attr', 'href')
|
||||||
.and('contain', '/tutorials/proposals/freeform-proposal');
|
.and('contain', '/tutorials/proposals/freeform-proposal');
|
||||||
@@ -117,7 +118,7 @@ context(
|
|||||||
|
|
||||||
it('should be able to see a connect wallet button - if vega wallet disconnected and user is submitting new proposal', function () {
|
it('should be able to see a connect wallet button - if vega wallet disconnected and user is submitting new proposal', function () {
|
||||||
goToMakeNewProposal(governanceProposalType.RAW);
|
goToMakeNewProposal(governanceProposalType.RAW);
|
||||||
cy.get(connectToVegaWalletButton)
|
cy.getByTestId(connectToVegaWalletButton)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Connect Vega wallet');
|
.and('have.text', 'Connect Vega wallet');
|
||||||
});
|
});
|
||||||
@@ -165,6 +166,7 @@ context(
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
cy.get('[data-testid="closed-proposals-toggle-networkUpgrades"]').click();
|
||||||
cy.getByTestId('closed-proposals').within(() => {
|
cy.getByTestId('closed-proposals').within(() => {
|
||||||
cy.getByTestId('protocol-upgrade-proposals-list-item').should(
|
cy.getByTestId('protocol-upgrade-proposals-list-item').should(
|
||||||
'have.length',
|
'have.length',
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import {
|
|||||||
} from '../../support/common.functions';
|
} from '../../support/common.functions';
|
||||||
import { waitForBeginningOfEpoch } from '../../support/staking.functions';
|
import { waitForBeginningOfEpoch } from '../../support/staking.functions';
|
||||||
|
|
||||||
const viewToggle = '[data-testid="epoch-reward-view-toggle-total"]';
|
const viewToggle = 'epoch-reward-view-toggle-total';
|
||||||
const warning = '[data-testid="callout"]';
|
const warning = 'callout';
|
||||||
|
|
||||||
context(
|
context(
|
||||||
'Rewards Page - verify elements on page',
|
'Rewards Page - verify elements on page',
|
||||||
@@ -27,7 +27,7 @@ context(
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should have epoch warning', function () {
|
it('should have epoch warning', function () {
|
||||||
cy.get(warning)
|
cy.getByTestId(warning)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and(
|
.and(
|
||||||
'have.text',
|
'have.text',
|
||||||
@@ -36,7 +36,7 @@ context(
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should have toggle for seeing total vs individual rewards', function () {
|
it('should have toggle for seeing total vs individual rewards', function () {
|
||||||
cy.get(viewToggle).should('be.visible');
|
cy.getByTestId(viewToggle).should('be.visible');
|
||||||
});
|
});
|
||||||
|
|
||||||
// Skipping due to bug #3471 causing flaky failuress
|
// Skipping due to bug #3471 causing flaky failuress
|
||||||
|
|||||||
@@ -1,18 +1,17 @@
|
|||||||
import { navigateTo, navigation } from '../../support/common.functions';
|
import { navigateTo, navigation } from '../../support/common.functions';
|
||||||
|
|
||||||
const tokenDetailsTable = '.token-details';
|
const tokenDetailsTable = '.token-details';
|
||||||
const address = '[data-testid="token-address"]';
|
const address = 'token-address';
|
||||||
const contract = '[data-testid="token-contract"]';
|
const contract = 'token-contract';
|
||||||
const totalSupply = '[data-testid="total-supply"]';
|
const totalSupply = 'total-supply';
|
||||||
const circulatingSupply = '[data-testid="circulating-supply"]';
|
const circulatingSupply = 'circulating-supply';
|
||||||
const staked = '[data-testid="staked"]';
|
const staked = 'staked';
|
||||||
const tranchesLink = '[data-testid="tranches-link"]';
|
const tranchesLink = 'tranches-link';
|
||||||
const redeemBtn = '[data-testid="check-vesting-page-btn"]';
|
const redeemBtn = 'check-vesting-page-btn';
|
||||||
const getVegaWalletLink = '[data-testid="get-vega-wallet-link"]';
|
const getVegaWalletLink = 'get-vega-wallet-link';
|
||||||
const associateVegaLink =
|
const associateVegaLink = 'associate-vega-tokens-link-on-homepage';
|
||||||
'[data-testid="associate-vega-tokens-link-on-homepage"]';
|
const stakingBtn = 'staking-button-on-homepage';
|
||||||
const stakingBtn = '[data-testid="staking-button-on-homepage"]';
|
const governanceBtn = 'governance-button-on-homepage';
|
||||||
const governanceBtn = '[data-testid="governance-button-on-homepage"]';
|
|
||||||
|
|
||||||
const vegaTokenAddress = Cypress.env('vegaTokenAddress');
|
const vegaTokenAddress = Cypress.env('vegaTokenAddress');
|
||||||
const vegaTokenContractAddress = Cypress.env('vegaTokenContractAddress');
|
const vegaTokenContractAddress = Cypress.env('vegaTokenContractAddress');
|
||||||
@@ -25,7 +24,7 @@ context('Verify elements on Token page', { tags: '@smoke' }, function () {
|
|||||||
describe('THE $VEGA TOKEN table', function () {
|
describe('THE $VEGA TOKEN table', function () {
|
||||||
it('should have TOKEN ADDRESS', function () {
|
it('should have TOKEN ADDRESS', function () {
|
||||||
cy.get(tokenDetailsTable).within(() => {
|
cy.get(tokenDetailsTable).within(() => {
|
||||||
cy.get(address)
|
cy.getByTestId(address)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('be.equal', vegaTokenAddress);
|
.should('be.equal', vegaTokenAddress);
|
||||||
@@ -34,7 +33,7 @@ context('Verify elements on Token page', { tags: '@smoke' }, function () {
|
|||||||
it('should have VESTING CONTRACT', function () {
|
it('should have VESTING CONTRACT', function () {
|
||||||
// 1004-ASSO-001
|
// 1004-ASSO-001
|
||||||
cy.get(tokenDetailsTable).within(() => {
|
cy.get(tokenDetailsTable).within(() => {
|
||||||
cy.get(contract)
|
cy.getByTestId(contract)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('be.equal', vegaTokenContractAddress);
|
.should('be.equal', vegaTokenContractAddress);
|
||||||
@@ -42,56 +41,56 @@ context('Verify elements on Token page', { tags: '@smoke' }, function () {
|
|||||||
});
|
});
|
||||||
it('should have TOTAL SUPPLY', function () {
|
it('should have TOTAL SUPPLY', function () {
|
||||||
cy.get(tokenDetailsTable).within(() => {
|
cy.get(tokenDetailsTable).within(() => {
|
||||||
cy.get(totalSupply).should('be.visible');
|
cy.getByTestId(totalSupply).should('be.visible');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it('should have CIRCULATING SUPPLY', function () {
|
it('should have CIRCULATING SUPPLY', function () {
|
||||||
cy.get(tokenDetailsTable).within(() => {
|
cy.get(tokenDetailsTable).within(() => {
|
||||||
cy.get(circulatingSupply).should('be.visible');
|
cy.getByTestId(circulatingSupply).should('be.visible');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it('should have STAKED $VEGA', function () {
|
it('should have STAKED $VEGA', function () {
|
||||||
cy.get(tokenDetailsTable).within(() => {
|
cy.get(tokenDetailsTable).within(() => {
|
||||||
cy.get(staked).should('be.visible');
|
cy.getByTestId(staked).should('be.visible');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('links and buttons', function () {
|
describe('links and buttons', function () {
|
||||||
it('should have TRANCHES link', function () {
|
it('should have TRANCHES link', function () {
|
||||||
cy.get(tranchesLink)
|
cy.getByTestId(tranchesLink)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.attr', 'href')
|
.and('have.attr', 'href')
|
||||||
.and('equal', '/token/tranches');
|
.and('equal', '/token/tranches');
|
||||||
});
|
});
|
||||||
it('should have REDEEM button', function () {
|
it('should have REDEEM button', function () {
|
||||||
cy.get(redeemBtn)
|
cy.getByTestId(redeemBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.parent()
|
.parent()
|
||||||
.should('have.attr', 'href')
|
.should('have.attr', 'href')
|
||||||
.and('equal', '/token/redeem');
|
.and('equal', '/token/redeem');
|
||||||
});
|
});
|
||||||
it('should have GET VEGA WALLET link', function () {
|
it('should have GET VEGA WALLET link', function () {
|
||||||
cy.get(getVegaWalletLink)
|
cy.getByTestId(getVegaWalletLink)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.attr', 'href')
|
.and('have.attr', 'href')
|
||||||
.and('equal', 'https://vega.xyz/wallet');
|
.and('equal', 'https://vega.xyz/wallet');
|
||||||
});
|
});
|
||||||
it('should have ASSOCIATE VEGA TOKENS link', function () {
|
it('should have ASSOCIATE VEGA TOKENS link', function () {
|
||||||
cy.get(associateVegaLink)
|
cy.getByTestId(associateVegaLink)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.attr', 'href')
|
.and('have.attr', 'href')
|
||||||
.and('equal', '/token/associate');
|
.and('equal', '/token/associate');
|
||||||
});
|
});
|
||||||
it('should have STAKING button', function () {
|
it('should have STAKING button', function () {
|
||||||
cy.get(stakingBtn)
|
cy.getByTestId(stakingBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.parent()
|
.parent()
|
||||||
.should('have.attr', 'href')
|
.should('have.attr', 'href')
|
||||||
.and('equal', '/validators');
|
.and('equal', '/validators');
|
||||||
});
|
});
|
||||||
it('should have GOVERNANCE button', function () {
|
it('should have GOVERNANCE button', function () {
|
||||||
cy.get(governanceBtn)
|
cy.getByTestId(governanceBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.parent()
|
.parent()
|
||||||
.should('have.attr', 'href')
|
.should('have.attr', 'href')
|
||||||
|
|||||||
@@ -12,28 +12,26 @@ import {
|
|||||||
} from '../../support/staking.functions';
|
} from '../../support/staking.functions';
|
||||||
import { previousEpochData } from '../../fixtures/mocks/previous-epoch';
|
import { previousEpochData } from '../../fixtures/mocks/previous-epoch';
|
||||||
|
|
||||||
const guideLink = '[data-testid="staking-guide-link"]';
|
const guideLink = 'staking-guide-link';
|
||||||
const validatorTitle = '[data-testid="validator-node-title"]';
|
const validatorTitle = 'validator-node-title';
|
||||||
const validatorId = '[data-testid="validator-id"]';
|
const validatorId = 'validator-id';
|
||||||
const validatorPubKey = '[data-testid="validator-public-key"]';
|
const validatorPubKey = 'validator-public-key';
|
||||||
const ethAddressLink = '[data-testid="link"]';
|
const ethAddressLink = 'link';
|
||||||
const validatorStatus = '[data-testid="validator-status"]';
|
const validatorStatus = 'validator-status';
|
||||||
const totalStake = '[data-testid="total-stake"]';
|
const totalStake = 'total-stake';
|
||||||
const pendingStake = '[data-testid="pending-stake"]';
|
const pendingStake = 'pending-stake';
|
||||||
const stakedByOperator = '[data-testid="staked-by-operator"]';
|
const stakedByOperator = 'staked-by-operator';
|
||||||
const stakedByDelegates = '[data-testid="staked-by-delegates"]';
|
const stakedByDelegates = 'staked-by-delegates';
|
||||||
const stakeShare = '[data-testid="stake-percentage"]';
|
const stakeShare = 'stake-percentage';
|
||||||
const stakedByOperatorToolTip = '[data-testid="staked-operator-tooltip"]';
|
const stakedByOperatorToolTip = 'staked-operator-tooltip';
|
||||||
const stakedByDelegatesToolTip = '[data-testid="staked-delegates-tooltip"]';
|
const stakedByDelegatesToolTip = 'staked-delegates-tooltip';
|
||||||
const totalStakedToolTip = '[data-testid="total-staked-tooltip"]';
|
const totalStakedToolTip = 'total-staked-tooltip';
|
||||||
const unnormalisedVotingPowerToolTip =
|
const unnormalisedVotingPowerToolTip = 'unnormalised-voting-power-tooltip';
|
||||||
'[data-testid="unnormalised-voting-power-tooltip"]';
|
const normalisedVotingPowerToolTip = 'normalised-voting-power-tooltip';
|
||||||
const normalisedVotingPowerToolTip =
|
const performancePenaltyToolTip = 'performance-penalty-tooltip';
|
||||||
'[data-testid="normalised-voting-power-tooltip"]';
|
const overstakedPenaltyToolTip = 'overstaked-penalty-tooltip';
|
||||||
const performancePenaltyToolTip = '[data-testid="performance-penalty-tooltip"]';
|
const multisigPenaltyToolTip = 'multisig-error-tooltip';
|
||||||
const overstakedPenaltyToolTip = '[data-testid="overstaked-penalty-tooltip"]';
|
const epochCountDown = 'epoch-countdown';
|
||||||
const multisigPenaltyToolTip = '[data-testid="multisig-error-tooltip"]';
|
|
||||||
const epochCountDown = '[data-testid="epoch-countdown"]';
|
|
||||||
const stakeNumberRegex = /^\d{1,3}(,\d{3})*(\.\d+)?$/;
|
const stakeNumberRegex = /^\d{1,3}(,\d{3})*(\.\d+)?$/;
|
||||||
|
|
||||||
context('Validators Page - verify elements on page', function () {
|
context('Validators Page - verify elements on page', function () {
|
||||||
@@ -52,7 +50,7 @@ context('Validators Page - verify elements on page', function () {
|
|||||||
|
|
||||||
it('Should have Staking Guide link visible', function () {
|
it('Should have Staking Guide link visible', function () {
|
||||||
// 1002-STKE-003
|
// 1002-STKE-003
|
||||||
cy.get(guideLink)
|
cy.getByTestId(guideLink)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Read more about staking on Vega')
|
.and('have.text', 'Read more about staking on Vega')
|
||||||
.and(
|
.and(
|
||||||
@@ -95,13 +93,13 @@ context('Validators Page - verify elements on page', function () {
|
|||||||
waitForBeginningOfEpoch();
|
waitForBeginningOfEpoch();
|
||||||
cy.getByTestId('total-stake').first().realHover();
|
cy.getByTestId('total-stake').first().realHover();
|
||||||
|
|
||||||
cy.get(stakedByOperatorToolTip)
|
cy.getByTestId(stakedByOperatorToolTip)
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('contain', 'Staked by operator: 3,000.00');
|
.should('contain', 'Staked by operator: 3,000.00');
|
||||||
cy.get(stakedByDelegatesToolTip)
|
cy.getByTestId(stakedByDelegatesToolTip)
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('contain', 'Staked by delegates: 0.00');
|
.should('contain', 'Staked by delegates: 0.00');
|
||||||
cy.get(totalStakedToolTip)
|
cy.getByTestId(totalStakedToolTip)
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('contain', 'Total stake: 3,000.00');
|
.should('contain', 'Total stake: 3,000.00');
|
||||||
});
|
});
|
||||||
@@ -118,10 +116,10 @@ context('Validators Page - verify elements on page', function () {
|
|||||||
waitForBeginningOfEpoch();
|
waitForBeginningOfEpoch();
|
||||||
cy.getByTestId('normalised-voting-power').first().realHover();
|
cy.getByTestId('normalised-voting-power').first().realHover();
|
||||||
|
|
||||||
cy.get(unnormalisedVotingPowerToolTip)
|
cy.getByTestId(unnormalisedVotingPowerToolTip)
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('contain', 'Unnormalised voting power: 20.00%');
|
.should('contain', 'Unnormalised voting power: 20.00%');
|
||||||
cy.get(normalisedVotingPowerToolTip)
|
cy.getByTestId(normalisedVotingPowerToolTip)
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('contain', 'Normalised voting power: 50.00%');
|
.should('contain', 'Normalised voting power: 50.00%');
|
||||||
});
|
});
|
||||||
@@ -139,10 +137,10 @@ context('Validators Page - verify elements on page', function () {
|
|||||||
waitForBeginningOfEpoch();
|
waitForBeginningOfEpoch();
|
||||||
cy.getByTestId('total-penalty').realHover();
|
cy.getByTestId('total-penalty').realHover();
|
||||||
|
|
||||||
cy.get(performancePenaltyToolTip)
|
cy.getByTestId(performancePenaltyToolTip)
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('contain', 'Performance penalty: 0.00%');
|
.should('contain', 'Performance penalty: 0.00%');
|
||||||
cy.get(overstakedPenaltyToolTip)
|
cy.getByTestId(overstakedPenaltyToolTip)
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('contain', 'Overstaked penalty: 60.00%'); // value not asserted due to #2886
|
.should('contain', 'Overstaked penalty: 60.00%'); // value not asserted due to #2886
|
||||||
});
|
});
|
||||||
@@ -161,12 +159,12 @@ context('Validators Page - verify elements on page', function () {
|
|||||||
});
|
});
|
||||||
waitForBeginningOfEpoch();
|
waitForBeginningOfEpoch();
|
||||||
cy.getByTestId('total-penalty').first().realHover();
|
cy.getByTestId('total-penalty').first().realHover();
|
||||||
cy.get(multisigPenaltyToolTip)
|
cy.getByTestId(multisigPenaltyToolTip)
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('contain', 'Multisig penalty: 100%');
|
.should('contain', 'Multisig penalty: 100%');
|
||||||
|
|
||||||
cy.getByTestId('total-penalty').eq(1).realHover();
|
cy.getByTestId('total-penalty').eq(1).realHover();
|
||||||
cy.get(multisigPenaltyToolTip)
|
cy.getByTestId(multisigPenaltyToolTip)
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('contain', 'Multisig penalty: 100%');
|
.should('contain', 'Multisig penalty: 100%');
|
||||||
});
|
});
|
||||||
@@ -185,53 +183,59 @@ context('Validators Page - verify elements on page', function () {
|
|||||||
|
|
||||||
// 1002-STKE-006
|
// 1002-STKE-006
|
||||||
it('Should be able to see validator name', function () {
|
it('Should be able to see validator name', function () {
|
||||||
cy.get(validatorTitle).should('not.be.empty');
|
cy.getByTestId(validatorTitle).should('not.be.empty');
|
||||||
});
|
});
|
||||||
|
|
||||||
// 1002-STKE-007
|
// 1002-STKE-007
|
||||||
it('Should be able to see validator id', function () {
|
it('Should be able to see validator id', function () {
|
||||||
cy.get(validatorId).should('not.be.empty');
|
cy.getByTestId(validatorId).should('not.be.empty');
|
||||||
});
|
});
|
||||||
|
|
||||||
// 1002-STKE-008
|
// 1002-STKE-008
|
||||||
it('Should be able to see validator public key', function () {
|
it('Should be able to see validator public key', function () {
|
||||||
cy.get(validatorPubKey).should('not.be.empty');
|
cy.getByTestId(validatorPubKey).should('not.be.empty');
|
||||||
});
|
});
|
||||||
|
|
||||||
// 1002-STKE-010
|
// 1002-STKE-010
|
||||||
it('Should be able to see Ethereum address', function () {
|
it('Should be able to see Ethereum address', function () {
|
||||||
cy.get(ethAddressLink).should('not.be.empty').and('have.attr', 'href');
|
cy.getByTestId(ethAddressLink)
|
||||||
|
.should('not.be.empty')
|
||||||
|
.and('have.attr', 'href');
|
||||||
});
|
});
|
||||||
// TODO validators missing url for more information about them 1002-STKE-09
|
// TODO validators missing url for more information about them 1002-STKE-09
|
||||||
|
|
||||||
it('Should be able to see validator status', function () {
|
it('Should be able to see validator status', function () {
|
||||||
cy.get(validatorStatus).should('have.text', 'Consensus');
|
cy.getByTestId(validatorStatus).should('have.text', 'Consensus');
|
||||||
});
|
});
|
||||||
|
|
||||||
// 1002-STKE-012
|
// 1002-STKE-012
|
||||||
it('Should be able to see total stake', function () {
|
it('Should be able to see total stake', function () {
|
||||||
cy.get(totalStake).invoke('text').should('match', stakeNumberRegex);
|
cy.getByTestId(totalStake)
|
||||||
|
.invoke('text')
|
||||||
|
.should('match', stakeNumberRegex);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Should be able to see pending stake', function () {
|
it('Should be able to see pending stake', function () {
|
||||||
cy.get(pendingStake).invoke('text').should('match', stakeNumberRegex);
|
cy.getByTestId(pendingStake)
|
||||||
|
.invoke('text')
|
||||||
|
.should('match', stakeNumberRegex);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Should be able to see staked by operator', function () {
|
it('Should be able to see staked by operator', function () {
|
||||||
cy.get(stakedByOperator)
|
cy.getByTestId(stakedByOperator)
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('match', stakeNumberRegex);
|
.should('match', stakeNumberRegex);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Should be able to see staked by delegates', function () {
|
it('Should be able to see staked by delegates', function () {
|
||||||
cy.get(stakedByDelegates)
|
cy.getByTestId(stakedByDelegates)
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('match', stakeNumberRegex);
|
.should('match', stakeNumberRegex);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 1002-STKE-051
|
// 1002-STKE-051
|
||||||
it('Should be able to see stake share in percentage', function () {
|
it('Should be able to see stake share in percentage', function () {
|
||||||
cy.get(stakeShare)
|
cy.getByTestId(stakeShare)
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.then(($stakePercentage) => {
|
.then(($stakePercentage) => {
|
||||||
// The pattern must start at a word boundary (\b).
|
// The pattern must start at a word boundary (\b).
|
||||||
@@ -257,7 +261,7 @@ context('Validators Page - verify elements on page', function () {
|
|||||||
const epochTitle = 'h3';
|
const epochTitle = 'h3';
|
||||||
const nextEpochInfo = 'p';
|
const nextEpochInfo = 'p';
|
||||||
|
|
||||||
cy.get(epochCountDown).within(() => {
|
cy.getByTestId(epochCountDown).within(() => {
|
||||||
cy.get(epochTitle).should('not.be.empty');
|
cy.get(epochTitle).should('not.be.empty');
|
||||||
cy.get(nextEpochInfo).should('contain.text', 'Next epoch');
|
cy.get(nextEpochInfo).should('contain.text', 'Next epoch');
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import {
|
|||||||
} from '../../support/common.functions';
|
} from '../../support/common.functions';
|
||||||
import { ethereumWalletConnect } from '../../support/wallet-eth.functions';
|
import { ethereumWalletConnect } from '../../support/wallet-eth.functions';
|
||||||
|
|
||||||
const connectButton = '[data-testid="connect-to-eth-btn"]';
|
const connectButton = 'connect-to-eth-btn';
|
||||||
const lockedTokensInVestingContract = '6,499,972.30';
|
const lockedTokensInVestingContract = '6,499,972.30';
|
||||||
|
|
||||||
context(
|
context(
|
||||||
@@ -29,7 +29,7 @@ context(
|
|||||||
|
|
||||||
// 1005-VEST-018
|
// 1005-VEST-018
|
||||||
it('should have connect Eth wallet button', function () {
|
it('should have connect Eth wallet button', function () {
|
||||||
cy.get(connectButton)
|
cy.getByTestId(connectButton)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Connect Ethereum wallet');
|
.and('have.text', 'Connect Ethereum wallet');
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -5,11 +5,11 @@ const walletContainer = 'aside [data-testid="ethereum-wallet"]';
|
|||||||
const walletHeader = '[data-testid="wallet-header"] h1';
|
const walletHeader = '[data-testid="wallet-header"] h1';
|
||||||
const connectToEthButton =
|
const connectToEthButton =
|
||||||
'[data-testid="connect-to-eth-wallet-button"]:visible';
|
'[data-testid="connect-to-eth-wallet-button"]:visible';
|
||||||
const connectorList = '[data-testid="web3-connector-list"]';
|
const connectorList = 'web3-connector-list';
|
||||||
const associate = '[href="/token/associate"]';
|
const associate = '[href="/token/associate"]';
|
||||||
const disassociate = '[href="/token/disassociate"]';
|
const disassociate = '[href="/token/disassociate"]';
|
||||||
const disconnect = '[data-testid="disconnect-from-eth-wallet-button"]';
|
const disconnect = 'disconnect-from-eth-wallet-button';
|
||||||
const accountNo = '[data-testid="ethereum-account-truncated"]';
|
const accountNo = 'ethereum-account-truncated';
|
||||||
const currencyTitle = '[data-testid="currency-title"]:visible';
|
const currencyTitle = '[data-testid="currency-title"]:visible';
|
||||||
const currencyValue = '[data-testid="currency-value"]:visible';
|
const currencyValue = '[data-testid="currency-value"]:visible';
|
||||||
const vegaInVesting = '[data-testid="vega-in-vesting-contract"]:visible';
|
const vegaInVesting = '[data-testid="vega-in-vesting-contract"]:visible';
|
||||||
@@ -18,8 +18,8 @@ const progressBar = '[data-testid="progress-bar"]:visible';
|
|||||||
const currencyLocked = '[data-testid="currency-locked"]:visible';
|
const currencyLocked = '[data-testid="currency-locked"]:visible';
|
||||||
const currencyUnlocked = '[data-testid="currency-unlocked"]:visible';
|
const currencyUnlocked = '[data-testid="currency-unlocked"]:visible';
|
||||||
const dialog = '[role="dialog"]:visible';
|
const dialog = '[role="dialog"]:visible';
|
||||||
const dialogHeader = '[data-testid="dialog-title"]';
|
const dialogHeader = 'dialog-title';
|
||||||
const dialogCloseBtn = '[data-testid="dialog-close"]';
|
const dialogCloseBtn = 'dialog-close';
|
||||||
|
|
||||||
context(
|
context(
|
||||||
'Ethereum Wallet - verify elements on widget',
|
'Ethereum Wallet - verify elements on widget',
|
||||||
@@ -59,7 +59,7 @@ context(
|
|||||||
|
|
||||||
it('should have Connect Ethereum header visible', function () {
|
it('should have Connect Ethereum header visible', function () {
|
||||||
cy.get(dialog).within(() => {
|
cy.get(dialog).within(() => {
|
||||||
cy.get(dialogHeader)
|
cy.getByTestId(dialogHeader)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Connect to your Ethereum wallet');
|
.and('have.text', 'Connect to your Ethereum wallet');
|
||||||
});
|
});
|
||||||
@@ -73,7 +73,7 @@ context(
|
|||||||
'WalletConnect',
|
'WalletConnect',
|
||||||
'WalletConnect Legacy',
|
'WalletConnect Legacy',
|
||||||
];
|
];
|
||||||
cy.get(connectorList).within(() => {
|
cy.getByTestId(connectorList).within(() => {
|
||||||
cy.get('button').each(($btn, i) => {
|
cy.get('button').each(($btn, i) => {
|
||||||
cy.wrap($btn).should('be.visible').and('have.text', connectList[i]);
|
cy.wrap($btn).should('be.visible').and('have.text', connectList[i]);
|
||||||
});
|
});
|
||||||
@@ -83,7 +83,7 @@ context(
|
|||||||
after('close popup', function () {
|
after('close popup', function () {
|
||||||
cy.get(dialog)
|
cy.get(dialog)
|
||||||
.within(() => {
|
.within(() => {
|
||||||
cy.get(dialogCloseBtn).click();
|
cy.getByTestId(dialogCloseBtn).click();
|
||||||
})
|
})
|
||||||
.should('not.exist');
|
.should('not.exist');
|
||||||
});
|
});
|
||||||
@@ -106,7 +106,7 @@ context(
|
|||||||
// 0004-EWAL-005
|
// 0004-EWAL-005
|
||||||
it('should have account number visible', function () {
|
it('should have account number visible', function () {
|
||||||
cy.get(walletContainer).within(() => {
|
cy.get(walletContainer).within(() => {
|
||||||
cy.get(accountNo)
|
cy.getByTestId(accountNo)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', Cypress.env('ethWalletPublicKeyTruncated'));
|
.and('have.text', Cypress.env('ethWalletPublicKeyTruncated'));
|
||||||
});
|
});
|
||||||
@@ -129,7 +129,7 @@ context(
|
|||||||
// 0004-EWAL-007
|
// 0004-EWAL-007
|
||||||
it('should have Disconnect button visible', function () {
|
it('should have Disconnect button visible', function () {
|
||||||
cy.get(walletContainer).within(() => {
|
cy.get(walletContainer).within(() => {
|
||||||
cy.get(disconnect)
|
cy.getByTestId(disconnect)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Disconnect');
|
.and('have.text', 'Disconnect');
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -7,28 +7,28 @@ import {
|
|||||||
|
|
||||||
const walletContainer = 'aside [data-testid="vega-wallet"]';
|
const walletContainer = 'aside [data-testid="vega-wallet"]';
|
||||||
const walletHeader = '[data-testid="wallet-header"] h1';
|
const walletHeader = '[data-testid="wallet-header"] h1';
|
||||||
const connectButton = '[data-testid="connect-vega-wallet"]';
|
const connectButton = 'connect-vega-wallet';
|
||||||
const getVegaLink = '[data-testid="link"]';
|
const getVegaLink = 'link';
|
||||||
const dialog = '[role="dialog"]:visible';
|
const dialog = '[role="dialog"]:visible';
|
||||||
const dialogHeader = '[data-testid="dialog-title"]';
|
const dialogHeader = 'dialog-title';
|
||||||
const walletDialogHeader = '[data-testid="wallet-dialog-title"]';
|
const walletDialogHeader = 'wallet-dialog-title';
|
||||||
const connectorsList = '[data-testid="connectors-list"]';
|
const connectorsList = 'connectors-list';
|
||||||
const dialogCloseBtn = '[data-testid="dialog-close"]';
|
const dialogCloseBtn = 'dialog-close';
|
||||||
const restConnectorForm = '[data-testid="rest-connector-form"]';
|
const restConnectorForm = 'rest-connector-form';
|
||||||
const restWallet = '#wallet';
|
const restWallet = '#wallet';
|
||||||
const restPassphrase = '#passphrase';
|
const restPassphrase = '#passphrase';
|
||||||
const restConnectBtn = '[type="submit"]';
|
const restConnectBtn = '[type="submit"]';
|
||||||
const accountNo = '[data-testid="vega-account-truncated"]';
|
const accountNo = 'vega-account-truncated';
|
||||||
const currencyTitle = '[data-testid="currency-title"]';
|
const currencyTitle = 'currency-title';
|
||||||
const currencyValue = '[data-testid="currency-value"]';
|
const currencyValue = 'currency-value';
|
||||||
const vegaUnstaked = '[data-testid="vega-wallet-balance-unstaked"] .text-right';
|
const vegaUnstaked = '[data-testid="vega-wallet-balance-unstaked"] .text-right';
|
||||||
const governanceBtn = '[href="/proposals"]';
|
const governanceBtn = '[href="/proposals"]';
|
||||||
const stakingBtn = '[href="/validators"]';
|
const stakingBtn = '[href="/validators"]';
|
||||||
const manageLink = '[data-testid="manage-vega-wallet"]';
|
const manageLink = 'manage-vega-wallet';
|
||||||
const dialogVegaKey = '[data-testid="vega-public-key-full"]';
|
const dialogVegaKey = 'vega-public-key-full';
|
||||||
const dialogDisconnectBtn = '[data-testid="disconnect"]';
|
const dialogDisconnectBtn = 'disconnect';
|
||||||
const copyPublicKeyBtn = '[data-testid="copy-vega-public-key"]';
|
const copyPublicKeyBtn = 'copy-vega-public-key';
|
||||||
const vegaWalletCurrencyTitle = '[data-testid="currency-title"]';
|
const vegaWalletCurrencyTitle = 'currency-title';
|
||||||
const vegaWalletPublicKey = Cypress.env('vegaWalletPublicKey');
|
const vegaWalletPublicKey = Cypress.env('vegaWalletPublicKey');
|
||||||
const txTimeout = Cypress.env('txTimeout');
|
const txTimeout = Cypress.env('txTimeout');
|
||||||
|
|
||||||
@@ -47,10 +47,10 @@ context(
|
|||||||
cy.get(walletHeader)
|
cy.get(walletHeader)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Vega Wallet');
|
.and('have.text', 'Vega Wallet');
|
||||||
cy.get(connectButton)
|
cy.getByTestId(connectButton)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Connect Vega wallet to use associated $VEGA');
|
.and('have.text', 'Connect Vega wallet to use associated $VEGA');
|
||||||
cy.get(getVegaLink)
|
cy.getByTestId(getVegaLink)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Get a Vega wallet')
|
.and('have.text', 'Get a Vega wallet')
|
||||||
.and('have.attr', 'href', 'https://vega.xyz/wallet');
|
.and('have.attr', 'href', 'https://vega.xyz/wallet');
|
||||||
@@ -61,20 +61,20 @@ context(
|
|||||||
describe('when connect button clicked', () => {
|
describe('when connect button clicked', () => {
|
||||||
before('click connect vega wallet button', () => {
|
before('click connect vega wallet button', () => {
|
||||||
cy.get(walletContainer).within(() => {
|
cy.get(walletContainer).within(() => {
|
||||||
cy.get(connectButton).click();
|
cy.getByTestId(connectButton).click();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should have Connect Vega header visible', () => {
|
it('should have Connect Vega header visible', () => {
|
||||||
cy.get(dialog).within(() => {
|
cy.get(dialog).within(() => {
|
||||||
cy.get(walletDialogHeader)
|
cy.getByTestId(walletDialogHeader)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Connect');
|
.and('have.text', 'Connect');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should have jsonRpc and hosted connection options visible on list', function () {
|
it('should have jsonRpc and hosted connection options visible on list', function () {
|
||||||
cy.get(connectorsList).within(() => {
|
cy.getByTestId(connectorsList).within(() => {
|
||||||
cy.getByTestId('connector-jsonRpc')
|
cy.getByTestId('connector-jsonRpc')
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Connect Vega wallet');
|
.and('have.text', 'Connect Vega wallet');
|
||||||
@@ -86,33 +86,33 @@ context(
|
|||||||
|
|
||||||
it('should have close button visible', function () {
|
it('should have close button visible', function () {
|
||||||
cy.get(dialog).within(() => {
|
cy.get(dialog).within(() => {
|
||||||
cy.get(dialogCloseBtn).should('be.visible');
|
cy.getByTestId(dialogCloseBtn).should('be.visible');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('when rest connector form opened', function () {
|
describe('when rest connector form opened', function () {
|
||||||
before('click hosted wallet app button', function () {
|
before('click hosted wallet app button', function () {
|
||||||
cy.get(connectorsList).within(() => {
|
cy.getByTestId(connectorsList).within(() => {
|
||||||
cy.getByTestId('connector-hosted').click();
|
cy.getByTestId('connector-hosted').click();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// 0002-WCON-002
|
// 0002-WCON-002
|
||||||
it('should have wallet field visible', function () {
|
it('should have wallet field visible', function () {
|
||||||
cy.get(restConnectorForm).within(() => {
|
cy.getByTestId(restConnectorForm).within(() => {
|
||||||
cy.get(restWallet).should('be.visible');
|
cy.get(restWallet).should('be.visible');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should have password field visible', function () {
|
it('should have password field visible', function () {
|
||||||
cy.get(restConnectorForm).within(() => {
|
cy.getByTestId(restConnectorForm).within(() => {
|
||||||
cy.get(restPassphrase).should('be.visible');
|
cy.get(restPassphrase).should('be.visible');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should have connect button visible', function () {
|
it('should have connect button visible', function () {
|
||||||
cy.get(restConnectorForm).within(() => {
|
cy.getByTestId(restConnectorForm).within(() => {
|
||||||
cy.get(restConnectBtn)
|
cy.get(restConnectBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Connect');
|
.and('have.text', 'Connect');
|
||||||
@@ -121,12 +121,12 @@ context(
|
|||||||
|
|
||||||
it('should have close button visible', function () {
|
it('should have close button visible', function () {
|
||||||
cy.get(dialog).within(() => {
|
cy.get(dialog).within(() => {
|
||||||
cy.get(dialogCloseBtn).should('be.visible');
|
cy.getByTestId(dialogCloseBtn).should('be.visible');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
after('close dialog', function () {
|
after('close dialog', function () {
|
||||||
cy.get(dialogCloseBtn).click().should('not.exist');
|
cy.getByTestId(dialogCloseBtn).click().should('not.exist');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -152,7 +152,7 @@ context(
|
|||||||
{ tags: '@smoke' },
|
{ tags: '@smoke' },
|
||||||
function () {
|
function () {
|
||||||
cy.get(walletContainer).within(() => {
|
cy.get(walletContainer).within(() => {
|
||||||
cy.get(accountNo)
|
cy.getByTestId(accountNo)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', Cypress.env('vegaWalletPublicKeyShort'));
|
.and('have.text', Cypress.env('vegaWalletPublicKeyShort'));
|
||||||
});
|
});
|
||||||
@@ -161,7 +161,7 @@ context(
|
|||||||
|
|
||||||
it('should have Vega Associated currency title visible', function () {
|
it('should have Vega Associated currency title visible', function () {
|
||||||
cy.get(walletContainer).within(() => {
|
cy.get(walletContainer).within(() => {
|
||||||
cy.get(currencyTitle)
|
cy.getByTestId(currencyTitle)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('contain.text', `VEGAAssociated`);
|
.and('contain.text', `VEGAAssociated`);
|
||||||
});
|
});
|
||||||
@@ -172,7 +172,7 @@ context(
|
|||||||
{ tags: '@smoke' },
|
{ tags: '@smoke' },
|
||||||
function () {
|
function () {
|
||||||
cy.get(walletContainer).within(() => {
|
cy.get(walletContainer).within(() => {
|
||||||
cy.get(currencyValue)
|
cy.getByTestId(currencyValue)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('contain.text', `0.00`);
|
.and('contain.text', `0.00`);
|
||||||
});
|
});
|
||||||
@@ -204,21 +204,23 @@ context(
|
|||||||
|
|
||||||
it('should have Manage link visible', function () {
|
it('should have Manage link visible', function () {
|
||||||
cy.get(walletContainer).within(() => {
|
cy.get(walletContainer).within(() => {
|
||||||
cy.get(manageLink).should('be.visible').and('have.text', 'Manage');
|
cy.getByTestId(manageLink)
|
||||||
|
.should('be.visible')
|
||||||
|
.and('have.text', 'Manage');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('when Manage dialog opened', function () {
|
describe('when Manage dialog opened', function () {
|
||||||
before('click Manage link', function () {
|
before('click Manage link', function () {
|
||||||
cy.get(walletContainer).within(() => {
|
cy.get(walletContainer).within(() => {
|
||||||
cy.get(manageLink).click();
|
cy.getByTestId(manageLink).click();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// 0002-WCON-025, 0002-WCON-026
|
// 0002-WCON-025, 0002-WCON-026
|
||||||
it('should have SELECT A VEGA KEY dialog title visible', function () {
|
it('should have SELECT A VEGA KEY dialog title visible', function () {
|
||||||
cy.get(dialog).within(() => {
|
cy.get(dialog).within(() => {
|
||||||
cy.get(dialogHeader)
|
cy.getByTestId(dialogHeader)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'SELECT A VEGA KEY');
|
.and('have.text', 'SELECT A VEGA KEY');
|
||||||
});
|
});
|
||||||
@@ -238,7 +240,7 @@ context(
|
|||||||
'contain.text',
|
'contain.text',
|
||||||
truncatedPubKey1
|
truncatedPubKey1
|
||||||
);
|
);
|
||||||
cy.get(dialogVegaKey)
|
cy.getByTestId(dialogVegaKey)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('contain.text', truncatedPubKey1)
|
.and('contain.text', truncatedPubKey1)
|
||||||
.and('contain.text', truncatedPubKey2);
|
.and('contain.text', truncatedPubKey2);
|
||||||
@@ -248,7 +250,7 @@ context(
|
|||||||
// 0002-WCON-029
|
// 0002-WCON-029
|
||||||
it('should have copy public key button visible', function () {
|
it('should have copy public key button visible', function () {
|
||||||
cy.get(dialog).within(() => {
|
cy.get(dialog).within(() => {
|
||||||
cy.get(copyPublicKeyBtn)
|
cy.getByTestId(copyPublicKeyBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('contain.text', 'Copy');
|
.and('contain.text', 'Copy');
|
||||||
});
|
});
|
||||||
@@ -256,13 +258,13 @@ context(
|
|||||||
|
|
||||||
it('should have close button visible', function () {
|
it('should have close button visible', function () {
|
||||||
cy.get(dialog).within(() => {
|
cy.get(dialog).within(() => {
|
||||||
cy.get(dialogCloseBtn).should('be.visible');
|
cy.getByTestId(dialogCloseBtn).should('be.visible');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should have vega Disconnect all keys button visible', function () {
|
it('should have vega Disconnect all keys button visible', function () {
|
||||||
cy.get(dialog).within(() => {
|
cy.get(dialog).within(() => {
|
||||||
cy.get(dialogDisconnectBtn)
|
cy.getByTestId(dialogDisconnectBtn)
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Disconnect all keys');
|
.and('have.text', 'Disconnect all keys');
|
||||||
});
|
});
|
||||||
@@ -271,10 +273,10 @@ context(
|
|||||||
// 0002-WCON-022
|
// 0002-WCON-022
|
||||||
it('should be able to disconnect all keys', function () {
|
it('should be able to disconnect all keys', function () {
|
||||||
cy.get(dialog).within(() => {
|
cy.get(dialog).within(() => {
|
||||||
cy.get(dialogDisconnectBtn).click();
|
cy.getByTestId(dialogDisconnectBtn).click();
|
||||||
});
|
});
|
||||||
cy.get(walletContainer).within(() => {
|
cy.get(walletContainer).within(() => {
|
||||||
cy.get(connectButton).should('be.visible'); // 0002-WCON-023
|
cy.getByTestId(connectButton).should('be.visible'); // 0002-WCON-023
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -319,16 +321,22 @@ context(
|
|||||||
cy.reload();
|
cy.reload();
|
||||||
waitForSpinner();
|
waitForSpinner();
|
||||||
cy.connectVegaWallet();
|
cy.connectVegaWallet();
|
||||||
|
cy.get(walletContainer).within(() => {
|
||||||
|
cy.getByTestId('currency-title', txTimeout).should(
|
||||||
|
'have.length.at.least',
|
||||||
|
5
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
for (const { name, symbol, expectedAmount } of assets) {
|
for (const { name, symbol, expectedAmount } of assets) {
|
||||||
it(`should see ${name} within vega wallet`, () => {
|
it(`should see ${name} within vega wallet`, () => {
|
||||||
cy.get(walletContainer).within(() => {
|
cy.get(walletContainer).within(() => {
|
||||||
cy.get(vegaWalletCurrencyTitle)
|
cy.getByTestId(vegaWalletCurrencyTitle)
|
||||||
.contains(name, txTimeout)
|
.contains(name, txTimeout)
|
||||||
.should('be.visible');
|
.should('be.visible');
|
||||||
|
|
||||||
cy.get(vegaWalletCurrencyTitle)
|
cy.getByTestId(vegaWalletCurrencyTitle)
|
||||||
.contains(name)
|
.contains(name)
|
||||||
.parent()
|
.parent()
|
||||||
.siblings()
|
.siblings()
|
||||||
@@ -337,7 +345,7 @@ context(
|
|||||||
expect(displayedAmount).be.gte(expectedAmount);
|
expect(displayedAmount).be.gte(expectedAmount);
|
||||||
});
|
});
|
||||||
|
|
||||||
cy.get(vegaWalletCurrencyTitle)
|
cy.getByTestId(vegaWalletCurrencyTitle)
|
||||||
.contains(name)
|
.contains(name)
|
||||||
.parent()
|
.parent()
|
||||||
.contains(symbol);
|
.contains(symbol);
|
||||||
|
|||||||
@@ -5,8 +5,6 @@ import {
|
|||||||
verifyTabHighlighted,
|
verifyTabHighlighted,
|
||||||
} from '../../support/common.functions';
|
} from '../../support/common.functions';
|
||||||
|
|
||||||
const connectToVegaBtn = '[data-testid="connect-to-vega-wallet-btn"]';
|
|
||||||
|
|
||||||
context(
|
context(
|
||||||
'Withdraw Page - verify elements on page',
|
'Withdraw Page - verify elements on page',
|
||||||
{ tags: '@smoke' },
|
{ tags: '@smoke' },
|
||||||
@@ -26,7 +24,7 @@ context(
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should have connect Vega wallet button', function () {
|
it('should have connect Vega wallet button', function () {
|
||||||
cy.get(connectToVegaBtn)
|
cy.getByTestId('connect-to-vega-wallet-btn')
|
||||||
.should('be.visible')
|
.should('be.visible')
|
||||||
.and('have.text', 'Connect Vega wallet');
|
.and('have.text', 'Connect Vega wallet');
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -139,6 +139,9 @@ async function vegaWalletTeardownStaking(stakingBridgeContract: StakingBridge) {
|
|||||||
$associatedAmount
|
$associatedAmount
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
// Wait needed to allow Eth transaction to complete - otherwise could result in nonce error
|
||||||
|
// eslint-disable-next-line cypress/no-unnecessary-waiting
|
||||||
|
cy.wait(2000);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,69 @@
|
|||||||
|
import { render, fireEvent } from '@testing-library/react';
|
||||||
|
import { CollapsibleToggle } from './collapsible-toggle';
|
||||||
|
|
||||||
|
describe('CollapsibleToggle', () => {
|
||||||
|
const testId = 'collapsible-toggle';
|
||||||
|
|
||||||
|
it('renders without crashing', () => {
|
||||||
|
const mockSetToggleState = jest.fn();
|
||||||
|
const { getByTestId, getByText } = render(
|
||||||
|
<CollapsibleToggle
|
||||||
|
toggleState={false}
|
||||||
|
setToggleState={mockSetToggleState}
|
||||||
|
dataTestId={testId}
|
||||||
|
>
|
||||||
|
<div>Test</div>
|
||||||
|
</CollapsibleToggle>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(getByTestId(testId)).toBeInTheDocument();
|
||||||
|
expect(getByText('Test')).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('calls setToggleState with the opposite of current toggleState when clicked', () => {
|
||||||
|
const mockSetToggleState = jest.fn();
|
||||||
|
const { getByTestId } = render(
|
||||||
|
<CollapsibleToggle
|
||||||
|
toggleState={false}
|
||||||
|
setToggleState={mockSetToggleState}
|
||||||
|
dataTestId={testId}
|
||||||
|
>
|
||||||
|
<div>Test</div>
|
||||||
|
</CollapsibleToggle>
|
||||||
|
);
|
||||||
|
|
||||||
|
fireEvent.click(getByTestId(testId));
|
||||||
|
|
||||||
|
expect(mockSetToggleState).toHaveBeenCalledWith(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('has the rotate-180 class if toggleState is true', () => {
|
||||||
|
const mockSetToggleState = jest.fn();
|
||||||
|
const { getByTestId } = render(
|
||||||
|
<CollapsibleToggle
|
||||||
|
toggleState={true}
|
||||||
|
setToggleState={mockSetToggleState}
|
||||||
|
dataTestId={testId}
|
||||||
|
>
|
||||||
|
<div>Test</div>
|
||||||
|
</CollapsibleToggle>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(getByTestId('toggle-icon-wrapper')).toHaveClass('rotate-180');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not have the rotate-180 class if toggleState is false', () => {
|
||||||
|
const mockSetToggleState = jest.fn();
|
||||||
|
const { getByTestId } = render(
|
||||||
|
<CollapsibleToggle
|
||||||
|
toggleState={false}
|
||||||
|
setToggleState={mockSetToggleState}
|
||||||
|
dataTestId={testId}
|
||||||
|
>
|
||||||
|
<div>Test</div>
|
||||||
|
</CollapsibleToggle>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(getByTestId('toggle-icon-wrapper')).not.toHaveClass('rotate-180');
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
import classnames from 'classnames';
|
||||||
|
import { Icon } from '@vegaprotocol/ui-toolkit';
|
||||||
|
import type { Dispatch, SetStateAction, ReactNode } from 'react';
|
||||||
|
|
||||||
|
interface CollapsibleToggleProps {
|
||||||
|
toggleState: boolean;
|
||||||
|
setToggleState: Dispatch<SetStateAction<boolean>>;
|
||||||
|
children: ReactNode;
|
||||||
|
dataTestId?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const CollapsibleToggle = ({
|
||||||
|
toggleState,
|
||||||
|
setToggleState,
|
||||||
|
dataTestId,
|
||||||
|
children,
|
||||||
|
}: CollapsibleToggleProps) => {
|
||||||
|
const classes = classnames(
|
||||||
|
'mb-4 transition-transform ease-in-out duration-300',
|
||||||
|
{
|
||||||
|
'rotate-180': toggleState,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
onClick={() => setToggleState(!toggleState)}
|
||||||
|
data-testid={dataTestId}
|
||||||
|
>
|
||||||
|
<div className="flex items-center gap-3">
|
||||||
|
{children}
|
||||||
|
<div className={classes} data-testid="toggle-icon-wrapper">
|
||||||
|
<Icon name="chevron-down" size={8} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export * from './collapsible-toggle';
|
||||||
@@ -833,5 +833,8 @@
|
|||||||
"multisigContractIncorrect": "is incorrectly configured. Validator and delegator rewards will be penalised until this is resolved.",
|
"multisigContractIncorrect": "is incorrectly configured. Validator and delegator rewards will be penalised until this is resolved.",
|
||||||
"learnMore": "Learn more",
|
"learnMore": "Learn more",
|
||||||
"AllValidators": "All validators",
|
"AllValidators": "All validators",
|
||||||
"AllProposals": "All proposals"
|
"AllProposals": "All proposals",
|
||||||
|
"RejectedProposals": "Rejected proposals",
|
||||||
|
"networkGovernance": "Network governance",
|
||||||
|
"networkUpgrades": "Network upgrades"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
import classnames from 'classnames';
|
|
||||||
|
|
||||||
export const collapsibleToggleStyles = (toggleState: boolean) =>
|
|
||||||
classnames('mb-4 transition-transform ease-in-out duration-300', {
|
|
||||||
'rotate-180': toggleState,
|
|
||||||
});
|
|
||||||
+8
-12
@@ -1,9 +1,9 @@
|
|||||||
import ReactMarkdown from 'react-markdown';
|
import ReactMarkdown from 'react-markdown';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { Icon, RoundedWrapper } from '@vegaprotocol/ui-toolkit';
|
import { RoundedWrapper } from '@vegaprotocol/ui-toolkit';
|
||||||
import { SubHeading } from '../../../../components/heading';
|
import { SubHeading } from '../../../../components/heading';
|
||||||
import { collapsibleToggleStyles } from '../../../../lib/collapsible-toggle-styles';
|
import { CollapsibleToggle } from '../../../../components/collapsible-toggle';
|
||||||
|
|
||||||
export const ProposalDescription = ({
|
export const ProposalDescription = ({
|
||||||
description,
|
description,
|
||||||
@@ -15,17 +15,13 @@ export const ProposalDescription = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<section data-testid="proposal-description">
|
<section data-testid="proposal-description">
|
||||||
<button
|
<CollapsibleToggle
|
||||||
onClick={() => setShowDescription(!showDescription)}
|
toggleState={showDescription}
|
||||||
data-testid="proposal-description-toggle"
|
setToggleState={setShowDescription}
|
||||||
|
dataTestId={'proposal-description-toggle'}
|
||||||
>
|
>
|
||||||
<div className="flex items-center gap-3">
|
<SubHeading title={t('proposalDescription')} />
|
||||||
<SubHeading title={t('proposalDescription')} />
|
</CollapsibleToggle>
|
||||||
<div className={collapsibleToggleStyles(showDescription)}>
|
|
||||||
<Icon name="chevron-down" size={8} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
{showDescription && (
|
{showDescription && (
|
||||||
<RoundedWrapper paddingBottom={true} marginBottomLarge={true}>
|
<RoundedWrapper paddingBottom={true} marginBottomLarge={true}>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { Icon, SyntaxHighlighter } from '@vegaprotocol/ui-toolkit';
|
import { SyntaxHighlighter } from '@vegaprotocol/ui-toolkit';
|
||||||
import { SubHeading } from '../../../../components/heading';
|
import { SubHeading } from '../../../../components/heading';
|
||||||
import { collapsibleToggleStyles } from '../../../../lib/collapsible-toggle-styles';
|
import { CollapsibleToggle } from '../../../../components/collapsible-toggle';
|
||||||
import type { ProposalFieldsFragment } from '../../proposals/__generated__/Proposals';
|
import type { ProposalFieldsFragment } from '../../proposals/__generated__/Proposals';
|
||||||
import type { ProposalQuery } from '../../proposal/__generated__/Proposal';
|
import type { ProposalQuery } from '../../proposal/__generated__/Proposal';
|
||||||
|
|
||||||
@@ -16,17 +16,13 @@ export const ProposalJson = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<section data-testid="proposal-json">
|
<section data-testid="proposal-json">
|
||||||
<button
|
<CollapsibleToggle
|
||||||
onClick={() => setShowDetails(!showDetails)}
|
toggleState={showDetails}
|
||||||
data-testid="proposal-json-toggle"
|
setToggleState={setShowDetails}
|
||||||
|
dataTestId="proposal-json-toggle"
|
||||||
>
|
>
|
||||||
<div className="flex items-center gap-3">
|
<SubHeading title={t('proposalJson')} />
|
||||||
<SubHeading title={t('proposalJson')} />
|
</CollapsibleToggle>
|
||||||
<div className={collapsibleToggleStyles(showDetails)}>
|
|
||||||
<Icon name="chevron-down" size={8} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
{showDetails && <SyntaxHighlighter data={proposal} />}
|
{showDetails && <SyntaxHighlighter data={proposal} />}
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
+7
-11
@@ -24,7 +24,7 @@ import {
|
|||||||
SyntaxHighlighter,
|
SyntaxHighlighter,
|
||||||
} from '@vegaprotocol/ui-toolkit';
|
} from '@vegaprotocol/ui-toolkit';
|
||||||
import { SubHeading } from '../../../../components/heading';
|
import { SubHeading } from '../../../../components/heading';
|
||||||
import { collapsibleToggleStyles } from '../../../../lib/collapsible-toggle-styles';
|
import { CollapsibleToggle } from '../../../../components/collapsible-toggle';
|
||||||
import type { MarketInfoWithData } from '@vegaprotocol/markets';
|
import type { MarketInfoWithData } from '@vegaprotocol/markets';
|
||||||
import type { DataSourceDefinition } from '@vegaprotocol/types';
|
import type { DataSourceDefinition } from '@vegaprotocol/types';
|
||||||
import { create } from 'zustand';
|
import { create } from 'zustand';
|
||||||
@@ -77,17 +77,13 @@ export const ProposalMarketData = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="relative" data-testid="proposal-market-data">
|
<section className="relative" data-testid="proposal-market-data">
|
||||||
<button
|
<CollapsibleToggle
|
||||||
onClick={() => setShowDetails(!showDetails)}
|
toggleState={showDetails}
|
||||||
data-testid="proposal-market-data-toggle"
|
setToggleState={setShowDetails}
|
||||||
|
dataTestId="proposal-market-data-toggle"
|
||||||
>
|
>
|
||||||
<div className="flex items-center gap-3">
|
<SubHeading title={t('marketSpecification')} />
|
||||||
<SubHeading title={t('marketSpecification')} />
|
</CollapsibleToggle>
|
||||||
<div className={collapsibleToggleStyles(showDetails)}>
|
|
||||||
<Icon name="chevron-down" size={8} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
{showDetails && (
|
{showDetails && (
|
||||||
<>
|
<>
|
||||||
|
|||||||
+7
-12
@@ -5,14 +5,13 @@ import {
|
|||||||
KeyValueTableRow,
|
KeyValueTableRow,
|
||||||
Thumbs,
|
Thumbs,
|
||||||
RoundedWrapper,
|
RoundedWrapper,
|
||||||
Icon,
|
|
||||||
} from '@vegaprotocol/ui-toolkit';
|
} from '@vegaprotocol/ui-toolkit';
|
||||||
import { formatNumber, formatNumberPercentage } from '@vegaprotocol/utils';
|
import { formatNumber, formatNumberPercentage } from '@vegaprotocol/utils';
|
||||||
import { SubHeading } from '../../../../components/heading';
|
import { SubHeading } from '../../../../components/heading';
|
||||||
import { useVoteInformation } from '../../hooks';
|
import { useVoteInformation } from '../../hooks';
|
||||||
import { useAppState } from '../../../../contexts/app-state/app-state-context';
|
import { useAppState } from '../../../../contexts/app-state/app-state-context';
|
||||||
import { ProposalType } from '../proposal/proposal';
|
import { ProposalType } from '../proposal/proposal';
|
||||||
import { collapsibleToggleStyles } from '../../../../lib/collapsible-toggle-styles';
|
import { CollapsibleToggle } from '../../../../components/collapsible-toggle';
|
||||||
import type { ProposalFieldsFragment } from '../../proposals/__generated__/Proposals';
|
import type { ProposalFieldsFragment } from '../../proposals/__generated__/Proposals';
|
||||||
import type { ProposalQuery } from '../../proposal/__generated__/Proposal';
|
import type { ProposalQuery } from '../../proposal/__generated__/Proposal';
|
||||||
|
|
||||||
@@ -59,17 +58,13 @@ export const ProposalVotesTable = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<button
|
<CollapsibleToggle
|
||||||
onClick={() => setShowDetails(!showDetails)}
|
toggleState={showDetails}
|
||||||
data-testid="vote-breakdown-toggle"
|
setToggleState={setShowDetails}
|
||||||
|
dataTestId="vote-breakdown-toggle"
|
||||||
>
|
>
|
||||||
<div className="flex items-center gap-3">
|
<SubHeading title={t('voteBreakdown')} />
|
||||||
<SubHeading title={t('voteBreakdown')} />
|
</CollapsibleToggle>
|
||||||
<div className={collapsibleToggleStyles(showDetails)}>
|
|
||||||
<Icon name="chevron-down" size={8} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
{showDetails && (
|
{showDetails && (
|
||||||
<RoundedWrapper marginBottomLarge={true} paddingBottom={true}>
|
<RoundedWrapper marginBottomLarge={true} paddingBottom={true}>
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { render, screen } from '@testing-library/react';
|
|||||||
import { generateProposal } from '../../test-helpers/generate-proposals';
|
import { generateProposal } from '../../test-helpers/generate-proposals';
|
||||||
import { Proposal } from './proposal';
|
import { Proposal } from './proposal';
|
||||||
import type { ProposalQuery } from '../../proposal/__generated__/Proposal';
|
import type { ProposalQuery } from '../../proposal/__generated__/Proposal';
|
||||||
|
import { ProposalState } from '@vegaprotocol/types';
|
||||||
|
|
||||||
jest.mock('@vegaprotocol/network-parameters', () => ({
|
jest.mock('@vegaprotocol/network-parameters', () => ({
|
||||||
...jest.requireActual('@vegaprotocol/network-parameters'),
|
...jest.requireActual('@vegaprotocol/network-parameters'),
|
||||||
@@ -64,6 +65,17 @@ it('Renders with a link back to "all proposals"', async () => {
|
|||||||
expect(await screen.findByTestId('all-proposals-link')).toBeInTheDocument();
|
expect(await screen.findByTestId('all-proposals-link')).toBeInTheDocument();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('Renders a rejected proposals with a link back to "rejected proposals"', async () => {
|
||||||
|
const proposal = generateProposal({
|
||||||
|
state: ProposalState.STATE_REJECTED,
|
||||||
|
});
|
||||||
|
renderComponent(proposal);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
await screen.findByTestId('rejected-proposals-link')
|
||||||
|
).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
it('renders each section', async () => {
|
it('renders each section', async () => {
|
||||||
const proposal = generateProposal();
|
const proposal = generateProposal();
|
||||||
renderComponent(proposal);
|
renderComponent(proposal);
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import { ProposalMarketData } from '../proposal-market-data';
|
|||||||
import type { ProposalFieldsFragment } from '../../proposals/__generated__/Proposals';
|
import type { ProposalFieldsFragment } from '../../proposals/__generated__/Proposals';
|
||||||
import type { ProposalQuery } from '../../proposal/__generated__/Proposal';
|
import type { ProposalQuery } from '../../proposal/__generated__/Proposal';
|
||||||
import type { MarketInfoWithData } from '@vegaprotocol/markets';
|
import type { MarketInfoWithData } from '@vegaprotocol/markets';
|
||||||
|
import { ProposalState } from '@vegaprotocol/types';
|
||||||
|
|
||||||
export enum ProposalType {
|
export enum ProposalType {
|
||||||
PROPOSAL_NEW_MARKET = 'PROPOSAL_NEW_MARKET',
|
PROPOSAL_NEW_MARKET = 'PROPOSAL_NEW_MARKET',
|
||||||
@@ -91,14 +92,22 @@ export const Proposal = ({
|
|||||||
return (
|
return (
|
||||||
<AsyncRenderer data={params} loading={loading} error={error}>
|
<AsyncRenderer data={params} loading={loading} error={error}>
|
||||||
<section data-testid="proposal">
|
<section data-testid="proposal">
|
||||||
<div
|
<div className="flex items-center gap-1">
|
||||||
className="flex items-center gap-1"
|
|
||||||
data-testid="all-proposals-link"
|
|
||||||
>
|
|
||||||
<Icon name={'chevron-left'} />
|
<Icon name={'chevron-left'} />
|
||||||
<Link className="underline" to={Routes.PROPOSALS}>
|
|
||||||
{t('AllProposals')}
|
{proposal.state === ProposalState.STATE_REJECTED ? (
|
||||||
</Link>
|
<div data-testid="rejected-proposals-link">
|
||||||
|
<Link className="underline" to={Routes.PROPOSALS_REJECTED}>
|
||||||
|
{t('RejectedProposals')}
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<div data-testid="all-proposals-link">
|
||||||
|
<Link className="underline" to={Routes.PROPOSALS}>
|
||||||
|
{t('AllProposals')}
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
<ProposalHeader proposal={proposal} isListItem={false} />
|
<ProposalHeader proposal={proposal} isListItem={false} />
|
||||||
|
|
||||||
|
|||||||
+34
@@ -0,0 +1,34 @@
|
|||||||
|
import { render, fireEvent, screen } from '@testing-library/react';
|
||||||
|
import { ProposalsListFilter } from './proposals-list-filter';
|
||||||
|
|
||||||
|
describe('ProposalsListFilter', () => {
|
||||||
|
let setFilterString: jest.Mock;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
setFilterString = jest.fn();
|
||||||
|
render(
|
||||||
|
<ProposalsListFilter filterString="" setFilterString={setFilterString} />
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders successfully', () => {
|
||||||
|
expect(screen.getByTestId('proposals-list-filter')).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle the filter toggle click', () => {
|
||||||
|
fireEvent.click(screen.getByTestId('proposal-filter-toggle'));
|
||||||
|
expect(screen.getByTestId('proposals-list-filter')).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle input change', () => {
|
||||||
|
fireEvent.click(screen.getByTestId('proposal-filter-toggle'));
|
||||||
|
fireEvent.change(screen.getByTestId('filter-input'), {
|
||||||
|
target: { value: 'test' },
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(setFilterString).toHaveBeenCalledWith('test');
|
||||||
|
});
|
||||||
|
|
||||||
|
// 'clear filter' tests are handled in the proposals-list.spec.tsx file
|
||||||
|
// as it is responsible for the filter state
|
||||||
|
});
|
||||||
+25
-10
@@ -1,13 +1,16 @@
|
|||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { ButtonLink, FormGroup, Input } from '@vegaprotocol/ui-toolkit';
|
import { FormGroup, Icon, Input } from '@vegaprotocol/ui-toolkit';
|
||||||
|
import { CollapsibleToggle } from '../../../../components/collapsible-toggle';
|
||||||
import type { Dispatch, SetStateAction } from 'react';
|
import type { Dispatch, SetStateAction } from 'react';
|
||||||
|
|
||||||
interface ProposalsListFilterProps {
|
interface ProposalsListFilterProps {
|
||||||
|
filterString: string;
|
||||||
setFilterString: Dispatch<SetStateAction<string>>;
|
setFilterString: Dispatch<SetStateAction<string>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ProposalsListFilter = ({
|
export const ProposalsListFilter = ({
|
||||||
|
filterString,
|
||||||
setFilterString,
|
setFilterString,
|
||||||
}: ProposalsListFilterProps) => {
|
}: ProposalsListFilterProps) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -15,27 +18,39 @@ export const ProposalsListFilter = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div data-testid="proposals-list-filter" className="mb-4">
|
<div data-testid="proposals-list-filter" className="mb-4">
|
||||||
{!filterVisible && (
|
<CollapsibleToggle
|
||||||
<ButtonLink
|
toggleState={filterVisible}
|
||||||
onClick={() => setFilterVisible(true)}
|
setToggleState={setFilterVisible}
|
||||||
data-testid="set-proposals-filter-visible"
|
dataTestId={'proposal-filter-toggle'}
|
||||||
>
|
>
|
||||||
{t('FilterProposals')}
|
<div className="text-xl mb-4">{t('FilterProposals')}</div>
|
||||||
</ButtonLink>
|
</CollapsibleToggle>
|
||||||
)}
|
|
||||||
{filterVisible && (
|
{filterVisible && (
|
||||||
<div data-testid="open-proposals-list-filter">
|
<div data-testid="proposals-list-filter-visible">
|
||||||
<p>{t('FilterProposalsDescription')}</p>
|
<p>{t('FilterProposalsDescription')}</p>
|
||||||
<FormGroup
|
<FormGroup
|
||||||
label="Filter text input"
|
label="Filter text input"
|
||||||
labelFor="filter-input"
|
labelFor="filter-input"
|
||||||
hideLabel={true}
|
hideLabel={true}
|
||||||
|
className="relative"
|
||||||
>
|
>
|
||||||
<Input
|
<Input
|
||||||
|
value={filterString}
|
||||||
data-testid="filter-input"
|
data-testid="filter-input"
|
||||||
id="filter-input"
|
id="filter-input"
|
||||||
onChange={(e) => setFilterString(e.target.value)}
|
onChange={(e) => setFilterString(e.target.value)}
|
||||||
|
className="pr-8"
|
||||||
/>
|
/>
|
||||||
|
{filterString && filterString.length > 0 && (
|
||||||
|
<button
|
||||||
|
className="absolute top-2 right-2"
|
||||||
|
onClick={() => setFilterString('')}
|
||||||
|
data-testid="clear-filter"
|
||||||
|
>
|
||||||
|
<Icon name="cross" size={6} className="text-vega-light-200" />
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
+110
-10
@@ -1,4 +1,7 @@
|
|||||||
import { generateProposal } from '../../test-helpers/generate-proposals';
|
import {
|
||||||
|
generateProposal,
|
||||||
|
generateProtocolUpgradeProposal,
|
||||||
|
} from '../../test-helpers/generate-proposals';
|
||||||
import { MockedProvider } from '@apollo/client/testing';
|
import { MockedProvider } from '@apollo/client/testing';
|
||||||
import { VegaWalletContext } from '@vegaprotocol/wallet';
|
import { VegaWalletContext } from '@vegaprotocol/wallet';
|
||||||
import { BrowserRouter as Router } from 'react-router-dom';
|
import { BrowserRouter as Router } from 'react-router-dom';
|
||||||
@@ -15,6 +18,7 @@ import {
|
|||||||
nextMonth,
|
nextMonth,
|
||||||
} from '../../test-helpers/mocks';
|
} from '../../test-helpers/mocks';
|
||||||
import type { ProposalQuery } from '../../proposal/__generated__/Proposal';
|
import type { ProposalQuery } from '../../proposal/__generated__/Proposal';
|
||||||
|
import type { ProtocolUpgradeProposalFieldsFragment } from '@vegaprotocol/proposals';
|
||||||
|
|
||||||
const openProposalClosesNextMonth = generateProposal({
|
const openProposalClosesNextMonth = generateProposal({
|
||||||
id: 'proposal1',
|
id: 'proposal1',
|
||||||
@@ -54,12 +58,22 @@ const failedProposalClosedLastMonth = generateProposal({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const renderComponent = (proposals: ProposalQuery['proposal'][]) => (
|
const closedProtocolUpgradeProposal = generateProtocolUpgradeProposal({
|
||||||
|
upgradeBlockHeight: '1',
|
||||||
|
});
|
||||||
|
|
||||||
|
const renderComponent = (
|
||||||
|
proposals: ProposalQuery['proposal'][],
|
||||||
|
protocolUpgradeProposals?: ProtocolUpgradeProposalFieldsFragment[]
|
||||||
|
) => (
|
||||||
<Router>
|
<Router>
|
||||||
<MockedProvider mocks={[networkParamsQueryMock]}>
|
<MockedProvider mocks={[networkParamsQueryMock]}>
|
||||||
<AppStateProvider>
|
<AppStateProvider>
|
||||||
<VegaWalletContext.Provider value={mockWalletContext}>
|
<VegaWalletContext.Provider value={mockWalletContext}>
|
||||||
<ProposalsList proposals={proposals} protocolUpgradeProposals={[]} />
|
<ProposalsList
|
||||||
|
proposals={proposals}
|
||||||
|
protocolUpgradeProposals={protocolUpgradeProposals || []}
|
||||||
|
/>
|
||||||
</VegaWalletContext.Provider>
|
</VegaWalletContext.Provider>
|
||||||
</AppStateProvider>
|
</AppStateProvider>
|
||||||
</MockedProvider>
|
</MockedProvider>
|
||||||
@@ -143,17 +157,15 @@ describe('Proposals list', () => {
|
|||||||
render(
|
render(
|
||||||
renderComponent([openProposalClosesNextMonth, openProposalClosesNextWeek])
|
renderComponent([openProposalClosesNextMonth, openProposalClosesNextWeek])
|
||||||
);
|
);
|
||||||
fireEvent.click(screen.getByTestId('set-proposals-filter-visible'));
|
fireEvent.click(screen.getByTestId('proposal-filter-toggle'));
|
||||||
expect(
|
expect(screen.getByTestId('proposals-list-filter')).toBeInTheDocument();
|
||||||
screen.getByTestId('open-proposals-list-filter')
|
|
||||||
).toBeInTheDocument();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Filters list by text - party id', () => {
|
it('Filters list by text - party id', () => {
|
||||||
render(
|
render(
|
||||||
renderComponent([openProposalClosesNextMonth, openProposalClosesNextWeek])
|
renderComponent([openProposalClosesNextMonth, openProposalClosesNextWeek])
|
||||||
);
|
);
|
||||||
fireEvent.click(screen.getByTestId('set-proposals-filter-visible'));
|
fireEvent.click(screen.getByTestId('proposal-filter-toggle'));
|
||||||
fireEvent.change(screen.getByTestId('filter-input'), {
|
fireEvent.change(screen.getByTestId('filter-input'), {
|
||||||
target: { value: 'bvcx' },
|
target: { value: 'bvcx' },
|
||||||
});
|
});
|
||||||
@@ -166,7 +178,7 @@ describe('Proposals list', () => {
|
|||||||
render(
|
render(
|
||||||
renderComponent([openProposalClosesNextMonth, openProposalClosesNextWeek])
|
renderComponent([openProposalClosesNextMonth, openProposalClosesNextWeek])
|
||||||
);
|
);
|
||||||
fireEvent.click(screen.getByTestId('set-proposals-filter-visible'));
|
fireEvent.click(screen.getByTestId('proposal-filter-toggle'));
|
||||||
fireEvent.change(screen.getByTestId('filter-input'), {
|
fireEvent.change(screen.getByTestId('filter-input'), {
|
||||||
target: { value: 'proposal1' },
|
target: { value: 'proposal1' },
|
||||||
});
|
});
|
||||||
@@ -179,7 +191,7 @@ describe('Proposals list', () => {
|
|||||||
render(
|
render(
|
||||||
renderComponent([openProposalClosesNextMonth, openProposalClosesNextWeek])
|
renderComponent([openProposalClosesNextMonth, openProposalClosesNextWeek])
|
||||||
);
|
);
|
||||||
fireEvent.click(screen.getByTestId('set-proposals-filter-visible'));
|
fireEvent.click(screen.getByTestId('proposal-filter-toggle'));
|
||||||
fireEvent.change(screen.getByTestId('filter-input'), {
|
fireEvent.change(screen.getByTestId('filter-input'), {
|
||||||
target: { value: 'osal1' },
|
target: { value: 'osal1' },
|
||||||
});
|
});
|
||||||
@@ -187,4 +199,92 @@ describe('Proposals list', () => {
|
|||||||
expect(container.querySelector('#proposal1')).toBeInTheDocument();
|
expect(container.querySelector('#proposal1')).toBeInTheDocument();
|
||||||
expect(container.querySelector('#proposal2')).not.toBeInTheDocument();
|
expect(container.querySelector('#proposal2')).not.toBeInTheDocument();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('When filter is used, clear button is visible', () => {
|
||||||
|
render(
|
||||||
|
renderComponent([openProposalClosesNextMonth, openProposalClosesNextWeek])
|
||||||
|
);
|
||||||
|
fireEvent.click(screen.getByTestId('proposal-filter-toggle'));
|
||||||
|
fireEvent.change(screen.getByTestId('filter-input'), {
|
||||||
|
target: { value: 'test' },
|
||||||
|
});
|
||||||
|
expect(screen.getByTestId('clear-filter')).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('When clear filter button is used, input is cleared', () => {
|
||||||
|
render(
|
||||||
|
renderComponent([openProposalClosesNextMonth, openProposalClosesNextWeek])
|
||||||
|
);
|
||||||
|
fireEvent.click(screen.getByTestId('proposal-filter-toggle'));
|
||||||
|
fireEvent.change(screen.getByTestId('filter-input'), {
|
||||||
|
target: { value: 'test' },
|
||||||
|
});
|
||||||
|
fireEvent.click(screen.getByTestId('clear-filter'));
|
||||||
|
expect((screen.getByTestId('filter-input') as HTMLInputElement).value).toBe(
|
||||||
|
''
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Displays a toggle for closed proposals if there are both closed governance proposals and closed upgrade proposals', () => {
|
||||||
|
render(
|
||||||
|
renderComponent(
|
||||||
|
[enactedProposalClosedLastWeek],
|
||||||
|
[closedProtocolUpgradeProposal]
|
||||||
|
)
|
||||||
|
);
|
||||||
|
expect(screen.getByTestId('toggle-closed-proposals')).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Does not display a toggle for closed proposals if there are only closed upgrade proposals', () => {
|
||||||
|
render(renderComponent([], [closedProtocolUpgradeProposal]));
|
||||||
|
expect(
|
||||||
|
screen.queryByTestId('toggle-closed-proposals')
|
||||||
|
).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Does not display a toggle for closed proposals if there are only closed governance proposals', () => {
|
||||||
|
render(renderComponent([enactedProposalClosedLastWeek]));
|
||||||
|
expect(
|
||||||
|
screen.queryByTestId('toggle-closed-proposals')
|
||||||
|
).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Does not display a toggle for closed proposals if the proposal filter is engaged', () => {
|
||||||
|
render(
|
||||||
|
renderComponent(
|
||||||
|
[enactedProposalClosedLastWeek],
|
||||||
|
[closedProtocolUpgradeProposal]
|
||||||
|
)
|
||||||
|
);
|
||||||
|
fireEvent.click(screen.getByTestId('proposal-filter-toggle'));
|
||||||
|
fireEvent.change(screen.getByTestId('filter-input'), {
|
||||||
|
target: { value: 'test' },
|
||||||
|
});
|
||||||
|
expect(
|
||||||
|
screen.queryByTestId('toggle-closed-proposals')
|
||||||
|
).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Displays closed governance proposals by default due to default for the toggle', () => {
|
||||||
|
render(
|
||||||
|
renderComponent(
|
||||||
|
[enactedProposalClosedLastWeek],
|
||||||
|
[closedProtocolUpgradeProposal]
|
||||||
|
)
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
screen.getByTestId('closed-governance-proposals')
|
||||||
|
).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Displays closed upgrade proposals when the toggle is clicked', () => {
|
||||||
|
render(
|
||||||
|
renderComponent(
|
||||||
|
[enactedProposalClosedLastWeek],
|
||||||
|
[closedProtocolUpgradeProposal]
|
||||||
|
)
|
||||||
|
);
|
||||||
|
fireEvent.click(screen.getByText('Network upgrades'));
|
||||||
|
expect(screen.getByTestId('closed-upgrade-proposals')).toBeInTheDocument();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
+106
-15
@@ -7,7 +7,12 @@ import { ProposalsListItem } from '../proposals-list-item';
|
|||||||
import { ProtocolUpgradeProposalsListItem } from '../protocol-upgrade-proposals-list-item/protocol-upgrade-proposals-list-item';
|
import { ProtocolUpgradeProposalsListItem } from '../protocol-upgrade-proposals-list-item/protocol-upgrade-proposals-list-item';
|
||||||
import { ProposalsListFilter } from '../proposals-list-filter';
|
import { ProposalsListFilter } from '../proposals-list-filter';
|
||||||
import Routes from '../../../routes';
|
import Routes from '../../../routes';
|
||||||
import { Button, VegaIcon, VegaIconNames } from '@vegaprotocol/ui-toolkit';
|
import {
|
||||||
|
Button,
|
||||||
|
Toggle,
|
||||||
|
VegaIcon,
|
||||||
|
VegaIconNames,
|
||||||
|
} from '@vegaprotocol/ui-toolkit';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import { ExternalLink } from '@vegaprotocol/ui-toolkit';
|
import { ExternalLink } from '@vegaprotocol/ui-toolkit';
|
||||||
import type { ProposalQuery } from '../../proposal/__generated__/Proposal';
|
import type { ProposalQuery } from '../../proposal/__generated__/Proposal';
|
||||||
@@ -54,6 +59,11 @@ export const orderByUpgradeBlockHeight = (
|
|||||||
['desc', 'desc']
|
['desc', 'desc']
|
||||||
);
|
);
|
||||||
|
|
||||||
|
enum ClosedProposalsViewOptions {
|
||||||
|
NetworkGovernance = 'networkGovernance',
|
||||||
|
NetworkUpgrades = 'networkUpgrades',
|
||||||
|
}
|
||||||
|
|
||||||
export const ProposalsList = ({
|
export const ProposalsList = ({
|
||||||
proposals,
|
proposals,
|
||||||
protocolUpgradeProposals,
|
protocolUpgradeProposals,
|
||||||
@@ -61,6 +71,10 @@ export const ProposalsList = ({
|
|||||||
}: ProposalsListProps) => {
|
}: ProposalsListProps) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [filterString, setFilterString] = useState('');
|
const [filterString, setFilterString] = useState('');
|
||||||
|
const [closedProposalsView, setClosedProposalsView] =
|
||||||
|
useState<ClosedProposalsViewOptions>(
|
||||||
|
ClosedProposalsViewOptions.NetworkGovernance
|
||||||
|
);
|
||||||
|
|
||||||
const sortedProposals: SortedProposalsProps = useMemo(() => {
|
const sortedProposals: SortedProposalsProps = useMemo(() => {
|
||||||
const initialSorting = proposals.reduce(
|
const initialSorting = proposals.reduce(
|
||||||
@@ -109,7 +123,7 @@ export const ProposalsList = ({
|
|||||||
);
|
);
|
||||||
return {
|
return {
|
||||||
open: orderByUpgradeBlockHeight(initialSorting.open),
|
open: orderByUpgradeBlockHeight(initialSorting.open),
|
||||||
closed: orderByUpgradeBlockHeight(initialSorting.closed).reverse(),
|
closed: orderByUpgradeBlockHeight(initialSorting.closed),
|
||||||
};
|
};
|
||||||
}, [protocolUpgradeProposals, lastBlockHeight]);
|
}, [protocolUpgradeProposals, lastBlockHeight]);
|
||||||
|
|
||||||
@@ -127,6 +141,7 @@ export const ProposalsList = ({
|
|||||||
marginBottom={false}
|
marginBottom={false}
|
||||||
title={t('pageTitleProposals')}
|
title={t('pageTitleProposals')}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{DocsLinks && (
|
{DocsLinks && (
|
||||||
<div className="xs:justify-self-end" data-testid="new-proposal-link">
|
<div className="xs:justify-self-end" data-testid="new-proposal-link">
|
||||||
<ExternalLink href={DocsLinks.PROPOSALS_GUIDE}>
|
<ExternalLink href={DocsLinks.PROPOSALS_GUIDE}>
|
||||||
@@ -140,6 +155,7 @@ export const ProposalsList = ({
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p className="mb-8">
|
<p className="mb-8">
|
||||||
{t(
|
{t(
|
||||||
`The Vega network is governed by the community. View active proposals, vote on them or propose changes to the network. Network upgrades are proposed and approved by validators.`
|
`The Vega network is governed by the community. View active proposals, vote on them or propose changes to the network. Network upgrades are proposed and approved by validators.`
|
||||||
@@ -152,11 +168,26 @@ export const ProposalsList = ({
|
|||||||
{t(`Find out more about Vega governance`)}
|
{t(`Find out more about Vega governance`)}
|
||||||
</ExternalLink>
|
</ExternalLink>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
{proposals.length > 0 && (
|
{proposals.length > 0 && (
|
||||||
<ProposalsListFilter setFilterString={setFilterString} />
|
<ProposalsListFilter
|
||||||
|
filterString={filterString}
|
||||||
|
setFilterString={(value) => {
|
||||||
|
setFilterString(value);
|
||||||
|
if (value.length > 0) {
|
||||||
|
// If the filter is engaged, ensure the user is viewing governance proposals,
|
||||||
|
// as network upgrades do not have IDs to filter by and will be excluded.
|
||||||
|
setClosedProposalsView(
|
||||||
|
ClosedProposalsViewOptions.NetworkGovernance
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<section className="-mx-4 p-4 mb-8 bg-vega-dark-100">
|
<section className="-mx-4 p-4 mb-8 bg-vega-dark-100">
|
||||||
<SubHeading title={t('openProposals')} />
|
<SubHeading title={t('openProposals')} />
|
||||||
|
|
||||||
{sortedProposals.open.length > 0 ||
|
{sortedProposals.open.length > 0 ||
|
||||||
sortedProtocolUpgradeProposals.open.length > 0 ? (
|
sortedProtocolUpgradeProposals.open.length > 0 ? (
|
||||||
<ul data-testid="open-proposals">
|
<ul data-testid="open-proposals">
|
||||||
@@ -166,6 +197,7 @@ export const ProposalsList = ({
|
|||||||
proposal={proposal}
|
proposal={proposal}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
{sortedProposals.open.filter(filterPredicate).map((proposal) => (
|
{sortedProposals.open.filter(filterPredicate).map((proposal) => (
|
||||||
<ProposalsListItem key={proposal?.id} proposal={proposal} />
|
<ProposalsListItem key={proposal?.id} proposal={proposal} />
|
||||||
))}
|
))}
|
||||||
@@ -176,22 +208,81 @@ export const ProposalsList = ({
|
|||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
</section>
|
</section>
|
||||||
<section>
|
|
||||||
|
<section className="relative">
|
||||||
<SubHeading title={t('closedProposals')} />
|
<SubHeading title={t('closedProposals')} />
|
||||||
{sortedProposals.closed.length > 0 ||
|
{sortedProposals.closed.length > 0 ||
|
||||||
sortedProtocolUpgradeProposals.closed.length > 0 ? (
|
sortedProtocolUpgradeProposals.closed.length > 0 ? (
|
||||||
<ul data-testid="closed-proposals">
|
<>
|
||||||
{sortedProtocolUpgradeProposals.closed.map((proposal) => (
|
{
|
||||||
<ProtocolUpgradeProposalsListItem
|
// We need both the closed proposals and closed protocol upgrade
|
||||||
key={proposal.upgradeBlockHeight}
|
// proposals to be present for there to be a toggle. It also gets
|
||||||
proposal={proposal}
|
// hidden if the user has filtered the list, as the upgrade proposals
|
||||||
/>
|
// do not have the necessary fields for filtering.
|
||||||
))}
|
sortedProposals.closed.length > 0 &&
|
||||||
|
sortedProtocolUpgradeProposals.closed.length > 0 &&
|
||||||
|
filterString.length < 1 && (
|
||||||
|
<div
|
||||||
|
className="grid w-full justify-end xl:-mt-12 pb-6"
|
||||||
|
data-testid="toggle-closed-proposals"
|
||||||
|
>
|
||||||
|
<div className="w-[440px]">
|
||||||
|
<Toggle
|
||||||
|
name="closed-proposals-toggle"
|
||||||
|
toggles={[
|
||||||
|
{
|
||||||
|
label: t(
|
||||||
|
ClosedProposalsViewOptions.NetworkGovernance
|
||||||
|
),
|
||||||
|
value: ClosedProposalsViewOptions.NetworkGovernance,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t(
|
||||||
|
ClosedProposalsViewOptions.NetworkUpgrades
|
||||||
|
),
|
||||||
|
value: ClosedProposalsViewOptions.NetworkUpgrades,
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
checkedValue={closedProposalsView}
|
||||||
|
onChange={(e) =>
|
||||||
|
setClosedProposalsView(
|
||||||
|
e.target.value as ClosedProposalsViewOptions
|
||||||
|
)
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
{sortedProposals.closed.filter(filterPredicate).map((proposal) => (
|
<ul data-testid="closed-proposals">
|
||||||
<ProposalsListItem key={proposal?.id} proposal={proposal} />
|
{closedProposalsView ===
|
||||||
))}
|
ClosedProposalsViewOptions.NetworkUpgrades && (
|
||||||
</ul>
|
<div data-testid="closed-upgrade-proposals">
|
||||||
|
{sortedProtocolUpgradeProposals.closed.map((proposal) => (
|
||||||
|
<ProtocolUpgradeProposalsListItem
|
||||||
|
key={proposal.upgradeBlockHeight}
|
||||||
|
proposal={proposal}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{closedProposalsView ===
|
||||||
|
ClosedProposalsViewOptions.NetworkGovernance && (
|
||||||
|
<div data-testid="closed-governance-proposals">
|
||||||
|
{sortedProposals.closed
|
||||||
|
.filter(filterPredicate)
|
||||||
|
.map((proposal) => (
|
||||||
|
<ProposalsListItem
|
||||||
|
key={proposal?.id}
|
||||||
|
proposal={proposal}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</ul>
|
||||||
|
</>
|
||||||
) : (
|
) : (
|
||||||
<p className="mb-0" data-testid="no-closed-proposals">
|
<p className="mb-0" data-testid="no-closed-proposals">
|
||||||
{t('noClosedProposals')}
|
{t('noClosedProposals')}
|
||||||
|
|||||||
+4
-1
@@ -23,7 +23,10 @@ export const RejectedProposalsList = ({ proposals }: ProposalsListProps) => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Heading title={t('pageTitleRejectedProposals')} />
|
<Heading title={t('pageTitleRejectedProposals')} />
|
||||||
<ProposalsListFilter setFilterString={setFilterString} />
|
<ProposalsListFilter
|
||||||
|
filterString={filterString}
|
||||||
|
setFilterString={setFilterString}
|
||||||
|
/>
|
||||||
<section>
|
<section>
|
||||||
{proposals.length > 0 ? (
|
{proposals.length > 0 ? (
|
||||||
<ul data-testid="rejected-proposals">
|
<ul data-testid="rejected-proposals">
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import * as Schema from '@vegaprotocol/types';
|
import * as Schema from '@vegaprotocol/types';
|
||||||
|
import { ProtocolUpgradeProposalStatus } from '@vegaprotocol/types';
|
||||||
import BigNumber from 'bignumber.js';
|
import BigNumber from 'bignumber.js';
|
||||||
import * as faker from 'faker';
|
import * as faker from 'faker';
|
||||||
import isArray from 'lodash/isArray';
|
import isArray from 'lodash/isArray';
|
||||||
@@ -6,6 +7,40 @@ import mergeWith from 'lodash/mergeWith';
|
|||||||
|
|
||||||
import type { PartialDeep } from 'type-fest';
|
import type { PartialDeep } from 'type-fest';
|
||||||
import type { ProposalQuery } from '../proposal/__generated__/Proposal';
|
import type { ProposalQuery } from '../proposal/__generated__/Proposal';
|
||||||
|
import type { ProtocolUpgradeProposalFieldsFragment } from '@vegaprotocol/proposals';
|
||||||
|
|
||||||
|
export function generateProtocolUpgradeProposal(
|
||||||
|
override: PartialDeep<ProtocolUpgradeProposalFieldsFragment> = {}
|
||||||
|
): ProtocolUpgradeProposalFieldsFragment {
|
||||||
|
const defaultProposal: ProtocolUpgradeProposalFieldsFragment = {
|
||||||
|
__typename: 'ProtocolUpgradeProposal',
|
||||||
|
upgradeBlockHeight: '3917600',
|
||||||
|
vegaReleaseTag: 'v0.71.6',
|
||||||
|
approvers: [
|
||||||
|
'0ac70c4ccc7f961614fe49b93e639ddf916269b7dcf8391db264cefeadf5a6b7',
|
||||||
|
'63a1755006642bda9ab1bfa84660f944d30a113d1609590ca90c50b24aede472',
|
||||||
|
'68ed0770fc3e67b74d09c05443243d27e29a8513dc0e8628beb98338cd509159',
|
||||||
|
'a6e6f7daf8610f9242ab6ab46b394f6fb79cf9533d48051ca7a2f142b8b700a8',
|
||||||
|
'aad2be546ba83cbcab4c1d57ebe22b4a942f294f54333f1a7c2c9ef0e9fe19bb',
|
||||||
|
'acc55c7205cfcd5480e0235acab56a01487a39dc858a641fc04df6ba016870ee',
|
||||||
|
'b7e500deb24cc19bd6ebb2311997f0904ca0d9e51541249e9650ab41fd8ac376',
|
||||||
|
'cf295dff6d9506e8a905d168a44dfcff2f64bd0a6671783a469f8322959c62e2',
|
||||||
|
'f4686749895bf51c6df4092ef6be4279c384a3c380c24ea7a2fd20afc602a35d',
|
||||||
|
],
|
||||||
|
status:
|
||||||
|
ProtocolUpgradeProposalStatus.PROTOCOL_UPGRADE_PROPOSAL_STATUS_APPROVED,
|
||||||
|
};
|
||||||
|
|
||||||
|
return mergeWith<
|
||||||
|
ProtocolUpgradeProposalFieldsFragment,
|
||||||
|
PartialDeep<ProtocolUpgradeProposalFieldsFragment>
|
||||||
|
>(defaultProposal, override, (objValue, srcValue) => {
|
||||||
|
if (!isArray(objValue)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return srcValue;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export function generateProposal(
|
export function generateProposal(
|
||||||
override: PartialDeep<ProposalQuery['proposal']> = {}
|
override: PartialDeep<ProposalQuery['proposal']> = {}
|
||||||
|
|||||||
Reference in New Issue
Block a user