diora-web/diora/test_search.py

63 lines
3.6 KiB
Python
Raw Normal View History

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