Skip to content

Add real app tests and standardize test discovery#95

Merged
DaTiC0 merged 10 commits into
mainfrom
feat/test-suite-update
Mar 8, 2026
Merged

Add real app tests and standardize test discovery#95
DaTiC0 merged 10 commits into
mainfrom
feat/test-suite-update

Conversation

@DaTiC0

@DaTiC0 DaTiC0 commented Mar 7, 2026

Copy link
Copy Markdown
Owner

Summary

  • What changed?
  • Why was it needed?

Validation

  • Local checks passed (make test)
  • Runtime check done where relevant (make health)
  • CI checks are green

AI-Assisted Review (if applicable)

  • I used AI assistance for parts of this change
  • I manually reviewed all AI-generated code
  • I verified no secrets/credentials were added

Risk & Rollback

  • Risk level: Low / Medium / High
  • Rollback plan (if needed):

Summary by Sourcery

Add application-level tests and align unittest discovery with a consistent filename pattern.

New Features:

  • Add integration-style tests for the Flask application root and health endpoints.
  • Add unit tests for the allowed_file helper to cover extensions, case handling, and edge cases.

Enhancements:

  • Standardize unittest discovery to only run test files matching the test*.py pattern.
  • Remove the placeholder empty_test.py file that no longer provides value.

Tests:

  • Introduce real HTTP client tests exercising app routes and health contract.
  • Add comprehensive tests for file extension validation behavior.

@sourcery-ai

sourcery-ai Bot commented Mar 7, 2026

Copy link
Copy Markdown
Contributor

Reviewer's Guide

Standardizes Python unittest discovery pattern in the Makefile and replaces a placeholder test with real application-level tests for the Flask app routes and allowed_file helper.

Sequence diagram for standardized unittest discovery via make test

sequenceDiagram
    actor Developer
    participant Makefile
    participant Python
    participant unittest
    participant tests_test_app

    Developer->>Makefile: invoke make test
    Makefile->>Python: run python -m unittest discover -s tests -p test*.py -v
    Python->>unittest: initialize discovery
    unittest->>unittest: discover tests matching pattern test*.py in tests
    unittest-->>tests_test_app: load test cases
    unittest->>tests_test_app: execute tests
    tests_test_app-->>unittest: report results
    unittest-->>Python: aggregate exit code
    Python-->>Makefile: return exit code
    Makefile-->>Developer: display test results
Loading

Sequence diagram for Flask app route and helper testing in test_app

sequenceDiagram
    participant unittest
    participant TestAppRoutes
    participant TestAllowedFile
    participant FlaskApp
    participant allowed_file

    unittest->>TestAppRoutes: run setUp
    TestAppRoutes->>FlaskApp: create test_client
    unittest->>TestAppRoutes: run route tests
    TestAppRoutes->>FlaskApp: client.get or client.post to routes
    FlaskApp-->>TestAppRoutes: return response
    TestAppRoutes-->>unittest: assert response status and body

    unittest->>TestAllowedFile: run helper tests
    TestAllowedFile->>allowed_file: call with sample filenames
    allowed_file-->>TestAllowedFile: return boolean result
    TestAllowedFile-->>unittest: assert expected boolean values

    unittest-->>unittest: aggregate test results and exit code
Loading

File-Level Changes

Change Details Files
Standardize unittest discovery so only files matching test*.py are collected and executed.
  • Update the test target to call unittest discover with an explicit pattern of test*.py instead of the default discovery rules
  • Preserve the existing behavior that treats exit code 5 (no tests discovered) as a non-failing condition
Makefile
Add real Flask application tests covering main routes and the allowed_file helper, and remove the previous empty placeholder test.
  • Introduce an ApplicationRoutesTest test case that configures the Flask app for testing and exercises the root and /health endpoints, including response contract and status/status_code combinations
  • Introduce an AllowedFileTest test case that validates allowed_file behavior across a variety of filenames, extensions, case variations, and edge cases
  • Remove the previous empty_test.py placeholder so it no longer influences discovery or test results
