62 lines
3.6 KiB
Python
62 lines
3.6 KiB
Python
"""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)
|