33
44from django_mongodb_backend .test import MongoTestCaseMixin
55
6- from .models import Author
6+ from .models import Author , Book
77
88
99class SaveDollarPrefixTests (MongoTestCaseMixin , TestCase ):
@@ -14,6 +14,70 @@ def test_insert_dollar_prefix(self):
1414 self .assertEqual (obj .name , "$foobar" )
1515
1616
17+ class UpdateDollarPrefixTests (MongoTestCaseMixin , TestCase ):
18+ def test_update_dollar_prefix (self ):
19+ """$-prefixed values are correctly saved on update."""
20+ obj = Author .objects .create (name = "foobar" )
21+ obj .name = "$updated"
22+ with self .assertNumQueries (1 ) as ctx :
23+ obj .save ()
24+ obj .refresh_from_db ()
25+ self .assertEqual (obj .name , "$updated" )
26+ self .assertUpdateQuery (
27+ ctx .captured_queries [0 ]["sql" ],
28+ "basic__author" ,
29+ {"_id" : obj .id },
30+ [{"$set" : {"name" : {"$literal" : "$updated" }}}],
31+ )
32+
33+ def test_update_dollar_prefix_in_value_expression (self ):
34+ """$-prefixed Value() expressions are correctly handled on update."""
35+ obj = Author .objects .create (name = "foobar" )
36+ obj .name = Value ("$updated" )
37+ with self .assertNumQueries (1 ) as ctx :
38+ obj .save ()
39+ obj .refresh_from_db ()
40+ self .assertEqual (obj .name , "$updated" )
41+ self .assertUpdateQuery (
42+ ctx .captured_queries [0 ]["sql" ],
43+ "basic__author" ,
44+ {"_id" : obj .id },
45+ [{"$set" : {"name" : {"$literal" : "$updated" }}}],
46+ )
47+
48+ def test_update_dict_value (self ):
49+ """MQL-like dict Value() expressions are correctly handled on update."""
50+ obj = Book .objects .create (name = "foobar" , data = {})
51+ obj .data = Value ({"$concat" : ["$name" , "-" , "$name" ]})
52+ obj .save ()
53+ obj .refresh_from_db ()
54+ self .assertEqual (obj .data , {"$concat" : ["$name" , "-" , "$name" ]})
55+
56+ def test_update_dict (self ):
57+ """MQL-like dict updates are correctly handled on update."""
58+ obj = Book .objects .create (name = "foobar" )
59+ obj .data = {"$concat" : ["$name" , "-" , "$name" ]}
60+ obj .save ()
61+ obj .refresh_from_db ()
62+ self .assertEqual (obj .data , {"$concat" : ["$name" , "-" , "$name" ]})
63+
64+ def test_update_tuple (self ):
65+ """MQL-like tuple updates are correctly handled on update."""
66+ obj = Book .objects .create (name = "foobar" )
67+ obj .data = ("$name" , "-" , "$name" )
68+ obj .save ()
69+ obj .refresh_from_db ()
70+ self .assertEqual (obj .data , ["$name" , "-" , "$name" ])
71+
72+ def test_update_tuple_value (self ):
73+ """MQL-like tuple Value() expressions are correctly handled on update."""
74+ obj = Book .objects .create (name = "foobar" )
75+ obj .data = Value (("$name" , "-" , "$name" ))
76+ obj .save ()
77+ obj .refresh_from_db ()
78+ self .assertEqual (obj .data , ["$name" , "-" , "$name" ])
79+
80+
1781class QueryDollarPrefixTests (MongoTestCaseMixin , TestCase ):
1882 def test_query_injection (self ):
1983 """$-prefixed Value() expressions are correctly handled on update."""
0 commit comments