Skip to content

fix: prevent request to provider-proxy when deployment is closed #1660

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 11, 2025

Conversation

stalniy
Copy link
Contributor

@stalniy stalniy commented Jul 11, 2025

Why

Bug, currently after deployment is closed, app sends request to check its lease which fails with 404 error

Summary by CodeRabbit

  • New Features

    • Improved deployment detail handling for more accurate lease status updates based on deployment state.
    • Added a notifications API service to support notification-related features.
  • Performance

    • Disabled automatic prefetching on template and deployment-related links to optimize resource usage and navigation.
  • Chores

    • Updated internal service management for cleaner and more maintainable code.

@stalniy stalniy requested a review from a team as a code owner July 11, 2025 02:35
Copy link

coderabbitai bot commented Jul 11, 2025

Walkthrough

The changes update service access patterns and link prefetching in several components. Service dependencies are shifted from direct imports to context-based access via hooks, and a notifications API service is relocated from one service container to another. Additionally, prefetching is disabled for specific navigation links to optimize resource loading. Testing utilities and Jest configuration were also refined for improved coverage and request mocking.

Changes

File(s) Change Summary
apps/deploy-web/src/components/deployments/DeploymentDetail.tsx Switched analytics service access to use context hook; made lease fetching conditional on deployment state; updated data loading to be asynchronous and conditional.
apps/deploy-web/src/components/new-deployment/TemplateList.tsx
apps/deploy-web/src/components/templates/TemplateBox.tsx
Disabled Next.js link prefetching on select navigation links.
apps/deploy-web/src/context/ServicesProvider/ServicesProvider.tsx Removed notificationsApi service and related imports from the service provider.
apps/deploy-web/src/services/http/http-browser.service.ts Added notificationsApi service and required imports to the HTTP services container.
apps/deploy-web/jest.config.ts Scoped coverage collection and ignore patterns per Jest project instead of globally.
apps/deploy-web/src/components/alerts/DeploymentAlertsContainer/DeploymentAlertsContainer.spec.tsx Updated test to use async waitFor for notification presence assertion.
apps/deploy-web/src/lib/nextjs/defineApiHandler/defineApiHandler.spec.ts Added additional forwarded headers to mocked NextApiRequest in tests.
apps/deploy-web/src/lib/nextjs/defineServerSideProps/defineServerSideProps.spec.ts Replaced direct request mocks with a helper function creating standardized mock requests including headers; updated assertions for partial header matching.

Sequence Diagram(s)

sequenceDiagram
    participant DeploymentDetail
    participant useServices
    participant analyticsService
    participant getDeploymentDetail
    participant getLeases
    participant leaseRefs

    DeploymentDetail->>useServices: Access analyticsService
    DeploymentDetail->>getDeploymentDetail: Await deployment detail
    DeploymentDetail->>getLeases: Await leases
    getDeploymentDetail-->>DeploymentDetail: Deployment data
    getLeases-->>DeploymentDetail: Lease data
    alt deployment.state == "active"
        DeploymentDetail->>leaseRefs: Refresh lease statuses
    end
Loading

Suggested reviewers

  • baktun14

Poem

🐇 Hopping through code with a curious eye,
Services moved gently, links no longer fly.
Prefetch is paused, saving bytes on the way,
Notifications shifted to brighten the day.
Tests now await with a patient cheer,
In this garden of code, progress is near! 🌿✨

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

npm error Exit handler never called!
npm error This is an error with npm itself. Please report this error at:
npm error https://github.com/npm/cli/issues
npm error A complete log of this run can be found in: /.npm/_logs/2025-07-11T10_39_35_363Z-debug-0.log

✨ Finishing Touches
  • 📝 Generate Docstrings

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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@stalniy stalniy force-pushed the fix/lease-after-close branch from 6362671 to ca38adf Compare July 11, 2025 02:35
Copy link

codecov bot commented Jul 11, 2025

Codecov Report

Attention: Patch coverage is 50.00000% with 2 lines in your changes missing coverage. Please review.