tests/test_app.py
tests/empty_test.py

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the project's test coverage by introducing dedicated tests for the Flask application's routes and a critical file utility function. Concurrently, it refines the test execution process by standardizing the test discovery pattern in the 'Makefile', ensuring that only relevant test files are identified and run. These changes improve the reliability of the application and streamline the testing workflow.

Highlights

  • New Application Tests: Introduced comprehensive unit tests for the Flask application's routes (root and health endpoints) and the 'allowed_file' utility function, ensuring core functionalities behave as expected.
  • Standardized Test Discovery: Updated the 'Makefile' to explicitly use the "'test*.py'" pattern for 'unittest discover', standardizing how tests are found and executed.
  • Removed Placeholder Test: Deleted the 'tests/empty_test.py' file, which was a placeholder and is no longer needed with the introduction of actual application tests.
Changelog
  • Makefile
    • Modified the 'test' target to include the "-p 'test*.py'" pattern for 'unittest discover'.
  • tests/empty_test.py
    • Removed the placeholder test file.
  • tests/test_app.py
    • Added 'ApplicationRoutesTest' class to verify the '/' and '/health' endpoints of the Flask application.
    • Added 'AllowedFileTest' class to validate the 'allowed_file' function with various scenarios, including extensions, multiple dots, uppercase, and edge cases.
Activity
  • No specific activity (comments, reviews, or progress updates) has been recorded for this pull request yet.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hey - I've found 2 issues

Prompt for AI Agents
Please address the comments from this code review:

## Individual Comments

### Comment 1
<location path="tests/test_app.py" line_range="15-17" />
<code_context>
+    def setUp(self):
+        self.client = flask_app.test_client()
+
+    def test_root_endpoint_returns_success(self):
+        response = self.client.get('/')
+        self.assertEqual(response.status_code, 200)
+
+    def test_health_endpoint_contract(self):
</code_context>
<issue_to_address>
**suggestion (testing):** Consider asserting on the response payload for `/` to prove the route behavior, not just the status code.

This test only verifies that `/` returns HTTP 200. To fully validate the route, also assert on the response body (e.g., via `response.get_data(as_text=True)` or `response.get_json()`) to confirm it returns the expected content or structure, not just a success code.

```suggestion
    def test_root_endpoint_returns_success(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)

        body = response.get_data(as_text=True)
        self.assertIsInstance(body, str)
        self.assertNotEqual(body.strip(), "")
```
</issue_to_address>

### Comment 2
<location path="tests/test_app.py" line_range="19-28" />
<code_context>
+        response = self.client.get('/')
+        self.assertEqual(response.status_code, 200)
+
+    def test_health_endpoint_contract(self):
+        response = self.client.get('/health')
+        self.assertIn(response.status_code, (200, 503))
+
+        payload = response.get_json()
+        self.assertIsInstance(payload, dict)
+        self.assertEqual(payload.get('service'), 'smart-google')
+        self.assertIsInstance(payload.get('mqtt_connected'), bool)
+        self.assertIn(payload.get('status'), ('ok', 'degraded'))
+
+        if response.status_code == 200:
+            self.assertEqual(payload.get('status'), 'ok')
+        else:
+            self.assertEqual(payload.get('status'), 'degraded')
+
+
</code_context>
<issue_to_address>
**suggestion (testing):** Strengthen the `/health` test by validating response headers and JSON shape more explicitly.

To further lock down the contract and detect regressions earlier, you could also assert that:
- The response has a JSON content type (e.g. `self.assertEqual(response.content_type, 'application/json')` or starts with `application/json`).
- Field types are as expected beyond `mqtt_connected` (e.g. `service` is a non-empty string).

These additions make the health probe more robust for external systems and tooling.

Suggested implementation:

