|
4 | 4 |
|
5 | 5 | from mongoengine import * |
6 | 6 | from mongoengine.pymongo_support import list_collection_names |
7 | | -from tests.utils import MongoDBTestCase |
| 7 | +from tests.utils import MongoDBTestCase, get_as_pymongo |
8 | 8 |
|
9 | 9 |
|
10 | 10 | class TestDelta(MongoDBTestCase): |
@@ -952,6 +952,49 @@ class Doc(Document): |
952 | 952 | assert "oops" == delta[0]["users.007.rolist"][0]["type"] |
953 | 953 | assert uinfo.id == delta[0]["users.007.info"] |
954 | 954 |
|
| 955 | + def test_delta_on_dict(self): |
| 956 | + class MyDoc(Document): |
| 957 | + dico = DictField() |
| 958 | + |
| 959 | + MyDoc.drop_collection() |
| 960 | + |
| 961 | + MyDoc(dico={"a": {"b": 0}}).save() |
| 962 | + |
| 963 | + mydoc = MyDoc.objects.first() |
| 964 | + assert mydoc._get_changed_fields() == [] |
| 965 | + mydoc.dico["a"]["b"] = 0 |
| 966 | + assert mydoc._get_changed_fields() == [] |
| 967 | + mydoc.dico["a"] = {"b": 0} |
| 968 | + assert mydoc._get_changed_fields() == [] |
| 969 | + mydoc.dico = {"a": {"b": 0}} |
| 970 | + assert mydoc._get_changed_fields() == [] |
| 971 | + mydoc.dico["a"]["c"] = 1 |
| 972 | + assert mydoc._get_changed_fields() == ["dico.a.c"] |
| 973 | + mydoc.dico["a"]["b"] = 2 |
| 974 | + mydoc.dico["d"] = 3 |
| 975 | + assert mydoc._get_changed_fields() == ["dico.a.c", "dico.a.b", "dico.d"] |
| 976 | + |
| 977 | + mydoc._clear_changed_fields() |
| 978 | + assert mydoc._get_changed_fields() == [] |
| 979 | + |
| 980 | + def test_delta_on_dict_empty_key_triggers_full_change(self): |
| 981 | + """more of a bug (harmless) but empty key changes aren't managed perfectly""" |
| 982 | + |
| 983 | + class MyDoc(Document): |
| 984 | + dico = DictField() |
| 985 | + |
| 986 | + MyDoc.drop_collection() |
| 987 | + |
| 988 | + MyDoc(dico={"a": {"b": 0}}).save() |
| 989 | + |
| 990 | + mydoc = MyDoc.objects.first() |
| 991 | + assert mydoc._get_changed_fields() == [] |
| 992 | + mydoc.dico[""] = 3 |
| 993 | + assert mydoc._get_changed_fields() == ["dico"] |
| 994 | + mydoc.save() |
| 995 | + raw_doc = get_as_pymongo(mydoc) |
| 996 | + assert raw_doc == {"_id": mydoc.id, "dico": {"": 3, "a": {"b": 0}}} |
| 997 | + |
955 | 998 |
|
956 | 999 | if __name__ == "__main__": |
957 | 1000 | unittest.main() |
0 commit comments