tests.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from django.db.models import Q
  2. from django.test import TestCase
  3. from .models import Number
  4. class XorLookupsTests(TestCase):
  5. @classmethod
  6. def setUpTestData(cls):
  7. cls.numbers = [Number.objects.create(num=i) for i in range(10)]
  8. def test_filter(self):
  9. self.assertCountEqual(
  10. Number.objects.filter(num__lte=7) ^ Number.objects.filter(num__gte=3),
  11. self.numbers[:3] + self.numbers[8:],
  12. )
  13. self.assertCountEqual(
  14. Number.objects.filter(Q(num__lte=7) ^ Q(num__gte=3)),
  15. self.numbers[:3] + self.numbers[8:],
  16. )
  17. def test_filter_negated(self):
  18. self.assertCountEqual(
  19. Number.objects.filter(Q(num__lte=7) ^ ~Q(num__lt=3)),
  20. self.numbers[:3] + self.numbers[8:],
  21. )
  22. self.assertCountEqual(
  23. Number.objects.filter(~Q(num__gt=7) ^ ~Q(num__lt=3)),
  24. self.numbers[:3] + self.numbers[8:],
  25. )
  26. self.assertCountEqual(
  27. Number.objects.filter(Q(num__lte=7) ^ ~Q(num__lt=3) ^ Q(num__lte=1)),
  28. [self.numbers[2]] + self.numbers[8:],
  29. )
  30. self.assertCountEqual(
  31. Number.objects.filter(~(Q(num__lte=7) ^ ~Q(num__lt=3) ^ Q(num__lte=1))),
  32. self.numbers[:2] + self.numbers[3:8],
  33. )
  34. def test_exclude(self):
  35. self.assertCountEqual(
  36. Number.objects.exclude(Q(num__lte=7) ^ Q(num__gte=3)),
  37. self.numbers[3:8],
  38. )
  39. def test_stages(self):
  40. numbers = Number.objects.all()
  41. self.assertSequenceEqual(
  42. numbers.filter(num__gte=0) ^ numbers.filter(num__lte=11),
  43. [],
  44. )
  45. self.assertSequenceEqual(
  46. numbers.filter(num__gt=0) ^ numbers.filter(num__lt=11),
  47. [self.numbers[0]],
  48. )
  49. def test_pk_q(self):
  50. self.assertCountEqual(
  51. Number.objects.filter(Q(pk=self.numbers[0].pk) ^ Q(pk=self.numbers[1].pk)),
  52. self.numbers[:2],
  53. )
  54. def test_empty_in(self):
  55. self.assertCountEqual(
  56. Number.objects.filter(Q(pk__in=[]) ^ Q(num__gte=5)),
  57. self.numbers[5:],
  58. )