Skip to content

Commit 1e395de

Browse files
authored
PYTHON-4737 Migrate test_binary.py to async (#1863)
1 parent 7742b7f commit 1e395de

File tree

3 files changed

+188
-118
lines changed

3 files changed

+188
-118
lines changed

test/asynchronous/test_client.py

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import _thread as thread
1919
import asyncio
20+
import base64
2021
import contextlib
2122
import copy
2223
import datetime
@@ -31,13 +32,15 @@
3132
import sys
3233
import threading
3334
import time
34-
from typing import Iterable, Type, no_type_check
35+
import uuid
36+
from typing import Any, Iterable, Type, no_type_check
3537
from unittest import mock
3638
from unittest.mock import patch
3739

3840
import pytest
3941
import pytest_asyncio
4042

43+
from bson.binary import CSHARP_LEGACY, JAVA_LEGACY, PYTHON_LEGACY, Binary, UuidRepresentation
4144
from pymongo.operations import _Op
4245

4346
sys.path[0:0] = [""]
@@ -57,6 +60,7 @@
5760
unittest,
5861
)
5962
from test.asynchronous.pymongo_mocks import AsyncMockClient
63+
from test.test_binary import BinaryData
6064
from test.utils import (
6165
NTHREADS,
6266
CMAPListener,
@@ -2020,6 +2024,75 @@ def test_dict_hints_sort(self):
20202024
async def test_dict_hints_create_index(self):
20212025
await self.db.t.create_index({"x": pymongo.ASCENDING})
20222026

2027+
async def test_legacy_java_uuid_roundtrip(self):
2028+
data = BinaryData.java_data
2029+
docs = bson.decode_all(data, CodecOptions(SON[str, Any], False, JAVA_LEGACY))
2030+
2031+
await async_client_context.client.pymongo_test.drop_collection("java_uuid")
2032+
db = async_client_context.client.pymongo_test
2033+
coll = db.get_collection("java_uuid", CodecOptions(uuid_representation=JAVA_LEGACY))
2034+
2035+
await coll.insert_many(docs)
2036+
self.assertEqual(5, await coll.count_documents({}))
2037+
async for d in coll.find():
2038+
self.assertEqual(d["newguid"], uuid.UUID(d["newguidstring"]))
2039+
2040+
coll = db.get_collection("java_uuid", CodecOptions(uuid_representation=PYTHON_LEGACY))
2041+
async for d in coll.find():
2042+
self.assertNotEqual(d["newguid"], d["newguidstring"])
2043+
await async_client_context.client.pymongo_test.drop_collection("java_uuid")
2044+
2045+
async def test_legacy_csharp_uuid_roundtrip(self):
2046+
data = BinaryData.csharp_data
2047+
docs = bson.decode_all(data, CodecOptions(SON[str, Any], False, CSHARP_LEGACY))
2048+
2049+
await async_client_context.client.pymongo_test.drop_collection("csharp_uuid")
2050+
db = async_client_context.client.pymongo_test
2051+
coll = db.get_collection("csharp_uuid", CodecOptions(uuid_representation=CSHARP_LEGACY))
2052+
2053+
await coll.insert_many(docs)
2054+
self.assertEqual(5, await coll.count_documents({}))
2055+
async for d in coll.find():
2056+
self.assertEqual(d["newguid"], uuid.UUID(d["newguidstring"]))
2057+
2058+
coll = db.get_collection("csharp_uuid", CodecOptions(uuid_representation=PYTHON_LEGACY))
2059+
async for d in coll.find():
2060+
self.assertNotEqual(d["newguid"], d["newguidstring"])
2061+
await async_client_context.client.pymongo_test.drop_collection("csharp_uuid")
2062+
2063+
async def test_uri_to_uuid(self):
2064+
uri = "mongodb://foo/?uuidrepresentation=csharpLegacy"
2065+
client = await self.async_single_client(uri, connect=False)
2066+
self.assertEqual(client.pymongo_test.test.codec_options.uuid_representation, CSHARP_LEGACY)
2067+
2068+
async def test_uuid_queries(self):
2069+
db = async_client_context.client.pymongo_test
2070+
coll = db.test
2071+
await coll.drop()
2072+
2073+
uu = uuid.uuid4()
2074+
await coll.insert_one({"uuid": Binary(uu.bytes, 3)})
2075+
self.assertEqual(1, await coll.count_documents({}))
2076+
2077+
# Test regular UUID queries (using subtype 4).
2078+
coll = db.get_collection(
2079+
"test", CodecOptions(uuid_representation=UuidRepresentation.STANDARD)
2080+
)
2081+
self.assertEqual(0, await coll.count_documents({"uuid": uu}))
2082+
await coll.insert_one({"uuid": uu})
2083+
self.assertEqual(2, await coll.count_documents({}))
2084+
docs = await coll.find({"uuid": uu}).to_list()
2085+
self.assertEqual(1, len(docs))
2086+
self.assertEqual(uu, docs[0]["uuid"])
2087+
2088+
# Test both.
2089+
uu_legacy = Binary.from_uuid(uu, UuidRepresentation.PYTHON_LEGACY)
2090+
predicate = {"uuid": {"$in": [uu, uu_legacy]}}
2091+
self.assertEqual(2, await coll.count_documents(predicate))
2092+
docs = await coll.find(predicate).to_list()
2093+
self.assertEqual(2, len(docs))
2094+
await coll.drop()
2095+
20232096

20242097
class TestExhaustCursor(AsyncIntegrationTest):
20252098
"""Test that clients properly handle errors from exhaust cursors."""

test/test_binary.py

Lines changed: 40 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -34,53 +34,49 @@
3434
from bson.codec_options import CodecOptions
3535
from bson.son import SON
3636
from pymongo.common import validate_uuid_representation
37-
from pymongo.synchronous.mongo_client import MongoClient
3837
from pymongo.write_concern import WriteConcern
3938

4039

41-
class TestBinary(unittest.TestCase):
42-
csharp_data: bytes
43-
java_data: bytes
40+
class BinaryData:
41+
# Generated by the Java driver
42+
from_java = (
43+
b"bAAAAAdfaWQAUCBQxkVm+XdxJ9tOBW5ld2d1aWQAEAAAAAMIQkfACFu"
44+
b"Z/0RustLOU/G6Am5ld2d1aWRzdHJpbmcAJQAAAGZmOTk1YjA4LWMwND"
45+
b"ctNDIwOC1iYWYxLTUzY2VkMmIyNmU0NAAAbAAAAAdfaWQAUCBQxkVm+"
46+
b"XdxJ9tPBW5ld2d1aWQAEAAAAANgS/xhRXXv8kfIec+dYdyCAm5ld2d1"
47+
b"aWRzdHJpbmcAJQAAAGYyZWY3NTQ1LTYxZmMtNGI2MC04MmRjLTYxOWR"
48+
b"jZjc5Yzg0NwAAbAAAAAdfaWQAUCBQxkVm+XdxJ9tQBW5ld2d1aWQAEA"
49+
b"AAAAPqREIbhZPUJOSdHCJIgaqNAm5ld2d1aWRzdHJpbmcAJQAAADI0Z"
50+
b"DQ5Mzg1LTFiNDItNDRlYS04ZGFhLTgxNDgyMjFjOWRlNAAAbAAAAAdf"
51+
b"aWQAUCBQxkVm+XdxJ9tRBW5ld2d1aWQAEAAAAANjQBn/aQuNfRyfNyx"
52+
b"29COkAm5ld2d1aWRzdHJpbmcAJQAAADdkOGQwYjY5LWZmMTktNDA2My"
53+
b"1hNDIzLWY0NzYyYzM3OWYxYwAAbAAAAAdfaWQAUCBQxkVm+XdxJ9tSB"
54+
b"W5ld2d1aWQAEAAAAAMtSv/Et1cAQUFHUYevqxaLAm5ld2d1aWRzdHJp"
55+
b"bmcAJQAAADQxMDA1N2I3LWM0ZmYtNGEyZC04YjE2LWFiYWY4NzUxNDc"
56+
b"0MQAA"
57+
)
58+
java_data = base64.b64decode(from_java)
59+
60+
# Generated by the .net driver
61+
from_csharp = (
62+
b"ZAAAABBfaWQAAAAAAAVuZXdndWlkABAAAAAD+MkoCd/Jy0iYJ7Vhl"
63+
b"iF3BAJuZXdndWlkc3RyaW5nACUAAAAwOTI4YzlmOC1jOWRmLTQ4Y2"
64+
b"ItOTgyNy1iNTYxOTYyMTc3MDQAAGQAAAAQX2lkAAEAAAAFbmV3Z3V"
65+
b"pZAAQAAAAA9MD0oXQe6VOp7mK4jkttWUCbmV3Z3VpZHN0cmluZwAl"
66+
b"AAAAODVkMjAzZDMtN2JkMC00ZWE1LWE3YjktOGFlMjM5MmRiNTY1A"
67+
b"ABkAAAAEF9pZAACAAAABW5ld2d1aWQAEAAAAAPRmIO2auc/Tprq1Z"
68+
b"oQ1oNYAm5ld2d1aWRzdHJpbmcAJQAAAGI2ODM5OGQxLWU3NmEtNGU"
69+
b"zZi05YWVhLWQ1OWExMGQ2ODM1OAAAZAAAABBfaWQAAwAAAAVuZXdn"
70+
b"dWlkABAAAAADISpriopuTEaXIa7arYOCFAJuZXdndWlkc3RyaW5nA"
71+
b"CUAAAA4YTZiMmEyMS02ZThhLTQ2NGMtOTcyMS1hZWRhYWQ4MzgyMT"
72+
b"QAAGQAAAAQX2lkAAQAAAAFbmV3Z3VpZAAQAAAAA98eg0CFpGlPihP"
73+
b"MwOmYGOMCbmV3Z3VpZHN0cmluZwAlAAAANDA4MzFlZGYtYTQ4NS00"
74+
b"ZjY5LThhMTMtY2NjMGU5OTgxOGUzAAA="
75+
)
76+
csharp_data = base64.b64decode(from_csharp)
4477

45-
@classmethod
46-
def setUpClass(cls):
47-
# Generated by the Java driver
48-
from_java = (
49-
b"bAAAAAdfaWQAUCBQxkVm+XdxJ9tOBW5ld2d1aWQAEAAAAAMIQkfACFu"
50-
b"Z/0RustLOU/G6Am5ld2d1aWRzdHJpbmcAJQAAAGZmOTk1YjA4LWMwND"
51-
b"ctNDIwOC1iYWYxLTUzY2VkMmIyNmU0NAAAbAAAAAdfaWQAUCBQxkVm+"
52-
b"XdxJ9tPBW5ld2d1aWQAEAAAAANgS/xhRXXv8kfIec+dYdyCAm5ld2d1"
53-
b"aWRzdHJpbmcAJQAAAGYyZWY3NTQ1LTYxZmMtNGI2MC04MmRjLTYxOWR"
54-
b"jZjc5Yzg0NwAAbAAAAAdfaWQAUCBQxkVm+XdxJ9tQBW5ld2d1aWQAEA"
55-
b"AAAAPqREIbhZPUJOSdHCJIgaqNAm5ld2d1aWRzdHJpbmcAJQAAADI0Z"
56-
b"DQ5Mzg1LTFiNDItNDRlYS04ZGFhLTgxNDgyMjFjOWRlNAAAbAAAAAdf"
57-
b"aWQAUCBQxkVm+XdxJ9tRBW5ld2d1aWQAEAAAAANjQBn/aQuNfRyfNyx"
58-
b"29COkAm5ld2d1aWRzdHJpbmcAJQAAADdkOGQwYjY5LWZmMTktNDA2My"
59-
b"1hNDIzLWY0NzYyYzM3OWYxYwAAbAAAAAdfaWQAUCBQxkVm+XdxJ9tSB"
60-
b"W5ld2d1aWQAEAAAAAMtSv/Et1cAQUFHUYevqxaLAm5ld2d1aWRzdHJp"
61-
b"bmcAJQAAADQxMDA1N2I3LWM0ZmYtNGEyZC04YjE2LWFiYWY4NzUxNDc"
62-
b"0MQAA"
63-
)
64-
cls.java_data = base64.b64decode(from_java)
65-
66-
# Generated by the .net driver
67-
from_csharp = (
68-
b"ZAAAABBfaWQAAAAAAAVuZXdndWlkABAAAAAD+MkoCd/Jy0iYJ7Vhl"
69-
b"iF3BAJuZXdndWlkc3RyaW5nACUAAAAwOTI4YzlmOC1jOWRmLTQ4Y2"
70-
b"ItOTgyNy1iNTYxOTYyMTc3MDQAAGQAAAAQX2lkAAEAAAAFbmV3Z3V"
71-
b"pZAAQAAAAA9MD0oXQe6VOp7mK4jkttWUCbmV3Z3VpZHN0cmluZwAl"
72-
b"AAAAODVkMjAzZDMtN2JkMC00ZWE1LWE3YjktOGFlMjM5MmRiNTY1A"
73-
b"ABkAAAAEF9pZAACAAAABW5ld2d1aWQAEAAAAAPRmIO2auc/Tprq1Z"
74-
b"oQ1oNYAm5ld2d1aWRzdHJpbmcAJQAAAGI2ODM5OGQxLWU3NmEtNGU"
75-
b"zZi05YWVhLWQ1OWExMGQ2ODM1OAAAZAAAABBfaWQAAwAAAAVuZXdn"
76-
b"dWlkABAAAAADISpriopuTEaXIa7arYOCFAJuZXdndWlkc3RyaW5nA"
77-
b"CUAAAA4YTZiMmEyMS02ZThhLTQ2NGMtOTcyMS1hZWRhYWQ4MzgyMT"
78-
b"QAAGQAAAAQX2lkAAQAAAAFbmV3Z3VpZAAQAAAAA98eg0CFpGlPihP"
79-
b"MwOmYGOMCbmV3Z3VpZHN0cmluZwAlAAAANDA4MzFlZGYtYTQ4NS00"
80-
b"ZjY5LThhMTMtY2NjMGU5OTgxOGUzAAA="
81-
)
82-
cls.csharp_data = base64.b64decode(from_csharp)
8378

79+
class TestBinary(unittest.TestCase):
8480
def test_binary(self):
8581
a_string = "hello world"
8682
a_binary = Binary(b"hello world")
@@ -159,7 +155,7 @@ def test_uuid_subtype_4(self):
159155

160156
def test_legacy_java_uuid(self):
161157
# Test decoding
162-
data = self.java_data
158+
data = BinaryData.java_data
163159
docs = bson.decode_all(data, CodecOptions(SON[str, Any], False, PYTHON_LEGACY))
164160
for d in docs:
165161
self.assertNotEqual(d["newguid"], uuid.UUID(d["newguidstring"]))
@@ -197,27 +193,8 @@ def test_legacy_java_uuid(self):
197193
)
198194
self.assertEqual(data, encoded)
199195

