test_unaccent.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. import unittest
  4. from django.db import connection
  5. from django.test import TestCase, modify_settings
  6. from .models import CharFieldModel, TextFieldModel
  7. @unittest.skipUnless(connection.vendor == 'postgresql', 'PostgreSQL required')
  8. @modify_settings(INSTALLED_APPS={'append': 'django.contrib.postgres'})
  9. class UnaccentTest(TestCase):
  10. Model = CharFieldModel
  11. def setUp(self):
  12. self.Model.objects.bulk_create([
  13. self.Model(field="àéÖ"),
  14. self.Model(field="aeO"),
  15. self.Model(field="aeo"),
  16. ])
  17. def test_unaccent(self):
  18. self.assertQuerysetEqual(
  19. self.Model.objects.filter(field__unaccent="aeO"),
  20. ["àéÖ", "aeO"],
  21. transform=lambda instance: instance.field,
  22. ordered=False
  23. )
  24. def test_unaccent_chained(self):
  25. """
  26. Check that unaccent can be used chained with a lookup (which should be
  27. the case since unaccent implements the Transform API)
  28. """
  29. self.assertQuerysetEqual(
  30. self.Model.objects.filter(field__unaccent__iexact="aeO"),
  31. ["àéÖ", "aeO", "aeo"],
  32. transform=lambda instance: instance.field,
  33. ordered=False
  34. )
  35. self.assertQuerysetEqual(
  36. self.Model.objects.filter(field__unaccent__endswith="éÖ"),
  37. ["àéÖ", "aeO"],
  38. transform=lambda instance: instance.field,
  39. ordered=False
  40. )
  41. def test_unaccent_accentuated_needle(self):
  42. self.assertQuerysetEqual(
  43. self.Model.objects.filter(field__unaccent="aéÖ"),
  44. ["àéÖ", "aeO"],
  45. transform=lambda instance: instance.field,
  46. ordered=False
  47. )
  48. class UnaccentTextFieldTest(UnaccentTest):
  49. """
  50. TextField should have the exact same behavior as CharField
  51. regarding unaccent lookups.
  52. """
  53. Model = TextFieldModel