django/tests/db_functions/text/test_strindex.py

75 lines
2.6 KiB
Python

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,
)