200-
@client_context.require_connection
201-
def test_legacy_java_uuid_roundtrip(self):
202-
data = self.java_data
203-
docs = bson.decode_all(data, CodecOptions(SON[str, Any], False, JAVA_LEGACY))
204-
205-
client_context.client.pymongo_test.drop_collection("java_uuid")
206-
db = client_context.client.pymongo_test
207-
coll = db.get_collection("java_uuid", CodecOptions(uuid_representation=JAVA_LEGACY))
208-
209-
coll.insert_many(docs)
210-
self.assertEqual(5, coll.count_documents({}))
211-
for d in coll.find():
212-
self.assertEqual(d["newguid"], uuid.UUID(d["newguidstring"]))
213-
214-
coll = db.get_collection("java_uuid", CodecOptions(uuid_representation=PYTHON_LEGACY))
215-
for d in coll.find():
216-
self.assertNotEqual(d["newguid"], d["newguidstring"])
217-
client_context.client.pymongo_test.drop_collection("java_uuid")
218-
219196
def test_legacy_csharp_uuid(self):
220-
data = self.csharp_data
197+
data = BinaryData.csharp_data
221198

222199
# Test decoding
223200
docs = bson.decode_all(data, CodecOptions(SON[str, Any], False, PYTHON_LEGACY))
@@ -257,59 +234,6 @@ def test_legacy_csharp_uuid(self):
257234
)
258235
self.assertEqual(data, encoded)
259236

