11import datetime
2- import json
32
4- from bson import ObjectId , json_util
3+ from bson import ObjectId
54from django .test import TestCase
65
76from django_mongodb_extensions .mql_panel .forms import MQLQueryForm
@@ -12,13 +11,11 @@ def setUp(self):
1211 self .form = MQLQueryForm ()
1312
1413 def test_empty_documents (self ):
15- """Empty document list returns empty rows and headers."""
1614 rows , headers = self .form .convert_documents_to_table ([])
1715 self .assertEqual (rows , [])
1816 self .assertEqual (headers , [])
1917
2018 def test_simple_fields (self ):
21- """Primitive field values like in model query output."""
2219 cases = [
2320 ("username" , {"value" : "username" , "is_json" : False }),
2421 (42 , {"value" : "42" , "is_json" : False }),
@@ -30,20 +27,16 @@ def test_simple_fields(self):
3027 self .assertEqual (self .form ._format_cell_value (input_value ), expected )
3128
3229 def test_objectid (self ):
33- """MongoDB ObjectId from a document."""
34- oid = "69cd52da72ad0703d3dfef51"
30+ oid = ObjectId ("69cd52da72ad0703d3dfef51" )
3531 result = self .form ._format_cell_value (oid )
36- # ObjectIds serialize to {"$oid": "<id>"} which is single-key
3732 self .assertIs (result ["is_json" ], False )
38- self .assertEqual (result ["value" ], oid )
33+ self .assertEqual (result ["value" ], "69cd52da72ad0703d3dfef51" )
3934
4035 def test_datetime (self ):
41- """Datetime values as they might appear in a MongoDB doc."""
4236 dt = datetime .datetime (2024 , 1 , 1 , 12 , 30 )
4337 result = self .form ._format_cell_value (dt )
44- # Datetimes serialize to {"$date": timestamp_ms} which is single-key dict
4538 self .assertIs (result ["is_json" ], False )
46- self .assertEqual (result ["value" ], str ( json . loads ( json_util . dumps ( dt ))[ "$date" ]) )
39+ self .assertEqual (result ["value" ], "2024-01-01T12:30:00Z" )
4740
4841 def test_embedded_document (self ):
4942 embedded_doc = {
@@ -69,6 +62,71 @@ def test_list_field(self):
6962 value_map = {item ["key" ]: item ["value" ] for item in result ["value" ]}
7063 self .assertEqual (value_map [0 ], "tag1" )
7164 self .assertEqual (value_map [1 ], "tag2" )
72- self .assertEqual (value_map [2 ], "69cd51ddf1a98c14c906c51e" ) # ObjectId string
65+ self .assertEqual (value_map [2 ], "69cd51ddf1a98c14c906c51e" )
7366 for item in result ["value" ]:
7467 self .assertIs (item ["is_json" ], False )
68+
69+ def test_list_of_embedded_dicts (self ):
70+ tags = [
71+ {"name" : "cool_tag" , "number" : 42 },
72+ {"name" : "other_tag" , "number" : 7 },
73+ ]
74+ result = self .form ._format_cell_value (tags )
75+ self .assertEqual (result ["type" ], "list" )
76+ self .assertIs (result ["is_json" ], False )
77+ for item in result ["value" ]:
78+ self .assertEqual (item ["type" ], "dict" )
79+ self .assertIs (item ["is_json" ], False )
80+ inner_map = {inner ["key" ]: inner ["value" ] for inner in item ["value" ]}
81+ self .assertIn ("name" , inner_map )
82+ self .assertIn ("number" , inner_map )
83+
84+ def test_dict_with_nested_list_of_dicts (self ):
85+ address = {
86+ "street" : "123 Main St" ,
87+ "tags" : [
88+ {"name" : "cool_tag" , "number" : 42 },
89+ ],
90+ }
91+ result = self .form ._format_cell_value (address )
92+ self .assertEqual (result ["type" ], "dict" )
93+ self .assertIs (result ["is_json" ], False )
94+ items_by_key = {item ["key" ]: item for item in result ["value" ]}
95+ self .assertEqual (items_by_key ["street" ]["value" ], "123 Main St" )
96+ tags_item = items_by_key ["tags" ]
97+ self .assertEqual (tags_item ["type" ], "list" )
98+ self .assertIs (tags_item ["is_json" ], False )
99+ first_tag = tags_item ["value" ][0 ]
100+ self .assertEqual (first_tag ["type" ], "dict" )
101+ inner_map = {inner ["key" ]: inner ["value" ] for inner in first_tag ["value" ]}
102+ self .assertEqual (inner_map ["name" ], "cool_tag" )
103+ self .assertEqual (inner_map ["number" ], "42" )
104+
105+ def test_deeply_nested_embedded_document (self ):
106+ address = {
107+ "street" : "123 Main St" ,
108+ "tags" : [
109+ {
110+ "name" : "cool_tag" ,
111+ "number" : 42 ,
112+ "person" : {"name" : "Alice" },
113+ }
114+ ],
115+ }
116+ result = self .form ._format_cell_value (address )
117+ self .assertEqual (result ["type" ], "dict" )
118+ address_by_key = {item ["key" ]: item for item in result ["value" ]}
119+ tags_item = address_by_key ["tags" ]
120+ self .assertEqual (tags_item ["type" ], "list" )
121+ self .assertIs (tags_item ["is_json" ], False )
122+ first_tag = tags_item ["value" ][0 ]
123+ self .assertEqual (first_tag ["type" ], "dict" )
124+ self .assertIs (first_tag ["is_json" ], False )
125+ tag_by_key = {inner ["key" ]: inner for inner in first_tag ["value" ]}
126+ self .assertEqual (tag_by_key ["name" ]["value" ], "cool_tag" )
127+ self .assertEqual (tag_by_key ["number" ]["value" ], "42" )
128+ person_item = tag_by_key ["person" ]
129+ self .assertEqual (person_item ["type" ], "dict" )
130+ self .assertIs (person_item ["is_json" ], False )
131+ person_map = {inner ["key" ]: inner ["value" ] for inner in person_item ["value" ]}
132+ self .assertEqual (person_map ["name" ], "Alice" )
0 commit comments