mirror of
				https://github.com/django/django.git
				synced 2025-11-04 13:39:16 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from django.db import connection
 | 
						|
from django.test import modify_settings
 | 
						|
 | 
						|
from . import PostgreSQLTestCase
 | 
						|
from .models import CharFieldModel, TextFieldModel
 | 
						|
 | 
						|
 | 
						|
@modify_settings(INSTALLED_APPS={'append': 'django.contrib.postgres'})
 | 
						|
class UnaccentTest(PostgreSQLTestCase):
 | 
						|
 | 
						|
    Model = CharFieldModel
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def setUpTestData(cls):
 | 
						|
        cls.Model.objects.bulk_create([
 | 
						|
            cls.Model(field="àéÖ"),
 | 
						|
            cls.Model(field="aeO"),
 | 
						|
            cls.Model(field="aeo"),
 | 
						|
        ])
 | 
						|
 | 
						|
    def test_unaccent(self):
 | 
						|
        self.assertQuerysetEqual(
 | 
						|
            self.Model.objects.filter(field__unaccent="aeO"),
 | 
						|
            ["àéÖ", "aeO"],
 | 
						|
            transform=lambda instance: instance.field,
 | 
						|
            ordered=False
 | 
						|
        )
 | 
						|
 | 
						|
    def test_unaccent_chained(self):
 | 
						|
        """
 | 
						|
        Unaccent can be used chained with a lookup (which should be the case
 | 
						|
        since unaccent implements the Transform API)
 | 
						|
        """
 | 
						|
        self.assertQuerysetEqual(
 | 
						|
            self.Model.objects.filter(field__unaccent__iexact="aeO"),
 | 
						|
            ["àéÖ", "aeO", "aeo"],
 | 
						|
            transform=lambda instance: instance.field,
 | 
						|
            ordered=False
 | 
						|
        )
 | 
						|
        self.assertQuerysetEqual(
 | 
						|
            self.Model.objects.filter(field__unaccent__endswith="éÖ"),
 | 
						|
            ["àéÖ", "aeO"],
 | 
						|
            transform=lambda instance: instance.field,
 | 
						|
            ordered=False
 | 
						|
        )
 | 
						|
 | 
						|
    def test_unaccent_with_conforming_strings_off(self):
 | 
						|
        """SQL is valid when standard_conforming_strings is off."""
 | 
						|
        with connection.cursor() as cursor:
 | 
						|
            cursor.execute('SHOW standard_conforming_strings')
 | 
						|
            disable_conforming_strings = cursor.fetchall()[0][0] == 'on'
 | 
						|
            if disable_conforming_strings:
 | 
						|
                cursor.execute('SET standard_conforming_strings TO off')
 | 
						|
            try:
 | 
						|
                self.assertQuerysetEqual(
 | 
						|
                    self.Model.objects.filter(field__unaccent__endswith='éÖ'),
 | 
						|
                    ['àéÖ', 'aeO'],
 | 
						|
                    transform=lambda instance: instance.field,
 | 
						|
                    ordered=False,
 | 
						|
                )
 | 
						|
            finally:
 | 
						|
                if disable_conforming_strings:
 | 
						|
                    cursor.execute('SET standard_conforming_strings TO on')
 | 
						|
 | 
						|
    def test_unaccent_accentuated_needle(self):
 | 
						|
        self.assertQuerysetEqual(
 | 
						|
            self.Model.objects.filter(field__unaccent="aéÖ"),
 | 
						|
            ["àéÖ", "aeO"],
 | 
						|
            transform=lambda instance: instance.field,
 | 
						|
            ordered=False
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
class UnaccentTextFieldTest(UnaccentTest):
 | 
						|
    """
 | 
						|
    TextField should have the exact same behavior as CharField
 | 
						|
    regarding unaccent lookups.
 | 
						|
    """
 | 
						|
    Model = TextFieldModel
 |