Coverage for books/tests/test_views.py: 100.00%

75 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2025-10-24 18:34 -0700

1import pytest 

2from django.urls import reverse 

3from pytest_django.asserts import ( 

4 assertContains, 

5) 

6 

7from ..models import Book 

8from ..views import ( 

9 BookCreateView, 

10 BookDetailView, 

11 BookListView, 

12 BookUpdateView, 

13) 

14 

15# from .factories import BookFactory 

16 

17pytestmark = pytest.mark.django_db 

18 

19 

20def test_book_list_view(rf): 

21 # Get the request 

22 request = rf.get(reverse("book_list")) 1j

23 # Use the request to get the response 

24 response = BookListView.as_view()(request) 1j

25 # Test that the response is valid 

26 assertContains(response, "Our Book list") 1j

27 

28 

29def test_book_detail_view(rf, book): # noqa:F811 

30 # Get the request 

31 url = reverse("book_detail", kwargs={"pk": book.pk}) 1h

32 request = rf.get(url) 1h

33 # Use the request to get the response 

34 callable_obj = BookDetailView.as_view() 1h

35 response = callable_obj(request, pk=book.pk) 1h

36 # Test that the response is valid 

37 assertContains(response, book.title) 1h

38 

39 

40def test_book_create_view(rf, book, admin_user): # noqa:F811 

41 form_data = { 1d

42 "title": book.title, 

43 "author": book.author, 

44 "price": book.price, 

45 "creator": book.creator, 

46 } 

47 # Make a request for our new book 

48 request = rf.get(reverse("book_add"), form_data) 1d

49 # Add an authenticated user 

50 request.user = admin_user 1d

51 # Use the request to get the response 

52 response = BookCreateView.as_view()(request) 1d

53 book_sample = Book.objects.last() 1d

54 # Test that the response is valid 

55 assert response.status_code == 200 1d

56 assert book_sample.creator == book.creator 1d

57 assert book_sample.title == book.title 1d

58 

59 

60""" 

61def test_book_list_contains_2_books(rf, book): 

62 # Create a couple of books 

63 book1 = BookFactory() 

64 book2 = BookFactory() 

65 # Create a request and then a response 

66 # for the list of books 

67 request = rf.get(reverse("book_list")) 

68 response = BookListView.as_view()(request) 

69 # Assert that the response contains both book titles 

70 # in the template 

71 assertContains(response, book1.title) 

72 assertContains(response, book2.title) 

73""" 

74 

75 

76def test_detail_contains_book_data(rf, book): # noqa:F811 

77 # Make a request for our new book 

78 url = reverse("book_detail", kwargs={"pk": book.pk}) 1e

79 request = rf.get(url) 1e

80 # Use the request to get the response 

81 callable_obj = BookDetailView.as_view() 1e

82 response = callable_obj(request, pk=book.pk) 1e

83 # Test our Book details: 

84 assertContains(response, book.title) 1e

85 assertContains(response, book.author) 1e

86 assertContains(response, book.price) 1e

87 

88 

89def test_book_create_form_valid(rf, admin_user): 

90 # Submit the book add form 

91 form_data = { 1b

92 "title": "Programming Python", 

93 "author": "Mark Lutz", 

94 "price": "69.00", 

95 } 

96 request = rf.post(reverse("book_add"), form_data) 1b

97 request.user = admin_user 1b

98 response = BookCreateView.as_view()(request) 1b

99 # Get the book based on the name 

100 book = Book.objects.get(title="Programming Python") # noqa:F811 1b

101 # Test that the book matches our form 

102 assert response.status_code == 302 1b

103 assert book.author == "Mark Lutz" 1b

104 assert book.price == 69.00 1b

105 assert book.creator == admin_user 1b

106 

107 

108def test_book_create_correct_title(rf, admin_user): 

109 """Page title for BookCreateView should be Add Book.""" 

110 request = rf.get(reverse("book_add")) 1i

111 request.user = admin_user 1i

112 response = BookCreateView.as_view()(request) 1i

113 assertContains(response, "Add a Book") 1i

114 

115 

116def test_book_update_view(rf, admin_user, book): 

117 url = reverse("book_update", kwargs={"pk": book.id}) 1f

118 # Make a request for our new cheese 

119 request = rf.get(url) 1f

120 # Add an authenticated user 

121 request.user = admin_user 1f

122 # Use the request to get the response 

123 callable_obj = BookUpdateView.as_view() 1f

124 response = callable_obj(request, pk=book.id) 1f

125 # Test that the response is valid 

126 assertContains(response, "Update") 1f

127 

128 

129def test_book_update(rf, admin_user, book): 

130 """POST request to BookUpdateView updates a book 

131 and redirects. 

132 """ 

133 # Make a request for our new book 

134 form_data = { 1c

135 "title": book.title, 

136 "author": "John Q. Public", 

137 "price": book.price, 

138 } 

139 url = reverse("book_update", kwargs={"pk": book.id}) 1c

140 request = rf.post(url, form_data) 1c

141 request.user = admin_user 1c

142 callable_obj = BookUpdateView.as_view() 1c

143 response = callable_obj(request, pk=book.id) # noqa:F841 1c

144 

145 # Check that the book has been changed 

146 book.refresh_from_db() 1c

147 assert book.author == "John Q. Public" 1c

148 assert response.status_code == 302 1c

149 

150 

151@pytest.mark.django_db 

152def test_sitemap(client, ten_books): 

153 response = client.get("/sitemap.xml") 1g

154 xml = response.content.decode("utf-8") 1g

155 expected_books = [p for p in ten_books] 1g

156 assert response.status_code == 200 1g

157 assert len(expected_books) == 10 1g

158 assert "<loc>" in xml 1g

159 # assert "<lastmod>" in xml 

160 

161 

162""" 

163def test_review_create_form_valid(rf, admin_user, book, review): # noqa:F811 

164 form_data = { 

165 "review": "This is a great book", 

166 } 

167 url = reverse("review_create", kwargs={"book_id": str(book.id)}) 

168 request = rf.post(url, form_data) 

169 request.user = admin_user 

170 callable_obj = ReviewCreateView.as_view() 

171 response = callable_obj(request) # noqa:F841 

172 # response = callable_obj(request, book.id) # noqa:F841 

173 # Get the book based on the name 

174 review = Review.objects.get(review="This is a great book") # noqa:F811 

175 # Test that the book matches our form 

176 book.refresh_from_db() 

177 assert response.status_code == 302 

178 assert review.book == book.title 

179 assert review.review == "This is a great book" 

180 assert review.creator == admin_user 

181 

182 

183def test_book_delete(rf, book): 

184 request = rf.post( 

185 reverse("book_delete", kwargs={"pk": book.id}), 

186 ) 

187 request.user = book.creator 

188 callable_obj = BookDeleteView.as_view() 

189 response = callable_obj(request, pk=book.id) 

190 assert response.status_code == 302 

191"""