260-
@client_context.require_connection
261-
def test_legacy_csharp_uuid_roundtrip(self):
262-
data = self.csharp_data
263-
docs = bson.decode_all(data, CodecOptions(SON[str, Any], False, CSHARP_LEGACY))
264-
265-
client_context.client.pymongo_test.drop_collection("csharp_uuid")
266-
db = client_context.client.pymongo_test
267-
coll = db.get_collection("csharp_uuid", CodecOptions(uuid_representation=CSHARP_LEGACY))
268-
269-
coll.insert_many(docs)
270-
self.assertEqual(5, coll.count_documents({}))
271-
for d in coll.find():
272-
self.assertEqual(d["newguid"], uuid.UUID(d["newguidstring"]))
273-
274-
coll = db.get_collection("csharp_uuid", CodecOptions(uuid_representation=PYTHON_LEGACY))
275-
for d in coll.find():
276-
self.assertNotEqual(d["newguid"], d["newguidstring"])
277-
client_context.client.pymongo_test.drop_collection("csharp_uuid")
278-
279-
def test_uri_to_uuid(self):
280-
uri = "mongodb://foo/?uuidrepresentation=csharpLegacy"
281-
client = MongoClient(uri, connect=False)
282-
self.assertEqual(client.pymongo_test.test.codec_options.uuid_representation, CSHARP_LEGACY)
283-
284-
@client_context.require_connection
285-
def test_uuid_queries(self):
286-
db = client_context.client.pymongo_test
287-
coll = db.test
288-
coll.drop()
289-
290-
uu = uuid.uuid4()
291-
coll.insert_one({"uuid": Binary(uu.bytes, 3)})
292-
self.assertEqual(1, coll.count_documents({}))
293-
294-
# Test regular UUID queries (using subtype 4).
295-
coll = db.get_collection(
296-
"test", CodecOptions(uuid_representation=UuidRepresentation.STANDARD)
297-
)
298-
self.assertEqual(0, coll.count_documents({"uuid": uu}))
299-
coll.insert_one({"uuid": uu})
300-
self.assertEqual(2, coll.count_documents({}))
301-
docs = list(coll.find({"uuid": uu}))
302-
self.assertEqual(1, len(docs))
303-
self.assertEqual(uu, docs[0]["uuid"])
304-
305-
# Test both.
306-
uu_legacy = Binary.from_uuid(uu, UuidRepresentation.PYTHON_LEGACY)
307-
predicate = {"uuid": {"$in": [uu, uu_legacy]}}
308-
self.assertEqual(2, coll.count_documents(predicate))
309-
docs = list(coll.find(predicate))
310-
self.assertEqual(2, len(docs))
311-
coll.drop()
312-
313237
def test_pickle(self):
314238
b1 = Binary(b"123", 2)
315239

0 commit comments

Comments
 (0)