django/tests/db_functions/test_strindex.py

67 lines
2.5 KiB
Python
Raw Normal View History

from django.db.models import Value
from django.db.models.functions import StrIndex
from django.test import TestCase
from django.utils import timezone
from .models import Article, Author
class StrIndexTests(TestCase):
def test_annotate_charfield(self):
Author.objects.create(name='George. R. R. Martin')
Author.objects.create(name='J. R. R. Tolkien')
Author.objects.create(name='Terry Pratchett')
authors = Author.objects.annotate(fullstop=StrIndex('name', Value('R.')))
self.assertQuerysetEqual(authors.order_by('name'), [9, 4, 0], lambda a: a.fullstop)
def test_annotate_textfield(self):
Article.objects.create(
title='How to Django',
text='This is about How to Django.',
written=timezone.now(),
)
Article.objects.create(
title='How to Tango',
text="Won't find anything here.",
written=timezone.now(),
)
articles = Article.objects.annotate(title_pos=StrIndex('text', 'title'))
self.assertQuerysetEqual(articles.order_by('title'), [15, 0], lambda a: a.title_pos)
def test_order_by(self):
Author.objects.create(name='Terry Pratchett')
Author.objects.create(name='J. R. R. Tolkien')
Author.objects.create(name='George. R. R. Martin')
self.assertQuerysetEqual(
Author.objects.order_by(StrIndex('name', Value('R.')).asc()), [
'Terry Pratchett',
'J. R. R. Tolkien',
'George. R. R. Martin',
],
lambda a: a.name
)
self.assertQuerysetEqual(
Author.objects.order_by(StrIndex('name', Value('R.')).desc()), [
'George. R. R. Martin',
'J. R. R. Tolkien',
'Terry Pratchett',
],
lambda a: a.name
)
def test_unicode_values(self):
Author.objects.create(name='ツリー')
Author.objects.create(name='皇帝')
Author.objects.create(name='皇帝 ツリー')
authors = Author.objects.annotate(sb=StrIndex('name', Value('')))
self.assertQuerysetEqual(authors.order_by('name'), [2, 0, 5], lambda a: a.sb)
def test_filtering(self):
Author.objects.create(name='George. R. R. Martin')
Author.objects.create(name='Terry Pratchett')
self.assertQuerysetEqual(
Author.objects.annotate(middle_name=StrIndex('name', Value('R.'))).filter(middle_name__gt=0),
['George. R. R. Martin'],
lambda a: a.name
)