Coverage for book\test_views.py: 100%
72 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-06-29 10:02 +0100
« prev ^ index » next coverage.py v7.4.4, created at 2024-06-29 10:02 +0100
1from django.contrib.auth.models import User
2from django.test import TestCase
3from django.urls import reverse
5from author.models import Author
6from book.models import Book
9class TestBookView(TestCase):
11 def setUp(self):
12 """
13 Set up the necessary objects and data for the test case.
14 """
15 self.user = User.objects.create_superuser(
16 username="myUsername",
17 password="myPassword",
18 email="test@test.com"
19 )
20 self.author = Author(name="Test Author")
21 self.book = Book(title='Book title', author=self.author)
22 self.author.save()
23 self.book.save()
25 def test_render_books_page_authorised_user(self):
26 """
27 Test case to verify that the books page is rendered correctly for an
28 authorised user.
29 """
30 self.client.login(username='myUsername', password='myPassword')
31 response = self.client.get(reverse('books'))
32 self.assertEqual(response.status_code, 200)
33 self.assertIn(b"Books", response.content)
34 self.assertIn(b"Add Book", response.content)
36 def test_successful_book_creation(self):
37 """
38 Test case to verify successful book creation.
40 This test logs in a user, creates a book using the 'add_book' view,
41 and then checks if the book count has increased by 1.
43 """
44 self.client.login(username='myUsername', password='myPassword')
45 post_data = {'title': 'Book title2', 'author': self.author.id}
46 self.assertEqual(Book.objects.count(), 1)
47 self.client.post(reverse('add_book'), post_data)
48 self.assertEqual(Book.objects.count(), 2)
50 def test_add_book_non_admin(self):
51 """
52 Test case to verify that a non-admin user cannot add a book.
53 """
54 self.user = User.objects.create_user(
55 username='reader',
56 password='readerPassword',
57 email='test@test.com'
58 )
59 self.client.login(username='reader', password='readerPassword')
60 post_data = {'title': 'Test Book2', 'author': self.author.id}
61 original_count = Book.objects.count()
62 self.client.post(reverse('add_book'), post_data)
63 self.assertEqual(Book.objects.count(), original_count)
64 response = self.client.get(reverse('add_book'))
65 self.assertEqual(response.status_code, 302)
67 def test_successful_book_update(self):
68 """
69 Test case to verify successful book update.
71 This test case logs in a user, retrieves a book object, updates its
72 title, and verifies that the title has been successfully updated in the
73 database.
74 """
75 self.client.login(username='myUsername', password='myPassword')
76 new_title = 'Book title2'
77 response = self.client.get(reverse('update_book',
78 kwargs={'book_id': self.book.id}))
79 self.assertEqual(response.context['book'].id, self.book.id)
80 self.client.post(
81 reverse('update_book', kwargs={'book_id': self.book.id}),
82 {'title': new_title, 'author': self.author.id})
83 updated_title = Book.objects.get(id=self.book.id).title
84 self.assertEqual(updated_title, new_title)
86 def test_update_book_non_admin(self):
87 """
88 Test case to verify that a non-admin user cannot update a book.
89 """
90 self.user = User.objects.create_user(
91 username='reader',
92 password='readerPassword',
93 email='test@test.com'
94 )
95 self.client.login(username='reader', password='readerPassword')
96 post_data = {'title': 'Updated Book', 'author': self.author.id}
97 original_title = self.book.title
98 self.client.post(
99 reverse('update_book', kwargs={'book_id': self.book.id}),
100 post_data)
101 self.book.refresh_from_db()
102 self.assertEqual(self.book.title, original_title)
103 response = self.client.get(
104 reverse('update_book', kwargs={'book_id': self.book.id}))
105 self.assertEqual(response.status_code, 302)
107 def test_successful_book_delete(self):
108 """
109 Test case to verify successful deletion of a book.
111 This test logs in a user, creates a book, and then deletes it using the
112 `delete_book` view.
113 It asserts that the book count before and after the deletion is as
114 expected.
115 """
116 self.client.login(username='myUsername', password='myPassword')
117 self.assertEqual(Book.objects.count(), 1)
118 self.client.post(
119 reverse('delete_book', kwargs={'book_id': self.book.id}))
120 self.assertEqual(Book.objects.count(), 0)
122 def test_delete_book_non_admin(self):
123 """
124 Test case to verify that a non-admin user cannot delete a book.
125 """
126 self.user = User.objects.create_user(
127 username='reader',
128 password='readerPassword',
129 email='test@test.com'
130 )
131 self.client.login(username='reader', password='readerPassword')
132 original_count = Book.objects.count()
133 self.client.post(
134 reverse('delete_book', kwargs={'book_id': self.book.id}))
135 self.assertEqual(Book.objects.count(), original_count)
137 def test_toggle_reader(self):
138 """
139 Test case for toggling the reader of a book.
141 This test checks if the reader of a book can be toggled correctly.
142 It creates a user, logs in as the user, and checks if the initial
143 reader of the book is None.
144 Then it sends a POST request to toggle the reader of the book and
145 checks if the reader is updated correctly.
146 Finally, it sends another POST request to toggle the reader back to
147 None and checks if the reader is set to None again.
148 """
149 self.user = User.objects.create_user(
150 username="reader",
151 password="readerPassword",
152 email="reader@test.com"
153 )
154 self.client.login(username='reader', password='readerPassword')
155 self.assertIsNone(self.book.reader)
156 self.client.post(
157 reverse('toggle_reader', kwargs={'book_id': self.book.id}))
158 self.book.refresh_from_db()
159 self.assertEqual(self.book.reader, self.user)
160 self.client.post(
161 reverse('toggle_reader', kwargs={'book_id': self.book.id}))
162 self.book.refresh_from_db()
163 self.assertIsNone(self.book.reader)