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

1from django.contrib.auth.models import User 

2from django.test import TestCase 

3from django.urls import reverse 

4 

5from author.models import Author 

6from book.models import Book 

7 

8 

9class TestBookView(TestCase): 

10 

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() 

24 

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) 

35 

36 def test_successful_book_creation(self): 

37 """ 

38 Test case to verify successful book creation. 

39 

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. 

42 

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) 

49 

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) 

66 

67 def test_successful_book_update(self): 

68 """ 

69 Test case to verify successful book update. 

70 

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) 

85 

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) 

106 

107 def test_successful_book_delete(self): 

108 """ 

109 Test case to verify successful deletion of a book. 

110 

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) 

121 

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) 

136 

137 def test_toggle_reader(self): 

138 """ 

139 Test case for toggling the reader of a book. 

140 

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)