From 709ce48c40afd9d97240159644e2563a5cf56ce8 Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 14 May 2025 11:39:50 +0545 Subject: [PATCH 01/17] fix: remove oldest report only if report count is more than 10 --- .github/scripts/remove_oldest_report.sh | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/.github/scripts/remove_oldest_report.sh b/.github/scripts/remove_oldest_report.sh index 566aed1c7..684d768ac 100644 --- a/.github/scripts/remove_oldest_report.sh +++ b/.github/scripts/remove_oldest_report.sh @@ -2,14 +2,21 @@ if [ -d "gh-pages/$REPORT_NAME" ]; then cd gh-pages/$REPORT_NAME - # Find the oldest numerical directory - oldest_dir=$(find . -maxdepth 1 -type d -regex './[0-9]+' | sort -n | head -1) - if [ -n "$oldest_dir" ]; then - echo "Removing oldest report directory: $oldest_dir" - rm -rf "$oldest_dir" + + # Count the number of numerical directories + dir_count=$(find . -maxdepth 1 -type d -regex './[0-9]+' | wc -l) + + if [ "$dir_count" -gt 10 ]; then + # Find the oldest numerical directory + oldest_dir=$(find . -maxdepth 1 -type d -regex './[0-9]+' | sort -n | head -1) + if [ -n "$oldest_dir" ]; then + echo "More than 10 report directories exist. Removing oldest: $oldest_dir" + rm -rf "$oldest_dir" + fi else - echo "No report directories found to remove" + echo "Only $dir_count report directories exist (threshold: 10). Nothing to remove." fi + cd ../../ else echo "Report directory does not exist yet" From 9649e97940bce9bb964f8022e0bac47aab9a6084 Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 14 May 2025 11:41:44 +0545 Subject: [PATCH 02/17] feat: add test schedule for nightly workflows and update base urls --- .github/workflows/test_backend.yml | 10 ++++++++-- .github/workflows/test_integration_playwright.yml | 7 +++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test_backend.yml b/.github/workflows/test_backend.yml index accc4f99f..648dc1658 100644 --- a/.github/workflows/test_backend.yml +++ b/.github/workflows/test_backend.yml @@ -16,6 +16,7 @@ on: - "sanchogov.tools/api" - "staging.govtool.byron.network/api" - "govtool.cardanoapi.io/api" + - "be.preview.gov.tools" - "z6b8d2f7a-zca4a4c45-gtw.z937eb260.rustrocks.fr" - "z78acf3c2-z5575152b-gtw.z937eb260.rustrocks.fr" - "be.gov.tools" @@ -28,6 +29,7 @@ on: - "preview" - "mainnet" - "preprod" + workflow_run: workflows: ["Build and deploy GovTool test stack"] types: [completed] @@ -35,6 +37,9 @@ on: - test - infra/test-chores + schedule: + - cron: "0 0 * * *" # 12AM UTC + concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: false @@ -115,7 +120,7 @@ jobs: path: gh-pages repository: ${{vars.GH_PAGES}} ssh-key: ${{ secrets.DEPLOY_KEY }} - + - name: Remove oldest report to save space if: ${{success()}} run: | @@ -128,6 +133,7 @@ jobs: run: | chmod +x .github/scripts/register_report.sh .github/scripts/register_report.sh + - if: steps.register-project.outputs.project_exists != 'true' uses: JamesIves/github-pages-deploy-action@v4 with: @@ -191,7 +197,7 @@ jobs: GITHUB_TOKEN: ${{ github.token }} env: - BASE_URL: https://${{inputs.deployment || 'govtool.cardanoapi.io/api' }} + BASE_URL: https://${{github.event.schedule && 'be.preview.gov.tools' || inputs.deployment || 'govtool.cardanoapi.io/api' }} REPORT_NAME: govtool-backend GH_PAGES: ${{vars.GH_PAGES}} COMMIT_SHA: ${{ github.event.workflow_run.head_sha || github.sha }} diff --git a/.github/workflows/test_integration_playwright.yml b/.github/workflows/test_integration_playwright.yml index 030c25225..f0fc92296 100644 --- a/.github/workflows/test_integration_playwright.yml +++ b/.github/workflows/test_integration_playwright.yml @@ -37,6 +37,9 @@ on: - test - infra/test-chores + schedule: + - cron: "0 0 * * *" # 12AM UTC + concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: false @@ -165,7 +168,7 @@ jobs: run: | chmod +x .github/scripts/register_report.sh .github/scripts/register_report.sh - + - if: steps.register-project.outputs.project_exists != 'true' uses: JamesIves/github-pages-deploy-action@v4 with: @@ -229,7 +232,7 @@ jobs: REPORT_NUMBER: ${{ needs.publish-report.outputs.report_number }} GITHUB_TOKEN: ${{ github.token }} env: - HOST_URL: https://${{inputs.deployment || 'govtool.cardanoapi.io' }} + HOST_URL: https://${{ github.event.schedule && 'preview.gov.tools' || (inputs.deployment || 'govtool.cardanoapi.io') }} REPORT_NAME: govtool-frontend GH_PAGES: ${{vars.GH_PAGES}} COMMIT_SHA: ${{ github.event.workflow_run.head_sha || github.sha }} From c92d5dbef76af278d69c3b0f220a0d960f9334f4 Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 14 May 2025 14:13:44 +0545 Subject: [PATCH 03/17] chore: skip proposal submission test for schedule workflow --- .../playwright/lib/constants/environments.ts | 4 ++++ tests/govtool-frontend/playwright/lib/helpers/cardano.ts | 7 +++++++ .../7-proposal-submission/proposalSubmission.ga.spec.ts | 2 ++ tests/govtool-frontend/playwright/tests/proposal.setup.ts | 2 +- 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/tests/govtool-frontend/playwright/lib/constants/environments.ts b/tests/govtool-frontend/playwright/lib/constants/environments.ts index 1882424c6..a8491fa0e 100644 --- a/tests/govtool-frontend/playwright/lib/constants/environments.ts +++ b/tests/govtool-frontend/playwright/lib/constants/environments.ts @@ -28,6 +28,10 @@ const environments = { metadataBucketUrl: `${CARDANO_API_METADATA_HOST_URL}/data`, lockInterceptorUrl: `${CARDANO_API_METADATA_HOST_URL}/lock`, ci: process.env.CI, + isScheduled: + (process.env.SCHEDULED_WORKFLOW && + process.env.SCHEDULED_WORKFLOW == "true") || + false, }; export default environments; diff --git a/tests/govtool-frontend/playwright/lib/helpers/cardano.ts b/tests/govtool-frontend/playwright/lib/helpers/cardano.ts index a2b47a3ff..e4ff03501 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/cardano.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/cardano.ts @@ -85,3 +85,10 @@ export async function getWalletBalance(address: string) { return balance; } + +export async function skipIfScheduledWorkflow() { + if (environments.isScheduled) { + await allure.description("This test is skipped in scheduled workflow."); + test.skip(); + } +} diff --git a/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts b/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts index 3826af310..e0c04d36a 100644 --- a/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts +++ b/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts @@ -9,6 +9,7 @@ import ProposalSubmissionPage from "@pages/proposalSubmissionPage"; import { expect } from "@playwright/test"; import { skipIfMainnet, + skipIfScheduledWorkflow, skipIfTemporyWalletIsNotAvailable, } from "@helpers/cardano"; import { ProposalType } from "@types"; @@ -31,6 +32,7 @@ Object.values(ProposalType).forEach((proposalType, index) => { page, browser, }, testInfo) => { + await skipIfScheduledWorkflow(); test.setTimeout(testInfo.timeout + environments.txTimeOut); const wallet = await walletManager.popWallet("proposalSubmission"); diff --git a/tests/govtool-frontend/playwright/tests/proposal.setup.ts b/tests/govtool-frontend/playwright/tests/proposal.setup.ts index 4a44b621c..62c0f16e2 100644 --- a/tests/govtool-frontend/playwright/tests/proposal.setup.ts +++ b/tests/govtool-frontend/playwright/tests/proposal.setup.ts @@ -9,7 +9,7 @@ import walletManager from "lib/walletManager"; import { functionWaitedAssert } from "@helpers/waitedLoop"; import { getWalletConfigForFaucet } from "@helpers/index"; -const PROPOSAL_WALLETS_COUNT = 5; +const PROPOSAL_WALLETS_COUNT = environments.isScheduled ? 1 : 5; let govActionDeposit: number; From e47a62d97884d843cca955358ca8f946629575a8 Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 14 May 2025 14:15:43 +0545 Subject: [PATCH 04/17] feat: add schedule workflow variable on integration-test workflow --- .github/workflows/test_integration_playwright.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/test_integration_playwright.yml b/.github/workflows/test_integration_playwright.yml index f0fc92296..42539dfb7 100644 --- a/.github/workflows/test_integration_playwright.yml +++ b/.github/workflows/test_integration_playwright.yml @@ -105,6 +105,11 @@ jobs: else export BLOCKFROST_API_KEY="${{ secrets.BLOCKFROST_API_KEY_MAINNET }}" fi + + # Set schedule workflow variable + if [[ "$GITHUB_EVENT_NAME" == "schedule" ]]; then + export SCHEDULE_WORKFLOW="true" + fi npm run test:headless From f3c14c1bb9242bcc18906d095e6a6841a4fb436a Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 14 May 2025 14:24:23 +0545 Subject: [PATCH 05/17] feat: prepend 'nightly-' to report names for scheduled workflows --- .github/workflows/test_backend.yml | 2 +- .github/workflows/test_integration_playwright.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test_backend.yml b/.github/workflows/test_backend.yml index 648dc1658..14051d2ab 100644 --- a/.github/workflows/test_backend.yml +++ b/.github/workflows/test_backend.yml @@ -198,6 +198,6 @@ jobs: env: BASE_URL: https://${{github.event.schedule && 'be.preview.gov.tools' || inputs.deployment || 'govtool.cardanoapi.io/api' }} - REPORT_NAME: govtool-backend + REPORT_NAME: ${{ github.event.schedule && 'nightly-'}}govtool-backend GH_PAGES: ${{vars.GH_PAGES}} COMMIT_SHA: ${{ github.event.workflow_run.head_sha || github.sha }} diff --git a/.github/workflows/test_integration_playwright.yml b/.github/workflows/test_integration_playwright.yml index 42539dfb7..f842fe601 100644 --- a/.github/workflows/test_integration_playwright.yml +++ b/.github/workflows/test_integration_playwright.yml @@ -238,6 +238,6 @@ jobs: GITHUB_TOKEN: ${{ github.token }} env: HOST_URL: https://${{ github.event.schedule && 'preview.gov.tools' || (inputs.deployment || 'govtool.cardanoapi.io') }} - REPORT_NAME: govtool-frontend + REPORT_NAME: ${{ github.event.schedule && 'nightly-'}}govtool-frontend GH_PAGES: ${{vars.GH_PAGES}} COMMIT_SHA: ${{ github.event.workflow_run.head_sha || github.sha }} From cc361147040d2b0961cf0e8d0fadfe57c8368ba8 Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 14 May 2025 15:28:37 +0545 Subject: [PATCH 06/17] ix: update sorting method to use version sort for oldest report directory --- .github/scripts/remove_oldest_report.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/remove_oldest_report.sh b/.github/scripts/remove_oldest_report.sh index 684d768ac..e0a809604 100644 --- a/.github/scripts/remove_oldest_report.sh +++ b/.github/scripts/remove_oldest_report.sh @@ -8,7 +8,7 @@ if [ -d "gh-pages/$REPORT_NAME" ]; then if [ "$dir_count" -gt 10 ]; then # Find the oldest numerical directory - oldest_dir=$(find . -maxdepth 1 -type d -regex './[0-9]+' | sort -n | head -1) + oldest_dir=$(find . -maxdepth 1 -type d -regex './[0-9]+' | sort -V | head -1) if [ -n "$oldest_dir" ]; then echo "More than 10 report directories exist. Removing oldest: $oldest_dir" rm -rf "$oldest_dir" From 860d9f05ba6f348d497e70a6a0cbc0a470348cc8 Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 14 May 2025 15:29:03 +0545 Subject: [PATCH 07/17] fix: allow scheduled runs for backend and integration tests --- .github/workflows/test_backend.yml | 2 +- .github/workflows/test_integration_playwright.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test_backend.yml b/.github/workflows/test_backend.yml index 14051d2ab..74b9ca195 100644 --- a/.github/workflows/test_backend.yml +++ b/.github/workflows/test_backend.yml @@ -47,7 +47,7 @@ concurrency: jobs: backend-tests: runs-on: ubuntu-latest - if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }} + if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' || github.event.schedule }} outputs: start_time: ${{ steps.set-pending-status.outputs.timestamp }} status: ${{ steps.run-tests.outcome }} diff --git a/.github/workflows/test_integration_playwright.yml b/.github/workflows/test_integration_playwright.yml index f842fe601..dfa532f46 100644 --- a/.github/workflows/test_integration_playwright.yml +++ b/.github/workflows/test_integration_playwright.yml @@ -47,7 +47,7 @@ concurrency: jobs: integration-tests: runs-on: ubuntu-latest - if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }} + if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' || github.event.schedule }} outputs: start_time: ${{ steps.set-pending-status.outputs.timestamp }} status: ${{ steps.run-test.outcome }} @@ -105,7 +105,7 @@ jobs: else export BLOCKFROST_API_KEY="${{ secrets.BLOCKFROST_API_KEY_MAINNET }}" fi - + # Set schedule workflow variable if [[ "$GITHUB_EVENT_NAME" == "schedule" ]]; then export SCHEDULE_WORKFLOW="true" From 48c6f1a2e1affaf9bfc827b5f1d5c1d2acc2c071 Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 14 May 2025 15:35:09 +0545 Subject: [PATCH 08/17] fix: add newline before report name in register_report script --- .github/scripts/register_report.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/register_report.sh b/.github/scripts/register_report.sh index f5e5756f9..959368afb 100644 --- a/.github/scripts/register_report.sh +++ b/.github/scripts/register_report.sh @@ -10,6 +10,6 @@ if grep -q "$REPORT_NAME" "$PROJECT_DIR/$PROJECT_FILE"; then echo "Project already exists" echo "project_exists=true">> $GITHUB_OUTPUT else - echo "$REPORT_NAME" >> "$PROJECT_DIR/$PROJECT_FILE" + echo "\n$REPORT_NAME" >> "$PROJECT_DIR/$PROJECT_FILE" echo "project_exists=false">> $GITHUB_OUTPUT fi From 5781bb45bc57e4dbf942e35a9ff50acdc913d232 Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 16 May 2025 12:26:26 +0545 Subject: [PATCH 09/17] chore: set proposal wallet stake pkh to faucet stake pkh --- .../tests/7-proposal-submission/proposalSubmission.ga.spec.ts | 2 ++ tests/govtool-frontend/playwright/tests/proposal.setup.ts | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts b/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts index 3826af310..94d7a450b 100644 --- a/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts +++ b/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts @@ -34,6 +34,8 @@ Object.values(ProposalType).forEach((proposalType, index) => { test.setTimeout(testInfo.timeout + environments.txTimeOut); const wallet = await walletManager.popWallet("proposalSubmission"); + wallet.stake.pkh = getWalletConfigForFaucet().stake.pkh; + await logWalletDetails(wallet.address); const tempUserAuth = await createTempUserAuth(page, wallet); diff --git a/tests/govtool-frontend/playwright/tests/proposal.setup.ts b/tests/govtool-frontend/playwright/tests/proposal.setup.ts index 4a44b621c..57bd5f70e 100644 --- a/tests/govtool-frontend/playwright/tests/proposal.setup.ts +++ b/tests/govtool-frontend/playwright/tests/proposal.setup.ts @@ -28,8 +28,7 @@ setup.beforeEach(async () => { await setAllureStory("Proposal"); await skipIfMainnet(); const totalRequiredBalanceForWallets = - (govActionDeposit / 1000000) * PROPOSAL_WALLETS_COUNT + - 22 * PROPOSAL_WALLETS_COUNT; + (govActionDeposit / 1000000 + 22) * PROPOSAL_WALLETS_COUNT; await skipIfBalanceIsInsufficient(totalRequiredBalanceForWallets); }); From e5d7ce56a925164d947e3f0b44294a4b59703118 Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 16 May 2025 21:50:13 +0545 Subject: [PATCH 10/17] fix: rename environment variable for scheduled workflow --- .github/workflows/test_integration_playwright.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_integration_playwright.yml b/.github/workflows/test_integration_playwright.yml index dfa532f46..841357529 100644 --- a/.github/workflows/test_integration_playwright.yml +++ b/.github/workflows/test_integration_playwright.yml @@ -108,7 +108,7 @@ jobs: # Set schedule workflow variable if [[ "$GITHUB_EVENT_NAME" == "schedule" ]]; then - export SCHEDULE_WORKFLOW="true" + export SCHEDULED_WORKFLOW="true" fi npm run test:headless From 1086814acea8e4b8aae95cbc063ee6b4a1ddb3e5 Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 19 May 2025 13:50:56 +0545 Subject: [PATCH 11/17] chore: add public and private stake keys to faucet configuration --- tests/govtool-frontend/playwright/.env.example | 2 ++ .../playwright/lib/constants/environments.ts | 6 +++++- tests/govtool-frontend/playwright/lib/helpers/index.ts | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/govtool-frontend/playwright/.env.example b/tests/govtool-frontend/playwright/.env.example index 18caf343a..99ae700ef 100644 --- a/tests/govtool-frontend/playwright/.env.example +++ b/tests/govtool-frontend/playwright/.env.example @@ -19,6 +19,8 @@ NETWORK=preview FAUCET_ADDRESS= FAUCET_PAYMENT_PRIVATE= FAUCET_STAKE_PKH= +FAUCET_STAKE_PUBLIC= +FAUCET_STAKE_PRIVATE= CI=true TEST_WORKERS=6 // Number of workers to run in parallel \ No newline at end of file diff --git a/tests/govtool-frontend/playwright/lib/constants/environments.ts b/tests/govtool-frontend/playwright/lib/constants/environments.ts index 1882424c6..1201fa0cf 100644 --- a/tests/govtool-frontend/playwright/lib/constants/environments.ts +++ b/tests/govtool-frontend/playwright/lib/constants/environments.ts @@ -18,7 +18,11 @@ const environments = { apiUrl: `https://faucet.${NETWORK}.world.dev.cardano.org`, address: process.env.FAUCET_ADDRESS, payment: { private: process.env.FAUCET_PAYMENT_PRIVATE }, - stake: { pkh: process.env.FAUCET_STAKE_PKH }, + stake: { + pkh: process.env.FAUCET_STAKE_PKH, + private: process.env.FAUCET_STAKE_PRIVATE, + public: process.env.FAUCET_STAKE_PUBLIC, + }, }, kuber: { apiUrl: `https://${NETWORK}.kuber.cardanoapi.io`, diff --git a/tests/govtool-frontend/playwright/lib/helpers/index.ts b/tests/govtool-frontend/playwright/lib/helpers/index.ts index 3b5b658eb..7754a726e 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/index.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/index.ts @@ -23,6 +23,8 @@ export const getWalletConfigForFaucet = () => { }, stake: { pkh: environments.faucet.stake.pkh || "", + private: environments.faucet.stake.private || "", + public: environments.faucet.stake.public || "", }, address: environments.faucet.address || "", }; From c383a7304e5260ca690e9915a3b7e406bd38039b Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 19 May 2025 13:51:48 +0545 Subject: [PATCH 12/17] chore: update README and wallet generation script to include stake private and public keys --- tests/govtool-frontend/playwright/README.md | 6 +++++- tests/govtool-frontend/playwright/generate_faucet_wallet.ts | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index deb18fae4..3ede5b326 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -107,13 +107,17 @@ The script will: ----------------------------------- šŸ”‘ Payment Private Key: šŸ”— Stake Public Key Hash: +šŸ’° Stake Private Key: +šŸ’³ Stake Public Key: šŸ  Wallet Address: ----------------------------------- šŸ“‹ Please copy the following to your environment variables: 1. Set FAUCET_PAYMENT_PRIVATE= 2. Set FAUCET_STAKE_PKH= -3. Set FAUCET_ADDRESS= +3. Set FAUCET_STAKE_PRIVATE= +4. Set FAUCET_STAKE_PUBLIC= +5. Set FAUCET_ADDRESS= šŸŽˆ All set! Please ensure this wallet is funded with a sufficient balance ``` diff --git a/tests/govtool-frontend/playwright/generate_faucet_wallet.ts b/tests/govtool-frontend/playwright/generate_faucet_wallet.ts index c61b1137b..b73e644a3 100644 --- a/tests/govtool-frontend/playwright/generate_faucet_wallet.ts +++ b/tests/govtool-frontend/playwright/generate_faucet_wallet.ts @@ -12,6 +12,8 @@ import { ShelleyWallet } from "./lib/helpers/crypto"; console.log("šŸ’¼ Wallet:", walletJson); console.log(`\nšŸ”‘ Payment Private Key: ${walletJson.payment.private}`); console.log(`šŸ”— Stake Public Key Hash: ${walletJson.stake.pkh}`); + console.log(`šŸ’° Stake Private Key: ${walletJson.stake.private}`); + console.log(`šŸ’³ Stake Public Key: ${walletJson.stake.public}`); console.log(`šŸ  Wallet Address: ${walletJson.address}`); console.log("-----------------------------------"); @@ -21,7 +23,9 @@ import { ShelleyWallet } from "./lib/helpers/crypto"; ); console.log(`1. Set FAUCET_PAYMENT_PRIVATE=${walletJson.payment.private}`); console.log(`2. Set FAUCET_STAKE_PKH=${walletJson.stake.pkh}`); - console.log(`3. Set FAUCET_ADDRESS=${walletJson.address}`); + console.log(`3. Set FAUCET_STAKE_PRIVATE=${walletJson.stake.private}`); + console.log(`4. Set FAUCET_STAKE_PUBLIC=${walletJson.stake.public}`); + console.log(`5. Set FAUCET_ADDRESS=${walletJson.address}`); console.log( "\nšŸŽˆ All set! Please ensure this wallet is funded with a sufficient balance" From c077613dd52d589f232b8a75cf1517b1183a7235 Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 19 May 2025 13:52:08 +0545 Subject: [PATCH 13/17] chore: add stake keys to wallet and handle username input during proposal submission --- .../proposalSubmission.ga.spec.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts b/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts index 94d7a450b..b19253312 100644 --- a/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts +++ b/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts @@ -35,6 +35,8 @@ Object.values(ProposalType).forEach((proposalType, index) => { const wallet = await walletManager.popWallet("proposalSubmission"); wallet.stake.pkh = getWalletConfigForFaucet().stake.pkh; + wallet.stake.private = getWalletConfigForFaucet().stake.private; + wallet.stake.public = getWalletConfigForFaucet().stake.public; await logWalletDetails(wallet.address); @@ -48,7 +50,16 @@ Object.values(ProposalType).forEach((proposalType, index) => { const proposalDiscussionPage = new ProposalDiscussionPage(userPage); await proposalDiscussionPage.goto(); await proposalDiscussionPage.verifyIdentityBtn.click(); - await proposalDiscussionPage.setUsername(mockValid.username()); + + try { + await expect(userPage.getByTestId("username-input")).toBeVisible({ + timeout: 10_000, + }); + await proposalDiscussionPage.setUsername(mockValid.username()); + } catch (error) { + // Ignore error if username is already set + console.log("Username is already set"); + } const proposalSubmissionPage = new ProposalSubmissionPage(userPage); await proposalSubmissionPage.proposalCreateBtn.click(); From aaacacb7c94a0c3676631905b753888292a5f2b0 Mon Sep 17 00:00:00 2001 From: Niraj Date: Tue, 20 May 2025 10:19:30 +0545 Subject: [PATCH 14/17] chore: remove stake public key and public key hash from env --- tests/govtool-frontend/playwright/.env.example | 2 -- tests/govtool-frontend/playwright/README.md | 8 ++------ .../govtool-frontend/playwright/generate_faucet_wallet.ts | 8 ++------ 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/tests/govtool-frontend/playwright/.env.example b/tests/govtool-frontend/playwright/.env.example index 99ae700ef..c68929567 100644 --- a/tests/govtool-frontend/playwright/.env.example +++ b/tests/govtool-frontend/playwright/.env.example @@ -18,8 +18,6 @@ NETWORK=preview FAUCET_ADDRESS= FAUCET_PAYMENT_PRIVATE= -FAUCET_STAKE_PKH= -FAUCET_STAKE_PUBLIC= FAUCET_STAKE_PRIVATE= CI=true diff --git a/tests/govtool-frontend/playwright/README.md b/tests/govtool-frontend/playwright/README.md index 3ede5b326..43e9515ab 100644 --- a/tests/govtool-frontend/playwright/README.md +++ b/tests/govtool-frontend/playwright/README.md @@ -106,18 +106,14 @@ The script will: šŸŽ‰ Wallet generated successfully! ----------------------------------- šŸ”‘ Payment Private Key: -šŸ”— Stake Public Key Hash: šŸ’° Stake Private Key: -šŸ’³ Stake Public Key: šŸ  Wallet Address: ----------------------------------- šŸ“‹ Please copy the following to your environment variables: 1. Set FAUCET_PAYMENT_PRIVATE= -2. Set FAUCET_STAKE_PKH= -3. Set FAUCET_STAKE_PRIVATE= -4. Set FAUCET_STAKE_PUBLIC= -5. Set FAUCET_ADDRESS= +2. Set FAUCET_STAKE_PRIVATE= +3. Set FAUCET_ADDRESS= šŸŽˆ All set! Please ensure this wallet is funded with a sufficient balance ``` diff --git a/tests/govtool-frontend/playwright/generate_faucet_wallet.ts b/tests/govtool-frontend/playwright/generate_faucet_wallet.ts index b73e644a3..4d4fc2d9d 100644 --- a/tests/govtool-frontend/playwright/generate_faucet_wallet.ts +++ b/tests/govtool-frontend/playwright/generate_faucet_wallet.ts @@ -11,9 +11,7 @@ import { ShelleyWallet } from "./lib/helpers/crypto"; console.log("-----------------------------------"); console.log("šŸ’¼ Wallet:", walletJson); console.log(`\nšŸ”‘ Payment Private Key: ${walletJson.payment.private}`); - console.log(`šŸ”— Stake Public Key Hash: ${walletJson.stake.pkh}`); console.log(`šŸ’° Stake Private Key: ${walletJson.stake.private}`); - console.log(`šŸ’³ Stake Public Key: ${walletJson.stake.public}`); console.log(`šŸ  Wallet Address: ${walletJson.address}`); console.log("-----------------------------------"); @@ -22,10 +20,8 @@ import { ShelleyWallet } from "./lib/helpers/crypto"; "\nšŸ“‹ Please copy the following to your environment variables:" ); console.log(`1. Set FAUCET_PAYMENT_PRIVATE=${walletJson.payment.private}`); - console.log(`2. Set FAUCET_STAKE_PKH=${walletJson.stake.pkh}`); - console.log(`3. Set FAUCET_STAKE_PRIVATE=${walletJson.stake.private}`); - console.log(`4. Set FAUCET_STAKE_PUBLIC=${walletJson.stake.public}`); - console.log(`5. Set FAUCET_ADDRESS=${walletJson.address}`); + console.log(`2. Set FAUCET_STAKE_PRIVATE=${walletJson.stake.private}`); + console.log(`3. Set FAUCET_ADDRESS=${walletJson.address}`); console.log( "\nšŸŽˆ All set! Please ensure this wallet is funded with a sufficient balance" From a3b7c6add6a4261b8597b5bd5694e6181b2bc673 Mon Sep 17 00:00:00 2001 From: Niraj Date: Tue, 20 May 2025 10:21:08 +0545 Subject: [PATCH 15/17] feat: generate keys from private keyHex --- .../playwright/lib/helpers/crypto.ts | 6 ++++++ .../playwright/lib/helpers/index.ts | 2 -- .../proposalSubmission.ga.spec.ts | 17 ++++++++++------- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/helpers/crypto.ts b/tests/govtool-frontend/playwright/lib/helpers/crypto.ts index c221c747e..62442ac9f 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/crypto.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/crypto.ts @@ -247,3 +247,9 @@ export class ShelleyWalletAddress implements Address { return Buffer.from(this.toRawBytes()).toString("hex"); } } + +export const createKeyFromPrivateKeyHex = async ( + privateKeyHex: string +): Promise => { + return await Ed25519Key.fromPrivateKeyHex(privateKeyHex); +}; diff --git a/tests/govtool-frontend/playwright/lib/helpers/index.ts b/tests/govtool-frontend/playwright/lib/helpers/index.ts index 7754a726e..86fc90cc3 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/index.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/index.ts @@ -22,9 +22,7 @@ export const getWalletConfigForFaucet = () => { private: environments.faucet.payment.private || "", }, stake: { - pkh: environments.faucet.stake.pkh || "", private: environments.faucet.stake.private || "", - public: environments.faucet.stake.public || "", }, address: environments.faucet.address || "", }; diff --git a/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts b/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts index b19253312..8f41a226b 100644 --- a/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts +++ b/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts @@ -19,6 +19,7 @@ import { getWalletConfigForFaucet } from "@helpers/index"; import { faker } from "@faker-js/faker"; import { proposalSubmissionAuthFile } from "@constants/auth"; import ProposalDiscussionDetailsPage from "@pages/proposalDiscussionDetailsPage"; +import { createKeyFromPrivateKeyHex } from "@helpers/crypto"; test.beforeEach(async () => { await setAllureEpic("7. Proposal submission"); @@ -34,9 +35,14 @@ Object.values(ProposalType).forEach((proposalType, index) => { test.setTimeout(testInfo.timeout + environments.txTimeOut); const wallet = await walletManager.popWallet("proposalSubmission"); - wallet.stake.pkh = getWalletConfigForFaucet().stake.pkh; + + const stakeKeys = await createKeyFromPrivateKeyHex( + environments.faucet.stake.private || "" + ); + const { pkh: stakePkh, public: stakePublic } = stakeKeys.json(); + wallet.stake.pkh = stakePkh; wallet.stake.private = getWalletConfigForFaucet().stake.private; - wallet.stake.public = getWalletConfigForFaucet().stake.public; + wallet.stake.public = stakePublic; await logWalletDetails(wallet.address); @@ -65,10 +71,7 @@ Object.values(ProposalType).forEach((proposalType, index) => { await proposalSubmissionPage.proposalCreateBtn.click(); await proposalDiscussionPage.continueBtn.click(); - const rewardAddress = rewardAddressBech32( - environments.networkId, - getWalletConfigForFaucet().stake.pkh - ); + const rewardAddress = rewardAddressBech32(environments.networkId, stakePkh); await proposalSubmissionPage.createProposal(rewardAddress, proposalType); @@ -112,7 +115,7 @@ test.describe("Proposed as a governance action", async () => { const rewardAddress = rewardAddressBech32( environments.networkId, - getWalletConfigForFaucet().stake.pkh + getWalletConfigForFaucet().address ); proposalId = await proposalSubmissionPage.createProposal(rewardAddress); From 3d4e9eea1bcd65cd4f3efcf40dacd39067af9660 Mon Sep 17 00:00:00 2001 From: Niraj Date: Tue, 20 May 2025 10:22:46 +0545 Subject: [PATCH 16/17] chore: remove stake public key and public key hash from environments configuration --- tests/govtool-frontend/playwright/lib/constants/environments.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/constants/environments.ts b/tests/govtool-frontend/playwright/lib/constants/environments.ts index 1201fa0cf..dc88762a2 100644 --- a/tests/govtool-frontend/playwright/lib/constants/environments.ts +++ b/tests/govtool-frontend/playwright/lib/constants/environments.ts @@ -19,9 +19,7 @@ const environments = { address: process.env.FAUCET_ADDRESS, payment: { private: process.env.FAUCET_PAYMENT_PRIVATE }, stake: { - pkh: process.env.FAUCET_STAKE_PKH, private: process.env.FAUCET_STAKE_PRIVATE, - public: process.env.FAUCET_STAKE_PUBLIC, }, }, kuber: { From 6a72cdf1b468ec76ed0dfcdbe5bd0db964b5828f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sza=C5=82owski?= Date: Tue, 20 May 2025 11:34:22 +0200 Subject: [PATCH 17/17] feat(#3647): add fixed top banner for govtool maintenance notice --- CHANGELOG.md | 3 +- .../organisms/MaintenanceEndingBanner.tsx | 106 +++++++++++++++ .../src/components/organisms/TopBanners.tsx | 126 ++++++++++-------- .../src/components/organisms/TopNav.tsx | 88 ++++++------ govtool/frontend/src/i18n/locales/en.json | 8 +- 5 files changed, 234 insertions(+), 97 deletions(-) create mode 100644 govtool/frontend/src/components/organisms/MaintenanceEndingBanner.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 2515fbe34..145af887e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ changes. ### Added +- Add maintenance ending banner [Issue 3647](https://github.com/IntersectMBO/govtool/issues/3647) + ### Fixed ### Changed @@ -20,7 +22,6 @@ changes. ## [v2.0.22](https://github.com/IntersectMBO/govtool/releases/tag/v2.0.22) 2025-05-15 - ### Added ### Fixed diff --git a/govtool/frontend/src/components/organisms/MaintenanceEndingBanner.tsx b/govtool/frontend/src/components/organisms/MaintenanceEndingBanner.tsx new file mode 100644 index 000000000..37d207e72 --- /dev/null +++ b/govtool/frontend/src/components/organisms/MaintenanceEndingBanner.tsx @@ -0,0 +1,106 @@ +import { Box, Typography, IconButton } from "@mui/material"; +import { useState } from "react"; +import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown"; +import KeyboardArrowUpIcon from "@mui/icons-material/KeyboardArrowUp"; +import { Trans, useTranslation } from "react-i18next"; + +export const MaintenanceEndingBanner = () => { + const [isExpanded, setIsExpanded] = useState(true); + const { t } = useTranslation(); + + const handleToggle = () => { + setIsExpanded((prev) => !prev); + }; + + return ( + + {/* Banner Header */} + + + + {t("system.maintenanceEnding.title")} + + + + + {isExpanded ? : } + + + + + {/* Expandable Content */} + + + + {t("system.maintenanceEnding.description1")} + + + , + ]} + /> + + + {t("system.maintenanceEnding.description3")} + + + + + ); +}; diff --git a/govtool/frontend/src/components/organisms/TopBanners.tsx b/govtool/frontend/src/components/organisms/TopBanners.tsx index e27b8138d..f4cd741b8 100644 --- a/govtool/frontend/src/components/organisms/TopBanners.tsx +++ b/govtool/frontend/src/components/organisms/TopBanners.tsx @@ -1,11 +1,13 @@ import { Box, Link, Typography } from "@mui/material"; import { Trans, useTranslation } from "react-i18next"; -import { useAppContext } from "@/context"; +import { useAppContext, useCardano } from "@/context"; import { LINKS } from "@/consts/links"; +import { MaintenanceEndingBanner } from "./MaintenanceEndingBanner"; export const TopBanners = () => { const { isMainnet, networkName, isInBootstrapPhase, isAppInitializing } = useAppContext(); + const { isEnabled } = useCardano(); const { t } = useTranslation(); if (isAppInitializing) { @@ -13,65 +15,83 @@ export const TopBanners = () => { } return ( - - {/* NETWORK BANNER */} - {!isMainnet && ( - - - {`${t("network")}: ${networkName}`} - - - | - - + + {/* NETWORK BANNER */} + {!isMainnet && ( + - {t("goToMainnet")} - - - )} + + {`${t("network")}: ${networkName}`} + + + | + + + {t("goToMainnet")} + + + )} + - {/* BOOTSTRAPPING BANNER */} - {isInBootstrapPhase && ( + {/* GOVTOOL MAINTENANCE ENDING SOON BANNER */} + {isEnabled && ( - - - ), - }} - /> - + )} - + + {/* BOOTSTRAPPING BANNER */} + + {isInBootstrapPhase && ( + + + + ), + }} + /> + + + )} + + ); }; diff --git a/govtool/frontend/src/components/organisms/TopNav.tsx b/govtool/frontend/src/components/organisms/TopNav.tsx index 5a85776cf..5eb2654c5 100644 --- a/govtool/frontend/src/components/organisms/TopNav.tsx +++ b/govtool/frontend/src/components/organisms/TopNav.tsx @@ -8,8 +8,9 @@ import { useCardano, useFeatureFlag, useModal } from "@context"; import { useScreenDimension, useTranslation } from "@hooks"; import { openInNewTab } from "@utils"; import { DrawerMobile } from "./DrawerMobile"; +import { MaintenanceEndingBanner } from "./MaintenanceEndingBanner"; -const POSITION_TO_BLUR = 50; +const POSITION_TO_BLUR = 80; export const TopNav = ({ isConnectButton = true }) => { const { @@ -136,51 +137,54 @@ export const TopNav = ({ isConnectButton = true }) => { ); return ( - - + + + - isConnectButton || disconnectWallet()} + - app-logo - - {screenWidth >= 1145 ? renderDesktopNav() : renderMobileNav()} - - + isConnectButton || disconnectWallet()} + > + app-logo + + {screenWidth >= 1145 ? renderDesktopNav() : renderMobileNav()} + + + ); }; diff --git a/govtool/frontend/src/i18n/locales/en.json b/govtool/frontend/src/i18n/locales/en.json index d1d56337d..d057b97cb 100644 --- a/govtool/frontend/src/i18n/locales/en.json +++ b/govtool/frontend/src/i18n/locales/en.json @@ -738,7 +738,13 @@ "system": { "description": "The Cardano GovTool is a tool that allows you to participate in the governance of the Cardano network. You can propose, vote on, and delegate your voting power to other users.", "title": "This tool is connected to {{networkName}}", - "bootstrappingWarning": "Govtool is in the Bootstrapping phase. Some features are not available. Learn more" + "bootstrappingWarning": "Govtool is in the Bootstrapping phase. Some features are not available. Learn more", + "maintenanceEnding": { + "title": "āš ļø GovTool Maintenance Ending Soon", + "description1": "GovTool has not been included in the 2025 Cardano budget.", + "description2": "Unless alternative support is secured, <0>maintenance will end in June 2025.", + "description3": "We remain committed to transparency and will keep you updated." + } }, "tooltips": { "delegateTodRep": {