Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
fd76a9b
chore: update integration workflow to include new network options and…
kneerose Jan 28, 2025
bccd47e
chore: update backend test workflow to include new preview/mainnet de…
kneerose Jan 28, 2025
9688127
chore: remove unecessary https on deployment options
kneerose Jan 28, 2025
db27e12
chore: add dev api options on backend test deployment
kneerose Jan 28, 2025
49a0a2b
chore: update network input handling in integration test workflow
kneerose Jan 28, 2025
6eb6a27
fix: displaying DReps whose doNotList is of type string
MSzalowski Jan 29, 2025
844ce38
Merge pull request #2805 from IntersectMBO/feat/support-network-on-ma…
kneerose Jan 30, 2025
090081a
chore: update workflow triggers for backend and integration tests to …
kneerose Jan 29, 2025
4c15cd3
chore: make default test runner env to govtool.cardanoapi.io
kneerose Jan 30, 2025
4258e92
chore: update test workflow to run only on deployment success
kneerose Jan 30, 2025
e7c813e
Merge pull request #2828 from IntersectMBO/fix/deployment-order
kneerose Jan 30, 2025
8127b6b
Merge pull request #2827 from IntersectMBO/fix/displaying-dreps-with-…
MSzalowski Jan 30, 2025
8dd29fc
fix: update fetch first dRep filtering logic to exclude script-based…
kneerose Jan 27, 2025
7816855
fix test-2F,2E and 2S
kneerose Jan 27, 2025
b4e2bae
fix: update payment address generation
kneerose Jan 27, 2025
7d72f4d
fix: increase timeout for visibility checks in governance actions and…
kneerose Jan 27, 2025
7bc01c5
fix: update proposal discussion link
kneerose Jan 27, 2025
9884661
fix: update Usersnap API response status to 403 for testing purposes
kneerose Jan 27, 2025
084f347
fix: increase timeout for visibility checks in DRep registration and …
kneerose Jan 28, 2025
a7781d9
fix: update reward address retrieval in proposal submission tests
kneerose Jan 28, 2025
7635f81
fix: update wallet address generation according to network
kneerose Jan 28, 2025
20ac5d0
fix: crypto not found issue
kneerose Jan 28, 2025
50d16a9
fix: increase timeout for delegated voting power visibility assertion
kneerose Jan 30, 2025
3393376
fix: update assertion order in test 3I for consistency
kneerose Jan 30, 2025
31a3821
Merge pull request #2834 from IntersectMBO/fix/report-275-failing-test
kneerose Jan 30, 2025
5ca5bbd
fix(#1841): fix unhandled missing index exception
MSzalowski Jan 30, 2025
015a8e9
Merge pull request #2836 from IntersectMBO/fix/internal-fusion-common…
MSzalowski Jan 30, 2025
b70ebc7
Merge pull request #2840 from IntersectMBO/develop
MSzalowski Jan 30, 2025
d9c783f
Merge pull request #2841 from IntersectMBO/test
MSzalowski Jan 30, 2025
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
30 changes: 18 additions & 12 deletions .github/workflows/test_backend.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
name: Backend Test

on:
push:
branches:
- test
workflow_dispatch:
inputs:
deployment:
Expand All @@ -14,10 +11,26 @@ on:
- "sanchogov.tools/api"
- "staging.govtool.byron.network/api"
- "govtool.cardanoapi.io/api"
- "z6b8d2f7a-zca4a4c45-gtw.z937eb260.rustrocks.fr"
- "dev-sanchonet.govtool.byron.network/api"
- "be.gov.tools"
network:
required: true
type: choice
default: "preview"
options:
- "sanchonet"
- "preview"
- "mainnet"
- "preprod"
workflow_run:
workflows: ["Build and deploy GovTool test stack"]
types: [completed]

jobs:
backend-tests:
runs-on: ubuntu-latest
if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }}
steps:
- name: Checkout code
uses: actions/checkout@v4
Expand All @@ -42,16 +55,9 @@ jobs:
fi
python ./setup.py
python -m pytest --alluredir allure-results
if [[ "${{ env.NETWORK }}" == "preprod" ]]; then
echo "FAUCET_API_KEY=${{ secrets.FAUCET_API_KEY_PREPROD }}" >> $GITHUB_ENV
elif [[ "${{ env.NETWORK }}" == "sanchonet" ]]; then
echo "FAUCET_API_KEY=${{ secrets.FAUCET_API_KEY_SANCHONET }}" >> $GITHUB_ENV
else
echo "FAUCET_API_KEY=${{ secrets.FAUCET_API_KEY_PREVIEW }}" >> $GITHUB_ENV
fi
env:
BASE_URL: https://${{inputs.deployment || 'govtool.cardanoapi.io/api' }}
NETWORK: ${{ vars.NETWORK }}
NETWORK: ${{ inputs.network || vars.NETWORK }}
KUBER_API_KEY: ${{ secrets.KUBER_API_KEY }}

