PYTHON-5550 Add a test that uses uvloop as the event loop (#2543)
This commit is contained in:
parent
b291807106
commit
67384f0f08
33
.github/workflows/test-python.yml
vendored
33
.github/workflows/test-python.yml
vendored
@ -14,6 +14,9 @@ defaults:
|
|||||||
run:
|
run:
|
||||||
shell: bash -eux {0}
|
shell: bash -eux {0}
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
static:
|
static:
|
||||||
@ -163,6 +166,36 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
just typing
|
just typing
|
||||||
|
|
||||||
|
integration_tests:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: Integration Tests
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
- name: Install uv
|
||||||
|
uses: astral-sh/setup-uv@557e51de59eb14aaaba2ed9621916900a91d50c6 # v5
|
||||||
|
with:
|
||||||
|
enable-cache: true
|
||||||
|
python-version: "3.10"
|
||||||
|
- name: Install just
|
||||||
|
run: uv tool install rust-just
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
just install
|
||||||
|
- id: setup-mongodb
|
||||||
|
uses: mongodb-labs/drivers-evergreen-tools@master
|
||||||
|
- name: Run tests
|
||||||
|
run: |
|
||||||
|
just integration-tests
|
||||||
|
- id: setup-mongodb-ssl
|
||||||
|
uses: mongodb-labs/drivers-evergreen-tools@master
|
||||||
|
with:
|
||||||
|
ssl: true
|
||||||
|
- name: Run tests
|
||||||
|
run: |
|
||||||
|
just integration-tests
|
||||||
|
|
||||||
make_sdist:
|
make_sdist:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
name: "Make an sdist"
|
name: "Make an sdist"
|
||||||
|
|||||||
@ -411,6 +411,14 @@ a use the ticket number as the "reason" parameter to the decorator, e.g. `@flaky
|
|||||||
When running tests locally (not in CI), the `flaky` decorator will be disabled unless `ENABLE_FLAKY` is set.
|
When running tests locally (not in CI), the `flaky` decorator will be disabled unless `ENABLE_FLAKY` is set.
|
||||||
To disable the `flaky` decorator in CI, you can use `evergreen patch --param DISABLE_FLAKY=1`.
|
To disable the `flaky` decorator in CI, you can use `evergreen patch --param DISABLE_FLAKY=1`.
|
||||||
|
|
||||||
|
## Integration Tests
|
||||||
|
|
||||||
|
The `integration_tests` directory has a set of scripts that verify the usage of PyMongo with downstream packages or frameworks. See the [README](./integration_tests/README.md) for more information.
|
||||||
|
|
||||||
|
To run the tests, use `just integration_tests`.
|
||||||
|
|
||||||
|
The tests should be able to run with and without SSL enabled.
|
||||||
|
|
||||||
## Specification Tests
|
## Specification Tests
|
||||||
|
|
||||||
The MongoDB [specifications repository](https://github.com/mongodb/specifications)
|
The MongoDB [specifications repository](https://github.com/mongodb/specifications)
|
||||||
|
|||||||
42
integration_tests/README.md
Normal file
42
integration_tests/README.md
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# Integration Tests
|
||||||
|
|
||||||
|
A set of tests that verify the usage of PyMongo with downstream packages or frameworks.
|
||||||
|
|
||||||
|
Each test uses [PEP 723 inline metadata](https://packaging.python.org/en/latest/specifications/inline-script-metadata/) and can be run using `pipx` or `uv`.
|
||||||
|
|
||||||
|
The `run.sh` convenience script can be used to run all of the files using `uv`.
|
||||||
|
|
||||||
|
Here is an example header for the script with the inline dependencies:
|
||||||
|
|
||||||
|
```python
|
||||||
|
# /// script
|
||||||
|
# dependencies = [
|
||||||
|
# "uvloop>=0.18"
|
||||||
|
# ]
|
||||||
|
# requires-python = ">=3.10"
|
||||||
|
# ///
|
||||||
|
```
|
||||||
|
|
||||||
|
Here is an example of using the test helper function to create a configured client for the test:
|
||||||
|
|
||||||
|
|
||||||
|
```python
|
||||||
|
import asyncio
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
# Use pymongo from parent directory.
|
||||||
|
root = Path(__file__).parent.parent
|
||||||
|
sys.path.insert(0, str(root))
|
||||||
|
|
||||||
|
from test.asynchronous import async_simple_test_client # noqa: E402
|
||||||
|
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
async with async_simple_test_client() as client:
|
||||||
|
result = await client.admin.command("ping")
|
||||||
|
assert result["ok"]
|
||||||
|
|
||||||
|
|
||||||
|
asyncio.run(main())
|
||||||
|
```
|
||||||
11
integration_tests/run.sh
Executable file
11
integration_tests/run.sh
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Run all of the integration test files using `uv run`.
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
for file in integration_tests/test_*.py ; do
|
||||||
|
echo "-----------------"
|
||||||
|
echo "Running $file..."
|
||||||
|
uv run $file
|
||||||
|
echo "Running $file...done."
|
||||||
|
echo "-----------------"
|
||||||
|
done
|
||||||
27
integration_tests/test_uv_loop.py
Normal file
27
integration_tests/test_uv_loop.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# /// script
|
||||||
|
# dependencies = [
|
||||||
|
# "uvloop>=0.18"
|
||||||
|
# ]
|
||||||
|
# requires-python = ">=3.10"
|
||||||
|
# ///
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import uvloop
|
||||||
|
|
||||||
|
# Use pymongo from parent directory.
|
||||||
|
root = Path(__file__).parent.parent
|
||||||
|
sys.path.insert(0, str(root))
|
||||||
|
|
||||||
|
from test.asynchronous import async_simple_test_client # noqa: E402
|
||||||
|
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
async with async_simple_test_client() as client:
|
||||||
|
result = await client.admin.command("ping")
|
||||||
|
assert result["ok"]
|
||||||
|
|
||||||
|
|
||||||
|
uvloop.run(main())
|
||||||
4
justfile
4
justfile
@ -72,6 +72,10 @@ setup-tests *args="":
|
|||||||
teardown-tests:
|
teardown-tests:
|
||||||
bash .evergreen/scripts/teardown-tests.sh
|
bash .evergreen/scripts/teardown-tests.sh
|
||||||
|
|
||||||
|
[group('test')]
|
||||||
|
integration-tests:
|
||||||
|
bash integration_tests/run.sh
|
||||||
|
|
||||||
[group('server')]
|
[group('server')]
|
||||||
run-server *args="":
|
run-server *args="":
|
||||||
bash .evergreen/scripts/run-server.sh {{args}}
|
bash .evergreen/scripts/run-server.sh {{args}}
|
||||||
|
|||||||
@ -1227,6 +1227,13 @@ def teardown():
|
|||||||
print_running_clients()
|
print_running_clients()
|
||||||
|
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def simple_test_client():
|
||||||
|
client_context.init()
|
||||||
|
yield client_context.client
|
||||||
|
client_context.client.close()
|
||||||
|
|
||||||
|
|
||||||
def test_cases(suite):
|
def test_cases(suite):
|
||||||
"""Iterator over all TestCases within a TestSuite."""
|
"""Iterator over all TestCases within a TestSuite."""
|
||||||
for suite_or_case in suite._tests:
|
for suite_or_case in suite._tests:
|
||||||
|
|||||||
@ -1243,6 +1243,13 @@ async def async_teardown():
|
|||||||
print_running_clients()
|
print_running_clients()
|
||||||
|
|
||||||
|
|
||||||
|
@asynccontextmanager
|
||||||
|
async def async_simple_test_client():
|
||||||
|
await async_client_context.init()
|
||||||
|
yield async_client_context.client
|
||||||
|
await async_client_context.client.close()
|
||||||
|
|
||||||
|
|
||||||
def test_cases(suite):
|
def test_cases(suite):
|
||||||
"""Iterator over all TestCases within a TestSuite."""
|
"""Iterator over all TestCases within a TestSuite."""
|
||||||
for suite_or_case in suite._tests:
|
for suite_or_case in suite._tests:
|
||||||
|
|||||||
@ -131,6 +131,7 @@ replacements = {
|
|||||||
"async_create_barrier": "create_barrier",
|
"async_create_barrier": "create_barrier",
|
||||||
"async_barrier_wait": "barrier_wait",
|
"async_barrier_wait": "barrier_wait",
|
||||||
"async_joinall": "joinall",
|
"async_joinall": "joinall",
|
||||||
|
"async_simple_test_client": "simple_test_client",
|
||||||
"_async_create_connection": "_create_connection",
|
"_async_create_connection": "_create_connection",
|
||||||
"pymongo.asynchronous.srv_resolver._SrvResolver.get_hosts": "pymongo.synchronous.srv_resolver._SrvResolver.get_hosts",
|
"pymongo.asynchronous.srv_resolver._SrvResolver.get_hosts": "pymongo.synchronous.srv_resolver._SrvResolver.get_hosts",
|
||||||
"dns.asyncresolver.resolve": "dns.resolver.resolve",
|
"dns.asyncresolver.resolve": "dns.resolver.resolve",
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user