```python
    def test_root_endpoint_returns_success(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)

    def test_health_endpoint_contract(self):
        response = self.client.get('/health')
        self.assertIn(response.status_code, (200, 503))

        # Content type / headers
        self.assertTrue(
            response.content_type.startswith("application/json"),
            msg=f"Unexpected content type: {response.content_type}",
        )

        payload = response.get_json()
        self.assertIsInstance(payload, dict)

        # service field: non-empty string
        self.assertIn("service", payload)
        self.assertIsInstance(payload["service"], str)
        self.assertTrue(payload["service"])
        self.assertEqual(payload["service"], "smart-google")

        # mqtt_connected field: boolean
        self.assertIn("mqtt_connected", payload)
        self.assertIsInstance(payload["mqtt_connected"], bool)

        # status field: constrained string
        self.assertIn("status", payload)
        self.assertIsInstance(payload["status"], str)
        self.assertIn(payload["status"], ("ok", "degraded"))

        if response.status_code == 200:
            self.assertEqual(payload["status"], "ok")
        else:
            self.assertEqual(payload["status"], "degraded")

```

If the existing `test_health_endpoint_contract` method is already present in `tests/test_app.py`, replace its body with the updated version above rather than creating a duplicate method. Adjust the indentation to match the surrounding class definition if it differs from the snippet shown.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment thread tests/test_app.py Outdated
Comment on lines +15 to +17
def test_root_endpoint_returns_success(self):
response = self.client.get('/')
self.assertEqual(response.status_code, 200)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

suggestion (testing): Consider asserting on the response payload for / to prove the route behavior, not just the status code.

This test only verifies that / returns HTTP 200. To fully validate the route, also assert on the response body (e.g., via response.get_data(as_text=True) or response.get_json()) to confirm it returns the expected content or structure, not just a success code.

Suggested change
def test_root_endpoint_returns_success(self):
response = self.client.get('/')
self.assertEqual(response.status_code, 200)
def test_root_endpoint_returns_success(self):
response = self.client.get('/')
self.assertEqual(response.status_code, 200)
body = response.get_data(as_text=True)
self.assertIsInstance(body, str)
self.assertNotEqual(body.strip(), "")

Comment thread tests/test_app.py
Comment on lines +19 to +28
def test_health_endpoint_contract(self):
response = self.client.get('/health')
self.assertIn(response.status_code, (200, 503))

payload = response.get_json()
self.assertIsInstance(payload, dict)
self.assertEqual(payload.get('service'), 'smart-google')
self.assertIsInstance(payload.get('mqtt_connected'), bool)
self.assertIn(payload.get('status'), ('ok', 'degraded'))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

suggestion (testing): Strengthen the /health test by validating response headers and JSON shape more explicitly.

To further lock down the contract and detect regressions earlier, you could also assert that:

  • The response has a JSON content type (e.g. self.assertEqual(response.content_type, 'application/json') or starts with application/json).
  • Field types are as expected beyond mqtt_connected (e.g. service is a non-empty string).

These additions make the health probe more robust for external systems and tooling.

Suggested implementation:

    def test_root_endpoint_returns_success(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)

    def test_health_endpoint_contract(self):
        response = self.client.get('/health')
        self.assertIn(response.status_code, (200, 503))

        # Content type / headers
        self.assertTrue(
            response.content_type.startswith("application/json"),
            msg=f"Unexpected content type: {response.content_type}",
        )

        payload = response.get_json()
        self.assertIsInstance(payload, dict)

        # service field: non-empty string
        self.assertIn("service", payload)
        self.assertIsInstance(payload["service"], str)
        self.assertTrue(payload["service"])
        self.assertEqual(payload["service"], "smart-google")

        # mqtt_connected field: boolean
        self.assertIn("mqtt_connected", payload)
        self.assertIsInstance(payload["mqtt_connected"], bool)

        # status field: constrained string
        self.assertIn("status", payload)
        self.assertIsInstance(payload["status"], str)
        self.assertIn(payload["status"], ("ok", "degraded"))

        if response.status_code == 200:
            self.assertEqual(payload["status"], "ok")
        else:
            self.assertEqual(payload["status"], "degraded")

If the existing test_health_endpoint_contract method is already present in tests/test_app.py, replace its body with the updated version above rather than creating a duplicate method. Adjust the indentation to match the surrounding class definition if it differs from the snippet shown.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request introduces valuable application-level tests for the Flask app and standardizes the test discovery process, which are great improvements. The new tests for the allowed_file helper are comprehensive.

