Skip to content

Commit 0663cdd

Browse files
committed
Add group by and order tests.
1 parent 8a93a65 commit 0663cdd

File tree

1 file changed

+48
-1
lines changed

1 file changed

+48
-1
lines changed

tests/model_fields_/test_embedded_model.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
import operator
2+
from datetime import timedelta
13
from decimal import Decimal
24

35
from django.core.exceptions import FieldDoesNotExist, ValidationError
4-
6+
from django.db.models import ExpressionWrapper, F, IntegerField, Max, Model, Sum
57
from django.test import SimpleTestCase, TestCase
68

79
from django_mongodb.fields import EmbeddedModelField
@@ -183,3 +185,48 @@ def test_embedded_with_json_field(self):
183185
),
184186
models[1:3],
185187
)
188+
189+
@staticmethod
190+
def _truncate_ms(time):
191+
return time - timedelta(microseconds=time.microsecond)
192+
193+
################
194+
def test_ordering_by_embedded_field(self):
195+
query = (
196+
EmbeddedModelFieldModel.objects.filter(simple__someint__gt=3)
197+
.order_by("-simple__someint")
198+
.values("pk")
199+
)
200+
expected = [{"pk": e.pk} for e in list(reversed(self.objs[4:]))]
201+
self.assertSequenceEqual(query, expected)
202+
203+
def test_ordering_grouping_by_embedded_field(self):
204+
query = (
205+
EmbeddedModelFieldModel.objects.annotate(
206+
group=ExpressionWrapper(F("simple__someint") + 5, output_field=IntegerField())
207+
)
208+
.values("group")
209+
.annotate(max_pk=Max("simple__auto_now"))
210+
.order_by("simple__someint")
211+
)
212+
query = [{**e, "max_pk": self._truncate_ms(e["max_pk"])} for e in query]
213+
expected = [
214+
EmbeddedModelFieldModel.objects.create(simple=EmbeddedModel(someint=x))
215+
for x in range(6)
216+
]
217+
self.assertSequenceEqual(
218+
query,
219+
[
220+
{"group": e.simple.someint + 5, "max_pk": self._truncate_ms(e.simple.auto_now)}
221+
for e in expected
222+
],
223+
)
224+
225+
def test_ordering_grouping_by_sum(self):
226+
[EmbeddedModelFieldModel.objects.create(simple=EmbeddedModel(someint=x)) for x in range(6)]
227+
qs = (
228+
EmbeddedModelFieldModel.objects.values("simple__someint")
229+
.annotate(sum=Sum("simple__someint"))
230+
.order_by("sum")
231+
)
232+
self.assertQuerySetEqual(qs, [0, 2, 4, 6, 8, 10], operator.itemgetter("sum"))

0 commit comments

Comments
 (0)