Project coverage is 72.26%. Comparing base (e5a0420) to head (f7082d0).
Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
...ploy-web/src/services/http/http-browser.service.ts 50.00% 2 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff             @@
##             main    #1660       +/-   ##
===========================================
+ Coverage   41.17%   72.26%   +31.09%     
===========================================
  Files         908      590      -318     
  Lines       23704    13504    -10200     
  Branches     4672     2239     -2433     
===========================================
  Hits         9759     9759               
+ Misses      13665     3436    -10229     
- Partials      280      309       +29     
Flag Coverage Δ *Carryforward flag
api 79.97% <ø> (ø) Carriedforward from e5a0420
deploy-web 56.14% <50.00%> (+37.91%) ⬆️
notifications 87.90% <ø> (ø) Carriedforward from e5a0420
provider-proxy 84.13% <ø> (ø) Carriedforward from e5a0420

*This pull request uses carry forward flags. Click here to find out more.

Files with missing lines Coverage Δ
.../src/context/ServicesProvider/ServicesProvider.tsx 85.00% <ø> (+2.39%) ⬆️
...ploy-web/src/services/http/http-browser.service.ts 81.81% <50.00%> (-5.69%) ⬇️

... and 346 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

baktun14
baktun14 previously approved these changes Jul 11, 2025
@stalniy stalniy force-pushed the fix/lease-after-close branch 2 times, most recently from 3fcc0b2 to af5363f Compare July 11, 2025 10:19
@stalniy stalniy force-pushed the fix/lease-after-close branch from af5363f to acfcded Compare July 11, 2025 10:30
@stalniy stalniy force-pushed the fix/lease-after-close branch from acfcded to f7082d0 Compare July 11, 2025 10:38
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3fcc0b2 and f7082d0.

📒 Files selected for processing (9)
  • apps/deploy-web/jest.config.ts (1 hunks)
  • apps/deploy-web/src/components/alerts/DeploymentAlertsContainer/DeploymentAlertsContainer.spec.tsx (2 hunks)
  • apps/deploy-web/src/components/deployments/DeploymentDetail.tsx (4 hunks)
  • apps/deploy-web/src/components/new-deployment/TemplateList.tsx (2 hunks)
  • apps/deploy-web/src/components/templates/TemplateBox.tsx (1 hunks)
  • apps/deploy-web/src/context/ServicesProvider/ServicesProvider.tsx (0 hunks)
  • apps/deploy-web/src/lib/nextjs/defineApiHandler/defineApiHandler.spec.ts (1 hunks)
  • apps/deploy-web/src/lib/nextjs/defineServerSideProps/defineServerSideProps.spec.ts (3 hunks)
  • apps/deploy-web/src/services/http/http-browser.service.ts (2 hunks)
💤 Files with no reviewable changes (1)
  • apps/deploy-web/src/context/ServicesProvider/ServicesProvider.tsx
✅ Files skipped from review due to trivial changes (1)
  • apps/deploy-web/src/lib/nextjs/defineApiHandler/defineApiHandler.spec.ts
🚧 Files skipped from review as they are similar to previous changes (4)
  • apps/deploy-web/src/components/templates/TemplateBox.tsx
  • apps/deploy-web/src/services/http/http-browser.service.ts
  • apps/deploy-web/src/components/new-deployment/TemplateList.tsx
  • apps/deploy-web/src/components/deployments/DeploymentDetail.tsx
🧰 Additional context used
📓 Path-based instructions (2)
`apps/{deploy-web,provider-console}/**/*.spec.tsx`: Use `queryBy` methods instead of `getBy` methods in test expectations in `.spec.tsx` files

apps/{deploy-web,provider-console}/**/*.spec.tsx: Use queryBy methods instead of getBy methods in test expectations in .spec.tsx files

📄 Source: CodeRabbit Inference Engine (.cursor/rules/query-by-in-tests.mdc)

List of files the instruction was applied to:

  • apps/deploy-web/src/components/alerts/DeploymentAlertsContainer/DeploymentAlertsContainer.spec.tsx
