123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- import unittest
- from django.db import NotSupportedError, connection
- from django.test import TestCase
- from .models import Contact, Customer
- class TupleLookupsTests(TestCase):
- @classmethod
- def setUpTestData(cls):
- super().setUpTestData()
- cls.customer_1 = Customer.objects.create(customer_id=1, company="a")
- cls.customer_2 = Customer.objects.create(customer_id=1, company="b")
- cls.customer_3 = Customer.objects.create(customer_id=2, company="c")
- cls.customer_4 = Customer.objects.create(customer_id=3, company="d")
- cls.customer_5 = Customer.objects.create(customer_id=1, company="e")
- cls.contact_1 = Contact.objects.create(customer=cls.customer_1)
- cls.contact_2 = Contact.objects.create(customer=cls.customer_1)
- cls.contact_3 = Contact.objects.create(customer=cls.customer_2)
- cls.contact_4 = Contact.objects.create(customer=cls.customer_3)
- cls.contact_5 = Contact.objects.create(customer=cls.customer_1)
- cls.contact_6 = Contact.objects.create(customer=cls.customer_5)
- def test_exact(self):
- test_cases = (
- (self.customer_1, (self.contact_1, self.contact_2, self.contact_5)),
- (self.customer_2, (self.contact_3,)),
- (self.customer_3, (self.contact_4,)),
- (self.customer_4, ()),
- (self.customer_5, (self.contact_6,)),
- )
- for customer, contacts in test_cases:
- with self.subTest(customer=customer, contacts=contacts):
- self.assertSequenceEqual(
- Contact.objects.filter(customer=customer).order_by("id"), contacts
- )
- def test_exact_subquery(self):
- with self.assertRaisesMessage(
- NotSupportedError, "'exact' doesn't support multi-column subqueries."
- ):
- subquery = Customer.objects.filter(id=self.customer_1.id)[:1]
- self.assertSequenceEqual(
- Contact.objects.filter(customer=subquery).order_by("id"), ()
- )
- def test_in(self):
- cust_1, cust_2, cust_3, cust_4, cust_5 = (
- self.customer_1,
- self.customer_2,
- self.customer_3,
- self.customer_4,
- self.customer_5,
- )
- c1, c2, c3, c4, c5, c6 = (
- self.contact_1,
- self.contact_2,
- self.contact_3,
- self.contact_4,
- self.contact_5,
- self.contact_6,
- )
- test_cases = (
- ((), ()),
- ((cust_1,), (c1, c2, c5)),
- ((cust_1, cust_2), (c1, c2, c3, c5)),
- ((cust_1, cust_2, cust_3), (c1, c2, c3, c4, c5)),
- ((cust_1, cust_2, cust_3, cust_4), (c1, c2, c3, c4, c5)),
- ((cust_1, cust_2, cust_3, cust_4, cust_5), (c1, c2, c3, c4, c5, c6)),
- )
- for contacts, customers in test_cases:
- with self.subTest(contacts=contacts, customers=customers):
- self.assertSequenceEqual(
- Contact.objects.filter(customer__in=contacts).order_by("id"),
- customers,
- )
- @unittest.skipIf(
- connection.vendor == "mysql",
- "MySQL doesn't support LIMIT & IN/ALL/ANY/SOME subquery",
- )
- def test_in_subquery(self):
- subquery = Customer.objects.filter(id=self.customer_1.id)[:1]
- self.assertSequenceEqual(
- Contact.objects.filter(customer__in=subquery).order_by("id"),
- (self.contact_1, self.contact_2, self.contact_5),
- )
- def test_lt(self):
- c1, c2, c3, c4, c5, c6 = (
- self.contact_1,
- self.contact_2,
- self.contact_3,
- self.contact_4,
- self.contact_5,
- self.contact_6,
- )
- test_cases = (
- (self.customer_1, ()),
- (self.customer_2, (c1, c2, c5)),
- (self.customer_5, (c1, c2, c3, c5)),
- (self.customer_3, (c1, c2, c3, c5, c6)),
- (self.customer_4, (c1, c2, c3, c4, c5, c6)),
- )
- for customer, contacts in test_cases:
- with self.subTest(customer=customer, contacts=contacts):
- self.assertSequenceEqual(
- Contact.objects.filter(customer__lt=customer).order_by("id"),
- contacts,
- )
- def test_lt_subquery(self):
- with self.assertRaisesMessage(
- NotSupportedError, "'lt' doesn't support multi-column subqueries."
- ):
- subquery = Customer.objects.filter(id=self.customer_1.id)[:1]
- self.assertSequenceEqual(
- Contact.objects.filter(customer__lt=subquery).order_by("id"), ()
- )
- def test_lte(self):
- c1, c2, c3, c4, c5, c6 = (
- self.contact_1,
- self.contact_2,
- self.contact_3,
- self.contact_4,
- self.contact_5,
- self.contact_6,
- )
- test_cases = (
- (self.customer_1, (c1, c2, c5)),
- (self.customer_2, (c1, c2, c3, c5)),
- (self.customer_5, (c1, c2, c3, c5, c6)),
- (self.customer_3, (c1, c2, c3, c4, c5, c6)),
- (self.customer_4, (c1, c2, c3, c4, c5, c6)),
- )
- for customer, contacts in test_cases:
- with self.subTest(customer=customer, contacts=contacts):
- self.assertSequenceEqual(
- Contact.objects.filter(customer__lte=customer).order_by("id"),
- contacts,
- )
- def test_lte_subquery(self):
- with self.assertRaisesMessage(
- NotSupportedError, "'lte' doesn't support multi-column subqueries."
- ):
- subquery = Customer.objects.filter(id=self.customer_1.id)[:1]
- self.assertSequenceEqual(
- Contact.objects.filter(customer__lte=subquery).order_by("id"), ()
- )
- def test_gt(self):
- test_cases = (
- (self.customer_1, (self.contact_3, self.contact_4, self.contact_6)),
- (self.customer_2, (self.contact_4, self.contact_6)),
- (self.customer_5, (self.contact_4,)),
- (self.customer_3, ()),
- (self.customer_4, ()),
- )
- for customer, contacts in test_cases:
- with self.subTest(customer=customer, contacts=contacts):
- self.assertSequenceEqual(
- Contact.objects.filter(customer__gt=customer).order_by("id"),
- contacts,
- )
- def test_gt_subquery(self):
- with self.assertRaisesMessage(
- NotSupportedError, "'gt' doesn't support multi-column subqueries."
- ):
- subquery = Customer.objects.filter(id=self.customer_1.id)[:1]
- self.assertSequenceEqual(
- Contact.objects.filter(customer__gt=subquery).order_by("id"), ()
- )
- def test_gte(self):
- c1, c2, c3, c4, c5, c6 = (
- self.contact_1,
- self.contact_2,
- self.contact_3,
- self.contact_4,
- self.contact_5,
- self.contact_6,
- )
- test_cases = (
- (self.customer_1, (c1, c2, c3, c4, c5, c6)),
- (self.customer_2, (c3, c4, c6)),
- (self.customer_5, (c4, c6)),
- (self.customer_3, (c4,)),
- (self.customer_4, ()),
- )
- for customer, contacts in test_cases:
- with self.subTest(customer=customer, contacts=contacts):
- self.assertSequenceEqual(
- Contact.objects.filter(customer__gte=customer).order_by("pk"),
- contacts,
- )
- def test_gte_subquery(self):
- with self.assertRaisesMessage(
- NotSupportedError, "'gte' doesn't support multi-column subqueries."
- ):
- subquery = Customer.objects.filter(id=self.customer_1.id)[:1]
- self.assertSequenceEqual(
- Contact.objects.filter(customer__gte=subquery).order_by("id"), ()
- )
- def test_isnull(self):
- with self.subTest("customer__isnull=True"):
- self.assertSequenceEqual(
- Contact.objects.filter(customer__isnull=True).order_by("id"),
- (),
- )
- with self.subTest("customer__isnull=False"):
- self.assertSequenceEqual(
- Contact.objects.filter(customer__isnull=False).order_by("id"),
- (
- self.contact_1,
- self.contact_2,
- self.contact_3,
- self.contact_4,
- self.contact_5,
- self.contact_6,
- ),
- )
- def test_isnull_subquery(self):
- with self.assertRaisesMessage(
- NotSupportedError, "'isnull' doesn't support multi-column subqueries."
- ):
- subquery = Customer.objects.filter(id=0)[:1]
- self.assertSequenceEqual(
- Contact.objects.filter(customer__isnull=subquery).order_by("id"), ()
- )
|