My review focuses on the new application route tests in tests/test_app.py. I've identified a couple of areas for improvement to make the tests more robust and reliable. Specifically, the tests for the / and /health endpoints don't account for the FULL_FEATURES flag in app.py, which can lead to tests failing in environments where optional dependencies are not installed. I've also suggested a way to make the assertions in the health check test clearer and safer.

Overall, this is a solid contribution, and with a few adjustments to the tests, it will be even better.

Comment thread tests/test_app.py Outdated
Comment on lines +19 to +32
def test_health_endpoint_contract(self):
response = self.client.get('/health')
self.assertIn(response.status_code, (200, 503))

payload = response.get_json()
self.assertIsInstance(payload, dict)
self.assertEqual(payload.get('service'), 'smart-google')
self.assertIsInstance(payload.get('mqtt_connected'), bool)
self.assertIn(payload.get('status'), ('ok', 'degraded'))

if response.status_code == 200:
self.assertEqual(payload.get('status'), 'ok')
else:
self.assertEqual(payload.get('status'), 'degraded')

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

high

The test for the /health endpoint seems to assume that the application is running with FULL_FEATURES=True. However, if FULL_FEATURES is False (e.g., due to missing optional dependencies), a fallback /health endpoint is registered in app.py which returns a different payload ({'status': 'healthy', 'features': 'basic'}). This will cause this test to fail because it expects keys like service and mqtt_connected which are not present in the fallback response.

Tests should be reliable and produce consistent results. Please consider skipping this test if FULL_FEATURES is False. You can import FULL_FEATURES from app and use self.skipTest() if it's False at the beginning of the test method.

Comment thread tests/test_app.py Outdated
Comment on lines +15 to +17
def test_root_endpoint_returns_success(self):
response = self.client.get('/')
self.assertEqual(response.status_code, 200)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

This test only verifies the status code. The response body of the root endpoint / differs depending on the FULL_FEATURES flag in app.py. To make this test more robust and ensure it's testing the intended behavior, consider adding an assertion to check the response content.

For example, if you intend to test the fallback route (when FULL_FEATURES is False), you could add:

data = response.get_json()
self.assertEqual(data['status'], 'Smart-Google is working!')

This will make the test more explicit about what it's verifying.

Comment thread tests/test_app.py Outdated
Comment on lines +25 to +27
self.assertEqual(payload.get('service'), 'smart-google')
self.assertIsInstance(payload.get('mqtt_connected'), bool)
self.assertIn(payload.get('status'), ('ok', 'degraded'))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

Using payload.get('key') in assertions can lead to less clear failure messages if the key is missing (e.g., AssertionError: None != 'smart-google'). It's better practice to first check for the key's existence or use dictionary access payload['key'] which would raise a KeyError with a clear message. This makes it explicit that the presence of these keys is part of the contract being tested.

        self.assertIn('service', payload)
        self.assertEqual(payload['service'], 'smart-google')
        self.assertIn('mqtt_connected', payload)
        self.assertIsInstance(payload['mqtt_connected'], bool)
        self.assertIn('status', payload)
        self.assertIn(payload['status'], ('ok', 'degraded'))

@DaTiC0

DaTiC0 commented Mar 8, 2026

Copy link
Copy Markdown
Owner Author

Hey - I've found 2 issues

Prompt for AI Agents
Please address the comments from this code review:

## Individual Comments

### Comment 1
<location path="tests/test_app.py" line_range="15-17" />
<code_context>
+    def setUp(self):
+        self.client = flask_app.test_client()
+
+    def test_root_endpoint_returns_success(self):
+        response = self.client.get('/')
+        self.assertEqual(response.status_code, 200)
+
+    def test_health_endpoint_contract(self):
</code_context>
<issue_to_address>
**suggestion (testing):** Consider asserting on the response payload for `/` to prove the route behavior, not just the status code.

This test only verifies that `/` returns HTTP 200. To fully validate the route, also assert on the response body (e.g., via `response.get_data(as_text=True)` or `response.get_json()`) to confirm it returns the expected content or structure, not just a success code.

