|
1 | 1 | import datetime |
2 | | -import json |
3 | 2 |
|
4 | | -from bson import ObjectId, json_util |
| 3 | +from bson import ObjectId |
5 | 4 | from django.test import TestCase |
6 | 5 |
|
7 | 6 | from django_mongodb_extensions.mql_panel.forms import MQLQueryForm |
@@ -30,20 +29,18 @@ def test_simple_fields(self): |
30 | 29 | self.assertEqual(self.form._format_cell_value(input_value), expected) |
31 | 30 |
|
32 | 31 | def test_objectid(self): |
33 | | - """MongoDB ObjectId from a document.""" |
34 | | - oid = "69cd52da72ad0703d3dfef51" |
| 32 | + oid = ObjectId("69cd52da72ad0703d3dfef51") |
35 | 33 | result = self.form._format_cell_value(oid) |
36 | | - # ObjectIds serialize to {"$oid": "<id>"} which is single-key |
37 | 34 | self.assertIs(result["is_json"], False) |
38 | | - self.assertEqual(result["value"], oid) |
| 35 | + self.assertEqual(result["value"], "69cd52da72ad0703d3dfef51") |
39 | 36 |
|
40 | 37 | def test_datetime(self): |
41 | 38 | """Datetime values as they might appear in a MongoDB doc.""" |
42 | 39 | dt = datetime.datetime(2024, 1, 1, 12, 30) |
43 | 40 | result = self.form._format_cell_value(dt) |
44 | 41 | # Datetimes serialize to {"$date": timestamp_ms} which is single-key dict |
45 | 42 | self.assertIs(result["is_json"], False) |
46 | | - self.assertEqual(result["value"], str(json.loads(json_util.dumps(dt))["$date"])) |
| 43 | + self.assertEqual(result["value"], "2024-01-01T12:30:00Z") |
47 | 44 |
|
48 | 45 | def test_embedded_document(self): |
49 | 46 | embedded_doc = { |
@@ -72,3 +69,68 @@ def test_list_field(self): |
72 | 69 | self.assertEqual(value_map[2], "69cd51ddf1a98c14c906c51e") # ObjectId string |
73 | 70 | for item in result["value"]: |
74 | 71 | self.assertIs(item["is_json"], False) |
| 72 | + |
| 73 | + def test_list_of_embedded_dicts(self): |
| 74 | + tags = [ |
| 75 | + {"name": "cool_tag", "number": 42}, |
| 76 | + {"name": "other_tag", "number": 7}, |
| 77 | + ] |
| 78 | + result = self.form._format_cell_value(tags) |
| 79 | + self.assertEqual(result["type"], "list") |
| 80 | + self.assertIs(result["is_json"], False) |
| 81 | + for item in result["value"]: |
| 82 | + self.assertEqual(item["type"], "dict") |
| 83 | + self.assertIs(item["is_json"], False) |
| 84 | + inner_map = {inner["key"]: inner["value"] for inner in item["value"]} |
| 85 | + self.assertIn("name", inner_map) |
| 86 | + self.assertIn("number", inner_map) |
| 87 | + |
| 88 | + def test_dict_with_nested_list_of_dicts(self): |
| 89 | + address = { |
| 90 | + "street": "123 Main St", |
| 91 | + "tags": [ |
| 92 | + {"name": "cool_tag", "number": 42}, |
| 93 | + ], |
| 94 | + } |
| 95 | + result = self.form._format_cell_value(address) |
| 96 | + self.assertEqual(result["type"], "dict") |
| 97 | + self.assertIs(result["is_json"], False) |
| 98 | + items_by_key = {item["key"]: item for item in result["value"]} |
| 99 | + self.assertEqual(items_by_key["street"]["value"], "123 Main St") |
| 100 | + tags_item = items_by_key["tags"] |
| 101 | + self.assertEqual(tags_item["type"], "list") |
| 102 | + self.assertIs(tags_item["is_json"], False) |
| 103 | + first_tag = tags_item["value"][0] |
| 104 | + self.assertEqual(first_tag["type"], "dict") |
| 105 | + inner_map = {inner["key"]: inner["value"] for inner in first_tag["value"]} |
| 106 | + self.assertEqual(inner_map["name"], "cool_tag") |
| 107 | + self.assertEqual(inner_map["number"], "42") |
| 108 | + |
| 109 | + def test_deeply_nested_embedded_document(self): |
| 110 | + address = { |
| 111 | + "street": "123 Main St", |
| 112 | + "tags": [ |
| 113 | + { |
| 114 | + "name": "cool_tag", |
| 115 | + "number": 42, |
| 116 | + "person": {"name": "Alice"}, |
| 117 | + } |
| 118 | + ], |
| 119 | + } |
| 120 | + result = self.form._format_cell_value(address) |
| 121 | + self.assertEqual(result["type"], "dict") |
| 122 | + address_by_key = {item["key"]: item for item in result["value"]} |
| 123 | + tags_item = address_by_key["tags"] |
| 124 | + self.assertEqual(tags_item["type"], "list") |
| 125 | + self.assertIs(tags_item["is_json"], False) |
| 126 | + first_tag = tags_item["value"][0] |
| 127 | + self.assertEqual(first_tag["type"], "dict") |
| 128 | + self.assertIs(first_tag["is_json"], False) |
| 129 | + tag_by_key = {inner["key"]: inner for inner in first_tag["value"]} |
| 130 | + self.assertEqual(tag_by_key["name"]["value"], "cool_tag") |
| 131 | + self.assertEqual(tag_by_key["number"]["value"], "42") |
| 132 | + person_item = tag_by_key["person"] |
| 133 | + self.assertEqual(person_item["type"], "dict") |
| 134 | + self.assertIs(person_item["is_json"], False) |
| 135 | + person_map = {inner["key"]: inner["value"] for inner in person_item["value"]} |
| 136 | + self.assertEqual(person_map["name"], "Alice") |
0 commit comments