- name: Upload report
Expand All @@ -63,7 +69,7 @@ jobs:

publish-report:
runs-on: ubuntu-latest
if: always()
if: always() && needs.backend-tests.result != 'skipped'
needs: backend-tests
steps:
- uses: actions/checkout@v4
Expand Down
34 changes: 19 additions & 15 deletions .github/workflows/test_integration_playwright.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
name: Integration Test [Playwright]

on:
push:
branches:
- test
workflow_dispatch:
inputs:
deployment:
Expand All @@ -16,14 +13,24 @@ on:
- "govtool.cardanoapi.io"
- "preview.gov.tools"
- "gov.tools"
network:
required: true
type: choice
default: "preview"
options:
- "sanchonet"
- "preview"
- "mainnet"
- "preprod"

workflow_run:
workflows: ["Build and deploy GovTool to TEST server"]
workflows: ["Build and deploy GovTool test stack"]
types: [completed]

jobs:
integration-tests:
runs-on: ubuntu-latest
if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }}
defaults:
run:
working-directory: tests/govtool-frontend/playwright
Expand Down Expand Up @@ -56,23 +63,19 @@ jobs:
chmod +w ./lib/_mock
npm run generate-wallets

# Set network variables based on deployment input and environment
if [[ "${{inputs.deployment}}" == "gov.tools" ]]; then
export NETWORK='mainnet'
else
export NETWORK="${{ vars.NETWORK }}"
fi

# Set API keys based on the network
if [[ "${{ vars.NETWORK }}" == "preprod" ]]; then
if [[ "${{ env.NETWORK }}" == "preprod" ]]; then
export FAUCET_API_KEY="${{ secrets.FAUCET_API_KEY_PREPROD }}"
export BLOCKFROST_API_KEY="${{ secrets.BLOCKFROST_API_KEY_PREPROD }}"
elif [[ "${{ vars.NETWORK }}" == "sanchonet" ]]; then
elif [[ "${{ env.NETWORK }}" == "sanchonet" ]]; then
export FAUCET_API_KEY="${{ secrets.FAUCET_API_KEY_SANCHONET }}"
export BLOCKFROST_API_KEY="${{ secrets.BLOCKFROST_API_KEY_SANCHONET }}"
else
elif [[ "${{ env.NETWORK }}" == "preview" ]]; then
export FAUCET_API_KEY="${{ secrets.FAUCET_API_KEY_PREVIEW }}"
export BLOCKFROST_API_KEY="${{ secrets.BLOCKFROST_API_KEY_PREVIEW }}"
else
export FAUCET_API_KEY="${{ secrets.FAUCET_API_KEY_PREVIEW }}"
export BLOCKFROST_API_KEY="${{ secrets.BLOCKFROST_API_KEY_MAINNET }}"
fi

npm test
Expand All @@ -96,6 +99,7 @@ jobs:
API_URL: https://${{inputs.deployment || 'govtool.cardanoapi.io' }}/api
DOCS_URL: ${{ vars.DOCS_URL }}
KUBER_API_KEY: ${{secrets.KUBER_API_KEY}}
NETWORK: ${{ inputs.network || vars.NETWORK }}
TEST_WORKERS: ${{vars.TEST_WORKERS}}
CI: ${{vars.CI}}
FAUCET_ADDRESS: ${{vars.FAUCET_ADDRESS}}
Expand All @@ -105,7 +109,7 @@ jobs:

publish-report:
runs-on: ubuntu-latest
if: always()
if: always() && needs.integration-tests.result != 'skipped'
needs: integration-tests
steps:
- uses: actions/checkout@v4
Expand Down
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ changes.

### Fixed

