1. from django.db import connection
    
  2. from django.test import modify_settings
    
  3. 
    
  4. from . import PostgreSQLTestCase
    
  5. from .models import CharFieldModel, TextFieldModel
    
  6. 
    
  7. 
    
  8. @modify_settings(INSTALLED_APPS={"append": "django.contrib.postgres"})
    
  9. class UnaccentTest(PostgreSQLTestCase):
    
  10.     Model = CharFieldModel
    
  11. 
    
  12.     @classmethod
    
  13.     def setUpTestData(cls):
    
  14.         cls.Model.objects.bulk_create(
    
  15.             [
    
  16.                 cls.Model(field="àéÖ"),
    
  17.                 cls.Model(field="aeO"),
    
  18.                 cls.Model(field="aeo"),
    
  19.             ]
    
  20.         )
    
  21. 
    
  22.     def test_unaccent(self):
    
  23.         self.assertQuerysetEqual(
    
  24.             self.Model.objects.filter(field__unaccent="aeO"),
    
  25.             ["àéÖ", "aeO"],
    
  26.             transform=lambda instance: instance.field,
    
  27.             ordered=False,
    
  28.         )
    
  29. 
    
  30.     def test_unaccent_chained(self):
    
  31.         """
    
  32.         Unaccent can be used chained with a lookup (which should be the case
    
  33.         since unaccent implements the Transform API)
    
  34.         """
    
  35.         self.assertQuerysetEqual(
    
  36.             self.Model.objects.filter(field__unaccent__iexact="aeO"),
    
  37.             ["àéÖ", "aeO", "aeo"],
    
  38.             transform=lambda instance: instance.field,
    
  39.             ordered=False,
    
  40.         )
    
  41.         self.assertQuerysetEqual(
    
  42.             self.Model.objects.filter(field__unaccent__endswith="éÖ"),
    
  43.             ["àéÖ", "aeO"],
    
  44.             transform=lambda instance: instance.field,
    
  45.             ordered=False,
    
  46.         )
    
  47. 
    
  48.     def test_unaccent_with_conforming_strings_off(self):
    
  49.         """SQL is valid when standard_conforming_strings is off."""
    
  50.         with connection.cursor() as cursor:
    
  51.             cursor.execute("SHOW standard_conforming_strings")
    
  52.             disable_conforming_strings = cursor.fetchall()[0][0] == "on"
    
  53.             if disable_conforming_strings:
    
  54.                 cursor.execute("SET standard_conforming_strings TO off")
    
  55.             try:
    
  56.                 self.assertQuerysetEqual(
    
  57.                     self.Model.objects.filter(field__unaccent__endswith="éÖ"),
    
  58.                     ["àéÖ", "aeO"],
    
  59.                     transform=lambda instance: instance.field,
    
  60.                     ordered=False,
    
  61.                 )
    
  62.             finally:
    
  63.                 if disable_conforming_strings:
    
  64.                     cursor.execute("SET standard_conforming_strings TO on")
    
  65. 
    
  66.     def test_unaccent_accentuated_needle(self):
    
  67.         self.assertQuerysetEqual(
    
  68.             self.Model.objects.filter(field__unaccent="aéÖ"),
    
  69.             ["àéÖ", "aeO"],
    
  70.             transform=lambda instance: instance.field,
    
  71.             ordered=False,
    
  72.         )
    
  73. 
    
  74. 
    
  75. class UnaccentTextFieldTest(UnaccentTest):
    
  76.     """
    
  77.     TextField should have the exact same behavior as CharField
    
  78.     regarding unaccent lookups.
    
  79.     """
    
  80. 
    
  81.     Model = TextFieldModel