Skip to content

Conversation

@SubhadityaMukherjee
Copy link

Moved tests to using testcontainers. It does seem to work but it might be good to verify if this is what was intended. :)

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 23, 2026

Walkthrough

The PR adds three optional dev dependencies in pyproject.toml: testcontainers, pymysql, and cryptography. tests/conftest.py is modified to load environment variables via dotenv, add an autouse session fixture that overrides MySqlContainer readiness with a custom wait strategy, introduce a session-scoped mysql_container fixture, and update expdb_test and user_test to use the container-provided mysql+pymysql URL and yield SQLAlchemy Connection objects within a begin/rollback context. py_api now yields a TestClient (generator), and pytest_collection_modifyitems signature was changed to accept (items).

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 22.22% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Moved tests to using testcontainers' directly and clearly describes the main change: migrating the test suite to use Testcontainers for database testing.
Description check ✅ Passed The description mentions moving tests to using testcontainers, which aligns with the actual changeset that adds testcontainers dependencies and refactors test fixtures.

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

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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 and usage tips.

Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

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

Hey - I've found 1 issue, and left some high level feedback:

  • The new expdb_test fixture no longer uses automatic_rollback, so test cases may now leak state into each other and depend on execution order; consider wrapping the Testcontainers-backed connection in the same rollback helper to preserve isolation.
  • Overriding MySqlContainer._connect globally in an autouse fixture tightly couples tests to a private implementation detail of testcontainers; if possible, prefer configuring an official wait strategy on the container instance instead of monkey-patching a private method at module scope.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The new `expdb_test` fixture no longer uses `automatic_rollback`, so test cases may now leak state into each other and depend on execution order; consider wrapping the Testcontainers-backed connection in the same rollback helper to preserve isolation.
- Overriding `MySqlContainer._connect` globally in an autouse fixture tightly couples tests to a private implementation detail of testcontainers; if possible, prefer configuring an official wait strategy on the container instance instead of monkey-patching a private method at module scope.

## Individual Comments

### Comment 1
<location> `tests/conftest.py:67-74` </location>
<code_context>
+        container.stop()
+
+
[email protected]
+def expdb_test(mysql_container: MySqlContainer) -> Connection:
+    url = mysql_container.get_connection_url()
+    url = url.replace("mysql://", "mysql+pymysql://")
+
+    engine = sqlalchemy.create_engine(url)
+    with engine.begin() as connection:
+        yield connection
+
+
</code_context>

<issue_to_address>
**issue (testing):** The new `expdb_test` fixture no longer wraps connections in `automatic_rollback`, so test data will persist across tests and may break isolation.

With `engine.begin()` the transaction is committed on context exit, so writes from one test will persist into the next and can cause order-dependent, flaky tests when sharing the same database. To preserve isolation, either wrap the dynamic `engine` with `automatic_rollback`, explicitly manage a transaction and roll it back per test, or add a fixture that truncates/cleans the DB between tests while still using Testcontainers.
</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 on lines 67 to 74
@pytest.fixture
def expdb_test(mysql_container: MySqlContainer) -> Connection:
url = mysql_container.get_connection_url()
url = url.replace("mysql://", "mysql+pymysql://")

engine = sqlalchemy.create_engine(url)
with engine.begin() as connection:
yield connection
Copy link
Contributor

Choose a reason for hiding this comment

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

issue (testing): The new expdb_test fixture no longer wraps connections in automatic_rollback, so test data will persist across tests and may break isolation.

With engine.begin() the transaction is committed on context exit, so writes from one test will persist into the next and can cause order-dependent, flaky tests when sharing the same database. To preserve isolation, either wrap the dynamic engine with automatic_rollback, explicitly manage a transaction and roll it back per test, or add a fixture that truncates/cleans the DB between tests while still using Testcontainers.

Copy link
Contributor

@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: 3

🤖 Fix all issues with AI agents
In `@tests/conftest.py`:
- Line 45: Remove the unused lint suppression by deleting the trailing "  #
noqa: SLF001" on the assignment MySqlContainer._connect = _connect so the line
reads only the assignment; this drops the unnecessary directive and resolves the
Ruff unused-directive warning while leaving the monkeypatch intact.
- Around line 48-64: The mysql_container fixture currently calls
container.start() unguarded and will hard-fail when Docker isn't reachable; wrap
the container.start() call in a try/except that catches
docker.errors.DockerException and calls pytest.skip(...) to skip the session
tests when Docker is unavailable (ensure you import pytest and docker.errors if
not present), then proceed to yield container and keep the existing finally
container.stop() behavior so cleanup still runs if start succeeded.
- Around line 29-44: The fixture override_testcontainers_connect is
monkey-patching the private MySqlContainer._connect; remove that override and
instead use the public waiting utilities—either call wait_for_logs(container,
r"ready for connections", timeout=60, interval=1) after container startup (use
the testcontainers.core.waiting_utils.wait_for_logs function) or create a
subclass (e.g., MySqlContainerWithWait) and implement _connect decorated with
`@wait_container_is_ready` to handle retry logic; in short: stop overriding
_connect directly in override_testcontainers_connect and switch to wait_for_logs
or a decorated subclass of MySqlContainer for log-based readiness.
♻️ Duplicate comments (1)
tests/conftest.py (1)

