test_q.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. from django.db.models import Exists, F, OuterRef, Q
  2. from django.test import SimpleTestCase
  3. from .models import Tag
  4. class QTests(SimpleTestCase):
  5. def test_combine_and_empty(self):
  6. q = Q(x=1)
  7. self.assertEqual(q & Q(), q)
  8. self.assertEqual(Q() & q, q)
  9. q = Q(x__in={}.keys())
  10. self.assertEqual(q & Q(), q)
  11. self.assertEqual(Q() & q, q)
  12. def test_combine_and_both_empty(self):
  13. self.assertEqual(Q() & Q(), Q())
  14. def test_combine_or_empty(self):
  15. q = Q(x=1)
  16. self.assertEqual(q | Q(), q)
  17. self.assertEqual(Q() | q, q)
  18. q = Q(x__in={}.keys())
  19. self.assertEqual(q | Q(), q)
  20. self.assertEqual(Q() | q, q)
  21. def test_combine_or_both_empty(self):
  22. self.assertEqual(Q() | Q(), Q())
  23. def test_combine_not_q_object(self):
  24. obj = object()
  25. q = Q(x=1)
  26. with self.assertRaisesMessage(TypeError, str(obj)):
  27. q | obj
  28. with self.assertRaisesMessage(TypeError, str(obj)):
  29. q & obj
  30. def test_deconstruct(self):
  31. q = Q(price__gt=F('discounted_price'))
  32. path, args, kwargs = q.deconstruct()
  33. self.assertEqual(path, 'django.db.models.Q')
  34. self.assertEqual(args, (('price__gt', F('discounted_price')),))
  35. self.assertEqual(kwargs, {})
  36. def test_deconstruct_negated(self):
  37. q = ~Q(price__gt=F('discounted_price'))
  38. path, args, kwargs = q.deconstruct()
  39. self.assertEqual(args, (('price__gt', F('discounted_price')),))
  40. self.assertEqual(kwargs, {'_negated': True})
  41. def test_deconstruct_or(self):
  42. q1 = Q(price__gt=F('discounted_price'))
  43. q2 = Q(price=F('discounted_price'))
  44. q = q1 | q2
  45. path, args, kwargs = q.deconstruct()
  46. self.assertEqual(args, (
  47. ('price__gt', F('discounted_price')),
  48. ('price', F('discounted_price')),
  49. ))
  50. self.assertEqual(kwargs, {'_connector': 'OR'})
  51. def test_deconstruct_and(self):
  52. q1 = Q(price__gt=F('discounted_price'))
  53. q2 = Q(price=F('discounted_price'))
  54. q = q1 & q2
  55. path, args, kwargs = q.deconstruct()
  56. self.assertEqual(args, (
  57. ('price__gt', F('discounted_price')),
  58. ('price', F('discounted_price')),
  59. ))
  60. self.assertEqual(kwargs, {})
  61. def test_deconstruct_multiple_kwargs(self):
  62. q = Q(price__gt=F('discounted_price'), price=F('discounted_price'))
  63. path, args, kwargs = q.deconstruct()
  64. self.assertEqual(args, (
  65. ('price', F('discounted_price')),
  66. ('price__gt', F('discounted_price')),
  67. ))
  68. self.assertEqual(kwargs, {})
  69. def test_deconstruct_nested(self):
  70. q = Q(Q(price__gt=F('discounted_price')))
  71. path, args, kwargs = q.deconstruct()
  72. self.assertEqual(args, (Q(price__gt=F('discounted_price')),))
  73. self.assertEqual(kwargs, {})
  74. def test_deconstruct_boolean_expression(self):
  75. tagged = Tag.objects.filter(category=OuterRef('pk'))
  76. q = Q(Exists(tagged))
  77. _, args, kwargs = q.deconstruct()
  78. self.assertEqual(args, (Exists(tagged),))
  79. self.assertEqual(kwargs, {})
  80. def test_reconstruct(self):
  81. q = Q(price__gt=F('discounted_price'))
  82. path, args, kwargs = q.deconstruct()
  83. self.assertEqual(Q(*args, **kwargs), q)
  84. def test_reconstruct_negated(self):
  85. q = ~Q(price__gt=F('discounted_price'))
  86. path, args, kwargs = q.deconstruct()
  87. self.assertEqual(Q(*args, **kwargs), q)
  88. def test_reconstruct_or(self):
  89. q1 = Q(price__gt=F('discounted_price'))
  90. q2 = Q(price=F('discounted_price'))
  91. q = q1 | q2
  92. path, args, kwargs = q.deconstruct()
  93. self.assertEqual(Q(*args, **kwargs), q)
  94. def test_reconstruct_and(self):
  95. q1 = Q(price__gt=F('discounted_price'))
  96. q2 = Q(price=F('discounted_price'))
  97. q = q1 & q2
  98. path, args, kwargs = q.deconstruct()
  99. self.assertEqual(Q(*args, **kwargs), q)