|
| 1 | +import copy |
1 | 2 | import os
|
2 | 3 | import pickle
|
3 | 4 | import unittest
|
@@ -3848,6 +3849,53 @@ class User(Document):
|
3848 | 3849 | with pytest.raises(DuplicateKeyError):
|
3849 | 3850 | User.objects().select_related()
|
3850 | 3851 |
|
| 3852 | + def test_deepcopy(self): |
| 3853 | + regex_field = StringField(regex=r"(^ABC\d\d\d\d$)") |
| 3854 | + no_regex_field = StringField() |
| 3855 | + # Copy copied field object |
| 3856 | + copy.deepcopy(copy.deepcopy(regex_field)) |
| 3857 | + copy.deepcopy(copy.deepcopy(no_regex_field)) |
| 3858 | + # Copy same field object multiple times to make sure we restore __deepcopy__ correctly |
| 3859 | + copy.deepcopy(regex_field) |
| 3860 | + copy.deepcopy(regex_field) |
| 3861 | + copy.deepcopy(no_regex_field) |
| 3862 | + copy.deepcopy(no_regex_field) |
| 3863 | + |
| 3864 | + def test_deepcopy_with_reference_itself(self): |
| 3865 | + class User(Document): |
| 3866 | + name = StringField(regex=r"(.*)") |
| 3867 | + other_user = ReferenceField("self") |
| 3868 | + |
| 3869 | + user1 = User(name="John").save() |
| 3870 | + User(name="Bob", other_user=user1).save() |
| 3871 | + |
| 3872 | + user1.other_user = user1 |
| 3873 | + user1.save() |
| 3874 | + for u in User.objects: |
| 3875 | + copied_u = copy.deepcopy(u) |
| 3876 | + assert copied_u is not u |
| 3877 | + assert copied_u._fields["name"] is u._fields["name"] |
| 3878 | + assert ( |
| 3879 | + copied_u._fields["name"].regex is u._fields["name"].regex |
| 3880 | + ) # Compiled regex objects are atomic |
| 3881 | + |
| 3882 | + def test_from_son_with_auto_dereference_disabled(self): |
| 3883 | + class User(Document): |
| 3884 | + name = StringField(regex=r"(^ABC\d\d\d\d$)") |
| 3885 | + |
| 3886 | + data = {"name": "ABC0000"} |
| 3887 | + user_obj = User._from_son(son=data, _auto_dereference=False) |
| 3888 | + |
| 3889 | + assert user_obj._fields["name"] is not User.name |
| 3890 | + assert ( |
| 3891 | + user_obj._fields["name"].regex is User.name.regex |
| 3892 | + ) # Compiled regex are atomic |
| 3893 | + copied_user = copy.deepcopy(user_obj) |
| 3894 | + assert user_obj._fields["name"] is not copied_user._fields["name"] |
| 3895 | + assert ( |
| 3896 | + user_obj._fields["name"].regex is copied_user._fields["name"].regex |
| 3897 | + ) # Compiled regex are atomic |
| 3898 | + |
3851 | 3899 | def test_embedded_document_failed_while_loading_instance_when_it_is_not_a_dict(
|
3852 | 3900 | self,
|
3853 | 3901 | ):
|
|
0 commit comments