from django.conf import settings from django.test import TestCase from django.urls import reverse from main import models class PageCreateTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice") self.client.force_login(self.user) def test_page_create(self): data = { "title": "New page", "slug": "new-page", "is_hidden": False, "body": "Content sentence.", } response = self.client.post(reverse("page_create"), data) self.assertEqual(response.status_code, 302) self.assertTrue(models.Page.objects.filter(title=data["title"]).exists()) self.assertEqual( models.Page.objects.get(title=data["title"]).slug, data["slug"] ) self.assertEqual( models.Page.objects.get(title=data["title"]).body, data["body"] ) def test_page_invalid_slug(self): data = { "title": "New page", "slug": "rss", "is_hidden": False, "body": "Content sentence.", } response = self.client.post(reverse("page_create"), data) self.assertContains(response, "slug is not allowed") self.assertFalse(models.Page.objects.filter(title=data["title"]).exists()) class PageCreateAnonTestCase(TestCase): def test_page_create_anon(self): data = { "title": "New page", "slug": "new-page", "is_hidden": False, "body": "Content sentence.", } response = self.client.post(reverse("page_create"), data) self.assertEqual(response.status_code, 302) self.assertTrue("login/" in response.url) self.assertFalse(models.Page.objects.filter(title=data["title"]).exists()) class PageDetailTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice") self.client.force_login(self.user) self.data = { "title": "New page", "slug": "new-page", "is_hidden": False, "body": "Content sentence.", } self.page = models.Page.objects.create(owner=self.user, **self.data) def test_page_detail(self): response = self.client.get( reverse("page_detail", args=(self.page.slug,)), HTTP_HOST=self.user.username + "." + settings.CANONICAL_HOST, ) self.assertEqual(response.status_code, 200) self.assertContains(response, self.data["title"]) self.assertContains(response, self.data["body"]) class PageNonHiddenTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice") self.client.force_login(self.user) self.data = { "title": "New page", "slug": "new-page", "is_hidden": False, "body": "Content sentence.", } self.page = models.Page.objects.create(owner=self.user, **self.data) def test_page_non_hidden(self): response = self.client.get( reverse("index"), HTTP_HOST=self.user.username + "." + settings.CANONICAL_HOST, ) self.assertEqual(response.status_code, 200) self.assertContains(response, self.data["title"]) self.assertContains(response, self.data["slug"]) class PageHiddenTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice") self.client.force_login(self.user) self.data = { "title": "New page", "slug": "new-page", "is_hidden": True, "body": "Content sentence.", } self.page = models.Page.objects.create(owner=self.user, **self.data) def test_page_hidden(self): response = self.client.get( reverse("index"), HTTP_HOST=self.user.username + "." + settings.CANONICAL_HOST, ) self.assertEqual(response.status_code, 200) self.assertNotContains(response, self.data["title"]) self.assertNotContains(response, self.data["slug"]) class PageUpdateTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice") self.client.force_login(self.user) self.data = { "title": "New page", "slug": "new-page", "is_hidden": False, "body": "Content sentence.", } self.page = models.Page.objects.create(owner=self.user, **self.data) def test_get_update(self): response = self.client.get( reverse("page_update", args=(self.page.slug,)), HTTP_HOST=self.user.username + "." + settings.CANONICAL_HOST, ) self.assertEqual(response.status_code, 200) def test_page_update(self): new_data = { "title": "Updated page", "slug": "updated-page", "is_hidden": True, "body": "Updated sentence.", } self.client.post( reverse("page_update", args=(self.page.slug,)), new_data, HTTP_HOST=self.user.username + "." + settings.CANONICAL_HOST, ) page_now = models.Page.objects.get(id=self.page.id) self.assertEqual(page_now.title, new_data["title"]) self.assertEqual(page_now.slug, new_data["slug"]) self.assertEqual(page_now.is_hidden, new_data["is_hidden"]) self.assertEqual(page_now.body, new_data["body"]) class PageUpdateAnonTestCase(TestCase): """Tests non logged in user cannot update page.""" def setUp(self): self.user = models.User.objects.create(username="alice") self.data = { "title": "New page", "slug": "new-page", "is_hidden": False, "body": "Content sentence.", } self.page = models.Page.objects.create(owner=self.user, **self.data) def test_page_update_anon(self): new_data = { "title": "Updated page", "slug": "updated-page", "is_hidden": True, "body": "Updated sentence.", } self.client.post( reverse("page_update", args=(self.page.slug,)), new_data, HTTP_HOST=self.user.username + "." + settings.CANONICAL_HOST, ) page_now = models.Page.objects.get(id=self.page.id) self.assertEqual(page_now.title, self.data["title"]) self.assertEqual(page_now.slug, self.data["slug"]) self.assertEqual(page_now.is_hidden, self.data["is_hidden"]) self.assertEqual(page_now.body, self.data["body"]) class PageUpdateNotOwnTestCase(TestCase): """Tests user cannot update other user's page.""" def setUp(self): self.victim = models.User.objects.create(username="bob") self.data = { "title": "New page", "slug": "new-page", "is_hidden": False, "body": "Content sentence.", } self.page = models.Page.objects.create(owner=self.victim, **self.data) self.attacker = models.User.objects.create(username="alice") self.client.force_login(self.attacker) def test_page_update_not_own(self): new_data = { "title": "Updated page", "slug": "updated-page", "is_hidden": True, "body": "Updated sentence.", } self.client.post( reverse("page_update", args=(self.page.slug,)), new_data, HTTP_HOST=self.victim.username + "." + settings.CANONICAL_HOST, ) page_now = models.Page.objects.get(id=self.page.id) self.assertEqual(page_now.title, self.data["title"]) self.assertEqual(page_now.slug, self.data["slug"]) self.assertEqual(page_now.is_hidden, self.data["is_hidden"]) self.assertEqual(page_now.body, self.data["body"]) class PageDeleteTestCase(TestCase): def setUp(self): self.user = models.User.objects.create(username="alice") self.client.force_login(self.user) self.data = { "title": "New page", "slug": "new-page", "is_hidden": False, "body": "Content sentence.", } self.page = models.Page.objects.create(owner=self.user, **self.data) def test_page_delete(self): self.client.post( reverse("page_delete", args=(self.page.slug,)), HTTP_HOST=self.user.username + "." + settings.CANONICAL_HOST, ) self.assertFalse( models.Page.objects.filter(slug=self.data["slug"], owner=self.user).exists() ) class PageDeleteAnonTestCase(TestCase): """Tests non logged in user cannot delete page.""" def setUp(self): self.user = models.User.objects.create(username="alice") self.data = { "title": "New page", "slug": "new-page", "is_hidden": False, "body": "Content sentence.", } self.page = models.Page.objects.create(owner=self.user, **self.data) def test_page_delete_anon(self): self.client.post( reverse("page_delete", args=(self.page.slug,)), HTTP_HOST=self.user.username + "." + settings.CANONICAL_HOST, ) self.assertTrue( models.Page.objects.filter(slug=self.data["slug"], owner=self.user).exists() ) class PageDeleteNotOwnTestCase(TestCase): """Tests user cannot delete other's page.""" def setUp(self): self.victim = models.User.objects.create(username="bob") self.data = { "title": "New page", "slug": "new-page", "is_hidden": False, "body": "Content sentence.", } self.page = models.Page.objects.create(owner=self.victim, **self.data) self.attacker = models.User.objects.create(username="alice") self.client.force_login(self.attacker) def test_page_delete_not_own(self): self.client.post( reverse("page_delete", args=(self.page.slug,)), HTTP_HOST=self.victim.username + "." + settings.CANONICAL_HOST, ) self.assertTrue( models.Page.objects.filter( slug=self.data["slug"], owner=self.victim ).exists() )