Skip to content

#12 Issue 3 — No test suite and no test step in CI#13

Merged
DanielCotoJ merged 3 commits into
ACTA-Team:developfrom
smith961:develop
Jun 29, 2026
Merged

#12 Issue 3 — No test suite and no test step in CI#13
DanielCotoJ merged 3 commits into
ACTA-Team:developfrom
smith961:develop

Conversation

@smith961

@smith961 smith961 commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

🚀 ACTA Pull Request

Mark with an x all the checkboxes that apply (like [x])


📌 Type of Change

  • Documentation (updates to README, docs, or comments)
  • Bug fix (non-breaking change which fixes an issue)
  • Enhancement (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

📝 Changes description


📸 Evidence (A Loom/Cap video is required as evidence, we WON'T merge if there's no proof)


Screenshot 2026-06-24 040803

⏰ Time spent breakdown


🌌 Comments


Thank you for contributing to ACTA! We hope you can continue contributing to this project.

Summary by CodeRabbit

  • New Features

    • Added validation for Stellar addresses and DID formats to ensure credential creation uses valid identifiers.
  • Bug Fixes

    • Enhanced error handling with validation checks before credential issuance; invalid Subject DIDs now display error messages.
  • Tests

    • Added comprehensive test suite with automated testing in CI/CD pipeline.
  • Chores

    • Updated GitHub Actions workflow and added testing dependencies.

@drips-wave

drips-wave Bot commented Jun 24, 2026

Copy link
Copy Markdown

@smith961 Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits.

You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀

Learn more about application limits

@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds Vitest as the test runner with jsdom environment, React plugin, and path alias configuration. Introduces isStellarAddress and isDidPkhStellarTestnet validation utilities, integrates them into makeDidForAddress and handleCreate, stubs @acta-team/acta-sdk as a local file dependency, lazily loads stellar-wallets-kit for test compatibility, and wires a CI test job into the PR workflow.

Changes

Test Suite, Validation, and CI Integration

Layer / File(s) Summary
Vitest config, setup, scripts, and CI job
vitest.config.ts, vitest.setup.ts, package.json, .github/workflows/pr-checks.yml, .husky/pre-push
Introduces Vitest configuration with jsdom environment, React plugin, and @ alias; registers jest-dom matchers in setup; adds test and test:watch scripts and dev dependencies; adds a test CI job with Node 20 and npm ci; removes Husky bootstrap header from pre-push hook.
Stellar address and DID PKH validation utilities
src/lib/validation.ts, src/lib/validation.test.ts
Adds isStellarAddress and isDidPkhStellarTestnet regex predicates with unit tests covering valid, invalid, empty, and malformed inputs.
DID provider validation and error handling
src/providers/did.provider.tsx, src/providers/did.provider.test.ts
makeDidForAddress calls isStellarAddress and throws Error('Invalid Stellar address') on failure; DidProvider wraps DID derivation in try/catch, setting ownerDid to null on error; tests verify both behaviors.
Wallet provider lazy require for Vitest compatibility
src/providers/wallet.provider.tsx
Moves stellar-wallets-kit runtime imports into a client-only dynamic require inside walletKit useMemo, preventing module resolution failures during test runs.
Acta SDK stub, credential form DID guard, and hook tests
src/test-stubs/acta-sdk/*, package.json, src/components/modules/credential/hooks/use-credential-form.ts, src/components/modules/credential/hooks/use-credential-form.test.ts
Adds local @acta-team/acta-sdk stub with a mocked useCredential; redirects the dependency in package.json; adds isDidPkhStellarTestnet guard in handleCreate with toast on failure; tests cover empty-field short-circuit and valid-field issue call with asserted payload and txId.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related issues

Poem

🐇 Hop hop, the tests are here at last,
No more guessing if the logic passed!
A valid DID or a broken key,
The validators catch what we can't see.
Green checks in CI, the rabbit cheers —
npm run test brings order to our fears! 🌟

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly references Issue #12 and accurately summarizes the main change: adding a test suite and CI test step.
Linked Issues check ✅ Passed All key requirements from Issue #12 are implemented: Vitest installed with dependencies, vitest.config.ts and vitest.setup.ts created, test scripts added, unit tests written for validation/DID/hook logic, and CI test job added.
Out of Scope Changes check ✅ Passed All changes are aligned with Issue #12 requirements. The dependency change for @acta-team/acta-sdk to a file-based stub and wallet.provider.tsx refactoring are both necessary to support the test infrastructure.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Warning

⚠️ This pull request shows signs of AI-generated slop (defensive_cruft, ai_padded_prose). It has been flagged by CodeRabbit slop detection and should be reviewed carefully.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/test-stubs/acta-sdk/index.ts (1)

1-6: 📐 Maintainability & Code Quality | 🟡 Minor

Remove the duplicate src/test-stubs/acta-sdk.ts file.

The file is an identical copy of src/test-stubs/acta-sdk/index.ts. Since package.json resolves @acta-team/acta-sdk to the directory file:src/test-stubs/acta-sdk, Node's module resolution will always load index.ts, leaving acta-sdk.ts unreferenced and redundant. Removing it eliminates unnecessary duplication and confusion.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/test-stubs/acta-sdk/index.ts` around lines 1 - 6, The file acta-sdk.ts in
src/test-stubs is a duplicate of acta-sdk/index.ts, and since package.json
resolves the module to the acta-sdk directory, Node's module resolution will
always load index.ts making acta-sdk.ts redundant. Delete the duplicate
acta-sdk.ts file from src/test-stubs to remove this unnecessary duplication.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/pr-checks.yml:
- Around line 52-60: Replace the floating action tags with pinned commit SHAs
for both the checkout and setup-node actions to ensure immutability. For the
actions/checkout@v4 step, add a persist-credentials field and set it to false to
prevent credential persistence. This addresses the security concerns by pinning
exact action versions and disabling automatic credential caching in the checkout
step.

In `@package.json`:
- Line 17: The `@acta-team/acta-sdk` dependency in package.json is incorrectly
pointing to the test stub file path in the dependencies section, causing
production code in ActaConfigProvider, use-vault-setup, use-vault-read,
use-issuer-authorize, and use-credential-form to resolve the stub instead of the
real SDK. Restore the real SDK package version to the dependencies section of
package.json, then configure the test stub as a Vitest alias in the Vitest
configuration file so the stub is only used during test resolution and does not
affect runtime code.

In `@src/components/modules/credential/hooks/use-credential-form.test.ts`:
- Around line 36-71: Add a test case to the useCredentialForm describe block
that verifies the DID validation guard behavior. Create a new test that renders
the hook, sets the subjectDid state to an invalid value, calls handleCreate
within an act block, and then assert that a toast error is displayed and
issueMock is not called. This will ensure the validation predicate within the
hook prevents credential issuance when the DID is invalid.

In `@src/providers/wallet.provider.tsx`:
- Around line 68-75: The eslint-disable-next-line directive on line 68
references the deprecated rule `@typescript-eslint/no-var-requires`, but the
project's ESLint configuration uses the modern
`@typescript-eslint/no-require-imports` rule instead. Update the eslint-disable
comment that precedes the require statement for stellar-wallets-kit imports to
replace `@typescript-eslint/no-var-requires` with
`@typescript-eslint/no-require-imports` to properly suppress the correct rule.

---

Outside diff comments:
In `@src/test-stubs/acta-sdk/index.ts`:
- Around line 1-6: The file acta-sdk.ts in src/test-stubs is a duplicate of
acta-sdk/index.ts, and since package.json resolves the module to the acta-sdk
directory, Node's module resolution will always load index.ts making acta-sdk.ts
redundant. Delete the duplicate acta-sdk.ts file from src/test-stubs to remove
this unnecessary duplication.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2b8e50ef-fef8-4f8f-a40a-ac8186d9c0cd

📥 Commits

Reviewing files that changed from the base of the PR and between e89eb6a and c10afeb.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (15)
  • .github/workflows/pr-checks.yml
  • .husky/pre-push
  • package.json
  • src/components/modules/credential/hooks/use-credential-form.test.ts
  • src/components/modules/credential/hooks/use-credential-form.ts
  • src/lib/validation.test.ts
  • src/lib/validation.ts
  • src/providers/did.provider.test.ts
  • src/providers/did.provider.tsx
  • src/providers/wallet.provider.tsx
  • src/test-stubs/acta-sdk.ts
  • src/test-stubs/acta-sdk/index.ts
  • src/test-stubs/acta-sdk/package.json
  • vitest.config.ts
  • vitest.setup.ts

Comment on lines +52 to +60
- name: Checkout code
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: package-lock.json

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Pin action SHAs and disable checkout credential persistence in the new job.

On Lines 53 and 56, floating tags (@v4) are not immutable, and checkout defaults to persisted credentials. Pin both actions to commit SHAs and set persist-credentials: false for the checkout step.

Suggested hardening patch
   test:
     name: Test
     runs-on: ubuntu-latest
     steps:
       - name: Checkout code
-        uses: actions/checkout@v4
+        uses: actions/checkout@<PINNED_SHA>
+        with:
+          persist-credentials: false

       - name: Setup Node.js
-        uses: actions/setup-node@v4
+        uses: actions/setup-node@<PINNED_SHA>
         with:
           node-version: '20'
           cache: 'npm'
           cache-dependency-path: package-lock.json
🧰 Tools
🪛 zizmor (1.26.1)

[warning] 52-53: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[error] 53-53: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 56-56: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/pr-checks.yml around lines 52 - 60, Replace the floating
action tags with pinned commit SHAs for both the checkout and setup-node actions
to ensure immutability. For the actions/checkout@v4 step, add a
persist-credentials field and set it to false to prevent credential persistence.
This addresses the security concerns by pinning exact action versions and
disabling automatic credential caching in the checkout step.

Source: Linters/SAST tools

Comment thread package.json
},
"dependencies": {
"@acta-team/acta-sdk": "^1.0.7",
"@acta-team/acta-sdk": "file:src/test-stubs/acta-sdk",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify whether `@acta-team/acta-sdk` is used by runtime (non-test) code.
fd -t f -e ts -e tsx src | xargs rg -n --no-heading "`@acta-team/acta-sdk`" \
  | rg -v "\.test\.(ts|tsx)$"

Repository: ACTA-Team/demo-ACTA

Length of output: 1565


Restore the real SDK to dependencies and scope the test stub to test resolution only.

The @acta-team/acta-sdk dependency at line 17 currently points to file:src/test-stubs/acta-sdk in dependencies, meaning runtime code will resolve the stub. This affects multiple production components:

  • src/components/config/ActaConfigProvider.tsx
  • src/components/modules/vault/hooks/use-vault-setup.ts
  • src/components/modules/vault/hooks/use-vault-read.ts
  • src/components/modules/issuer/hooks/use-issuer-authorize.ts
  • src/components/modules/credential/hooks/use-credential-form.ts

Move the real SDK back to dependencies and configure the test stub as a Vitest alias or mock instead.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@package.json` at line 17, The `@acta-team/acta-sdk` dependency in
package.json is incorrectly pointing to the test stub file path in the
dependencies section, causing production code in ActaConfigProvider,
use-vault-setup, use-vault-read, use-issuer-authorize, and use-credential-form
to resolve the stub instead of the real SDK. Restore the real SDK package
version to the dependencies section of package.json, then configure the test
stub as a Vitest alias in the Vitest configuration file so the stub is only used
during test resolution and does not affect runtime code.

Comment on lines +36 to +71
describe('useCredentialForm', () => {
it('short-circuits when required fields are empty', async () => {
const { result } = renderHook(() => useCredentialForm());

await act(async () => {
await result.current.handleCreate();
});

expect(result.current.state.txId).toBeNull();
expect(issueMock).not.toHaveBeenCalled();
});

it('issues a credential when the form is valid', async () => {
const { result } = renderHook(() => useCredentialForm());

await act(async () => {
result.current.updateField('issuerName', 'Example University');
result.current.updateField('degreeType', 'ExampleBachelorDegree');
result.current.updateField('degreeName', 'Bachelor of Science and Arts');
});

await act(async () => {
await result.current.handleCreate();
});

expect(issueMock).toHaveBeenCalledOnce();
const issuedPayload = issueMock.mock.calls[0][0];
expect(issuedPayload).toMatchObject({
owner: validStellarAddress,
issuer: validStellarAddress,
issuerDid: validSubjectDid,
signTransaction: signTransactionMock,
});
expect(result.current.state.txId).toBe('mockTxId');
});
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚖️ Poor tradeoff

Add a test case for the DID validation guard (lines 50–53 of the hook).

The test suite covers the required-field short-circuit and the valid-submission happy path, but does not exercise the DID validation gate. If state.subjectDid is set to an invalid value, the hook should show a toast error and not call issueMock.

While the validation predicate itself is tested in validation.test.ts, this integration test should verify the guard's behavior within the credential creation flow.

✅ Proposed test case for invalid DID rejection
  it('issues a credential when the form is valid', async () => {
    const { result } = renderHook(() => useCredentialForm());

    await act(async () => {
      result.current.updateField('issuerName', 'Example University');
      result.current.updateField('degreeType', 'ExampleBachelorDegree');
      result.current.updateField('degreeName', 'Bachelor of Science and Arts');
    });

    await act(async () => {
      await result.current.handleCreate();
    });

    expect(issueMock).toHaveBeenCalledOnce();
    const issuedPayload = issueMock.mock.calls[0][0];
    expect(issuedPayload).toMatchObject({
      owner: validStellarAddress,
      issuer: validStellarAddress,
      issuerDid: validSubjectDid,
      signTransaction: signTransactionMock,
    });
    expect(result.current.state.txId).toBe('mockTxId');
  });
+
+ it('rejects credential creation with an invalid subject DID', async () => {
+   const { result } = renderHook(() => useCredentialForm());
+
+   await act(async () => {
+     result.current.updateField('issuerName', 'Example University');
+     result.current.updateField('subjectDid', 'invalid-did-format');
+     result.current.updateField('degreeType', 'ExampleBachelorDegree');
+     result.current.updateField('degreeName', 'Bachelor of Science and Arts');
+   });
+
+   await act(async () => {
+     await result.current.handleCreate();
+   });
+
+   expect(issueMock).not.toHaveBeenCalled();
+   expect(result.current.state.txId).toBeNull();
+ });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/modules/credential/hooks/use-credential-form.test.ts` around
lines 36 - 71, Add a test case to the useCredentialForm describe block that
verifies the DID validation guard behavior. Create a new test that renders the
hook, sets the subjectDid state to an invalid value, calls handleCreate within
an act block, and then assert that a toast error is displayed and issueMock is
not called. This will ensure the validation predicate within the hook prevents
credential issuance when the DID is invalid.

Comment on lines +68 to +75
// eslint-disable-next-line @typescript-eslint/no-var-requires, global-require
const {
StellarWalletsKit,
WalletNetwork,
FreighterModule,
AlbedoModule,
xBullModule,
} = require('@creit.tech/stellar-wallets-kit');

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify which require-related ESLint rules are configured and where.
fd -HI --glob 'eslint.config.*' --glob '.eslintrc*' . | xargs rg -n --no-heading "no-require-imports|no-var-requires"
rg -n --no-heading "eslint-disable-next-line.*no-var-requires|require\('`@creit`\.tech/stellar-wallets-kit'\)" src/providers/wallet.provider.tsx

Repository: ACTA-Team/demo-ACTA

Length of output: 359


🏁 Script executed:

#!/bin/bash
# Search for ESLint configuration files with corrected approach
find . -maxdepth 3 -name '.eslintrc*' -o -name 'eslint.config.*' 2>/dev/null | head -20

# Also check package.json for eslintConfig
if [ -f "package.json" ]; then
  echo "=== Checking package.json for eslintConfig ==="
  jq '.eslintConfig' package.json 2>/dev/null || echo "No eslintConfig in package.json"
fi

# Check the exact context around lines 68-75
echo "=== Context around lines 68-75 in wallet.provider.tsx ==="
sed -n '60,80p' src/providers/wallet.provider.tsx

Repository: ACTA-Team/demo-ACTA

Length of output: 1938


🌐 Web query:

TypeScript ESLint @typescript-eslint/no-var-requiresvs@typescript-eslint/no-require-imports rule difference

💡 Result:

The rule @typescript-eslint/no-var-requires has been deprecated in favor of @typescript-eslint/no-require-imports [1][2][3]. The primary differences and relationship between the two are as follows: 1. Deprecation Status: @typescript-eslint/no-var-requires is deprecated and users are advised to switch to @typescript-eslint/no-require-imports [1][3]. 2. Scope and Functionality: @typescript-eslint/no-var-requires was historically more limited in scope, focusing specifically on variable declarations using require [4][1]. In contrast, @typescript-eslint/no-require-imports is the comprehensive rule designed to cover all require expressions, including both bare require calls and TypeScript import = require declarations [4][5]. 3. Configuration and Parity: The functionality of the deprecated rule is fully encompassed by the newer rule [4]. By enabling the allowAsImport: true option in @typescript-eslint/no-require-imports, you can replicate the behavior where TypeScript's import = require syntax is permitted while still flagging standard require calls [4][5]. In summary, @typescript-eslint/no-require-imports is the modern, superseding rule that provides a unified way to enforce ES Module syntax over CommonJS require statements [5].

Citations:


🏁 Script executed:

#!/bin/bash
# Check for root-level ESLint config files more thoroughly
ls -la | grep -E "eslint|\.rc"

# Check if there's a config in other common locations
if [ -f ".eslintrc.json" ]; then
  echo "=== .eslintrc.json ===" && cat .eslintrc.json
fi

if [ -f ".eslintrc.js" ]; then
  echo "=== .eslintrc.js ===" && cat .eslintrc.js
fi

if [ -f ".eslintrc.cjs" ]; then
  echo "=== .eslintrc.cjs ===" && cat .eslintrc.cjs
fi

if [ -f ".eslintrc.yml" ]; then
  echo "=== .eslintrc.yml ===" && cat .eslintrc.yml
fi

if [ -f "eslint.config.js" ]; then
  echo "=== eslint.config.js ===" && cat eslint.config.js
fi

# Also check the project structure to understand the setup
echo "=== Root level files ==="
ls -la *.json *.js *.cjs 2>/dev/null | head -20

Repository: ACTA-Team/demo-ACTA

Length of output: 518


🏁 Script executed:

#!/bin/bash
# Read the ESLint config
echo "=== eslint.config.mjs ===" && cat eslint.config.mjs

Repository: ACTA-Team/demo-ACTA

Length of output: 1100


Update ESLint suppress directive to target the correct rule.

Line 68 disables @typescript-eslint/no-var-requires, which is deprecated. The project's ESLint config extends next/typescript, which enforces the modern @typescript-eslint/no-require-imports rule instead. Update the directive to suppress the correct rule:

-      // eslint-disable-next-line `@typescript-eslint/no-var-requires`, global-require
+      // eslint-disable-next-line `@typescript-eslint/no-require-imports`, global-require
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// eslint-disable-next-line @typescript-eslint/no-var-requires, global-require
const {
StellarWalletsKit,
WalletNetwork,
FreighterModule,
AlbedoModule,
xBullModule,
} = require('@creit.tech/stellar-wallets-kit');
// eslint-disable-next-line `@typescript-eslint/no-require-imports`, global-require
const {
StellarWalletsKit,
WalletNetwork,
FreighterModule,
AlbedoModule,
xBullModule,
} = require('`@creit.tech/stellar-wallets-kit`');
🧰 Tools
🪛 ESLint

[error] 75-75: A require() style import is forbidden.

(@typescript-eslint/no-require-imports)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/providers/wallet.provider.tsx` around lines 68 - 75, The
eslint-disable-next-line directive on line 68 references the deprecated rule
`@typescript-eslint/no-var-requires`, but the project's ESLint configuration uses
the modern `@typescript-eslint/no-require-imports` rule instead. Update the
eslint-disable comment that precedes the require statement for
stellar-wallets-kit imports to replace `@typescript-eslint/no-var-requires` with
`@typescript-eslint/no-require-imports` to properly suppress the correct rule.

Source: Linters/SAST tools

@DanielCotoJ DanielCotoJ merged commit 2d3400b into ACTA-Team:develop Jun 29, 2026
2 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Issue 3 — No test suite and no test step in CI

2 participants