Skip to content

Commit 8095a54

Browse files
committed
update subquery test to test on all fields
1 parent fe23a60 commit 8095a54

File tree

1 file changed

+63
-58
lines changed

1 file changed

+63
-58
lines changed

django_enum/tests/tests.py

Lines changed: 63 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2754,68 +2754,73 @@ def update_empties(obj):
27542754

27552755
def test_subquery(self):
27562756

2757-
EnumClass = self.MODEL_CLASS._meta.get_field('pos').enum
2758-
self.MODEL_CLASS.objects.all().delete()
2757+
for field in [
2758+
field for field in self.MODEL_CLASS._meta.fields
2759+
if isinstance(field, FlagField)
2760+
and not isinstance(field, ExtraBigIntegerFlagField)
2761+
]:
2762+
EnumClass = field.enum
2763+
self.MODEL_CLASS.objects.all().delete()
27592764

2760-
objects = [
2761-
self.MODEL_CLASS.objects.create(
2762-
pos=EnumClass.TWO | EnumClass.FOUR | EnumClass.FIVE
2763-
),
2764-
self.MODEL_CLASS.objects.create(
2765-
pos=EnumClass.ONE | EnumClass.THREE
2766-
),
2767-
self.MODEL_CLASS.objects.create(
2768-
pos=EnumClass.TWO | EnumClass.FOUR
2769-
),
2770-
self.MODEL_CLASS.objects.create(
2771-
pos=EnumClass.FIVE
2772-
),
2773-
self.MODEL_CLASS.objects.create(
2774-
pos=(
2775-
EnumClass.ONE | EnumClass.TWO | EnumClass.THREE |
2776-
EnumClass.FOUR | EnumClass.FIVE
2765+
objects = [
2766+
self.MODEL_CLASS.objects.create(
2767+
**{field.name: EnumClass.TWO | EnumClass.FOUR | EnumClass.FIVE}
2768+
),
2769+
self.MODEL_CLASS.objects.create(
2770+
**{field.name: EnumClass.ONE | EnumClass.THREE}
2771+
),
2772+
self.MODEL_CLASS.objects.create(
2773+
**{field.name: EnumClass.TWO | EnumClass.FOUR}
2774+
),
2775+
self.MODEL_CLASS.objects.create(**{field.name: EnumClass.FIVE}),
2776+
self.MODEL_CLASS.objects.create(
2777+
**{
2778+
field.name: (
2779+
EnumClass.ONE | EnumClass.TWO | EnumClass.THREE |
2780+
EnumClass.FOUR | EnumClass.FIVE
2781+
)
2782+
}
27772783
)
2778-
)
2779-
]
2780-
2781-
exact_matches = self.MODEL_CLASS.objects.filter(
2782-
pos__exact=OuterRef("pos")
2783-
).order_by().annotate(
2784-
count=Func(F('id'), function='Count')
2785-
).values('count')
2786-
2787-
any_matches = self.MODEL_CLASS.objects.filter(
2788-
pos__has_any=OuterRef("pos")
2789-
).order_by().annotate(
2790-
count=Func(F('id'), function='Count')
2791-
).values('count')
2792-
2793-
all_matches = self.MODEL_CLASS.objects.filter(
2794-
pos__has_all=OuterRef("pos")
2795-
).order_by().annotate(
2796-
count=Func(F('id'), function='Count')
2797-
).values('count')
2798-
2799-
for obj in self.MODEL_CLASS.objects.annotate(
2800-
exact_matches=Subquery(exact_matches)
2801-
):
2802-
self.assertEqual(obj.exact_matches, 1)
2784+
]
2785+
2786+
exact_matches = self.MODEL_CLASS.objects.filter(
2787+
**{f'{field.name}__exact': OuterRef(field.name)}
2788+
).order_by().annotate(
2789+
count=Func(F('id'), function='Count')
2790+
).values('count')
2791+
2792+
any_matches = self.MODEL_CLASS.objects.filter(
2793+
**{f'{field.name}__has_any': OuterRef(field.name)}
2794+
).order_by().annotate(
2795+
count=Func(F('id'), function='Count')
2796+
).values('count')
2797+
2798+
all_matches = self.MODEL_CLASS.objects.filter(
2799+
**{f'{field.name}__has_all': OuterRef(field.name)}
2800+
).order_by().annotate(
2801+
count=Func(F('id'), function='Count')
2802+
).values('count')
2803+
2804+
for obj in self.MODEL_CLASS.objects.annotate(
2805+
exact_matches=Subquery(exact_matches)
2806+
):
2807+
self.assertEqual(obj.exact_matches, 1)
28032808

2804-
for expected, obj in zip(
2805-
[2, 2, 3, 3, 1],
2806-
self.MODEL_CLASS.objects.annotate(
2807-
all_matches=Subquery(all_matches)
2808-
).order_by('id')
2809-
):
2810-
self.assertEqual(obj.all_matches, expected)
2809+
for expected, obj in zip(
2810+
[2, 2, 3, 3, 1],
2811+
self.MODEL_CLASS.objects.annotate(
2812+
all_matches=Subquery(all_matches)
2813+
).order_by('id')
2814+
):
2815+
self.assertEqual(obj.all_matches, expected)
28112816

2812-
for expected, obj in zip(
2813-
[4, 2, 3, 3, 5],
2814-
self.MODEL_CLASS.objects.annotate(
2815-
any_matches=Subquery(any_matches)
2816-
).order_by('id')
2817-
):
2818-
self.assertEqual(obj.any_matches, expected)
2817+
for expected, obj in zip(
2818+
[4, 2, 3, 3, 5],
2819+
self.MODEL_CLASS.objects.annotate(
2820+
any_matches=Subquery(any_matches)
2821+
).order_by('id')
2822+
):
2823+
self.assertEqual(obj.any_matches, expected)
28192824

28202825
def test_unsupported_flags(self):
28212826
obj = self.MODEL_CLASS.objects.create()

0 commit comments

Comments
 (0)