Tests for OPDS search
authorRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Wed, 22 Aug 2012 11:39:08 +0000 (13:39 +0200)
committerRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Wed, 22 Aug 2012 11:39:08 +0000 (13:39 +0200)
apps/catalogue/test_utils.py
apps/opds/tests/__init__.py [new file with mode: 0755]
apps/opds/tests/files/do-doktora.xml [new file with mode: 0644]

index d447d0c..5e02619 100644 (file)
@@ -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 (executable)
index 0000000..d6e9ca0
--- /dev/null
@@ -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 (file)
index 0000000..53c1724
--- /dev/null
@@ -0,0 +1,56 @@
+<utwor>
+  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+<rdf:Description rdf:about="http://redakcja.wolnelektury.pl/documents/book/fraszki-ksiegi-trzecie-do-doktora-fraszka-a-doktor-to-sa-dwi/">
+<dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Kochanowski, Jan</dc:creator>
+<dc:title xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Do doktora (Fraszka a doktor — to są dwie rzeczy przeciwne...)</dc:title>
+<dc:relation.isPartOf xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">http://wolnelektury.pl/lektura/fraszki-ksiegi-trzecie</dc:relation.isPartOf>
+<dc:contributor.editor xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Krzyżanowski, Julian</dc:contributor.editor>
+<dc:contributor.editor xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Otwinowska, Barbara</dc:contributor.editor>
+<dc:contributor.editor xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Sekuła, Aleksandra</dc:contributor.editor>
+<dc:contributor.technical_editor xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Sutkowska, Olga</dc:contributor.technical_editor>
+<dc:contributor.technical_editor xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Gałecki, Dariusz</dc:contributor.technical_editor>
+<dc:contributor.translator xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Fikcyjny, Tłumacz</dc:contributor.translator>
+<dc:publisher xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Fundacja Nowoczesna Polska</dc:publisher>
+<dc:subject.period xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Renesans</dc:subject.period>
+<dc:subject.type xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Liryka</dc:subject.type>
+<dc:subject.genre xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Fraszka</dc:subject.genre>
+<dc:description xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN.</dc:description>
+<dc:identifier.url xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">http://wolnelektury.pl/katalog/lektura/fraszki-ksiegi-trzecie-do-doktora-fraszka-a-doktor-to-sa-dwi</dc:identifier.url>
+<dc:source.URL xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">http://www.polona.pl/dlibra/doccontent2?id=1499&amp;from=editionindex&amp;dirids=1</dc:source.URL>
+<dc:source xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Jan Kochanowski, Dzieła polskie, tom 1, Państwowy Instytut Wydawniczy, wyd. 8, Warszawa, 1976</dc:source>
+<dc:rights xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">Domena publiczna - Jan Kochanowski zm. 1584</dc:rights>
+<dc:date.pd xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">1584</dc:date.pd>
+<dc:format xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">xml</dc:format>
+<dc:type xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">text</dc:type>
+<dc:type xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">text</dc:type>
+<dc:date xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">2007-09-07</dc:date>
+<dc:audience xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">SP2</dc:audience>
+<dc:audience xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">G</dc:audience>
+<dc:audience xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">L</dc:audience>
+<dc:language xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="pl">pol</dc:language>
+<dc:relation.coverImage.url xmlns:dc="http://purl.org/dc/elements/1.1/">http://redakcja.wolnelektury.pl/media/dynamic/cover/image/607.jpg</dc:relation.coverImage.url>
+<dc:relation.coverImage.attribution xmlns:dc="http://purl.org/dc/elements/1.1/">Artondra Hall@Flickr, CC BY 2.0</dc:relation.coverImage.attribution>
+<dc:relation.coverImage.source xmlns:dc="http://purl.org/dc/elements/1.1/">http://redakcja.wolnelektury.pl/cover/image/607</dc:relation.coverImage.source>
+</rdf:Description>
+</rdf:RDF>
+  <liryka_l>
+
+<autor_utworu>Jan Kochanowski</autor_utworu>
+
+<dzielo_nadrzedne>Fraszki, Księgi wtóre</dzielo_nadrzedne>
+
+<nazwa_utworu>Do doktora<pr>Żartobliwy ton każe przypuszczać, iż adresatem wierszyka jest Jakub Montanus (por. przyp. do fr. II 49).</pr></nazwa_utworu>
+
+
+
+<strofa>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ę.</strofa>
+
+</liryka_l>
+</utwor>
\ No newline at end of file