67-74: engine.begin() commits on exit; tests may leak data across cases.

Line 73 uses engine.begin(), which commits on context exit. That breaks isolation and can make tests order-dependent. Prefer automatic_rollback(engine) or explicit rollback per test.

✅ Safer rollback-based fixture
     engine = sqlalchemy.create_engine(url)
-    with engine.begin() as connection:
+    with automatic_rollback(engine) as connection:
         yield connection
In SQLAlchemy, does `engine.begin()` commit on context exit, and what is the recommended pattern for rollback-based test fixtures?
🧹 Nitpick comments (1)
pyproject.toml (1)

35-37: Confirm and constrain new dev dependency versions.

Lines 35–37 add unpinned dev deps; to keep CI reproducible and avoid breaking changes, consider adding compatible version ranges (or a constraints file) after confirming they support Python 3.12 and your SQLAlchemy/MySQL stack.

What are the latest stable versions of testcontainers, pymysql, and cryptography, and do they support Python 3.12? Any breaking changes that could affect SQLAlchemy or PyMySQL usage?

Comment on lines +29 to +44
@pytest.fixture(scope="session", autouse=True)
def override_testcontainers_connect() -> None:
"""
Override MySqlContainer._connect once per test session.
Applied automatically everywhere.
"""

def _connect(self: MySqlContainer) -> None:
wait_strategy = LogMessageWaitStrategy(
re.compile(
r".*: ready for connections",
flags=re.DOTALL | re.MULTILINE,
)
)
wait_strategy.wait_until_ready(self)

Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

🧩 Analysis chain

🌐 Web query:

testcontainers-python MySqlContainer wait strategy customize public API

💡 Result:

In testcontainers-python, MySqlContainer doesn’t expose a Java-style “wait strategy” hook on the class itself; the public API for customizing readiness is via the waiting utilities (log-based waiting) and/or by subclassing and overriding the connection check.

1) Log-based waiting (public API)

Use testcontainers.core.waiting_utils.wait_for_logs(container, predicate, timeout=None, interval=1) after the container is started (or inside a custom container’s startup flow). The predicate can be a regex string or a callable. The function supports timeout and interval. [1]

from testcontainers.mysql import MySqlContainer
from testcontainers.core.waiting_utils import wait_for_logs

with MySqlContainer("mysql:8.0") as mysql:
    wait_for_logs(mysql, r"ready for connections", timeout=60, interval=1)

MySqlContainer itself is the standard MySQL wrapper you’re already using. [2]

2) Connection-based waiting via @wait_container_is_ready (public API)

If you want “wait until I can connect” semantics (common for DBs), subclass MySqlContainer and decorate your _connect() with wait_container_is_ready(...) so failures are retried until success/timeout. [3]

import mysql.connector
from testcontainers.mysql import MySqlContainer
from testcontainers.core.waiting_utils import wait_container_is_ready

class MyReadyMySql(MySqlContainer):
    `@wait_container_is_ready`(mysql.connector.Error)
    def _connect(self):
        conn = mysql.connector.connect(
            host=self.get_container_host_ip(),
            port=int(self.get_exposed_port(3306)),
            user=self.username,
            password=self.password,
            database=self.dbname,
        )
        conn.close()

with MyReadyMySql("mysql:8.0") as mysql:
    ...

3) Tuning retry/timeout behavior

Retry limits/sleep/timeout for readiness waiting are controlled via testcontainers_config (global configuration). [3]

from testcontainers.core.config import testcontainers_config
testcontainers_config.timeout = 180
testcontainers_config.max_tries = 180
testcontainers_config.sleep_time = 1

Sources: [1] [2] [3]


Use wait_for_logs() or subclass with @wait_container_is_ready() instead of monkey-patching _connect.

Line 36 overrides a private method, which breaks on testcontainers-python upgrades if internals change. testcontainers-python provides public APIs:

  • wait_for_logs(): Call after container startup with a regex predicate for log-based readiness
  • Subclass + @wait_container_is_ready() decorator: Override _connect in a subclass with the decorator to handle retry logic safely

