Skip to content

Commit ae88b5a

Browse files
authored
PYTHON-5530 Reduce usage of legacy test runner (#2642)
1 parent 49e59d4 commit ae88b5a

File tree

4 files changed

+4
-262
lines changed

4 files changed

+4
-262
lines changed

test/asynchronous/test_encryption.py

Lines changed: 0 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
from test.asynchronous import AsyncIntegrationTest, AsyncPyMongoTestCase, async_client_context
3434
from test.asynchronous.test_bulk import AsyncBulkTestBase
3535
from test.asynchronous.utils import flaky
36-
from test.asynchronous.utils_spec_runner import AsyncSpecRunner, AsyncSpecTestCreator
3736
from threading import Thread
3837
from typing import Any, Dict, Mapping, Optional
3938

@@ -55,7 +54,6 @@
5554
)
5655
from test.asynchronous.test_bulk import AsyncBulkTestBase
5756
from test.asynchronous.unified_format import generate_test_classes
58-
from test.asynchronous.utils_spec_runner import AsyncSpecRunner
5957
from test.helpers_shared import (
6058
ALL_KMS_PROVIDERS,
6159
AWS_CREDS,
@@ -624,125 +622,6 @@ async def test_with_statement(self):
624622
}
625623

626624

627-
class AsyncTestSpec(AsyncSpecRunner):
628-
@classmethod
629-
@unittest.skipUnless(_HAVE_PYMONGOCRYPT, "pymongocrypt is not installed")
630-
async def _setup_class(cls):
631-
await super()._setup_class()
632-
633-
def parse_auto_encrypt_opts(self, opts):
634-
"""Parse clientOptions.autoEncryptOpts."""
635-
opts = camel_to_snake_args(opts)
636-
kms_providers = opts["kms_providers"]
637-
if "aws" in kms_providers:
638-
kms_providers["aws"] = AWS_CREDS
639-
if not any(AWS_CREDS.values()):
640-
self.skipTest("AWS environment credentials are not set")
641-
if "awsTemporary" in kms_providers:
642-
kms_providers["aws"] = AWS_TEMP_CREDS
643-
del kms_providers["awsTemporary"]
644-
if not any(AWS_TEMP_CREDS.values()):
645-
self.skipTest("AWS Temp environment credentials are not set")
646-
if "awsTemporaryNoSessionToken" in kms_providers:
647-
kms_providers["aws"] = AWS_TEMP_NO_SESSION_CREDS
648-
del kms_providers["awsTemporaryNoSessionToken"]
649-
if not any(AWS_TEMP_NO_SESSION_CREDS.values()):
650-
self.skipTest("AWS Temp environment credentials are not set")
651-
if "azure" in kms_providers:
652-
kms_providers["azure"] = AZURE_CREDS
653-
if not any(AZURE_CREDS.values()):
654-
self.skipTest("Azure environment credentials are not set")
655-
if "gcp" in kms_providers:
656-
kms_providers["gcp"] = GCP_CREDS
657-
if not any(AZURE_CREDS.values()):
658-
self.skipTest("GCP environment credentials are not set")
659-
if "kmip" in kms_providers:
660-
kms_providers["kmip"] = KMIP_CREDS
661-
opts["kms_tls_options"] = DEFAULT_KMS_TLS
662-
if "key_vault_namespace" not in opts:
663-
opts["key_vault_namespace"] = "keyvault.datakeys"
664-
if "extra_options" in opts:
665-
opts.update(camel_to_snake_args(opts.pop("extra_options")))
666-
667-
opts = dict(opts)
668-
return AutoEncryptionOpts(**opts)
669-
670-
def parse_client_options(self, opts):
671-
"""Override clientOptions parsing to support autoEncryptOpts."""
672-
encrypt_opts = opts.pop("autoEncryptOpts", None)
673-
if encrypt_opts:
674-
opts["auto_encryption_opts"] = self.parse_auto_encrypt_opts(encrypt_opts)
675-
676-
return super().parse_client_options(opts)
677-
678-
def get_object_name(self, op):
679-
"""Default object is collection."""
680-
return op.get("object", "collection")
681-
682-
def maybe_skip_scenario(self, test):
683-
super().maybe_skip_scenario(test)
684-
desc = test["description"].lower()
685-
if (
686-
"timeoutms applied to listcollections to get collection schema" in desc
687-
and sys.platform in ("win32", "darwin")
688-
):
689-
self.skipTest("PYTHON-3706 flaky test on Windows/macOS")
690-
if "type=symbol" in desc:
691-
self.skipTest("PyMongo does not support the symbol type")
692-
if "timeoutms applied to listcollections to get collection schema" in desc and not _IS_SYNC:
693-
self.skipTest("PYTHON-4844 flaky test on async")
694-
695-
async def setup_scenario(self, scenario_def):
696-
"""Override a test's setup."""
697-
key_vault_data = scenario_def["key_vault_data"]
698-
encrypted_fields = scenario_def["encrypted_fields"]
699-
json_schema = scenario_def["json_schema"]
700-
data = scenario_def["data"]
701-
coll = async_client_context.client.get_database("keyvault", codec_options=OPTS)["datakeys"]
702-
await coll.delete_many({})
703-
if key_vault_data:
704-
await coll.insert_many(key_vault_data)
705-
706-
db_name = self.get_scenario_db_name(scenario_def)
707-
coll_name = self.get_scenario_coll_name(scenario_def)
708-
db = async_client_context.client.get_database(db_name, codec_options=OPTS)
709-
await db.drop_collection(coll_name, encrypted_fields=encrypted_fields)
710-
wc = WriteConcern(w="majority")
711-
kwargs: Dict[str, Any] = {}
712-
if json_schema:
713-
kwargs["validator"] = {"$jsonSchema": json_schema}
714-
kwargs["codec_options"] = OPTS
715-
if not data:
716-
kwargs["write_concern"] = wc
717-
if encrypted_fields:
718-
kwargs["encryptedFields"] = encrypted_fields
719-
await db.create_collection(coll_name, **kwargs)
720-
coll = db[coll_name]
721-
if data:
722-
# Load data.
723-
await coll.with_options(write_concern=wc).insert_many(scenario_def["data"])
724-
725-
def allowable_errors(self, op):
726-
"""Override expected error classes."""
727-
errors = super().allowable_errors(op)
728-
# An updateOne test expects encryption to error when no $ operator
729-
# appears but pymongo raises a client side ValueError in this case.
730-
if op["name"] == "updateOne":
731-
errors += (ValueError,)
732-
return errors
733-
734-
735-
def create_test(scenario_def, test, name):
736-
@async_client_context.require_test_commands
737-
async def run_scenario(self):
738-
await self.run_scenario(scenario_def, test)
739-
740-
return run_scenario
741-
742-
743-
test_creator = AsyncSpecTestCreator(create_test, AsyncTestSpec, os.path.join(SPEC_PATH, "legacy"))
744-
test_creator.create_tests()
745-
746625
if _HAVE_PYMONGOCRYPT:
747626
globals().update(
748627
generate_test_classes(

test/asynchronous/test_transactions.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import asyncio
1919
import sys
2020
from io import BytesIO
21-
from test.asynchronous.utils_spec_runner import AsyncSpecRunner
2221

2322
from gridfs.asynchronous.grid_file import AsyncGridFS, AsyncGridFSBucket
2423
from pymongo.asynchronous.pool import PoolState
@@ -61,15 +60,8 @@
6160
UNPIN_TEST_MAX_ATTEMPTS = 50
6261

6362

64-
class AsyncTransactionsBase(AsyncSpecRunner):
65-
def maybe_skip_scenario(self, test):
66-
super().maybe_skip_scenario(test)
67-
if (
68-
"secondary" in self.id()
69-
and not async_client_context.is_mongos
70-
and not async_client_context.has_secondaries
71-
):
72-
raise unittest.SkipTest("No secondaries")
63+
class AsyncTransactionsBase(AsyncIntegrationTest):
64+
pass
7365

7466

7567
class TestTransactions(AsyncTransactionsBase):

test/test_encryption.py

Lines changed: 0 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
from test import IntegrationTest, PyMongoTestCase, client_context
3434
from test.test_bulk import BulkTestBase
3535
from test.utils import flaky
36-
from test.utils_spec_runner import SpecRunner, SpecTestCreator
3736
from threading import Thread
3837
from typing import Any, Dict, Mapping, Optional
3938

@@ -75,7 +74,6 @@
7574
is_greenthread_patched,
7675
wait_until,
7776
)
78-
from test.utils_spec_runner import SpecRunner
7977

8078
from bson import BSON, DatetimeMS, Decimal128, encode, json_util
8179
from bson.binary import UUID_SUBTYPE, Binary, UuidRepresentation
@@ -622,125 +620,6 @@ def test_with_statement(self):
622620
}
623621

