"""The search across diora (diora/search.py).""" from datetime import datetime, timezone from django.contrib.auth.models import User from django.test import TestCase from feeds.models import Item, Source from podcasts import discover from podcasts.models import PodcastEpisode, PodcastFeed from radio.models import SavedStation class SearchTests(TestCase): def setUp(self): self.user = User.objects.create_user(username='sucher', password='pw12345678') self.client.force_login(self.user) other = User.objects.create_user(username='andere', password='pw12345678') when = datetime(2026, 3, 1, tzinfo=timezone.utc) self.pod = PodcastFeed.objects.create(user=self.user, rss_url='https://example.org/p', title='Ökonomie heute', author='Peter Decker') self.book = PodcastFeed.objects.create(user=self.user, rss_url='https://example.org/b', title='Das Kapital', author='Karl Marx', kind=PodcastFeed.AUDIOBOOK) PodcastFeed.objects.create(user=other, rss_url='https://example.org/p', title='Ökonomie heute') self.ep = PodcastEpisode.objects.create(feed=self.pod, guid='e1', title='Die Ökonomie der Plattformen', audio_url='https://example.org/e1.mp3', pub_date=when) PodcastEpisode.objects.create(feed=self.book, guid='k1', title='Kapitel 1: Die Ware', audio_url='https://example.org/k1.mp3', pub_date=when) discover.index_new() blog = Source.objects.create(user=self.user, url='https://blog.example/feed', title='Plattform-Blog', kind=Source.BLOG) Item.objects.create(source=blog, user=self.user, kind=Source.BLOG, guid_hash='a', title='Plattformarbeit und Streik', published=when) Item.objects.create(source=blog, user=self.user, kind=Source.BLOG, guid_hash='b', title='Gartenarbeit', published=when) Item.objects.create(source=blog, user=self.user, kind=Source.BLOG, guid_hash='c', title='Plattformen, alt', published=when, gone=True) SavedStation.objects.create(user=self.user, name='Radio Plattform', url='https://radio.example/s', tags='jazz') def find(self, q): return self.client.get('/search/', {'q': q}).json() def test_every_area(self): r = self.find('plattf') self.assertEqual([e['id'] for e in r['episodes']], [self.ep.id]) self.assertEqual([a['title'] for a in r['articles']], ['Plattformarbeit und Streik']) self.assertEqual([s['title'] for s in r['sources']], ['Plattform-Blog']) self.assertEqual([s['name'] for s in r['stations']], ['Radio Plattform']) def test_podcasts_and_audiobooks_apart_case_and_accents_blind(self): r = self.find('okonomie') self.assertEqual([f['id'] for f in r['podcasts']], [self.pod.id]) self.assertEqual(r['audiobooks'], []) r = self.find('marx kap') self.assertEqual([f['id'] for f in r['audiobooks']], [self.book.id]) self.assertEqual(r['episodes'], [], 'an audiobook\'s chapters are no podcast episodes') def test_every_word_and_nothing_for_too_little(self): self.assertEqual(self.find('plattform garten')['articles'], []) self.assertTrue(self.find('a')['empty']) self.assertEqual(self.client.get('/search/', {'q': 'x'}).status_code, 200) def test_only_signed_in(self): self.client.logout() self.assertEqual(self.client.get('/search/', {'q': 'plattform'}).status_code, 401)