# pymongo async Validation Report Generated 2026-07-16 — SecantusDB 0.5.4b234 vs pymongo f2103a95870a (`vendor/pymongo-tests/test/asynchronous/`). Run `uv run python -m invoke validate-pymongo-async` to refresh. This is the async sibling of the headline pymongo gauge: it drives pymongo's native `AsyncMongoClient` API (the async/await wire path that replaced Motor) over the same in-scope CRUD / cursor / change-stream / command-monitoring surface. A gap versus `docs/validation-report.md` means the async code path exercises something the sync path doesn't. ## Summary by test file | Test file | Passed | Failed | Errored | Skipped | Total | Pass rate | |---|---:|---:|---:|---:|---:|---:| | `test_bulk.py` | 33 | 1 | 0 | 4 | 38 | 97.1% | | `test_change_stream.py` | 97 | 0 | 0 | 58 | 155 | 100.0% | | `test_collation.py` | 16 | 0 | 0 | 0 | 16 | 100.0% | | `test_collection.py` | 85 | 2 | 0 | 4 | 91 | 97.7% | | `test_collection_management.py` | 7 | 0 | 0 | 0 | 7 | 100.0% | | `test_command_logging.py` | 22 | 0 | 0 | 14 | 36 | 100.0% | | `test_command_monitoring.py` | 31 | 0 | 0 | 7 | 38 | 100.0% | | `test_comment.py` | 3 | 0 | 0 | 0 | 3 | 100.0% | | `test_common.py` | 4 | 0 | 0 | 0 | 4 | 100.0% | | `test_crud_unified.py` | 301 | 0 | 0 | 185 | 486 | 100.0% | | `test_cursor.py` | 56 | 4 | 0 | 12 | 72 | 93.3% | | `test_custom_types.py` | 51 | 0 | 0 | 0 | 51 | 100.0% | | `test_database.py` | 35 | 0 | 0 | 1 | 36 | 100.0% | | `test_examples.py` | 18 | 0 | 0 | 2 | 20 | 100.0% | | `test_logger.py` | 3 | 1 | 0 | 2 | 6 | 75.0% | | `test_read_concern.py` | 6 | 0 | 0 | 0 | 6 | 100.0% | | `test_read_preferences.py` | 9 | 1 | 0 | 20 | 30 | 90.0% | | `test_run_command.py` | 16 | 0 | 0 | 5 | 21 | 100.0% | | `test_transactions_unified.py` | 92 | 0 | 0 | 172 | 264 | 100.0% | | `test_versioned_api_integration.py` | 38 | 0 | 0 | 5 | 43 | 100.0% | | **Overall** | **923** | **9** | **0** | **491** | **1423** | **99.0%** | ## Failures (9) First 30 failure node-ids for manual triage: ``` vendor/pymongo-tests/test/asynchronous/test_bulk.py::AsyncTestBulk::test_numerous_inserts vendor/pymongo-tests/test/asynchronous/test_collection.py::AsyncTestCollection::test_index_hashed vendor/pymongo-tests/test/asynchronous/test_collection.py::AsyncTestCollection::test_index_text vendor/pymongo-tests/test/asynchronous/test_cursor.py::TestCursor::test_maxtime_ms_message vendor/pymongo-tests/test/asynchronous/test_cursor.py::TestCursor::test_to_list_csot_applied vendor/pymongo-tests/test/asynchronous/test_cursor.py::TestCursor::test_where vendor/pymongo-tests/test/asynchronous/test_cursor.py::TestRawBatchCursor::test_collation vendor/pymongo-tests/test/asynchronous/test_logger.py::TestLogger::test_default_truncation_limit vendor/pymongo-tests/test/asynchronous/test_read_preferences.py::TestMongosAndReadPreference::test_read_preference_hedge_deprecated ``` ## How this is generated **pymongo's async tests are run unmodified.** The submodule at `vendor/pymongo-tests/` is checked out at the pinned upstream tag with zero local edits. The integration is entirely external: the shared `pymongo_validation/plugin.py` starts an embedded `SecantusDBServer(host='127.0.0.1', port=0, storage_path=)` (real on-disk WiredTiger) before pymongo's conftest is imported and writes the bound host/port into `DB_IP` + `DB_PORT` — the env vars pymongo's `helpers_shared.py` reads at import time, which the async `AsyncClientContext` also resolves from. Pytest then runs the in-scope paths from `pymongo_async_validation/include_paths.py` under `pytest-asyncio` (`asyncio_mode=auto`). Tests gated on replica-set / sharding / auth / TLS / encryption topology self-skip — those skips are honest gaps, not failures. The pass rate is a meaningful conformance number for SecantusDB's behaviour under pymongo's async driver, exercised the same way pymongo's own CI exercises a real `mongod`.