Merge branch 'test_views'

Fix #5
This commit is contained in:
Maximilian Friedersdorff 2022-07-06 21:57:01 +01:00
commit c962886504
5 changed files with 82 additions and 5 deletions

View file

@ -5,13 +5,19 @@ from django.core.files import File
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.test import Client
from django.urls import reverse
from django.conf import settings
from .models import Post, Collection from .models import Post, Collection
# Create your tests here. # Create your tests here.
class TestModelTests(TestCase): class ModelTests(TestCase):
def setUp(self): def setUp(self):
self.user = get_user_model().objects.create(email="someone@example.com") self.user = get_user_model().objects.create(email="someone@example.com")
with open( with open(
@ -36,3 +42,67 @@ class TestModelTests(TestCase):
title="A collection", description="foobar", user=self.user title="A collection", description="foobar", user=self.user
) )
self.assertIn("A collection", str(col)) self.assertIn("A collection", str(col))
class PostViewsTests(TestCase):
def setUp(self):
self.user = get_user_model().objects.create_user(
email="someone@example.com",
username="someone",
password="secret",
)
with open(
os.path.join(os.path.dirname(__file__), "test_data", "test_img.png"),
mode="rb",
) as f:
self.post = Post.objects.create(
img=File(f, "somefile.png"),
title="Foobar",
body="Some file",
user=self.user,
)
def tearDown(self):
self.post.img.delete()
def test_anon_cant_see_post(self):
c = Client()
url = reverse("posts:post_detail", kwargs={"pk": self.post.pk})
with self.settings(LOGIN_URL="/loginurl/"):
response = c.get(url)
self.assertRedirects(
response, f"/loginurl/?next={url}", fetch_redirect_response=False
)
def test_logged_in_other_user_cant_see_post(self):
get_user_model().objects.create_user(
email="someone2@example.com",
username="foobar",
password="secret",
)
c = Client()
c.login(username="foobar", password="secret")
url = reverse("posts:post_detail", kwargs={"pk": self.post.pk})
response = c.get(url)
self.assertEqual(response.status_code, 404)
def test_loggin_in_user_can_see_own_posts(self):
c = Client()
c.login(username="someone", password="secret")
url = reverse("posts:post_detail", kwargs={"pk": self.post.pk})
response = c.get(url)
self.assertEqual(response.status_code, 200)
def test_can_post_a_comment(self):
c = Client()
c.login(username="someone", password="secret")
url = reverse("posts:post_detail", kwargs={"pk": self.post.pk})
c.post(url, {"comment": "some comment"})
self.assertTrue(self.post.comments.filter(comment="some comment").exists())
def test_posting_a_comment_requires_a_comment(self):
c = Client()
c.login(username="someone", password="secret")
url = reverse("posts:post_detail", kwargs={"pk": self.post.pk})
c.post(url, {"comment": ""})
self.assertFalse(self.post.comments.all().exists())

View file

@ -2,6 +2,7 @@ from django.urls import path
from . import views from . import views
app_name = "posts"
urlpatterns = [ urlpatterns = [
path("post/<int:pk>", views.PostDetailView.as_view()), path("post/<int:pk>", views.PostDetailView.as_view(), name="post_detail"),
] ]

View file

@ -1,14 +1,16 @@
from django.views.generic import DetailView, CreateView from django.views.generic import DetailView
from django.views.generic.edit import ModelFormMixin from django.views.generic.edit import ModelFormMixin
from django.forms import modelform_factory from django.forms import modelform_factory
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.contrib.auth.mixins import LoginRequiredMixin
# Create your views here. # Create your views here.
from .models import Post, Comment from .models import Post, Comment
class PostDetailView(DetailView, ModelFormMixin): class PostDetailView(LoginRequiredMixin, DetailView, ModelFormMixin):
model = Post model = Post
form_class = modelform_factory(Comment, fields=("comment",)) form_class = modelform_factory(Comment, fields=("comment",))
success_url = "#" success_url = "#"
@ -20,10 +22,13 @@ class PostDetailView(DetailView, ModelFormMixin):
comment.save() comment.save()
return HttpResponseRedirect(self.get_success_url()) return HttpResponseRedirect(self.get_success_url())
def get_queryset(self):
return Post.objects.filter(user=self.request.user)
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
self.object = self.get_object() self.object = self.get_object()
form = self.form_class(request.POST) form = self.form_class(request.POST)
if form.is_valid: if form.is_valid():
return self.form_valid(form) return self.form_valid(form)
else: else:
return self.form_invalid(form) return self.form_invalid(form)

View file

View file

@ -21,6 +21,7 @@ from django.conf.urls.static import static
urlpatterns = [ urlpatterns = [
path("admin/", admin.site.urls), path("admin/", admin.site.urls),
path("accounts/", include("django.contrib.auth.urls")),
path("posts/", include("flangr.posts.urls")), path("posts/", include("flangr.posts.urls")),
] ]