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