Example using wait_for_logs:

from testcontainers.mysql import MySqlContainer
from testcontainers.core.waiting_utils import wait_for_logs

with MySqlContainer("mysql:8.0") as mysql:
    wait_for_logs(mysql, r"ready for connections", timeout=60, interval=1)
🤖 Prompt for AI Agents
In `@tests/conftest.py` around lines 29 - 44, The fixture
override_testcontainers_connect is monkey-patching the private
MySqlContainer._connect; remove that override and instead use the public waiting
utilities—either call wait_for_logs(container, r"ready for connections",
timeout=60, interval=1) after container startup (use the
testcontainers.core.waiting_utils.wait_for_logs function) or create a subclass
(e.g., MySqlContainerWithWait) and implement _connect decorated with
`@wait_container_is_ready` to handle retry logic; in short: stop overriding
_connect directly in override_testcontainers_connect and switch to wait_for_logs
or a decorated subclass of MySqlContainer for log-based readiness.

)
wait_strategy.wait_until_ready(self)

MySqlContainer._connect = _connect # noqa: SLF001
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Remove unused # noqa: SLF001.

Ruff reports this directive as unused at Line 45; drop it to keep lint clean.

🧹 Proposed cleanup
-    MySqlContainer._connect = _connect  # noqa: SLF001
+    MySqlContainer._connect = _connect
📝 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
MySqlContainer._connect = _connect # noqa: SLF001
MySqlContainer._connect = _connect
🧰 Tools
🪛 Ruff (0.14.13)

45-45: Unused noqa directive (non-enabled: SLF001)

Remove unused noqa directive

(RUF100)

🤖 Prompt for AI Agents
In `@tests/conftest.py` at line 45, Remove the unused lint suppression by deleting
the trailing "  # noqa: SLF001" on the assignment MySqlContainer._connect =
_connect so the line reads only the assignment; this drops the unnecessary
directive and resolves the Ruff unused-directive warning while leaving the
monkeypatch intact.

Comment on lines +48 to +64
@pytest.fixture(scope="session")
def mysql_container() -> MySqlContainer:
container = MySqlContainer(
os.environ.get(
"OPENML_DATABASES_OPENML_URL",
"openml/test-database:20240105",
),
username=os.environ.get("OPENML_DATABASES_OPENML_USERNAME", ""),
password=os.environ.get("OPENML_DATABASES_OPENML_PASSWORD", ""),
dbname="openml_expdb",
)

container.start()
try:
yield container
finally:
container.stop()
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

testcontainers-python MySqlContainer.start() Docker unavailable exception type

💡 Result:

In testcontainers-python, MySqlContainer.start() ultimately initializes the Docker SDK client (docker / “docker-py”). If Docker isn’t reachable (daemon not running, wrong DOCKER_HOST, etc.), the failure you’ll see is typically:

  • docker.errors.DockerException (often with a message like “Error while fetching server API version …”) [1][2]

So, the exception type to catch for “Docker unavailable” is generally docker.errors.DockerException. [1][2]


🏁 Script executed:

# Check if there are existing patterns for Docker error handling in the codebase
rg -i "docker|container" tests/conftest.py -A 3 -B 3

Repository: openml/server-api

Length of output: 1397


🏁 Script executed:

# Search for any existing pytest.skip usage patterns related to Docker or external services
rg "pytest.skip" --type py -B 2 -A 2

Repository: openml/server-api

Length of output: 2038


🏁 Script executed:

# Check imports in conftest.py to understand what's currently imported
head -30 tests/conftest.py

Repository: openml/server-api

Length of output: 840


🏁 Script executed:

# Check if there are any other exception handling patterns for testcontainers in the codebase
rg "testcontainers|MySqlContainer" --type py

Repository: openml/server-api

Length of output: 622


🏁 Script executed:

# Verify the fixture is used as a dependency in tests to understand impact scope
rg "mysql_container" tests/ --type py

Repository: openml/server-api

Length of output: 265


Skip tests gracefully when Docker isn't available (CI currently fails).

The pipeline reports a Docker connection error; container.start() will hard-fail the suite when Docker isn't reachable. Wrap the start call in a try-except to catch docker.errors.DockerException and skip tests in non-Docker environments.

🛠️ Proposed fix
+from docker.errors import DockerException
+
 `@pytest.fixture`(scope="session")
 def mysql_container() -> MySqlContainer:
     container = MySqlContainer(
         os.environ.get(
             "OPENML_DATABASES_OPENML_URL",
             "openml/test-database:20240105",
         ),
         username=os.environ.get("OPENML_DATABASES_OPENML_USERNAME", ""),
         password=os.environ.get("OPENML_DATABASES_OPENML_PASSWORD", ""),
         dbname="openml_expdb",
     )
 
