Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,110 changes: 0 additions & 1,110 deletions tests/govtool-frontend/playwright/lib/_mock/infoProposedGAs.json

This file was deleted.

1,362 changes: 0 additions & 1,362 deletions tests/govtool-frontend/playwright/lib/_mock/treasuryProposedGAs.json

This file was deleted.

9 changes: 9 additions & 0 deletions tests/govtool-frontend/playwright/lib/constants/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,12 @@ export const PROPOSAL_TYPE_FILTERS = [
export const BOOTSTRAP_PROPOSAL_TYPE_FILTERS = ["Info Action"];

export const PROPOSAL_STATUS_FILTER = ["Submitted for vote", "Active proposal"];

export const guardrailsScript = {
type: "PlutusScriptV3",
description: "",
cborHex: "46450101004981",
};

export const guardrailsScriptHash =
"914d97d63e2b7113465739faddd82362b1deaeedbcc4d01016c35c6e";
9 changes: 9 additions & 0 deletions tests/govtool-frontend/playwright/lib/helpers/metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,12 @@ export async function uploadMetadataAndGetJsonHash() {
);
return { dataHash, url };
}

export async function uploadScriptAndGenerateUrl(payload: Object) {
const data = JSON.stringify(payload);
const jsonData = JSON.parse(data);
return await metadataBucketService.uploadMetadata(
"guardrail-script",
jsonData
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,28 @@ export default class GovernanceActionDetailsPage {
}
}

async getDRepTotalAbstainVoted(
proposal: IProposal,
metricsResponsePromise: Promise<Response>
): Promise<number | undefined> {
const metricsResponses = await Promise.resolve(metricsResponsePromise);
const alwaysAbstainVotingPower = await metricsResponses
.json()
.then((data) => data.alwaysAbstainVotingPower);

if (
alwaysAbstainVotingPower &&
typeof alwaysAbstainVotingPower === "number"
) {
const totalAbstainVoted =
alwaysAbstainVotingPower + proposal.dRepAbstainVotes;

return totalAbstainVoted;
} else {
return proposal.dRepAbstainVotes;
}
}

async downloadVoteMetadata() {
const download: Download = await this.page.waitForEvent("download");
return downloadMetadata(download);
Expand Down
101 changes: 66 additions & 35 deletions tests/govtool-frontend/playwright/lib/pages/proposalSubmissionPage.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
import environments from "@constants/environments";
import { guardrailsScript, guardrailsScriptHash } from "@constants/index";
import { proposal04Wallet } from "@constants/staticWallets";
import { faker } from "@faker-js/faker";
import { isBootStrapingPhase } from "@helpers/cardano";
import { ShelleyWallet } from "@helpers/crypto";
import { expectWithInfo } from "@helpers/exceptionHandler";
import { calculateHash, downloadMetadata } from "@helpers/metadata";
import {
downloadMetadata,
uploadScriptAndGenerateUrl,
} from "@helpers/metadata";
import { extractProposalIdFromUrl } from "@helpers/string";
import { invalid } from "@mock/index";
import { invalid, valid } from "@mock/index";
import { Download, Locator, Page, expect } from "@playwright/test";
import metadataBucketService from "@services/metadataBucketService";
import {
Expand Down Expand Up @@ -66,9 +70,9 @@ export default class ProposalSubmissionPage {
readonly createNewProposalBtn = this.page.getByTestId(
"create-new-proposal-button"
);
readonly guardrailsScriptCheckbox = this.page.getByLabel(
"Do you want to provide new"
); // BUG missing test id
readonly guardrailsScriptCheckbox = this.page.getByTestId(
"chb-prop-have-guardrails-script"
);

// input fields
readonly titleInput = this.page.getByTestId("title-input");
Expand Down Expand Up @@ -172,7 +176,9 @@ export default class ProposalSubmissionPage {
await this.treasuryBtn.click();
} else {
await this.updateTheConstitutionBtn.click();
await this.guardrailsScriptCheckbox.click();
if (governanceProposal.has_guardrails) {
await this.guardrailsScriptCheckbox.click();
}
}

await this.fillupFormWithTypeSelected(governanceProposal);
Expand All @@ -199,12 +205,14 @@ export default class ProposalSubmissionPage {
governanceProposal.prop_constitution_url
);

await this.guardrailsScriptUrlInput.fill(
governanceProposal.prop_guardrails_script_url
);
await this.guardrailsScriptHashInput.fill(
governanceProposal.prop_guardrails_script_hash
);
if (governanceProposal.has_guardrails) {
await this.guardrailsScriptUrlInput.fill(
governanceProposal.prop_guardrails_script_url
);
await this.guardrailsScriptHashInput.fill(
governanceProposal.prop_guardrails_script_hash
);
}
}

async fillProposalLinks(proposal_links: Array<ProposalLink>) {
Expand Down Expand Up @@ -358,11 +366,19 @@ export default class ProposalSubmissionPage {
await expect(this.continueBtn).toBeDisabled();
}

generateValidProposalFormFields(
proposalType: ProposalType,
is_draft?: boolean,
receivingAddress?: string
) {
async generateValidProposalFormFields({
proposalType,
is_draft,
receivingAddress,
hasGuardrails = true,
forValidation = false,
}: {
proposalType: ProposalType;
is_draft?: boolean;
receivingAddress?: string;
hasGuardrails?: boolean;
forValidation?: boolean;
}) {
const proposal: ProposalCreateRequest = {
prop_name: faker.lorem.sentence(6),
prop_abstract: faker.lorem.words(5),
Expand All @@ -376,6 +392,7 @@ export default class ProposalSubmissionPage {
},
],
gov_action_type_id: Object.values(ProposalType).indexOf(proposalType),
has_guardrails: hasGuardrails,
is_draft: !!is_draft,
};

Expand All @@ -386,16 +403,28 @@ export default class ProposalSubmissionPage {
.toString());
}
if (proposalType === ProposalType.updatesToTheConstitution) {
proposal.prop_constitution_url = faker.internet.url();
proposal.prop_guardrails_script_url = faker.internet.url();
proposal.prop_guardrails_script_hash = calculateHash(
faker.lorem.paragraph()
);
proposal.prop_constitution_url = forValidation
? valid.url()
: environments.metadataBucketUrl + "/data.jsonId";

if (hasGuardrails) {
if (!forValidation) {
const url = await uploadScriptAndGenerateUrl(guardrailsScript);
proposal.prop_guardrails_script_url = url;
proposal.prop_guardrails_script_hash = guardrailsScriptHash;
} else {
proposal.prop_guardrails_script_url = valid.url();
proposal.prop_guardrails_script_hash = faker.string.alphanumeric(64);
}
}
}
return proposal;
}

generateInValidProposalFormFields(proposalType: ProposalType) {
generateInValidProposalFormFields(
proposalType: ProposalType,
hasGuardrails: boolean = true
) {
const proposal: ProposalCreateRequest = {
prop_name: invalid.proposalTitle(),
prop_abstract: invalid.paragraph(2510),
Expand All @@ -409,6 +438,7 @@ export default class ProposalSubmissionPage {
},
],
gov_action_type_id: Object.values(ProposalType).indexOf(proposalType),
has_guardrails: hasGuardrails,
is_draft: false,
};

Expand Down Expand Up @@ -437,11 +467,12 @@ export default class ProposalSubmissionPage {
);

const proposalRequest: ProposalCreateRequest =
this.generateValidProposalFormFields(
(await isBootStrapingPhase()) ? ProposalType.info : proposalType,
false,
receivingAddr
);
await this.generateValidProposalFormFields({
proposalType: (await isBootStrapingPhase())
? ProposalType.info
: proposalType,
receivingAddress: receivingAddr,
});
await this.fillupForm(proposalRequest);
await this.continueBtn.click();
await this.submitBtn.click();
Expand All @@ -457,13 +488,13 @@ export default class ProposalSubmissionPage {
await this.goto();
await this.addLinkBtn.click();

const proposalFormValue = this.generateValidProposalFormFields(
proposalType,
true,
ShelleyWallet.fromJson(proposal04Wallet).rewardAddressBech32(
environments.networkId
)
);
const proposalFormValue = await this.generateValidProposalFormFields({
proposalType: proposalType,
is_draft: true,
receivingAddress: ShelleyWallet.fromJson(
proposal04Wallet
).rewardAddressBech32(environments.networkId),
});
await this.fillupForm(proposalFormValue);

await this.saveDraftBtn.click();
Expand Down
1 change: 1 addition & 0 deletions tests/govtool-frontend/playwright/lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ export type ProposalCreateRequest = {
prop_constitution_url?: string;
prop_guardrails_script_url?: string;
prop_guardrails_script_hash?: string;
has_guardrails?: boolean;
is_draft: boolean;
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,10 +184,11 @@ test.describe("Check vote count", () => {
`${proposalToCheck.txHash}#${proposalToCheck.index}`
);

const dRepNotVoted = await govActionDetailsPage.getDRepNotVoted(
proposalToCheck,
metricsResponsePromise
);
const dRepTotalAbstainVote =
await govActionDetailsPage.getDRepTotalAbstainVoted(
proposalToCheck,
metricsResponsePromise
);

await govActionDetailsPage.showVotesBtn.click();

Expand All @@ -197,17 +198,11 @@ test.describe("Check vote count", () => {
`₳ ${correctVoteAdaFormat(proposalToCheck.dRepYesVotes)}`
);
await expect(govActionDetailsPage.dRepAbstainVotes).toHaveText(
`₳ ${correctVoteAdaFormat(proposalToCheck.dRepAbstainVotes)}`
`₳ ${correctVoteAdaFormat(dRepTotalAbstainVote)}`
);
await expect(govActionDetailsPage.dRepNoVotes).toHaveText(
`₳ ${correctVoteAdaFormat(proposalToCheck.dRepNoVotes)}`
);

if (dRepNotVoted) {
await expect(govActionDetailsPage.dRepNotVoted).toHaveText(
`₳ ${correctVoteAdaFormat(dRepNotVoted)}`
);
}
}

// check sPos votes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,6 @@ test("4K. Should display correct vote counts on governance details page for disc
`${proposalToCheck.txHash}#${proposalToCheck.index}`
);

const dRepNotVoted = await govActionDetailsPage.getDRepNotVoted(
proposalToCheck,
metricsResponsePromise
);

// check dRep votes
if (await areDRepVoteTotalsDisplayed(proposalToCheck)) {
await expect(govActionDetailsPage.dRepYesVotes).toHaveText(
Expand All @@ -91,12 +86,6 @@ test("4K. Should display correct vote counts on governance details page for disc
await expect(govActionDetailsPage.dRepNoVotes).toHaveText(
`₳ ${correctVoteAdaFormat(proposalToCheck.dRepNoVotes)}`
);

if (dRepNotVoted) {
await expect(govActionDetailsPage.dRepNotVoted).toHaveText(
`₳ ${correctVoteAdaFormat(dRepNotVoted)}`
);
}
}
// check sPos votes
if (await areSPOVoteTotalsDisplayed(proposalToCheck)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,11 @@ test.describe("Proposal created logged state", () => {
await ShelleyWallet.generate()
).rewardAddressBech32(environments.networkId);
const formFields: ProposalCreateRequest =
proposalSubmissionPage.generateValidProposalFormFields(
type,
false,
rewardAddressBech32
);
await proposalSubmissionPage.generateValidProposalFormFields({
proposalType: type,
receivingAddress: rewardAddressBech32,
forValidation: true,
});
await proposalSubmissionPage.validateForm(formFields);
}

Expand Down Expand Up @@ -141,11 +141,10 @@ test.describe("Proposal created logged state", () => {
wallet
).rewardAddressBech32(environments.networkId);
const proposal: ProposalCreateRequest =
proposalSubmissionPage.generateValidProposalFormFields(
type,
false,
stakeAddressBech32
);
await proposalSubmissionPage.generateValidProposalFormFields({
proposalType: type,
receivingAddress: stakeAddressBech32,
});

await proposalSubmissionPage.fillupForm(proposal);
await proposalSubmissionPage.continueBtn.click();
Expand Down Expand Up @@ -195,11 +194,10 @@ test.describe("Proposal created logged state", () => {
proposal01Wallet
).rewardAddressBech32(environments.networkId);
const proposal: ProposalCreateRequest =
proposalSubmissionPage.generateValidProposalFormFields(
type,
false,
rewardAddressBech32
);
await proposalSubmissionPage.generateValidProposalFormFields({
proposalType: type,
receivingAddress: rewardAddressBech32,
});

await proposalSubmissionPage.fillupForm(proposal);
await proposalSubmissionPage.continueBtn.click();
Expand Down
Loading