FB2 support
[wolnelektury.git] / apps / catalogue / tests / bookmedia.py
1 # -*- coding: utf-8 -*-
2 from os.path import basename, exists, join, dirname
3 from django.core.files.base import ContentFile, File
4
5 from catalogue.test_utils import *
6 from catalogue import models, utils
7
8 class BookMediaTests(WLTestCase):
9
10     def setUp(self):
11         WLTestCase.setUp(self)
12         self.file = ContentFile('X')
13         self.file2 = ContentFile('Y')
14         self.book = models.Book.objects.create(slug='test-book')
15
16     def test_diacritics(self):
17         bm = models.BookMedia(book=self.book, type="ogg", 
18                     name=u"Zażółć gęślą jaźń")
19         bm.file.save(None, self.file)
20         self.assertEqual(basename(bm.file.name), 'zazolc-gesla-jazn.ogg')
21
22     def test_long_name(self):
23         bm = models.BookMedia(book=self.book, type="ogg", 
24                     name="Some very very very very very very very very very very very very very very very very long file name")
25         bm.file.save(bm.name, self.file)
26
27         # reload to see what was really saved
28         bm = models.BookMedia.objects.get(pk=bm.pk)
29         self.assertEqual(bm.file.size, 1)
30
31     def test_overwrite(self):
32         """
33             File gets overwritten with same filename on update.
34         """
35
36         bm = models.BookMedia(book=self.book, type='ogg',
37                     name="Some media")
38         bm.file.save(None, self.file)
39         bm.file.save(None, self.file2)
40
41         self.assertEqual(bm.file.read(), 'Y')
42         self.assertEqual(basename(bm.file.name), 'some-media.ogg')
43
44     def test_no_clobber(self):
45         """
46             File save doesn't clobber some other media with similar name.
47         """
48
49         bm = models.BookMedia(book=self.book, type='ogg',
50             name=u"Tytul")
51         bm.file.save(None, self.file)
52         bm2 = models.BookMedia(book=self.book, type='ogg',
53             name=u"Tytuł")
54         bm2.file.save(None, self.file2)
55         self.assertEqual(basename(bm.file.name), 'tytul.ogg')
56         self.assertNotEqual(basename(bm2.file.name), 'tytul.ogg')
57         self.assertEqual(bm.file.read(), 'X')
58         self.assertEqual(bm2.file.read(), 'Y')
59
60     def test_change_name(self):
61         """
62             File name reflects name change.
63         """
64
65         bm = models.BookMedia(book=self.book, type='ogg', name="Title")
66         bm.file.save(None, self.file)
67         bm.name = "Other Title"
68         bm.save()
69         self.assertEqual(basename(bm.file.name), 'other-title.ogg')
70         self.assertEqual(bm.file.read(), 'X')
71
72     def test_change_name_no_clobber(self):
73         """
74             File name after change won't clobber some other file
75             with similar name.
76         """
77
78         bm = models.BookMedia(book=self.book, type='ogg', name="Title")
79         bm.file.save(None, self.file)
80         bm2 = models.BookMedia(book=self.book, type='ogg', name="Other title")
81         bm2.file.save(None, self.file2)
82         bm2.name = "Title"
83         bm2.save()
84         self.assertNotEqual(basename(bm2.file.name), 'title.ogg')
85         self.assertEqual(bm.file.read(), 'X')
86         self.assertEqual(bm2.file.read(), 'Y')
87
88     def test_zip_audiobooks(self):
89         paths = [
90             (None, join(dirname(__file__), "files/fraszka-do-anusie.xml")),
91             (None, join(dirname(__file__), "files/fraszki.xml")),
92             ]
93
94         url = utils.create_zip(paths, 'test-zip-slug')
95         self.assertEqual("zip/test-zip-slug.zip", url)
96         self.assertTrue(exists(join(settings.MEDIA_ROOT, url)))
97
98         utils.remove_zip('test-zip-slug')
99         self.assertFalse(exists(join(settings.MEDIA_ROOT, url)))
100
101     def test_remove_zip_on_media_change(self):
102         bm = models.BookMedia(book=self.book, type='ogg', name="Title")
103         bm.file.save(None, self.file)
104         bm.save()
105         
106         zip_url = self.book.zip_audiobooks('ogg')
107         self.assertEqual('zip/'+self.book.slug+'_ogg.zip', zip_url)
108         self.assertTrue(exists(join(settings.MEDIA_ROOT, zip_url)))
109
110         bm2 = models.BookMedia(book=self.book, type='ogg', name="Other title")
111         bm2.file.save(None, self.file2)
112         bm2.name = "Title"
113         bm2.save()
114         # was the audiobook zip deleted?
115         self.assertFalse(exists(join(settings.MEDIA_ROOT, zip_url)))