624622

625-
class TestSpec(SpecRunner):
626-
@classmethod
627-
@unittest.skipUnless(_HAVE_PYMONGOCRYPT, "pymongocrypt is not installed")
628-
def _setup_class(cls):
629-
super()._setup_class()
630-
631-
def parse_auto_encrypt_opts(self, opts):
632-
"""Parse clientOptions.autoEncryptOpts."""
633-
opts = camel_to_snake_args(opts)
634-
kms_providers = opts["kms_providers"]
635-
if "aws" in kms_providers:
636-
kms_providers["aws"] = AWS_CREDS
637-
if not any(AWS_CREDS.values()):
638-
self.skipTest("AWS environment credentials are not set")
639-
if "awsTemporary" in kms_providers:
640-
kms_providers["aws"] = AWS_TEMP_CREDS
641-
del kms_providers["awsTemporary"]
642-
if not any(AWS_TEMP_CREDS.values()):
643-
self.skipTest("AWS Temp environment credentials are not set")
644-
if "awsTemporaryNoSessionToken" in kms_providers:
645-
kms_providers["aws"] = AWS_TEMP_NO_SESSION_CREDS
646-
del kms_providers["awsTemporaryNoSessionToken"]
647-
if not any(AWS_TEMP_NO_SESSION_CREDS.values()):
648-
self.skipTest("AWS Temp environment credentials are not set")
649-
if "azure" in kms_providers:
650-
kms_providers["azure"] = AZURE_CREDS
651-
if not any(AZURE_CREDS.values()):
652-
self.skipTest("Azure environment credentials are not set")
653-
if "gcp" in kms_providers:
654-
kms_providers["gcp"] = GCP_CREDS
655-
if not any(AZURE_CREDS.values()):
656-
self.skipTest("GCP environment credentials are not set")
657-
if "kmip" in kms_providers:
658-
kms_providers["kmip"] = KMIP_CREDS
659-
opts["kms_tls_options"] = DEFAULT_KMS_TLS
660-
if "key_vault_namespace" not in opts:
661-
opts["key_vault_namespace"] = "keyvault.datakeys"
662-
if "extra_options" in opts:
663-
opts.update(camel_to_snake_args(opts.pop("extra_options")))
664-
665-
opts = dict(opts)
666-
return AutoEncryptionOpts(**opts)
667-
668-
def parse_client_options(self, opts):
669-
"""Override clientOptions parsing to support autoEncryptOpts."""
670-
encrypt_opts = opts.pop("autoEncryptOpts", None)
671-
if encrypt_opts:
672-
opts["auto_encryption_opts"] = self.parse_auto_encrypt_opts(encrypt_opts)
673-
674-
return super().parse_client_options(opts)
675-
676-
def get_object_name(self, op):
677-
"""Default object is collection."""
678-
return op.get("object", "collection")
679-
680-
def maybe_skip_scenario(self, test):
681-
super().maybe_skip_scenario(test)
682-
desc = test["description"].lower()
683-
if (
684-
"timeoutms applied to listcollections to get collection schema" in desc
685-
and sys.platform in ("win32", "darwin")
686-
):
687-
self.skipTest("PYTHON-3706 flaky test on Windows/macOS")
688-
if "type=symbol" in desc:
689-
self.skipTest("PyMongo does not support the symbol type")
690-
if "timeoutms applied to listcollections to get collection schema" in desc and not _IS_SYNC:
691-
self.skipTest("PYTHON-4844 flaky test on async")
692-
693-
def setup_scenario(self, scenario_def):
694-
"""Override a test's setup."""
695-
key_vault_data = scenario_def["key_vault_data"]
696-
encrypted_fields = scenario_def["encrypted_fields"]
697-
json_schema = scenario_def["json_schema"]
698-
data = scenario_def["data"]
699-
coll = client_context.client.get_database("keyvault", codec_options=OPTS)["datakeys"]
700-
coll.delete_many({})
701-
if key_vault_data:
702-
coll.insert_many(key_vault_data)
703-
704-
db_name = self.get_scenario_db_name(scenario_def)
705-
coll_name = self.get_scenario_coll_name(scenario_def)
706-
db = client_context.client.get_database(db_name, codec_options=OPTS)
707-
db.drop_collection(coll_name, encrypted_fields=encrypted_fields)
708-
wc = WriteConcern(w="majority")
709-
kwargs: Dict[str, Any] = {}
710-
if json_schema:
711-
kwargs["validator"] = {"$jsonSchema": json_schema}
712-
kwargs["codec_options"] = OPTS
713-
if not data:
714-
kwargs["write_concern"] = wc
715-
if encrypted_fields:
716-
kwargs["encryptedFields"] = encrypted_fields
717-
db.create_collection(coll_name, **kwargs)
718-
coll = db[coll_name]
719-
if data:
720-
# Load data.
721-
coll.with_options(write_concern=wc).insert_many(scenario_def["data"])
722-
723-
def allowable_errors(self, op):
724-
"""Override expected error classes."""
725-
errors = super().allowable_errors(op)
726-
# An updateOne test expects encryption to error when no $ operator
727-
# appears but pymongo raises a client side ValueError in this case.
728-
if op["name"] == "updateOne":
729-
errors += (ValueError,)
730-
return errors
731-
732-
733-
def create_test(scenario_def, test, name):
734-
@client_context.require_test_commands
735-
def run_scenario(self):
736-
self.run_scenario(scenario_def, test)
737-
738-
return run_scenario
739-
740-
741-
test_creator = SpecTestCreator(create_test, TestSpec, os.path.join(SPEC_PATH, "legacy"))
742-
test_creator.create_tests()
743-
744623
if _HAVE_PYMONGOCRYPT:
745624
globals().update(
746625
generate_test_classes(

test/test_transactions.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import asyncio
1919
import sys
2020
from io import BytesIO
21-
from test.utils_spec_runner import SpecRunner
2221

2322
from gridfs.synchronous.grid_file import GridFS, GridFSBucket
2423
from pymongo.server_selectors import writable_server_selector
@@ -61,15 +60,8 @@
6160
UNPIN_TEST_MAX_ATTEMPTS = 50
6261

6362

64-
class TransactionsBase(SpecRunner):
65-
def maybe_skip_scenario(self, test):
66-
super().maybe_skip_scenario(test)
67-
if (
68-
"secondary" in self.id()
69-
and not client_context.is_mongos
70-
and not client_context.has_secondaries
71-
):
72-
raise unittest.SkipTest("No secondaries")
63+
class TransactionsBase(IntegrationTest):
64+
pass
7365

7466

7567
class TestTransactions(TransactionsBase):

0 commit comments

Comments
 (0)