Skip to content

Commit 54e6e0d

Browse files
committed
test: submit valid budget draft and proposal
1 parent 7344adb commit 54e6e0d

File tree

4 files changed

+196
-7
lines changed

4 files changed

+196
-7
lines changed

tests/govtool-frontend/playwright/lib/fixtures/budgetProposal.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ export const test = base.extend<TestOptions>({
2121
);
2222
await budgetProposalCreationPage.goto();
2323

24-
const proposalId = await budgetProposalCreationPage.createBudgetProposal();
24+
const { proposalId } =
25+
await budgetProposalCreationPage.createBudgetProposal();
2526

2627
const budgetProposalDetailsPage = new BudgetDiscussionDetailsPage(
2728
budgetProposalPage

tests/govtool-frontend/playwright/lib/pages/budgetDiscussionDetailsPage.ts

Lines changed: 134 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import { expect, Page } from "@playwright/test";
2-
import { CommentResponse } from "@types";
2+
import {
3+
BudgetProposalProps,
4+
CommentResponse,
5+
} from "@types";
36
import environments from "lib/constants/environments";
47

58
export default class BudgetDiscussionDetailsPage {
@@ -17,11 +20,57 @@ export default class BudgetDiscussionDetailsPage {
1720
"change-poll-vote-yes-button"
1821
);
1922
readonly verifyIdentityBtn = this.page.getByTestId("verify-identity-button");
23+
readonly readMoreBtn = this.page.getByTestId("read-more-button");
2024

2125
// content
2226
readonly copyLinkText = this.page.getByTestId("copy-link-text");
2327
readonly pollVoteCard = this.page.getByTestId("poll-vote-card");
2428
readonly totalComments = this.page.getByTestId("total-comments");
29+
readonly linkTextContent = this.page.getByTestId("link-0-text-content");
30+
readonly linkUrlContent = this.page.getByTestId("link-0-url-content");
31+
readonly budgetDiscussionTypeContent = this.page
32+
.getByTestId("budget-discussion-type")
33+
.first();
34+
readonly publicProposalChampionContent = this.page.getByTestId(
35+
"public-proposal-champion"
36+
);
37+
readonly socialHandlesContent = this.page.getByTestId("social-handles");
38+
readonly problemStatementContent = this.page.getByTestId("problem-statement");
39+
readonly proposalBenefitsContent = this.page.getByTestId("problem-benefit");
40+
readonly productRoadMapContent = this.page.getByTestId("product-roadmap");
41+
readonly alignProposalComittesContent = this.page.getByTestId(
42+
"align-proposal-committees"
43+
);
44+
readonly evidenceContent = this.page.getByTestId("evidence");
45+
readonly proposalNameContent = this.page.getByTestId("proposal-name");
46+
readonly proposalDescriptionContent = this.page.getByTestId(
47+
"proposal-description"
48+
);
49+
readonly proposalKeyDependenciesContent = this.page.getByTestId(
50+
"proposal-key-dependencies"
51+
);
52+
readonly milestonesContent = this.page.getByTestId("proposal-milestone");
53+
readonly proposalResourcesAndEstimates = this.page.getByTestId(
54+
"proposal-resources-&-duration-estimates"
55+
);
56+
readonly projectExperienceContent =
57+
this.page.getByTestId("project-experience");
58+
readonly proposalContractingContent = this.page.getByTestId(
59+
"proposal-contracting"
60+
);
61+
readonly costingAmountContent = this.page.getByTestId("consting-amount"); // BUG typo
62+
readonly costingConversionRateContent = this.page.getByTestId(
63+
"costing-conversion-rate"
64+
);
65+
readonly constingPreferedCurrencyContent = this.page.getByTestId(
66+
"costing-preferred-currency"
67+
);
68+
readonly costingPreferedCurrencyAmountContent = this.page.getByTestId(
69+
"costing-prefereed-currency-amount"
70+
);
71+
readonly costBreakdownContent = this.page.getByTestId("cost-breakdown");
72+
readonly includeAsAuditorContent =
73+
this.page.getByTestId("include-as-auditor");
2574

2675
// Input
2776
readonly commentInput = this.page.getByTestId("comment-input");
@@ -93,4 +142,88 @@ export default class BudgetDiscussionDetailsPage {
93142
await this.page.getByTestId("delete-proposal").click();
94143
await this.page.getByTestId("delete-proposal-yes-button").click();
95144
}
145+
146+
async validateProposalDetails(budgetProposal: BudgetProposalProps) {
147+
await this.readMoreBtn.click();
148+
149+
// proposal ownership validation
150+
await expect(this.publicProposalChampionContent).toHaveText(
151+
budgetProposal.proposalOwnership.publicChampion
152+
);
153+
await expect(this.socialHandlesContent).toHaveText(
154+
budgetProposal.proposalOwnership.contactDetails
155+
);
156+
157+
// problem statement and benefits validation
158+
await expect(this.problemStatementContent).toHaveText(
159+
budgetProposal.problemStatementAndBenefits.problemStatement
160+
);
161+
await expect(this.proposalBenefitsContent).toHaveText(
162+
budgetProposal.problemStatementAndBenefits.proposalBenefits
163+
);
164+
await expect(this.productRoadMapContent).toHaveText(
165+
budgetProposal.problemStatementAndBenefits.roadmapName
166+
);
167+
await expect(this.budgetDiscussionTypeContent).toHaveText(
168+
budgetProposal.problemStatementAndBenefits.budgetDiscussionType
169+
);
170+
await expect(this.alignProposalComittesContent).toHaveText(
171+
budgetProposal.problemStatementAndBenefits.committeeAlignmentType
172+
);
173+
await expect(this.evidenceContent).toHaveText(
174+
budgetProposal.problemStatementAndBenefits.suplimentaryEndorsement
175+
);
176+
177+
// proposal details validation
178+
await expect(this.proposalNameContent).toHaveText(
179+
budgetProposal.proposalDetails.proposalName
180+
);
181+
await expect(this.proposalDescriptionContent).toHaveText(
182+
budgetProposal.proposalDetails.proposalDescription
183+
);
184+
await expect(this.proposalKeyDependenciesContent).toHaveText(
185+
budgetProposal.proposalDetails.proposalKeyDependencies
186+
);
187+
await expect(this.milestonesContent).toHaveText(
188+
budgetProposal.proposalDetails.milestones
189+
);
190+
await expect(this.proposalResourcesAndEstimates).toHaveText(
191+
budgetProposal.proposalDetails.teamSizeAndDuration
192+
);
193+
await expect(this.projectExperienceContent).toHaveText(
194+
budgetProposal.proposalDetails.previousExperience
195+
);
196+
await expect(this.proposalContractingContent).toHaveText(
197+
budgetProposal.proposalDetails.contracting
198+
);
199+
200+
// costing validation
201+
await expect(this.costingAmountContent).toHaveText(
202+
budgetProposal.costing.adaAmount.toString()
203+
);
204+
await expect(this.costingConversionRateContent).toHaveText(
205+
budgetProposal.costing.usaToAdaCnversionRate.toString()
206+
);
207+
await expect(this.constingPreferedCurrencyContent).toHaveText(
208+
budgetProposal.costing.preferredCurrency
209+
);
210+
await expect(this.costingPreferedCurrencyAmountContent).toHaveText(
211+
budgetProposal.costing.AmountInPreferredCurrency.toString()
212+
);
213+
await expect(this.costBreakdownContent).toHaveText(
214+
budgetProposal.costing.costBreakdown
215+
);
216+
217+
// further information validation
218+
await expect(this.linkTextContent).toHaveText(
219+
budgetProposal.furtherInformation[0].prop_link_text
220+
);
221+
222+
// administration and auditing validation
223+
await expect(this.includeAsAuditorContent).toHaveText(
224+
budgetProposal.administrationAndAuditing.intersectAdministration
225+
? "Yes"
226+
: "No"
227+
);
228+
}
96229
}

tests/govtool-frontend/playwright/lib/pages/budgetDiscussionSubmissionPage.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,10 @@ export default class BudgetDiscussionSubmissionPage {
545545
return fillAllDetails ? budgetProposal : budgetProposal.contactInformation;
546546
}
547547

548-
async createBudgetProposal(): Promise<number> {
548+
async createBudgetProposal(): Promise<{
549+
proposalId: number;
550+
proposalDetails: BudgetProposalProps;
551+
}> {
549552
const budgetProposalRequest: BudgetProposalProps =
550553
this.generateValidBudgetProposalInformation();
551554

@@ -558,6 +561,9 @@ export default class BudgetDiscussionSubmissionPage {
558561
});
559562

560563
const currentPageUrl = this.page.url();
561-
return extractProposalIdFromUrl(currentPageUrl);
564+
return {
565+
proposalId: extractProposalIdFromUrl(currentPageUrl),
566+
proposalDetails: budgetProposalRequest,
567+
};
562568
}
563569
}

tests/govtool-frontend/playwright/tests/12-proposal-budget-submission/proposalBudgetSubmission.loggedin.spec.ts

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
import {
22
budgetProposal01Wallet,
33
budgetProposal02Wallet,
4+
budgetProposal03Wallet,
5+
budgetProposal04Wallet,
46
} from "@constants/staticWallets";
57
import { test } from "@fixtures/budgetProposal";
68
import { setAllureEpic } from "@helpers/allure";
79
import { createNewPageWithWallet } from "@helpers/page";
10+
import BudgetDiscussionDetailsPage from "@pages/budgetDiscussionDetailsPage";
811
import BudgetDiscussionSubmissionPage from "@pages/budgetDiscussionSubmissionPage";
912
import { expect } from "@playwright/test";
10-
import { BudgetProposalContactInformationProps } from "@types";
13+
import {
14+
BudgetProposalContactInformationProps,
15+
BudgetProposalProps,
16+
} from "@types";
1117

1218
test.beforeEach(async () => {
1319
await setAllureEpic("12. Proposal Budget Submission");
@@ -97,5 +103,48 @@ test("12C. Should save and view draft proposal", async ({ browser }) => {
97103
);
98104
});
99105

100-
test("12H. Should submit a valid budget proposal", async ({}) => {});
101-
test("12I. Should submit a valid draft budget proposal", async ({}) => {});
106+
test("12H. Should submit a valid budget proposal", async ({ browser }) => {
107+
const page = await createNewPageWithWallet(browser, {
108+
storageState: ".auth/budgetProposal03.json",
109+
wallet: budgetProposal03Wallet,
110+
});
111+
const budgetSubmissionPage = new BudgetDiscussionSubmissionPage(page);
112+
await budgetSubmissionPage.goto();
113+
const { proposalId, proposalDetails } =
114+
await budgetSubmissionPage.createBudgetProposal();
115+
116+
const budgetDiscussionDetailsPage = new BudgetDiscussionDetailsPage(page);
117+
await budgetDiscussionDetailsPage.goto(proposalId);
118+
119+
await budgetDiscussionDetailsPage.validateProposalDetails(proposalDetails);
120+
121+
await budgetDiscussionDetailsPage.deleteProposal();
122+
});
123+
124+
test("12I. Should submit a valid draft budget proposal", async ({
125+
browser,
126+
}) => {
127+
test.slow();
128+
const page = await createNewPageWithWallet(browser, {
129+
storageState: ".auth/budgetProposal04.json",
130+
wallet: budgetProposal04Wallet,
131+
});
132+
133+
const budgetSubmissionPage = new BudgetDiscussionSubmissionPage(page);
134+
await budgetSubmissionPage.goto();
135+
const draftContact = (await budgetSubmissionPage.createDraftBudgetProposal(
136+
true
137+
)) as BudgetProposalProps;
138+
139+
await budgetSubmissionPage.viewLastDraft();
140+
141+
for (let i = 0; i < 8; i++) {
142+
await budgetSubmissionPage.continueBtn.click();
143+
}
144+
await budgetSubmissionPage.submitBtn.click();
145+
146+
const budgetDiscussionDetailsPage = new BudgetDiscussionDetailsPage(page);
147+
await budgetDiscussionDetailsPage.validateProposalDetails(draftContact);
148+
149+
await budgetDiscussionDetailsPage.deleteProposal();
150+
});

0 commit comments

Comments
 (0)