Skip to content

Commit

Permalink
Merge pull request #2840 from IntersectMBO/develop
Browse files Browse the repository at this point in the history
GovTool - v2.0.10-patch1
  • Loading branch information
MSzalowski authored Jan 30, 2025
2 parents e851151 + 015a8e9 commit b70ebc7
Show file tree
Hide file tree
Showing 25 changed files with 215 additions and 110 deletions.
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/[email protected]":
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/[email protected]":
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/[email protected]":
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==

[email protected]:
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

0 comments on commit b70ebc7

Please sign in to comment.