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
« 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)
7from ..models import Book
8from ..views import (
9 BookCreateView,
10 BookDetailView,
11 BookListView,
12 BookUpdateView,
13)
15# from .factories import BookFactory
17pytestmark = pytest.mark.django_db
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
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
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
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"""
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
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
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
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
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
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
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
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
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"""