```suggestion
    def test_root_endpoint_returns_success(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)

        body = response.get_data(as_text=True)
        self.assertIsInstance(body, str)
        self.assertNotEqual(body.strip(), "")
```
</issue_to_address>

### Comment 2
<location path="tests/test_app.py" line_range="19-28" />
<code_context>
+        response = self.client.get('/')
+        self.assertEqual(response.status_code, 200)
+
+    def test_health_endpoint_contract(self):
+        response = self.client.get('/health')
+        self.assertIn(response.status_code, (200, 503))
+
+        payload = response.get_json()
+        self.assertIsInstance(payload, dict)
+        self.assertEqual(payload.get('service'), 'smart-google')
+        self.assertIsInstance(payload.get('mqtt_connected'), bool)
+        self.assertIn(payload.get('status'), ('ok', 'degraded'))
+
+        if response.status_code == 200:
+            self.assertEqual(payload.get('status'), 'ok')
+        else:
+            self.assertEqual(payload.get('status'), 'degraded')
+
+
</code_context>
<issue_to_address>
**suggestion (testing):** Strengthen the `/health` test by validating response headers and JSON shape more explicitly.

To further lock down the contract and detect regressions earlier, you could also assert that:
- The response has a JSON content type (e.g. `self.assertEqual(response.content_type, 'application/json')` or starts with `application/json`).
- Field types are as expected beyond `mqtt_connected` (e.g. `service` is a non-empty string).

These additions make the health probe more robust for external systems and tooling.

Suggested implementation:

```python
    def test_root_endpoint_returns_success(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)

    def test_health_endpoint_contract(self):
        response = self.client.get('/health')
        self.assertIn(response.status_code, (200, 503))

        # Content type / headers
        self.assertTrue(
            response.content_type.startswith("application/json"),
            msg=f"Unexpected content type: {response.content_type}",
        )

        payload = response.get_json()
        self.assertIsInstance(payload, dict)

        # service field: non-empty string
        self.assertIn("service", payload)
        self.assertIsInstance(payload["service"], str)
        self.assertTrue(payload["service"])
        self.assertEqual(payload["service"], "smart-google")

        # mqtt_connected field: boolean
        self.assertIn("mqtt_connected", payload)
        self.assertIsInstance(payload["mqtt_connected"], bool)

        # status field: constrained string
        self.assertIn("status", payload)
        self.assertIsInstance(payload["status"], str)
        self.assertIn(payload["status"], ("ok", "degraded"))

        if response.status_code == 200:
            self.assertEqual(payload["status"], "ok")
        else:
            self.assertEqual(payload["status"], "degraded")

```

If the existing `test_health_endpoint_contract` method is already present in `tests/test_app.py`, replace its body with the updated version above rather than creating a duplicate method. Adjust the indentation to match the surrounding class definition if it differs from the snippet shown.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@copilot

Copilot AI commented Mar 8, 2026

Copy link
Copy Markdown
Contributor

@DaTiC0 I've opened a new pull request, #96, to work on those changes. Once the pull request is ready, I'll request review from you.

Copilot AI and others added 3 commits March 8, 2026 00:53
Co-authored-by: DaTiC0 <13198638+DaTiC0@users.noreply.github.com>
Strengthen health contract tests and standardize fallback health endpoint
@DaTiC0

DaTiC0 commented Mar 8, 2026

Copy link
Copy Markdown
Owner Author

@copilot code change failing two checks! Fix it!

Copilot AI commented Mar 8, 2026

Copy link
Copy Markdown
Contributor

@DaTiC0 I've opened a new pull request, #97, to work on those changes. Once the pull request is ready, I'll request review from you.

Copilot AI and others added 3 commits March 8, 2026 08:19
… E402

Co-authored-by: DaTiC0 <13198638+DaTiC0@users.noreply.github.com>
Fix CI: pin Flask 1.1.2 transitive deps and suppress noqa E402 in test imports
@DaTiC0
DaTiC0 merged commit 53ae0e5 into main Mar 8, 2026
7 checks passed
@DaTiC0
DaTiC0 deleted the feat/test-suite-update branch March 8, 2026 09:27
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