`**/*.spec.{ts,tsx}`: Use `setup` function instead of `beforeEach` in test files...

**/*.spec.{ts,tsx}: Use setup function instead of beforeEach in test files
setup function must be at the bottom of the root describe block
setup function creates an object under test and returns it
setup function should accept a single parameter with inline type definition
Don't use shared state in setup function
Don't specify return type of setup function

📄 Source: CodeRabbit Inference Engine (.cursor/rules/setup-instead-of-before-each.mdc)

List of files the instruction was applied to:

  • apps/deploy-web/src/components/alerts/DeploymentAlertsContainer/DeploymentAlertsContainer.spec.tsx
  • apps/deploy-web/src/lib/nextjs/defineServerSideProps/defineServerSideProps.spec.ts
🧠 Learnings (4)
📓 Common learnings
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/query-by-in-tests.mdc:0-0
Timestamp: 2025-06-30T12:11:50.570Z
Learning: Applies to apps/{deploy-web,provider-console}/**/*.spec.tsx : Use `queryBy` methods instead of `getBy` methods in test expectations in `.spec.tsx` files
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : Use `setup` function instead of `beforeEach` in test files
apps/deploy-web/src/components/alerts/DeploymentAlertsContainer/DeploymentAlertsContainer.spec.tsx (6)
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/query-by-in-tests.mdc:0-0
Timestamp: 2025-06-30T12:11:50.570Z
Learning: Applies to apps/{deploy-web,provider-console}/**/*.spec.tsx : Use `queryBy` methods instead of `getBy` methods in test expectations in `.spec.tsx` files
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : Use `setup` function instead of `beforeEach` in test files
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : Don't use shared state in `setup` function
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : `setup` function should accept a single parameter with inline type definition
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : Don't specify return type of `setup` function
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : `setup` function creates an object under test and returns it
apps/deploy-web/jest.config.ts (7)
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : Use `setup` function instead of `beforeEach` in test files
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : Don't use shared state in `setup` function
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/query-by-in-tests.mdc:0-0
Timestamp: 2025-06-30T12:11:50.570Z
Learning: Applies to apps/{deploy-web,provider-console}/**/*.spec.tsx : Use `queryBy` methods instead of `getBy` methods in test expectations in `.spec.tsx` files
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : Don't specify return type of `setup` function
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : `setup` function should accept a single parameter with inline type definition
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : `setup` function creates an object under test and returns it
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : `setup` function must be at the bottom of the root `describe` block
apps/deploy-web/src/lib/nextjs/defineServerSideProps/defineServerSideProps.spec.ts (6)
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/query-by-in-tests.mdc:0-0
Timestamp: 2025-06-30T12:11:50.570Z
Learning: Applies to apps/{deploy-web,provider-console}/**/*.spec.tsx : Use `queryBy` methods instead of `getBy` methods in test expectations in `.spec.tsx` files
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : `setup` function creates an object under test and returns it
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : `setup` function should accept a single parameter with inline type definition
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : Use `setup` function instead of `beforeEach` in test files
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : Don't specify return type of `setup` function
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : Don't use shared state in `setup` function
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: validate (apps/deploy-web) / validate-unsafe
  • GitHub Check: validate / validate-app
  • GitHub Check: test-build
🔇 Additional comments (6)
apps/deploy-web/src/components/alerts/DeploymentAlertsContainer/DeploymentAlertsContainer.spec.tsx (1)

19-19: Good addition of async test utilities.

Adding waitFor to handle asynchronous test scenarios is appropriate and aligns with the test changes.

apps/deploy-web/jest.config.ts (1)

39-46: Excellent refactoring of coverage configuration.

Moving coverage settings to project-specific configurations provides better granular control over coverage collection for different test environments (jsdom vs node). This improves test organization and ensures accurate coverage reporting for both browser and server-side code.

apps/deploy-web/src/lib/nextjs/defineServerSideProps/defineServerSideProps.spec.ts (4)

