tests.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from django.db.models import CharField
  2. from django.db.models import Value as V
  3. from django.db.models.functions import Coalesce, Length, Upper
  4. from django.test import TestCase
  5. from django.test.utils import register_lookup
  6. from .models import Author
  7. class UpperBilateral(Upper):
  8. bilateral = True
  9. class FunctionTests(TestCase):
  10. def test_nested_function_ordering(self):
  11. Author.objects.create(name="John Smith")
  12. Author.objects.create(name="Rhonda Simpson", alias="ronny")
  13. authors = Author.objects.order_by(Length(Coalesce("alias", "name")))
  14. self.assertQuerySetEqual(
  15. authors,
  16. [
  17. "Rhonda Simpson",
  18. "John Smith",
  19. ],
  20. lambda a: a.name,
  21. )
  22. authors = Author.objects.order_by(Length(Coalesce("alias", "name")).desc())
  23. self.assertQuerySetEqual(
  24. authors,
  25. [
  26. "John Smith",
  27. "Rhonda Simpson",
  28. ],
  29. lambda a: a.name,
  30. )
  31. def test_func_transform_bilateral(self):
  32. with register_lookup(CharField, UpperBilateral):
  33. Author.objects.create(name="John Smith", alias="smithj")
  34. Author.objects.create(name="Rhonda")
  35. authors = Author.objects.filter(name__upper__exact="john smith")
  36. self.assertQuerySetEqual(
  37. authors.order_by("name"),
  38. [
  39. "John Smith",
  40. ],
  41. lambda a: a.name,
  42. )
  43. def test_func_transform_bilateral_multivalue(self):
  44. with register_lookup(CharField, UpperBilateral):
  45. Author.objects.create(name="John Smith", alias="smithj")
  46. Author.objects.create(name="Rhonda")
  47. authors = Author.objects.filter(name__upper__in=["john smith", "rhonda"])
  48. self.assertQuerySetEqual(
  49. authors.order_by("name"),
  50. [
  51. "John Smith",
  52. "Rhonda",
  53. ],
  54. lambda a: a.name,
  55. )
  56. def test_function_as_filter(self):
  57. Author.objects.create(name="John Smith", alias="SMITHJ")
  58. Author.objects.create(name="Rhonda")
  59. self.assertQuerySetEqual(
  60. Author.objects.filter(alias=Upper(V("smithj"))),
  61. ["John Smith"],
  62. lambda x: x.name,
  63. )
  64. self.assertQuerySetEqual(
  65. Author.objects.exclude(alias=Upper(V("smithj"))),
  66. ["Rhonda"],
  67. lambda x: x.name,
  68. )