Fundraising in PDF.
[wolnelektury.git] / src / catalogue / tests / test_tags.py
index d5aa72c..0ca2ac0 100644 (file)
@@ -1,6 +1,5 @@
-# -*- coding: utf-8 -*-
-# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
-# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
+# This file is part of Wolne Lektury, licensed under GNU Affero GPLv3 or later.
+# Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
 #
 from unittest import skip
 
@@ -29,7 +28,7 @@ class BooksByTagTests(WLTestCase):
                                         parts=[self.child_info.url],
                                         **info_args("Parent"))
 
-        self.book_file = ContentFile('<utwor />')
+        self.book_file = ContentFile(b'<utwor />')
 
     def test_nonexistent_tag(self):
         """ Looking for a non-existent tag should yield 404 """
@@ -78,15 +77,15 @@ class TagRelatedTagsTests(WLTestCase):
         author = PersonStub(("Common",), "Man")
 
         gchild_info = BookInfoStub(author=author, genre="GchildGenre", epoch='Epoch', kind="Kind",
-                                   **info_args(u"GChild"))
+                                   **info_args("GChild"))
         child1_info = BookInfoStub(author=author, genre="ChildGenre", epoch='Epoch', kind="ChildKind",
                                    parts=[gchild_info.url],
-                                   **info_args(u"Child1"))
+                                   **info_args("Child1"))
         child2_info = BookInfoStub(author=author, genre="ChildGenre", epoch='Epoch', kind="ChildKind",
-                                   **info_args(u"Child2"))
+                                   **info_args("Child2"))
         parent_info = BookInfoStub(author=author, genre="Genre", epoch='Epoch', kind="Kind",
                                    parts=[child1_info.url, child2_info.url],
-                                   **info_args(u"Parent"))
+                                   **info_args("Parent"))
 
         for info in gchild_info, child1_info, child2_info, parent_info:
             book_text = """<utwor><opowiadanie><akap>
@@ -95,8 +94,11 @@ class TagRelatedTagsTests(WLTestCase):
                     Ala ma kota
                 <end id="m01" />
                 </akap></opowiadanie></utwor>
-                """ % info.title.encode('utf-8')
-            book = models.Book.from_text_and_meta(ContentFile(book_text), info)
+                """ % info.title
+            book = models.Book.from_text_and_meta(
+                ContentFile(book_text.encode('utf-8')),
+                info
+            )
             book.save()
 
         tag_empty = models.Tag(name='Empty tag', slug='empty', category='author')
@@ -105,73 +107,88 @@ class TagRelatedTagsTests(WLTestCase):
     def test_empty(self):
         """ empty tag should have no related tags """
 
-        cats = self.client.get('/katalog/autor/empty/').context['categories']
-        self.assertEqual({k: v for (k, v) in cats.items() if v}, {}, 'tags related to empty tag')
+        suggested = self.client.get('/katalog/autor/empty/').context['suggested_tags']
+        self.assertEqual(suggested, [], 'tags related to empty tag')
 
     def test_has_related(self):
         """ related own and descendants' tags should be generated """
 