-    container.start()
+    started = False
+    try:
+        container.start()
+        started = True
+    except DockerException as exc:
+        pytest.skip(f"Docker unavailable: {exc}")
     try:
         yield container
     finally:
-        container.stop()
+        if started:
+            container.stop()
🧰 Tools
🪛 GitHub Actions: Tests

[error] 50-50: Failed to initialize MySqlContainer due to docker connection error

🤖 Prompt for AI Agents
In `@tests/conftest.py` around lines 48 - 64, The mysql_container fixture
currently calls container.start() unguarded and will hard-fail when Docker isn't
reachable; wrap the container.start() call in a try/except that catches
docker.errors.DockerException and calls pytest.skip(...) to skip the session
tests when Docker is unavailable (ensure you import pytest and docker.errors if
not present), then proceed to yield container and keep the existing finally
container.stop() behavior so cleanup still runs if start succeeded.

Copy link
Contributor

@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: 2

🤖 Fix all issues with AI agents
In `@tests/conftest.py`:
- Around line 65-73: The expdb_test fixture currently uses engine.begin() which
commits on exit and persists test data; replace that with the same
automatic_rollback pattern used by user_test to ensure test isolation.
Specifically, after creating engine in expdb_test (and keeping mysql_container
and url logic), open the connection using the automatic_rollback context/utility
(the same automatic_rollback used by user_test) and yield that connection
instead of using engine.begin(), so tests roll back automatically and avoid
double-commit interactions with persisted_flow.
- Around line 48-52: Rename the misleading environment variable
OPENML_DATABASES_OPENML_URL to a name that reflects it holds a Docker image
(suggested OPENML_TEST_DATABASE_IMAGE) wherever it's used in tests/conftest.py
and related test configuration; update the call that passes its value into
MySqlContainer to read os.environ.get("OPENML_TEST_DATABASE_IMAGE",
"openml/test-database:20240105") instead of the old name, and search/replace
other references (tests, CI configs, and docs) to the old variable so callers
are updated and the naming is consistent with OPENML_DATABASES_OPENML_USERNAME /
OPENML_DATABASES_OPENML_PASSWORD.
🧹 Nitpick comments (2)
tests/conftest.py (2)

67-68: Fragile URL scheme replacement.

url.replace("mysql://", "mysql+pymysql://") would also match a prefix of "mysql+mysqlconnector://" or "mysql+pymysql://" (the latter becoming "mysql+pymysql+pymysql://"). This same pattern is repeated in user_test. Prefer a more targeted replacement or use urllib.parse to swap only the scheme component.

Safer alternative
-    url = mysql_container.get_connection_url()
-    url = url.replace("mysql://", "mysql+pymysql://")
+    url = mysql_container.get_connection_url()
+    if url.startswith("mysql://"):
+        url = "mysql+pymysql://" + url[len("mysql://"):]

46-62: New Engine created on every test invocation — consider session or module scope.

Both expdb_test and user_test call sqlalchemy.create_engine() on every test. Engine creation involves connection pool setup. Since the container URL doesn't change, consider creating the engine once at session scope and only yielding fresh connections per test.

Sketch
`@pytest.fixture`(scope="session")
def expdb_engine(mysql_container: MySqlContainer) -> Engine:
    url = mysql_container.get_connection_url()
    if url.startswith("mysql://"):
        url = "mysql+pymysql://" + url[len("mysql://"):]
    return sqlalchemy.create_engine(url)

`@pytest.fixture`
def expdb_test(expdb_engine: Engine) -> Connection:
    with automatic_rollback(expdb_engine) as connection:
        yield connection

Also applies to: 65-73, 85-93

