77
88from django_mongodb_backend .test import MongoTestCaseMixin
99
10- from .models import Author
10+ from .models import Author , Blob
1111
1212
1313class ModelCreationTests (MongoTestCaseMixin , TestCase ):
@@ -23,6 +23,69 @@ def test_dollar_prefixed_string(self):
2323 )
2424
2525
26+ class ModelUpdateTests (MongoTestCaseMixin , TestCase ):
27+ """
28+ $-prefixed strings and dict/tuples that could be interpreted as expressions
29+ are escaped in the queries that update model instances.
30+ """
31+
32+ def test_dollar_prefixed_string (self ):
33+ obj = Author .objects .create (name = "foobar" )
34+ obj .name = "$updated"
35+ with self .assertNumQueries (1 ) as ctx :
36+ obj .save ()
37+ obj .refresh_from_db ()
38+ self .assertEqual (obj .name , "$updated" )
39+ self .assertUpdateQuery (
40+ ctx .captured_queries [0 ]["sql" ],
41+ "basic__author" ,
42+ {"_id" : obj .id },
43+ [{"$set" : {"name" : {"$literal" : "$updated" }}}],
44+ )
45+
46+ def test_dollar_prefixed_value (self ):
47+ obj = Author .objects .create (name = "foobar" )
48+ obj .name = Value ("$updated" )
49+ with self .assertNumQueries (1 ) as ctx :
50+ obj .save ()
51+ obj .refresh_from_db ()
52+ self .assertEqual (obj .name , "$updated" )
53+ self .assertUpdateQuery (
54+ ctx .captured_queries [0 ]["sql" ],
55+ "basic__author" ,
56+ {"_id" : obj .id },
57+ [{"$set" : {"name" : {"$literal" : "$updated" }}}],
58+ )
59+
60+ def test_dict (self ):
61+ obj = Blob .objects .create (name = "foobar" )
62+ obj .data = {"$concat" : ["$name" , "-" , "$name" ]}
63+ obj .save ()
64+ obj .refresh_from_db ()
65+ self .assertEqual (obj .data , {"$concat" : ["$name" , "-" , "$name" ]})
66+
67+ def test_dict_value (self ):
68+ obj = Blob .objects .create (name = "foobar" , data = {})
69+ obj .data = Value ({"$concat" : ["$name" , "-" , "$name" ]})
70+ obj .save ()
71+ obj .refresh_from_db ()
72+ self .assertEqual (obj .data , {"$concat" : ["$name" , "-" , "$name" ]})
73+
74+ def test_tuple (self ):
75+ obj = Blob .objects .create (name = "foobar" )
76+ obj .data = ("$name" , "-" , "$name" )
77+ obj .save ()
78+ obj .refresh_from_db ()
79+ self .assertEqual (obj .data , ["$name" , "-" , "$name" ])
80+
81+ def test_tuple_value (self ):
82+ obj = Blob .objects .create (name = "foobar" )
83+ obj .data = Value (("$name" , "-" , "$name" ))
84+ obj .save ()
85+ obj .refresh_from_db ()
86+ self .assertEqual (obj .data , ["$name" , "-" , "$name" ])
87+
88+
2689class AnnotationTests (MongoTestCaseMixin , TestCase ):
2790 def test_dollar_prefixed_value (self ):
2891 """Value() escapes dollar prefixed strings."""
0 commit comments