From 19c5fcfb74a77dcd8bd6932a0c5ca623359f8350 Mon Sep 17 00:00:00 2001 From: Noah Stapp Date: Fri, 20 Oct 2023 14:08:43 -0700 Subject: [PATCH] PYTHON-3757 Bulk write operations don't consider hint field in equality checks (#1402) --- pymongo/operations.py | 16 ++++++++++++---- test/test_crud_v1.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/pymongo/operations.py b/pymongo/operations.py index 2a41575a3..2c48a2994 100644 --- a/pymongo/operations.py +++ b/pymongo/operations.py @@ -126,11 +126,15 @@ class DeleteOne: ) def __repr__(self) -> str: - return f"DeleteOne({self._filter!r}, {self._collation!r})" + return f"DeleteOne({self._filter!r}, {self._collation!r}, {self._hint!r})" def __eq__(self, other: Any) -> bool: if type(other) == type(self): - return (other._filter, other._collation) == (self._filter, self._collation) + return (other._filter, other._collation, other._hint) == ( + self._filter, + self._collation, + self._hint, + ) return NotImplemented def __ne__(self, other: Any) -> bool: @@ -187,11 +191,15 @@ class DeleteMany: ) def __repr__(self) -> str: - return f"DeleteMany({self._filter!r}, {self._collation!r})" + return f"DeleteMany({self._filter!r}, {self._collation!r}, {self._hint!r})" def __eq__(self, other: Any) -> bool: if type(other) == type(self): - return (other._filter, other._collation) == (self._filter, self._collation) + return (other._filter, other._collation, other._hint) == ( + self._filter, + self._collation, + self._hint, + ) return NotImplemented def __ne__(self, other: Any) -> bool: diff --git a/test/test_crud_v1.py b/test/test_crud_v1.py index 8eb8f3581..c9f8dbe4b 100644 --- a/test/test_crud_v1.py +++ b/test/test_crud_v1.py @@ -185,15 +185,45 @@ class TestWriteOpsComparison(unittest.TestCase): def test_DeleteOneEquals(self): self.assertEqual(DeleteOne({"foo": 42}), DeleteOne({"foo": 42})) + self.assertEqual( + DeleteOne({"foo": 42}, {"locale": "en_US"}), DeleteOne({"foo": 42}, {"locale": "en_US"}) + ) + self.assertEqual( + DeleteOne({"foo": 42}, {"locale": "en_US"}, {"hint": 1}), + DeleteOne({"foo": 42}, {"locale": "en_US"}, {"hint": 1}), + ) def test_DeleteOneNotEquals(self): self.assertNotEqual(DeleteOne({"foo": 42}), DeleteOne({"foo": 23})) + self.assertNotEqual( + DeleteOne({"foo": 42}, {"locale": "en_US"}), DeleteOne({"foo": 42}, {"locale": "en_GB"}) + ) + self.assertNotEqual( + DeleteOne({"foo": 42}, {"locale": "en_US"}, {"hint": 1}), + DeleteOne({"foo": 42}, {"locale": "en_US"}, {"hint": 2}), + ) def test_DeleteManyEquals(self): self.assertEqual(DeleteMany({"foo": 42}), DeleteMany({"foo": 42})) + self.assertEqual( + DeleteMany({"foo": 42}, {"locale": "en_US"}), + DeleteMany({"foo": 42}, {"locale": "en_US"}), + ) + self.assertEqual( + DeleteMany({"foo": 42}, {"locale": "en_US"}, {"hint": 1}), + DeleteMany({"foo": 42}, {"locale": "en_US"}, {"hint": 1}), + ) def test_DeleteManyNotEquals(self): self.assertNotEqual(DeleteMany({"foo": 42}), DeleteMany({"foo": 23})) + self.assertNotEqual( + DeleteMany({"foo": 42}, {"locale": "en_US"}), + DeleteMany({"foo": 42}, {"locale": "en_GB"}), + ) + self.assertNotEqual( + DeleteMany({"foo": 42}, {"locale": "en_US"}, {"hint": 1}), + DeleteMany({"foo": 42}, {"locale": "en_US"}, {"hint": 2}), + ) def test_DeleteOneNotEqualsDeleteMany(self): self.assertNotEqual(DeleteOne({"foo": 42}), DeleteMany({"foo": 42}))