Comment on lines +48 to +52
container = MySqlContainer(
os.environ.get(
"OPENML_DATABASES_OPENML_URL",
"openml/test-database:20240105",
),
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

rg -n "OPENML_DATABASES_OPENML_URL" --type py -C 3

Repository: openml/server-api

Length of output: 476


🏁 Script executed:

# Search for MySqlContainer definition and imports
rg -n "MySqlContainer" --type py -C 5

Repository: openml/server-api

Length of output: 3255


🏁 Script executed:

# Check the testcontainers library documentation or type hints
# Also search for any .md files that might document environment variables
find . -type f -name "*.md" | head -20

Repository: openml/server-api

Length of output: 429


🏁 Script executed:

# Check documentation files for env var documentation
cat docs/contributing/tests.md

Repository: openml/server-api

Length of output: 4491


🏁 Script executed:

# Check docker and installation documentation
cat docker/mysql/README.md

Repository: openml/server-api

Length of output: 2404


🏁 Script executed:

# Check the complete context of the mysql_container fixture
cat -n tests/conftest.py | sed -n '45,65p'

Repository: openml/server-api

Length of output: 732


🏁 Script executed:

# Search for any documentation or comments about OPENML_DATABASES env vars
rg -n "OPENML_DATABASES" --type py --type md -C 2

Repository: openml/server-api

Length of output: 1828


Rename OPENML_DATABASES_OPENML_URL to clarify it's a Docker image name, not a database connection URL.

The env var name OPENML_DATABASES_OPENML_URL misleadingly suggests a database connection string (e.g., mysql://host:3306/db), but it's actually passed as the Docker image name to MySqlContainer. This could cause confusion if someone sets it to an actual database URL, which would fail silently or with a confusing error when the container tries to start. The naming pattern is also inconsistent—adjacent env vars are clearly named USERNAME and PASSWORD. Consider renaming to OPENML_TEST_DATABASE_IMAGE to match its actual purpose.

🧰 Tools
🪛 GitHub Actions: Tests

[error] 48-48: FileNotFoundError during attempting to connect to Docker daemon. Docker API not reachable.

🤖 Prompt for AI Agents
In `@tests/conftest.py` around lines 48 - 52, Rename the misleading environment
variable OPENML_DATABASES_OPENML_URL to a name that reflects it holds a Docker
image (suggested OPENML_TEST_DATABASE_IMAGE) wherever it's used in
tests/conftest.py and related test configuration; update the call that passes
its value into MySqlContainer to read
os.environ.get("OPENML_TEST_DATABASE_IMAGE", "openml/test-database:20240105")
instead of the old name, and search/replace other references (tests, CI configs,
and docs) to the old variable so callers are updated and the naming is
consistent with OPENML_DATABASES_OPENML_USERNAME /
OPENML_DATABASES_OPENML_PASSWORD.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/openml/server-api/issues/comments/3790003942","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> \n> \n> \n> \n> <sub>✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.</sub>\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n<!-- usage_tips_start -->\n\n> [!TIP]\n> <details>\n> <summary>You can generate walkthrough in a markdown collapsible section to save space.</summary>\n> \n> Enable the `reviews.collapse_walkthrough` setting to generate walkthrough in a markdown collapsible section.\n> \n> </details>\n\n<!-- usage_tips_end -->\n<!-- walkthrough_start -->\n\n## Walkthrough\n\nThe PR adds three optional dev dependencies in pyproject.toml: testcontainers, pymysql, and cryptography. tests/conftest.py is changed to integrate MySQL testcontainers: it adds a session-scoped `mysql_container` fixture, updates `expdb_test` and `user_test` to use the container-provided `mysql+pymysql` URL and yield a SQLAlchemy connection within a begin/rollback context, introduces an autouse fixture that overrides MySqlContainer connection readiness with a custom wait strategy, loads environment via dotenv, and adjusts `pytest_collection_modifyitems` signature.\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 2 | ❌ 1</summary>\n\n<details>\n<summary>❌ Failed checks (1 warning)</summary>\n\n|     Check name     | Status     | Explanation                                                                           | Resolution                                                                         |\n| :----------------: | :--------- | :------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------- |\n| Docstring Coverage | ⚠️ Warning | Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. |\n\n</details>\n<details>\n<summary>✅ Passed checks (2 passed)</summary>\n\n|     Check name    | Status   | Explanation                                                                                                                                 |\n| :---------------: | :------- | :------------------------------------------------------------------------------------------------------------------------------------------ |\n|    Title check    | ✅ Passed | The title accurately summarizes the main change: migrating the test suite to use testcontainers instead of previous test setup approach.    |\n| Description check | ✅ Passed | The description is related to the changeset, explaining the testcontainers migration and noting the author's uncertainty about correctness. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=openml/server-api&utm_content=232)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/openml/server-api/issues/comments/3790003942","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:19:03 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"283B:2B8A00:ECAC4D:3FB042E:698A08F5","x-ratelimit-limit":"5800","x-ratelimit-remaining":"5716","x-ratelimit-reset":"1770656065","x-ratelimit-resource":"core","x-ratelimit-used":"84","x-xss-protection":"0"},"data":""}}

2 similar comments
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/openml/server-api/issues/comments/3790003942","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> \n> \n> \n> \n> <sub>✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.</sub>\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n<!-- usage_tips_start -->\n\n> [!TIP]\n> <details>\n> <summary>You can generate walkthrough in a markdown collapsible section to save space.</summary>\n> \n> Enable the `reviews.collapse_walkthrough` setting to generate walkthrough in a markdown collapsible section.\n> \n> </details>\n\n<!-- usage_tips_end -->\n<!-- walkthrough_start -->\n\n## Walkthrough\n\nThe PR adds three optional dev dependencies in pyproject.toml: testcontainers, pymysql, and cryptography. tests/conftest.py is changed to integrate MySQL testcontainers: it adds a session-scoped `mysql_container` fixture, updates `expdb_test` and `user_test` to use the container-provided `mysql+pymysql` URL and yield a SQLAlchemy connection within a begin/rollback context, introduces an autouse fixture that overrides MySqlContainer connection readiness with a custom wait strategy, loads environment via dotenv, and adjusts `pytest_collection_modifyitems` signature.\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 2 | ❌ 1</summary>\n\n<details>\n<summary>❌ Failed checks (1 warning)</summary>\n\n|     Check name     | Status     | Explanation                                                                           | Resolution                                                                         |\n| :----------------: | :--------- | :------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------- |\n| Docstring Coverage | ⚠️ Warning | Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. |\n\n</details>\n<details>\n<summary>✅ Passed checks (2 passed)</summary>\n\n|     Check name    | Status   | Explanation                                                                                                                                 |\n| :---------------: | :------- | :------------------------------------------------------------------------------------------------------------------------------------------ |\n|    Title check    | ✅ Passed | The title accurately summarizes the main change: migrating the test suite to use testcontainers instead of previous test setup approach.    |\n| Description check | ✅ Passed | The description is related to the changeset, explaining the testcontainers migration and noting the author's uncertainty about correctness. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=openml/server-api&utm_content=232)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/openml/server-api/issues/comments/3790003942","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:19:03 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"283B:2B8A00:ECAC4D:3FB042E:698A08F5","x-ratelimit-limit":"5800","x-ratelimit-remaining":"5716","x-ratelimit-reset":"1770656065","x-ratelimit-resource":"core","x-ratelimit-used":"84","x-xss-protection":"0"},"data":""}}

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/openml/server-api/issues/comments/3790003942","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> \n> \n> \n> \n> <sub>✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.</sub>\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n<!-- usage_tips_start -->\n\n> [!TIP]\n> <details>\n> <summary>You can generate walkthrough in a markdown collapsible section to save space.</summary>\n> \n> Enable the `reviews.collapse_walkthrough` setting to generate walkthrough in a markdown collapsible section.\n> \n> </details>\n\n<!-- usage_tips_end -->\n<!-- walkthrough_start -->\n\n## Walkthrough\n\nThe PR adds three optional dev dependencies in pyproject.toml: testcontainers, pymysql, and cryptography. tests/conftest.py is changed to integrate MySQL testcontainers: it adds a session-scoped `mysql_container` fixture, updates `expdb_test` and `user_test` to use the container-provided `mysql+pymysql` URL and yield a SQLAlchemy connection within a begin/rollback context, introduces an autouse fixture that overrides MySqlContainer connection readiness with a custom wait strategy, loads environment via dotenv, and adjusts `pytest_collection_modifyitems` signature.\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 2 | ❌ 1</summary>\n\n<details>\n<summary>❌ Failed checks (1 warning)</summary>\n\n|     Check name     | Status     | Explanation                                                                           | Resolution                                                                         |\n| :----------------: | :--------- | :------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------- |\n| Docstring Coverage | ⚠️ Warning | Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. |\n\n</details>\n<details>\n<summary>✅ Passed checks (2 passed)</summary>\n\n|     Check name    | Status   | Explanation                                                                                                                                 |\n| :---------------: | :------- | :------------------------------------------------------------------------------------------------------------------------------------------ |\n|    Title check    | ✅ Passed | The title accurately summarizes the main change: migrating the test suite to use testcontainers instead of previous test setup approach.    |\n| Description check | ✅ Passed | The description is related to the changeset, explaining the testcontainers migration and noting the author's uncertainty about correctness. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=openml/server-api&utm_content=232)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/openml/server-api/issues/comments/3790003942","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:19:03 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"283B:2B8A00:ECAC4D:3FB042E:698A08F5","x-ratelimit-limit":"5800","x-ratelimit-remaining":"5716","x-ratelimit-reset":"1770656065","x-ratelimit-resource":"core","x-ratelimit-used":"84","x-xss-protection":"0"},"data":""}}

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/openml/server-api/issues/comments/3790003942","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- walkthrough_start -->\n\n## Walkthrough\n\nThe PR adds three optional dev dependencies in `pyproject.toml`: `testcontainers`, `pymysql`, and `cryptography`. `tests/conftest.py` is modified to load environment variables via dotenv, add an autouse session fixture that overrides MySqlContainer readiness with a custom wait strategy, introduce a session-scoped `mysql_container` fixture, and update `expdb_test` and `user_test` to use the container-provided `mysql+pymysql` URL and yield SQLAlchemy `Connection` objects within a begin/rollback context. `py_api` now yields a `TestClient` (generator), and `pytest_collection_modifyitems` signature was changed to accept `(items)`.\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 2 | ❌ 1</summary>\n\n<details>\n<summary>❌ Failed checks (1 warning)</summary>\n\n|     Check name     | Status     | Explanation                                                                           | Resolution                                                                         |\n| :----------------: | :--------- | :------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------- |\n| Docstring Coverage | ⚠️ Warning | Docstring coverage is 22.22% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. |\n\n</details>\n<details>\n<summary>✅ Passed checks (2 passed)</summary>\n\n|     Check name    | Status   | Explanation                                                                                                                                                              |\n| :---------------: | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|    Title check    | ✅ Passed | The title 'Moved tests to using testcontainers' directly and clearly describes the main change: migrating the test suite to use Testcontainers for database testing.     |\n| Description check | ✅ Passed | The description mentions moving tests to using testcontainers, which aligns with the actual changeset that adds testcontainers dependencies and refactors test fixtures. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=openml/server-api&utm_content=232)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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= -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/openml/server-api/issues/comments/3790003942","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:23:35 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"284C:24E409:122F62:4DF5EC:698A0A06","x-ratelimit-limit":"5800","x-ratelimit-remaining":"5688","x-ratelimit-reset":"1770656065","x-ratelimit-resource":"core","x-ratelimit-used":"112","x-xss-protection":"0"},"data":""}}

3 similar comments
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/openml/server-api/issues/comments/3790003942","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- walkthrough_start -->\n\n## Walkthrough\n\nThe PR adds three optional dev dependencies in `pyproject.toml`: `testcontainers`, `pymysql`, and `cryptography`. `tests/conftest.py` is modified to load environment variables via dotenv, add an autouse session fixture that overrides MySqlContainer readiness with a custom wait strategy, introduce a session-scoped `mysql_container` fixture, and update `expdb_test` and `user_test` to use the container-provided `mysql+pymysql` URL and yield SQLAlchemy `Connection` objects within a begin/rollback context. `py_api` now yields a `TestClient` (generator), and `pytest_collection_modifyitems` signature was changed to accept `(items)`.\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 2 | ❌ 1</summary>\n\n<details>\n<summary>❌ Failed checks (1 warning)</summary>\n\n|     Check name     | Status     | Explanation                                                                           | Resolution                                                                         |\n| :----------------: | :--------- | :------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------- |\n| Docstring Coverage | ⚠️ Warning | Docstring coverage is 22.22% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. |\n\n</details>\n<details>\n<summary>✅ Passed checks (2 passed)</summary>\n\n|     Check name    | Status   | Explanation                                                                                                                                                              |\n| :---------------: | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|    Title check    | ✅ Passed | The title 'Moved tests to using testcontainers' directly and clearly describes the main change: migrating the test suite to use Testcontainers for database testing.     |\n| Description check | ✅ Passed | The description mentions moving tests to using testcontainers, which aligns with the actual changeset that adds testcontainers dependencies and refactors test fixtures. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=openml/server-api&utm_content=232)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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= -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/openml/server-api/issues/comments/3790003942","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:23:35 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"284C:24E409:122F62:4DF5EC:698A0A06","x-ratelimit-limit":"5800","x-ratelimit-remaining":"5688","x-ratelimit-reset":"1770656065","x-ratelimit-resource":"core","x-ratelimit-used":"112","x-xss-protection":"0"},"data":""}}

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/openml/server-api/issues/comments/3790003942","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- walkthrough_start -->\n\n## Walkthrough\n\nThe PR adds three optional dev dependencies in `pyproject.toml`: `testcontainers`, `pymysql`, and `cryptography`. `tests/conftest.py` is modified to load environment variables via dotenv, add an autouse session fixture that overrides MySqlContainer readiness with a custom wait strategy, introduce a session-scoped `mysql_container` fixture, and update `expdb_test` and `user_test` to use the container-provided `mysql+pymysql` URL and yield SQLAlchemy `Connection` objects within a begin/rollback context. `py_api` now yields a `TestClient` (generator), and `pytest_collection_modifyitems` signature was changed to accept `(items)`.\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 2 | ❌ 1</summary>\n\n<details>\n<summary>❌ Failed checks (1 warning)</summary>\n\n|     Check name     | Status     | Explanation                                                                           | Resolution                                                                         |\n| :----------------: | :--------- | :------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------- |\n| Docstring Coverage | ⚠️ Warning | Docstring coverage is 22.22% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. |\n\n</details>\n<details>\n<summary>✅ Passed checks (2 passed)</summary>\n\n|     Check name    | Status   | Explanation                                                                                                                                                              |\n| :---------------: | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|    Title check    | ✅ Passed | The title 'Moved tests to using testcontainers' directly and clearly describes the main change: migrating the test suite to use Testcontainers for database testing.     |\n| Description check | ✅ Passed | The description mentions moving tests to using testcontainers, which aligns with the actual changeset that adds testcontainers dependencies and refactors test fixtures. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=openml/server-api&utm_content=232)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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= -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/openml/server-api/issues/comments/3790003942","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:23:35 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"284C:24E409:122F62:4DF5EC:698A0A06","x-ratelimit-limit":"5800","x-ratelimit-remaining":"5688","x-ratelimit-reset":"1770656065","x-ratelimit-resource":"core","x-ratelimit-used":"112","x-xss-protection":"0"},"data":""}}

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/openml/server-api/issues/comments/3790003942","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- walkthrough_start -->\n\n## Walkthrough\n\nThe PR adds three optional dev dependencies in `pyproject.toml`: `testcontainers`, `pymysql`, and `cryptography`. `tests/conftest.py` is modified to load environment variables via dotenv, add an autouse session fixture that overrides MySqlContainer readiness with a custom wait strategy, introduce a session-scoped `mysql_container` fixture, and update `expdb_test` and `user_test` to use the container-provided `mysql+pymysql` URL and yield SQLAlchemy `Connection` objects within a begin/rollback context. `py_api` now yields a `TestClient` (generator), and `pytest_collection_modifyitems` signature was changed to accept `(items)`.\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 2 | ❌ 1</summary>\n\n<details>\n<summary>❌ Failed checks (1 warning)</summary>\n\n|     Check name     | Status     | Explanation                                                                           | Resolution                                                                         |\n| :----------------: | :--------- | :------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------- |\n| Docstring Coverage | ⚠️ Warning | Docstring coverage is 22.22% which is insufficient. The required threshold is 80.00%. | Write docstrings for the functions missing them to satisfy the coverage threshold. |\n\n</details>\n<details>\n<summary>✅ Passed checks (2 passed)</summary>\n\n|     Check name    | Status   | Explanation                                                                                                                                                              |\n| :---------------: | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|    Title check    | ✅ Passed | The title 'Moved tests to using testcontainers' directly and clearly describes the main change: migrating the test suite to use Testcontainers for database testing.     |\n| Description check | ✅ Passed | The description mentions moving tests to using testcontainers, which aligns with the actual changeset that adds testcontainers dependencies and refactors test fixtures. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=openml/server-api&utm_content=232)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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= -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/openml/server-api/issues/comments/3790003942","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:23:35 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"284C:24E409:122F62:4DF5EC:698A0A06","x-ratelimit-limit":"5800","x-ratelimit-remaining":"5688","x-ratelimit-reset":"1770656065","x-ratelimit-resource":"core","x-ratelimit-used":"112","x-xss-protection":"0"},"data":""}}

Copy link
Contributor

@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.

Caution

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

⚠️ Outside diff range comments (1)
tests/conftest.py (1)

136-167: ⚠️ Potential issue | 🟠 Major

persisted_flow interacts subtly with expdb_test's transaction management.

persisted_flow explicitly calls expdb_test.commit() (line 152) and later expdb_test.rollback() (line 156). If expdb_test wraps the connection in engine.begin(), these explicit transaction controls interact with the CM's auto-commit/rollback in unpredictable ways. Switching expdb_test to automatic_rollback (as suggested above) would make these interactions clearer and safer.

🧹 Nitpick comments (2)
tests/conftest.py (2)

86-95: Fragile URL manipulation via chained str.replace.

Lines 89–91 use three chained str.replace() calls to transform the connection URL. The replace("openml_expdb", "openml") on line 91 is particularly risky — if openml_expdb appeared in any other part of the URL (e.g., a password or hostname), it would silently corrupt the connection string. Consider using sqlalchemy.engine.make_url() to parse and safely modify the database name:

Suggested approach
from sqlalchemy.engine import make_url

raw = mysql_container.get_connection_url()
parsed = make_url(raw).set(drivername="mysql+pymysql", database="openml")
engine = sqlalchemy.create_engine(parsed)

This same concern applies to expdb_test (line 67) — make_url would be safer there too.


104-113: Fixture looks correct; minor type annotation nit.

The dependency overrides and cleanup logic are sound. The return type Generator[TestClient, None, None] works but Iterator[TestClient] would be more idiomatic for a pytest fixture that only yields (no send()).

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.

1 participant