From f16a0ea5826b6ca41abca50c462de0f852e3ec5c Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Wed, 22 Aug 2012 13:39:08 +0200 Subject: [PATCH 1/1] Tests for OPDS search --- apps/catalogue/test_utils.py | 15 +++++++- apps/opds/tests/__init__.py | 55 +++++++++++++++++++++++++++ apps/opds/tests/files/do-doktora.xml | 56 ++++++++++++++++++++++++++++ 3 files changed, 125 insertions(+), 1 deletion(-) create mode 100755 apps/opds/tests/__init__.py create mode 100644 apps/opds/tests/files/do-doktora.xml diff --git a/apps/catalogue/test_utils.py b/apps/catalogue/test_utils.py index d447d0cb8..5e02619f9 100644 --- a/apps/catalogue/test_utils.py +++ b/apps/catalogue/test_utils.py @@ -2,12 +2,15 @@ # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. # +from os.path import abspath, dirname, join +import tempfile +from traceback import extract_stack from django.test import TestCase from django.test.utils import override_settings -import tempfile from slughifi import slughifi from librarian import WLURI + @override_settings( MEDIA_ROOT=tempfile.mkdtemp(prefix='djangotest_'), CATALOGUE_DONT_BUILD=set(['pdf', 'mobi', 'epub', 'txt', 'fb2', 'cover']), @@ -77,3 +80,13 @@ def info_args(title, language=None): 'about': u"http://wolnelektury.pl/example/URI/%s" % slug, 'language': language, } + + +def get_fixture(path, app=None): + if app is not None: + mod_path = app.__file__ + f_path = join(dirname(abspath(mod_path)), 'tests/files', path) + else: + mod_path = extract_stack(limit=2)[0][0] + f_path = join(dirname(abspath(mod_path)), 'files', path) + return f_path diff --git a/apps/opds/tests/__init__.py b/apps/opds/tests/__init__.py new file mode 100755 index 000000000..d6e9ca05a --- /dev/null +++ b/apps/opds/tests/__init__.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +from lxml import etree +from django.core.files.base import ContentFile +import catalogue +from catalogue.test_utils import (BookInfoStub, PersonStub, info_args, + WLTestCase, get_fixture) +from catalogue.models import Book +from librarian import WLURI, XMLNamespace + +AtomNS = XMLNamespace("http://www.w3.org/2005/Atom") + + +class OpdsSearchTests(WLTestCase): + """Tests search feed in OPDS..""" + def setUp(self): + WLTestCase.setUp(self) + with self.settings(NO_SEARCH_INDEX=False): + self.do_doktora = Book.from_xml_file( + get_fixture('do-doktora.xml')) + self.do_anusie = Book.from_xml_file( + get_fixture('fraszka-do-anusie.xml', catalogue)) + + def assert_finds(self, query, books): + """Takes a query and tests against books expected to be found.""" + tree = etree.fromstring( + self.client.get('/opds/search/?%s' % query).content) + elem_ids = tree.findall('.//%s/%s' % (AtomNS('entry'), AtomNS('id'))) + slugs = [WLURI(elem.text).slug for elem in elem_ids] + self.assertEqual(set(slugs), set(b.slug for b in books), + u"OPDS search '%s' failed." % query) + + def test_opds_search_simple(self): + """Do a simple q= test, also emulate dumb OPDS clients.""" + both = set([self.do_doktora, self.do_anusie]) + self.assert_finds('q=fraszka', both) + self.assert_finds('q=fraszka&author={opds:author}', both) + + def test_opds_search_title(self): + """Search by title.""" + both = set([self.do_doktora, self.do_anusie]) + self.assert_finds('title=fraszka', both) + self.assert_finds('title=fraszka', both) + self.assert_finds('q=title:fraszka', [self.do_doktora]) + + def test_opds_search_author(self): + """Search by author.""" + self.assert_finds('q=fraszka&author=Kochanowski', [self.do_doktora]) + self.assert_finds('q=fraszka+author:Kochanowski', [self.do_doktora]) + self.assert_finds('q=Kochanowski', [self.do_doktora]) + + def test_opds_search_translator(self): + """Search by translator.""" + self.assert_finds('q=fraszka&translator=Fikcyjny', [self.do_doktora]) + self.assert_finds('q=fraszka+translator:Fikcyjny', [self.do_doktora]) + self.assert_finds('q=Fikcyjny', [self.do_doktora]) diff --git a/apps/opds/tests/files/do-doktora.xml b/apps/opds/tests/files/do-doktora.xml new file mode 100644 index 000000000..53c172430 --- /dev/null +++ b/apps/opds/tests/files/do-doktora.xml @@ -0,0 +1,56 @@ + + + +Kochanowski, Jan +Do doktora (Fraszka a doktor — to są dwie rzeczy przeciwne...) +http://wolnelektury.pl/lektura/fraszki-ksiegi-trzecie +Krzyżanowski, Julian +Otwinowska, Barbara +Sekuła, Aleksandra +Sutkowska, Olga +Gałecki, Dariusz +Fikcyjny, Tłumacz +Fundacja Nowoczesna Polska +Renesans +Liryka +Fraszka +Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN. +http://wolnelektury.pl/katalog/lektura/fraszki-ksiegi-trzecie-do-doktora-fraszka-a-doktor-to-sa-dwi +http://www.polona.pl/dlibra/doccontent2?id=1499&from=editionindex&dirids=1 +Jan Kochanowski, Dzieła polskie, tom 1, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976 +Domena publiczna - Jan Kochanowski zm. 1584 +1584 +xml +text +text +2007-09-07 +SP2 +G +L +pol +http://redakcja.wolnelektury.pl/media/dynamic/cover/image/607.jpg +Artondra Hall@Flickr, CC BY 2.0 +http://redakcja.wolnelektury.pl/cover/image/607 + + + + +Jan Kochanowski + +Fraszki, Księgi wtóre + +Do doktoraŻartobliwy ton każe przypuszczać, iż adresatem wierszyka jest Jakub Montanus (por. przyp. do fr. II 49). + + + +Fraszka a doktor --- to są dwie rzeczy przeciwne;/ +Przeto u mnie, doktorze, twe żądanie dziwne,/ +Że do mnie ślesz po fraszki, tak daleko k'temu;/ +Ja jednak dosyć czynię rozkazaniu twemu./ +Ty strzeż swojej powagi, nie baw się fraszkami,/ +Ale mi je odeśli prędkimi nogami,/ +A nie dziwuj się, że je tak drogo szacuję,/ +Bo chocia fraszki, przedsię w nich doktory czuję. + + + \ No newline at end of file -- 2.20.1