Skip to content

Commit 164d660

Browse files
committed
Add test for deepcopy and regex
1 parent e77daa6 commit 164d660

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed

tests/document/test_instance.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import copy
12
import os
23
import pickle
34
import unittest
@@ -3854,6 +3855,53 @@ class User(Document):
38543855
with pytest.raises(DuplicateKeyError):
38553856
User.objects().select_related()
38563857

3858+
def test_deepcopy(self):
3859+
regex_field = StringField(regex=r"(^ABC\d\d\d\d$)")
3860+
no_regex_field = StringField()
3861+
# Copy copied field object
3862+
copy.deepcopy(copy.deepcopy(regex_field))
3863+
copy.deepcopy(copy.deepcopy(no_regex_field))
3864+
# Copy same field object multiple times to make sure we restore __deepcopy__ correctly
3865+
copy.deepcopy(regex_field)
3866+
copy.deepcopy(regex_field)
3867+
copy.deepcopy(no_regex_field)
3868+
copy.deepcopy(no_regex_field)
3869+
3870+
def test_deepcopy_with_reference_itself(self):
3871+
class User(Document):
3872+
name = StringField(regex=r"(.*)")
3873+
other_user = ReferenceField("self")
3874+
3875+
user1 = User(name="John").save()
3876+
User(name="Bob", other_user=user1).save()
3877+
3878+
user1.other_user = user1
3879+
user1.save()
3880+
for u in User.objects:
3881+
copied_u = copy.deepcopy(u)
3882+
assert copied_u is not u
3883+
assert copied_u._fields["name"] is u._fields["name"]
3884+
assert (
3885+
copied_u._fields["name"].regex is u._fields["name"].regex
3886+
) # Compiled regex objects are atomic
3887+
3888+
def test_from_son_with_auto_dereference_disabled(self):
3889+
class User(Document):
3890+
name = StringField(regex=r"(^ABC\d\d\d\d$)")
3891+
3892+
data = {"name": "ABC0000"}
3893+
user_obj = User._from_son(son=data, _auto_dereference=False)
3894+
3895+
assert user_obj._fields["name"] is not User.name
3896+
assert (
3897+
user_obj._fields["name"].regex is User.name.regex
3898+
) # Compiled regex are atomic
3899+
copied_user = copy.deepcopy(user_obj)
3900+
assert user_obj._fields["name"] is not copied_user._fields["name"]
3901+
assert (
3902+
user_obj._fields["name"].regex is copied_user._fields["name"].regex
3903+
) # Compiled regex are atomic
3904+
38573905
def test_embedded_document_failed_while_loading_instance_when_it_is_not_a_dict(
38583906
self,
38593907
):

0 commit comments

Comments
 (0)