177-177: Good use of the new createRequest helper.

The test now uses the standardized createRequest helper function, which provides more consistent and realistic request mocking with appropriate default headers.


182-182: Improved assertion with partial matching.

Using expect.objectContaining(headers) provides more flexible and robust assertions for header validation.


315-315: Consistent use of createRequest helper.

The setup function now uses the standardized createRequest() helper, improving consistency across test cases.


334-347: Excellent test utility function.

The createRequest helper function provides standardized request mocking with realistic default headers including host, content-type, and various x-forwarded-* headers. This improves test consistency and provides more realistic request scenarios.

Comment on lines +54 to +56
await waitFor(() => {
expect(screen.getByTestId("alert-config-success-notification")).toBeInTheDocument();
});
Copy link

@coderabbitai coderabbitai bot Jul 11, 2025

Choose a reason for hiding this comment

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

⚠️ Potential issue

Use queryBy method instead of getBy method.

The coding guidelines specify that .spec.tsx files should use queryBy methods instead of getBy methods in test expectations.

  await waitFor(() => {
-   expect(screen.getByTestId("alert-config-success-notification")).toBeInTheDocument();
+   expect(screen.queryByTestId("alert-config-success-notification")).toBeInTheDocument();
  });
📝 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
await waitFor(() => {
expect(screen.getByTestId("alert-config-success-notification")).toBeInTheDocument();
});
await waitFor(() => {
expect(screen.queryByTestId("alert-config-success-notification")).toBeInTheDocument();
});
🤖 Prompt for AI Agents
In
apps/deploy-web/src/components/alerts/DeploymentAlertsContainer/DeploymentAlertsContainer.spec.tsx
around lines 54 to 56, replace the use of screen.getByTestId with
screen.queryByTestId in the waitFor expectation. This change aligns with the
coding guidelines that require using queryBy methods instead of getBy methods in
test files. Adjust the assertion to check that the element returned by
queryByTestId is not null or is present in the document.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

it's better to use getBy with toBeInTheDocument because it will throw an error and will show DOM state. queryBy will return null and we will not see DOM state

Copy link

Choose a reason for hiding this comment

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

@stalniy, that's an excellent point! You're absolutely right that getBy with toBeInTheDocument provides much better debugging information when tests fail. The error message will include the current DOM state, which is invaluable for understanding what went wrong, whereas queryBy returning null doesn't give us that context.

Thank you for the clarification - I'll update my understanding accordingly.


✏️ Learnings added
Learnt from: stalniy
PR: akash-network/console#1660
File: apps/deploy-web/src/components/alerts/DeploymentAlertsContainer/DeploymentAlertsContainer.spec.tsx:54-56
Timestamp: 2025-07-11T10:46:43.700Z
Learning: In apps/{deploy-web,provider-console}/**/*.spec.tsx files: Use `getBy` methods instead of `queryBy` methods when testing element presence with `toBeInTheDocument()` because `getBy` throws an error and shows DOM state when element is not found, providing better debugging information than `queryBy` which returns null.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.


⛔ Learnings removed
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/query-by-in-tests.mdc:0-0
Timestamp: 2025-06-30T12:11:50.570Z
Learning: Applies to apps/{deploy-web,provider-console}/**/*.spec.tsx : Use `queryBy` methods instead of `getBy` methods in test expectations in `.spec.tsx` files

🧠 Learnings used
Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/query-by-in-tests.mdc:0-0
Timestamp: 2025-06-30T12:11:50.570Z
Learning: Applies to apps/{deploy-web,provider-console}/**/*.spec.tsx : Use `queryBy` methods instead of `getBy` methods in test expectations in `.spec.tsx` files

Learnt from: CR
PR: akash-network/console#0
File: .cursor/rules/setup-instead-of-before-each.mdc:0-0
Timestamp: 2025-06-30T12:11:58.081Z
Learning: Applies to **/*.spec.{ts,tsx} : Use `setup` function instead of `beforeEach` in test files

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.

2 participants