-        cats = self.client.get('/katalog/rodzaj/kind/').context['categories']
-        self.assertTrue('Common Man' in [tag.name for tag in cats['author']],
+        suggested = {
+            (t.name, t.category)
+            for t in self.client.get('/katalog/rodzaj/kind/').context['suggested_tags']
+        }
+        self.assertTrue(('Common Man', 'author') in suggested,
                         'missing `author` related tag')
-        self.assertTrue('Epoch' in [tag.name for tag in cats['epoch']],
+        self.assertTrue(('Epoch', 'epoch') in suggested,
                         'missing `epoch` related tag')
-        self.assertFalse(cats.get("kind", False),
+        # TODO: this should probably be changed now.
+        self.assertFalse(any(x for x in suggested if x[1] == "kind"),
                          "There should be no child-only related `kind` tags")
-        self.assertTrue("Genre" in [tag.name for tag in cats['genre']],
+        self.assertTrue(("Genre", 'genre') in suggested,
                         'missing `genre` related tag')
-        self.assertFalse("ChildGenre" in [tag.name for tag in cats['genre']],
+        # TODO: this should probably be changed now.
+        self.assertFalse(("ChildGenre", 'genre') in suggested,
                          "There should be no child-only related `genre` tags")
-        self.assertTrue("GchildGenre" in [tag.name for tag in cats['genre']],
+        self.assertTrue(("GchildGenre", "genre") in suggested,
                         "missing grandchild's related tag")
-        self.assertTrue('Theme' in [tag.name for tag in cats['theme']],
+        self.assertTrue(('Theme', 'theme') in suggested,
                         "missing related theme")
-        self.assertFalse('Child1Theme' in [tag.name for tag in cats['theme']],
-                         "There should be no child-only related `theme` tags")
-        self.assertTrue('GChildTheme' in [tag.name for tag in cats['theme']],
+        self.assertTrue(('Child1Theme', 'theme') in suggested,
+                         "missing child's related theme")
+        self.assertTrue(('GChildTheme', 'theme') in suggested,
                         "missing grandchild's related theme")
 
     def test_related_differ(self):
         """ related tags shouldn't include filtering tags """
 
         response = self.client.get('/katalog/rodzaj/kind/')
-        cats = response.context['categories']
-        self.assertFalse(cats.get('kind', False),
+        suggested = response.context['suggested_tags']
+        self.assertFalse(any(x for x in suggested if x.category == 'kind'),
                          'filtering tag wrongly included in related')
-        cats = self.client.get('/katalog/motyw/theme/').context['categories']
-        self.assertFalse('Theme' in [tag.name for tag in cats['theme']],
+        suggested = {
+            (t.name, t.category)
+            for t in self.client.get(
+                    '/katalog/motyw/theme/').context['suggested_tags']
+        }
+        self.assertFalse(('Theme', 'theme') in suggested,
                          'filtering theme wrongly included in related')
 
     def test_parent_tag_once(self):
         """ if parent and descendants have a common tag, count it only once """
 
-        cats = self.client.get('/katalog/rodzaj/kind/').context['categories']
-        self.assertEqual([(tag.name, tag.count) for tag in cats['epoch']],
+        suggested = self.client.get('/katalog/rodzaj/kind/').context['suggested_tags']
+        self.assertEqual([(tag.name, tag.count) for tag in suggested if tag.category == 'epoch'],
                          [('Epoch', 1)],
                          'wrong related tag epoch tag on tag page')
 
     def test_siblings_tags_count(self):
         """ if children have tags and parent hasn't, count the children """
 
-        cats = self.client.get('/katalog/epoka/epoch/').context['categories']
+        suggested = self.client.get('/katalog/epoka/epoch/').context['suggested_tags']
+        kinds = [(tag.name, tag.count) for tag in suggested if tag.category == 'kind']
         self.assertTrue(
-            ('ChildKind', 2) in [(tag.name, tag.count) for tag in cats['kind']],
-            'wrong related kind tags on tag page, got: ' +
-            unicode([(tag.name, tag.count) for tag in cats['kind']]))
+            ('ChildKind', 2) in kinds,
+            'wrong related kind tags on tag page'
+        )
 
         # all occurencies of theme should be counted
-        self.assertTrue(('Theme', 4) in [(tag.name, tag.count) for tag in cats['theme']],
-                        'wrong related theme count')
+        themes = [(tag.name, tag.count) for tag in suggested if tag.category == 'theme']
+        self.assertTrue(
+            ('Theme', 4) in themes,
+            'wrong related theme count'
+        )
 
     def test_query_child_tag(self):
         """
         If child and parent have a common tag, but parent isn't included
         in the result, child should still count.
         """
-        cats = self.client.get('/katalog/gatunek/childgenre/').context['categories']
-        self.assertTrue(('Epoch', 2) in [(tag.name, tag.count) for tag in cats['epoch']],
-                        'wrong related kind tags on tag page, got: ' +
-                        unicode([(tag.name, tag.count) for tag in cats['epoch']]))
+        suggested = self.client.get('/katalog/gatunek/childgenre/').context['suggested_tags']
+        epochs = [(tag.name, tag.count) for tag in suggested if tag.category == 'epoch']
+        self.assertTrue(
+            ('Epoch', 2) in epochs,
+            'wrong related kind tags on tag page'
+        )
 
 
 class CleanTagRelationTests(WLTestCase):
@@ -181,21 +198,23 @@ class CleanTagRelationTests(WLTestCase):
         WLTestCase.setUp(self)
         author = PersonStub(("Common",), "Man")
 
-        book_info = BookInfoStub(author=author, genre="G", epoch='E', kind="K", **info_args(u"Book"))
+        book_info = BookInfoStub(author=author, genre="G", epoch='E', kind="K", **info_args("Book"))
         book_text = """<utwor><opowiadanie><akap>
             <begin id="m01" /><motyw id="m01">Theme</motyw>Ala ma kota
             <end id="m01" />
             </akap></opowiadanie></utwor>
             """
-        self.book = models.Book.from_text_and_meta(ContentFile(book_text), book_info)
+        self.book = models.Book.from_text_and_meta(
+                ContentFile(book_text.encode('utf-8')),
+                book_info)
 
     @skip('Not implemented and not priority')
     def test_delete_objects(self):
         """ there should be no related tags left after deleting some objects """
 
         models.Book.objects.all().delete()
-        cats = self.client.get('/katalog/rodzaj/k/').context['categories']
-        self.assertEqual({k: v for (k, v) in cats.items() if v}, {})
+        suggested = self.client.get('/katalog/rodzaj/k/').context['suggested_tags']
+        self.assertEqual(suggested, [])
         self.assertEqual(models.Fragment.objects.all().count(), 0,
                          "orphaned fragments left")
         self.assertEqual(models.Tag.intermediary_table_model.objects.all().count(), 0,
@@ -216,7 +235,7 @@ class TestIdenticalTag(WLTestCase):
         WLTestCase.setUp(self)
         author = PersonStub((), "Tag")
 
-        self.book_info = BookInfoStub(author=author, genre="tag", epoch='tag', kind="tag", **info_args(u"tag"))
+        self.book_info = BookInfoStub(author=author, genre="tag", epoch='tag', kind="tag", **info_args("tag"))
         self.book_text = """<utwor>
             <opowiadanie>
             <akap>
@@ -228,7 +247,9 @@ class TestIdenticalTag(WLTestCase):
 
     def test_book_tags(self):
         """ there should be all related tags in relevant categories """
-        book = models.Book.from_text_and_meta(ContentFile(self.book_text), self.book_info)
+        book = models.Book.from_text_and_meta(
+                ContentFile(self.book_text.encode('utf-8')),
+                self.book_info)
 
         related_themes = book.related_themes()
         for category in 'author', 'kind', 'genre', 'epoch':
@@ -237,13 +258,16 @@ class TestIdenticalTag(WLTestCase):
         self.assertTrue('tag' in [tag.slug for tag in related_themes])
 
     def test_qualified_url(self):
-        models.Book.from_text_and_meta(ContentFile(self.book_text), self.book_info)
+        models.Book.from_text_and_meta(
+                ContentFile(self.book_text.encode('utf-8')),
+                self.book_info)
         categories = {'author': 'autor', 'theme': 'motyw', 'epoch': 'epoka', 'kind': 'rodzaj', 'genre': 'gatunek'}
-        for cat, localcat in categories.iteritems():
+        for cat, localcat in categories.items():
+            if cat == 'theme': continue
             context = self.client.get('/katalog/%s/tag/' % localcat).context
             self.assertEqual(1, len(context['object_list']))
-            self.assertNotEqual({}, context['categories'])
-            self.assertFalse(context['categories'].get(cat, False))
+            self.assertNotEqual([], context['suggested_tags'])
+            self.assertFalse(any(t for t in context['suggested_tags'] if t.category == cat))
 
 
 class BookTagsTests(WLTestCase):
@@ -255,10 +279,10 @@ class BookTagsTests(WLTestCase):
         author2 = PersonStub(("Jim",), "Lazy")
 
         child_info = BookInfoStub(authors=(author1, author2), genre="ChildGenre", epoch='Epoch', kind="ChildKind",
-                                  **info_args(u"Child"))
+                                  **info_args("Child"))
         parent_info = BookInfoStub(author=author1, genre="Genre", epoch='Epoch', kind="Kind",
                                    parts=[child_info.url],
-                                   **info_args(u"Parent"))
+                                   **info_args("Parent"))
 
         for info in child_info, parent_info:
             book_text = """<utwor><opowiadanie><akap>
@@ -267,8 +291,10 @@ class BookTagsTests(WLTestCase):
                     Ala ma kota
                 <end id="m01" />
                 </akap></opowiadanie></utwor>
-                """ % info.title.encode('utf-8')
-            models.Book.from_text_and_meta(ContentFile(book_text), info)
+                """ % info.title
+            models.Book.from_text_and_meta(
+                    ContentFile(book_text.encode('utf-8')),
+                    info)
 
     def test_book_tags(self):
         """ book should have own tags and whole tree's themes """
@@ -281,4 +307,4 @@ class BookTagsTests(WLTestCase):
         self.assertEqual([t.slug for t in book.tags.filter(category='kind')],
                          ['kind'])
         self.assertEqual([(tag.name, tag.count) for tag in related_themes],
-                         [('ChildTheme', 1), ('ParentTheme', 1), ('Theme', 2)])
+                         [('Theme', 2), ('ChildTheme', 1), ('ParentTheme', 1)])