-
- Fix displaying DRep with doNotList property as string
- Handle exception when no index is provided to /proposal/get endpoint [Issue 1841](https://github.com/IntersectMBO/govtool/issues/1841)

### Changed

Expand Down
13 changes: 8 additions & 5 deletions govtool/backend/src/VVA/API/Types.hs
Original file line number Diff line number Diff line change
Expand Up @@ -139,11 +139,14 @@ instance ToJSON GovActionId where
instance FromHttpApiData GovActionId where
parseUrlPiece t = case Text.splitOn "#" t of
[hash, rest] -> do
index <- case readMaybe $ Text.unpack rest of
Just x -> pure x
_ -> Left (Text.tail rest <> " is not a number")
hexHash <- parseUrlPiece hash
Right $ GovActionId hexHash index
if Text.null rest
then Left "Missing index in hash#index format"
else do
index <- case readMaybe $ Text.unpack rest of
Just x -> pure x
_ -> Left (rest <> " is not a number")
hexHash <- parseUrlPiece hash
Right $ GovActionId hexHash index
_ -> Left "Not a valid hash#index value"

exampleGovActionId :: Text
Expand Down
10 changes: 8 additions & 2 deletions govtool/frontend/src/pages/DRepDirectoryContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
} from "@hooks";
import { DataActionsBar, EmptyStateDrepDirectory } from "@molecules";
import { AutomatedVotingOptions, DRepCard } from "@organisms";
import { correctAdaFormat, isSameDRep, uniqBy } from "@utils";
import { correctAdaFormat, isSameDRep, uniqBy, parseBoolean } from "@utils";
import { DRepData, DRepListSort, DRepStatus } from "@models";
import {
AutomatedVotingOptionCurrentDelegation,
Expand Down Expand Up @@ -107,9 +107,15 @@ export const DRepDirectoryContent: FC<DRepDirectoryContentProps> = ({
const ada = correctAdaFormat(votingPower);

const listedDRepsWithoutYourself = uniqBy(
dRepList?.filter((dRep) => !dRep.doNotList && !isSameDRep(dRep, myDRepId)),
dRepList?.filter(
(dRep) =>
(typeof dRep.doNotList === "string"
? !parseBoolean(dRep.doNotList)
: !dRep.doNotList) && !isSameDRep(dRep, myDRepId),
),
"view",
);

const dRepListToDisplay =
yourselfDRep && showYourselfDRep
? [yourselfDRep, ...listedDRepsWithoutYourself]
Expand Down
1 change: 1 addition & 0 deletions govtool/frontend/src/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,4 @@ export * from "./testIdFromLabel";
export * from "./uniqBy";
export * from "./wait";
export * from "./getBase64ImageDetails";
export * from "./parseBoolean";
13 changes: 13 additions & 0 deletions govtool/frontend/src/utils/parseBoolean.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/**
* Parses a string value and returns its boolean equivalent.
*
* @param value - The string value to be parsed.
* @returns `true` if the value is "true" (case insensitive),
* `false` if the value is "false" (case insensitive),
* or `null` if the value is neither.
*/
export const parseBoolean = (value: string): boolean | null =>
({
true: true,
false: false,
}[String(value).toLowerCase()] ?? null);
31 changes: 31 additions & 0 deletions govtool/frontend/src/utils/tests/parseBoolean.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { parseBoolean } from "../parseBoolean";

describe("parseBoolean", () => {
it("should return true for 'true' (case insensitive)", () => {
expect(parseBoolean("true")).toBe(true);
expect(parseBoolean("TRUE")).toBe(true);
expect(parseBoolean("TrUe")).toBe(true);
});

it("should return false for 'false' (case insensitive)", () => {
expect(parseBoolean("false")).toBe(false);
expect(parseBoolean("FALSE")).toBe(false);
expect(parseBoolean("FaLsE")).toBe(false);
});

it("should return null for any other string", () => {
expect(parseBoolean("yes")).toBeNull();
expect(parseBoolean("no")).toBeNull();
expect(parseBoolean("1")).toBeNull();
expect(parseBoolean("0")).toBeNull();
expect(parseBoolean("")).toBeNull();
});

it("should return null for non-string values", () => {
expect(parseBoolean(null as any)).toBeNull();
expect(parseBoolean(undefined as any)).toBeNull();
expect(parseBoolean(123 as any)).toBeNull();
expect(parseBoolean({} as any)).toBeNull();
});
});
55 changes: 25 additions & 30 deletions govtool/frontend/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1367,15 +1367,15 @@
resolved "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-asmjs/-/cardano-serialization-lib-asmjs-12.1.1.tgz"
integrity sha512-K3f28QUfLDJ7seO6MtKfMYtRm5ccf36TQ5yxyTmZqX1TA85MkriEdxqpgV9KLiLEA95emwnlvU2/WmlHMRPg1A==

"@esbuild/linux-x64@0.21.5":
"@esbuild/darwin-arm64@0.21.5":
version "0.21.5"
resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz"
integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==
resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz"
integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==

"@esbuild/linux-x64@0.24.2":
"@esbuild/darwin-arm64@0.24.2":
version "0.24.2"
resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz"
integrity sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==
resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz"
integrity sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==

"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
version "4.4.1"
Expand Down Expand Up @@ -2162,15 +2162,10 @@
resolved "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz"
integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==

"@parcel/watcher-linux-x64-glibc@2.5.0":
"@parcel/watcher-darwin-arm64@2.5.0":
version "2.5.0"
resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz"
integrity sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==

"@parcel/watcher-linux-x64-musl@2.5.0":
version "2.5.0"
resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz"
integrity sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==
resolved "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz"
integrity sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==

"@parcel/watcher@^2.4.1":
version "2.5.0"
Expand Down Expand Up @@ -2283,15 +2278,10 @@
estree-walker "^2.0.2"
picomatch "^4.0.2"

"@rollup/rollup-linux-x64-gnu@4.27.4":
"@rollup/rollup-darwin-arm64@4.27.4":
version "4.27.4"
resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz"
integrity sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==

"@rollup/rollup-linux-x64-musl@4.27.4":
version "4.27.4"
resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz"
integrity sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==
resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz"
integrity sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==

"@rtsao/scc@^1.1.0":
version "1.1.0"
Expand Down Expand Up @@ -2870,15 +2860,10 @@
"@svgr/plugin-svgo" "^5.5.0"
loader-utils "^2.0.0"

"@swc/core-linux-x64-gnu@1.9.3":
"@swc/core-darwin-arm64@1.9.3":
version "1.9.3"
resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.9.3.tgz"
integrity sha512-ivXXBRDXDc9k4cdv10R21ccBmGebVOwKXT/UdH1PhxUn9m/h8erAWjz5pcELwjiMf27WokqPgaWVfaclDbgE+w==

"@swc/core-linux-x64-musl@1.9.3":
version "1.9.3"
resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.9.3.tgz"
integrity sha512-ILsGMgfnOz1HwdDz+ZgEuomIwkP1PHT6maigZxaCIuC6OPEhKE8uYna22uU63XvYcLQvZYDzpR3ms47WQPuNEg==
resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.9.3.tgz"
integrity sha512-hGfl/KTic/QY4tB9DkTbNuxy5cV4IeejpPD4zo+Lzt4iLlDWIeANL4Fkg67FiVceNJboqg48CUX+APhDHO5G1w==

"@swc/core@*", "@swc/core@^1.5.22", "@swc/core@^1.7.26":
version "1.9.3"
Expand Down Expand Up @@ -7184,6 +7169,16 @@ fs@^0.0.1-security:
resolved "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz"
integrity sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==

fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3:
version "2.3.3"
resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==

fsevents@2.3.2:
version "2.3.2"
resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz"
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==

function-bind@^1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
Expand Down
2 changes: 1 addition & 1 deletion tests/govtool-backend/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@
METRICS_API_SECRET = os.getenv("METRICS_API_SECRET")
KUBER_API_URL = f'https://{os.getenv("NETWORK","preview")}.kuber.cardanoapi.io'
KUBER_API_KEY = os.getenv("KUBER_API_KEY")
FAUCET_API_URL = f'https://faucet.${os.getenv("NETWORK","preview")}.world.dev.cardano.org'
FAUCET_API_URL = f'https://faucet.{os.getenv("NETWORK","preview")}.world.dev.cardano.org'
FACUET_API_KEY = os.getenv("FAUCET_API_KEY")
3 changes: 2 additions & 1 deletion tests/govtool-frontend/playwright/generate_wallets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,11 @@ function saveWallets(wallets: ShelleyWallet[]): void {
const jsonWallets = [];
for (let i = 0; i < wallets.length; i++) {
const dRepId = extractDRepFromWallet(wallets[i]);
const networkId = process.env.NETWORK === "mainnet" ? 1 : 0;

jsonWallets.push({
...wallets[i].json(),
address: wallets[i].addressBech32(0), // testnet
address: wallets[i].addressBech32(networkId),
dRepId,
});
}
Expand Down
4 changes: 3 additions & 1 deletion tests/govtool-frontend/playwright/lib/helpers/dRep.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import DRepDirectoryPage from "@pages/dRepDirectoryPage";
import { Page } from "@playwright/test";
import { IDRep } from "@types";
import { bech32 } from "bech32";
import * as crypto from "crypto";

export async function fetchFirstActiveDRepDetails(page: Page) {
let dRepGivenName: string;
Expand All @@ -12,7 +14,7 @@ export async function fetchFirstActiveDRepDetails(page: Page) {
const response = await route.fetch();
const json = await response.json();
const elements = json["elements"].filter(
(element) => element["givenName"] != null
(element: IDRep) => element.givenName != null && !element.isScriptBased
);
dRepGivenName =
elements[Math.floor(Math.random() * elements.length)]["givenName"];
Expand Down
Loading