From 579c84a9a6417b7aed4549929f863d43d679cfdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Fri, 11 Oct 2013 09:38:54 +0200 Subject: [PATCH] Created tests to wiki app --- greenmine/projects/wiki/api.py | 22 +- greenmine/projects/wiki/models.py | 32 +- greenmine/projects/wiki/tests/__init__.py | 18 + greenmine/projects/wiki/tests/tests_api.py | 412 +++++++++++++++++++++ 4 files changed, 467 insertions(+), 17 deletions(-) create mode 100644 greenmine/projects/wiki/tests/__init__.py create mode 100644 greenmine/projects/wiki/tests/tests_api.py diff --git a/greenmine/projects/wiki/api.py b/greenmine/projects/wiki/api.py index 5bbedfb0..f2948b72 100644 --- a/greenmine/projects/wiki/api.py +++ b/greenmine/projects/wiki/api.py @@ -5,6 +5,7 @@ from django.contrib.contenttypes.models import ContentType from rest_framework.permissions import IsAuthenticated from greenmine.base import filters +from greenmine.base import exceptions as exc from greenmine.base.api import ModelCrudViewSet, ModelListViewSet from greenmine.base.notifications.api import NotificationSenderMixin from greenmine.projects.permissions import AttachmentPermission @@ -29,12 +30,21 @@ class WikiAttachmentViewSet(ModelCrudViewSet): qs = qs.filter(content_type=ct) return qs.distinct() + def pre_conditions_on_save(self, obj): + super().pre_conditions_on_save(obj) + + if (obj.project.owner != self.request.user and + obj.project.memberships.filter(user=self.request.user).count() == 0): + raise exc.PreconditionError("You must not add a new wiki page to this " + "project.") + def pre_save(self, obj): - super(WikiAttachmentViewSet, self).pre_save(obj) if not obj.id: obj.content_type = ContentType.objects.get_for_model(models.Wiki) obj.owner = self.request.user + super(WikiAttachmentViewSet, self).pre_save(obj) + class WikiViewSet(ModelCrudViewSet): model = models.WikiPage @@ -43,6 +53,16 @@ class WikiViewSet(ModelCrudViewSet): filter_backends = (filters.IsProjectMemberFilterBackend,) filter_fields = ["project", "slug"] + def pre_conditions_on_save(self, obj): + super().pre_conditions_on_save(obj) + + if (obj.project.owner != self.request.user and + obj.project.memberships.filter(user=self.request.user).count() == 0): + raise exc.PreconditionError("You must not add a new wiki page to this " + "project.") + def pre_save(self, obj): if not obj.owner: obj.owner = self.request.user + + super().pre_save(obj) diff --git a/greenmine/projects/wiki/models.py b/greenmine/projects/wiki/models.py index 43880173..e3281ed2 100644 --- a/greenmine/projects/wiki/models.py +++ b/greenmine/projects/wiki/models.py @@ -6,32 +6,32 @@ from django.utils.translation import ugettext_lazy as _ class WikiPage(models.Model): - project = models.ForeignKey('projects.Project', null=False, blank=False, - related_name='wiki_pages', verbose_name=_('project')) + project = models.ForeignKey("projects.Project", null=False, blank=False, + related_name="wiki_pages", verbose_name=_("project")) slug = models.SlugField(max_length=500, db_index=True, null=False, blank=False, - verbose_name=_('slug')) + verbose_name=_("slug")) content = models.TextField(null=False, blank=True, - verbose_name=_('content')) + verbose_name=_("content")) owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, - related_name='owned_wiki_pages', verbose_name=_('owner')) + related_name="owned_wiki_pages", verbose_name=_("owner")) watchers = models.ManyToManyField(settings.AUTH_USER_MODEL, null=True, blank=True, - related_name='watched_wiki_pages', - verbose_name=_('watchers')) + related_name="watched_wiki_pages", + verbose_name=_("watchers")) created_date = models.DateTimeField(auto_now_add=True, null=False, blank=False, - verbose_name=_('created date')) + verbose_name=_("created date")) modified_date = models.DateTimeField(auto_now=True, null=False, blank=False, - verbose_name=_('modified date')) + verbose_name=_("modified date")) class Meta: - verbose_name = u'wiki page' - verbose_name_plural = u'wiki pages' - ordering = ['project', 'slug'] - unique_together = ('project', 'slug',) + verbose_name = "wiki page" + verbose_name_plural = "wiki pages" + ordering = ["project", "slug"] + unique_together = ("project", "slug",) permissions = ( - ('view_wikipage', 'Can modify owned wiki pages'), - ('change_owned_wikipage', 'Can modify owned wiki pages'), + ("view_wikipage", "Can modify owned wiki pages"), + ("change_owned_wikipage", "Can modify owned wiki pages"), ) def __str__(self): - return u'project {0} - {1}'.format(self.project_id, self.slug) + return "project {0} - {1}".format(self.project_id, self.slug) diff --git a/greenmine/projects/wiki/tests/__init__.py b/greenmine/projects/wiki/tests/__init__.py new file mode 100644 index 00000000..cba2df1f --- /dev/null +++ b/greenmine/projects/wiki/tests/__init__.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from django.db.models.loading import get_model + + +def create_wiki_page(id, owner, project, save=True): + model = get_model("wiki", "WikiPage") + + instance = model( + slug="wikipage-{0}".format(id), + content="WikiPage {0}".format(id), + project=project, + owner=owner + ) + + if save: + instance.save() + return instance diff --git a/greenmine/projects/wiki/tests/tests_api.py b/greenmine/projects/wiki/tests/tests_api.py new file mode 100644 index 00000000..43f9d879 --- /dev/null +++ b/greenmine/projects/wiki/tests/tests_api.py @@ -0,0 +1,412 @@ +# -*- coding: utf-8 -*- + +import json + +from django import test +from django.core import mail +from django.core.urlresolvers import reverse + +from greenmine.base.users.tests import create_user +from greenmine.projects.tests import create_project, add_membership +from greenmine.projects.wiki.models import WikiPage + +from . import create_wiki_page + + +class WikiPagesTestCase(test.TestCase): + fixtures = ["initial_role.json", ] + + def setUp(self): + self.user1 = create_user(1) + self.user2 = create_user(2) + self.user3 = create_user(3) + self.user4 = create_user(4) + + self.project1 = create_project(1, self.user1) + add_membership(self.project1, self.user2, "dev") + add_membership(self.project1, self.user3, "dev") + + self.project2 = create_project(2, self.user4) + + self.wiki_page1 = create_wiki_page(1, self.user2, self.project1) + self.wiki_page2 = create_wiki_page(2, self.user2, self.project1) + + def test_list_wiki_pages_by_anon(self): + response = self.client.get(reverse("wiki-list")) + self.assertEqual(response.status_code, 401) + + def test_list_wiki_pages_by_project_owner(self): + response = self.client.login(username=self.user1.username, + password=self.user1.username) + self.assertTrue(response) + response = self.client.get(reverse("wiki-list")) + self.assertEqual(response.status_code, 200) + wiki_pages_list = response.data + self.assertEqual(len(wiki_pages_list), 2) + self.client.logout() + + def test_list_wiki_pages_by_owner(self): + response = self.client.login(username=self.user2.username, + password=self.user2.username) + self.assertTrue(response) + response = self.client.get(reverse("wiki-list")) + self.assertEqual(response.status_code, 200) + wiki_pages_list = response.data + self.assertEqual(len(wiki_pages_list), 2) + self.client.logout() + + def test_list_wiki_pages_by_membership(self): + response = self.client.login(username=self.user3.username, + password=self.user3.username) + self.assertTrue(response) + response = self.client.get(reverse("wiki-list")) + self.assertEqual(response.status_code, 200) + wiki_pages_list = response.data + self.assertEqual(len(wiki_pages_list), 2) + self.client.logout() + + def test_list_wiki_pages_by_no_membership(self): + response = self.client.login(username=self.user4.username, + password=self.user4.username) + self.assertTrue(response) + response = self.client.get(reverse("wiki-list")) + self.assertEqual(response.status_code, 200) + wiki_pages_list = response.data + self.assertEqual(len(wiki_pages_list), 0) + self.client.logout() + + def test_view_wiki_page_by_anon(self): + response = self.client.get(reverse("wiki-detail", args=(self.wiki_page1.id,))) + self.assertEqual(response.status_code, 401) + + def test_view_wiki_page_by_project_owner(self): + response = self.client.login(username=self.user1.username, + password=self.user1.username) + self.assertTrue(response) + response = self.client.get(reverse("wiki-detail", args=(self.wiki_page1.id,))) + self.assertEqual(response.status_code, 200) + self.client.logout() + + def test_view_wiki_page_by_owner(self): + response = self.client.login(username=self.user2.username, + password=self.user2.username) + self.assertTrue(response) + response = self.client.get(reverse("wiki-detail", args=(self.wiki_page1.id,))) + self.assertEqual(response.status_code, 200) + self.client.logout() + + def test_view_wiki_page_by_membership(self): + response = self.client.login(username=self.user3.username, + password=self.user3.username) + self.assertTrue(response) + response = self.client.get(reverse("wiki-detail", args=(self.wiki_page1.id,))) + self.assertEqual(response.status_code, 200) + self.client.logout() + + def test_view_wiki_page_by_no_membership(self): + response = self.client.login(username=self.user4.username, + password=self.user4.username) + self.assertTrue(response) + response = self.client.get(reverse("wiki-detail", args=(self.wiki_page1.id,))) + self.assertEqual(response.status_code, 404) + self.client.logout() + + + def test_create_wiki_page_by_anon(self): + data = { + "slug": "test-wiki-page", + "content": "Test WikiPage", + "project": self.project1.id + } + + self.assertEqual(WikiPage.objects.all().count(), 2) + response = self.client.post( + reverse("wiki-list"), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 401) + self.assertEqual(WikiPage.objects.all().count(), 2) + + def test_create_wiki_page_by_project_owner(self): + data = { + "slug": "test-wiki-page", + "content": "Test WikiPage", + "project": self.project1.id + } + + self.assertEqual(WikiPage.objects.all().count(), 2) + self.assertEqual(len(mail.outbox), 0) + response = self.client.login(username=self.user1.username, + password=self.user1.username) + self.assertTrue(response) + response = self.client.post( + reverse("wiki-list"), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 201) + self.assertEqual(WikiPage.objects.all().count(), 3) + self.assertEqual(len(mail.outbox), 0) + self.client.logout() + + def test_create_wiki_page_by_membership(self): + data = { + "slug": "test-wiki-page", + "content": "Test WikiPage", + "project": self.project1.id + } + + self.assertEqual(WikiPage.objects.all().count(), 2) + self.assertEqual(len(mail.outbox), 0) + response = self.client.login(username=self.user2.username, + password=self.user2.username) + self.assertTrue(response) + response = self.client.post( + reverse("wiki-list"), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 201) + self.assertEqual(WikiPage.objects.all().count(), 3) + self.assertEqual(len(mail.outbox), 0) + self.client.logout() + + def test_create_wiki_page_by_membership_with_wron_project(self): + data = { + "slug": "test-wiki-page", + "content": "Test WikiPage", + "project": self.project2.id + } + + self.assertEqual(WikiPage.objects.all().count(), 2) + response = self.client.login(username=self.user2.username, + password=self.user2.username) + self.assertTrue(response) + response = self.client.post( + reverse("wiki-list"), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 400) + self.assertEqual(WikiPage.objects.all().count(), 2) + self.client.logout() + + def test_create_wiki_page_by_no_membership(self): + data = { + "slug": "test-wiki-page", + "content": "Test WikiPage", + "project": self.project1.id + } + + self.assertEqual(WikiPage.objects.all().count(), 2) + self.assertEqual(len(mail.outbox), 0) + response = self.client.login(username=self.user4.username, + password=self.user4.username) + self.assertTrue(response) + response = self.client.post( + reverse("wiki-list"), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 400) + self.assertEqual(WikiPage.objects.all().count(), 2) + self.client.logout() + + def test_edit_wiki_page_by_anon(self): + data = { + "content": "Edited test wiki_page", + } + + self.assertEqual(WikiPage.objects.all().count(), 2) + self.assertNotEqual(data["content"], self.wiki_page1.content) + response = self.client.patch( + reverse("wiki-detail", args=(self.wiki_page1.id,)), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 401) + self.assertEqual(WikiPage.objects.all().count(), 2) + + def test_edit_wiki_page_by_project_owner(self): + data = { + "content": "Edited test wiki_page", + } + + self.assertEqual(WikiPage.objects.all().count(), 2) + self.assertNotEqual(data["content"], self.wiki_page1.content) + self.assertEqual(len(mail.outbox), 0) + response = self.client.login(username=self.user1.username, + password=self.user1.username) + self.assertTrue(response) + response = self.client.patch( + reverse("wiki-detail", args=(self.wiki_page1.id,)), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 200) + self.assertEqual(data["content"], response.data["content"]) + self.assertEqual(WikiPage.objects.all().count(), 2) + self.assertEqual(len(mail.outbox), 0) + self.client.logout() + + def test_edit_wiki_page_by_project_owner_with_wron_project(self): + data = { + "project": self.project2.id + } + + self.assertEqual(WikiPage.objects.all().count(), 2) + response = self.client.login(username=self.user1.username, + password=self.user1.username) + self.assertTrue(response) + response = self.client.patch( + reverse("wiki-detail", args=(self.wiki_page1.id,)), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 400) + self.assertEqual(WikiPage.objects.all().count(), 2) + self.client.logout() + + def test_edit_wiki_page_by_owner(self): + data = { + "content": "Edited test wiki_page", + } + + self.assertEqual(WikiPage.objects.all().count(), 2) + self.assertNotEqual(data["content"], self.wiki_page1.content) + self.assertEqual(len(mail.outbox), 0) + response = self.client.login(username=self.user2.username, + password=self.user2.username) + self.assertTrue(response) + response = self.client.patch( + reverse("wiki-detail", args=(self.wiki_page1.id,)), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 200) + self.assertEqual(data["content"], response.data["content"]) + self.assertEqual(WikiPage.objects.all().count(), 2) + self.assertEqual(len(mail.outbox), 0) + self.client.logout() + + def test_edit_wiki_page_by_owner_with_wron_project(self): + data = { + "project": self.project2.id + } + + self.assertEqual(WikiPage.objects.all().count(), 2) + response = self.client.login(username=self.user2.username, + password=self.user2.username) + self.assertTrue(response) + response = self.client.patch( + reverse("wiki-detail", args=(self.wiki_page1.id,)), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 400) + self.assertEqual(WikiPage.objects.all().count(), 2) + self.client.logout() + + def test_edit_wiki_page_by_membership(self): + data = { + "content": "Edited test wiki_page", + } + + self.assertEqual(WikiPage.objects.all().count(), 2) + self.assertNotEqual(data["content"], self.wiki_page1.content) + self.assertEqual(len(mail.outbox), 0) + response = self.client.login(username=self.user3.username, + password=self.user3.username) + self.assertTrue(response) + response = self.client.patch( + reverse("wiki-detail", args=(self.wiki_page1.id,)), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 200) + self.assertEqual(data["content"], response.data["content"]) + self.assertEqual(WikiPage.objects.all().count(), 2) + self.assertEqual(len(mail.outbox), 0) + self.client.logout() + + def test_edit_wiki_page_by_membership_with_wron_project(self): + data = { + "project": self.project2.id + } + + self.assertEqual(WikiPage.objects.all().count(), 2) + response = self.client.login(username=self.user3.username, + password=self.user3.username) + self.assertTrue(response) + response = self.client.patch( + reverse("wiki-detail", args=(self.wiki_page1.id,)), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 400) + self.assertEqual(WikiPage.objects.all().count(), 2) + self.client.logout() + + def test_edit_wiki_page_by_no_membership(self): + data = { + "content": "Edited test wiki_page", + } + + self.assertEqual(WikiPage.objects.all().count(), 2) + self.assertNotEqual(data["content"], self.wiki_page1.content) + response = self.client.login(username=self.user4.username, + password=self.user4.username) + self.assertTrue(response) + response = self.client.patch( + reverse("wiki-detail", args=(self.wiki_page1.id,)), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 404) + self.assertEqual(WikiPage.objects.all().count(), 2) + self.client.logout() + + def test_delete_wiki_page_by_ano(self): + self.assertEqual(WikiPage.objects.all().count(), 2) + response = self.client.delete( + reverse("wiki-detail", args=(self.wiki_page1.id,)) + ) + self.assertEqual(response.status_code, 401) + self.assertEqual(WikiPage.objects.all().count(), 2) + + def test_delete_wiki_page_by_project_owner(self): + self.assertEqual(WikiPage.objects.all().count(), 2) + response = self.client.login(username=self.user1.username, + password=self.user1.username) + self.assertTrue(response) + response = self.client.delete( + reverse("wiki-detail", args=(self.wiki_page1.id,)) + ) + self.assertEqual(response.status_code, 204) + self.assertEqual(WikiPage.objects.all().count(), 1) + self.client.logout() + + def test_delete_wiki_page_by_owner(self): + self.assertEqual(WikiPage.objects.all().count(), 2) + response = self.client.login(username=self.user2.username, + password=self.user2.username) + self.assertTrue(response) + response = self.client.delete( + reverse("wiki-detail", args=(self.wiki_page1.id,)) + ) + self.assertEqual(response.status_code, 204) + self.assertEqual(WikiPage.objects.all().count(), 1) + self.client.logout() + + def test_delete_wiki_page_by_membership(self): + self.assertEqual(WikiPage.objects.all().count(), 2) + response = self.client.login(username=self.user3.username, + password=self.user3.username) + self.assertTrue(response) + response = self.client.delete( + reverse("wiki-detail", args=(self.wiki_page1.id,)) + ) + self.assertEqual(response.status_code, 204) + self.assertEqual(WikiPage.objects.all().count(), 1) + self.client.logout() + + def test_delete_wiki_page_by_no_membership(self): + self.assertEqual(WikiPage.objects.all().count(), 2) + response = self.client.login(username=self.user4.username, + password=self.user4.username) + self.assertTrue(response) + response = self.client.delete( + reverse("wiki-detail", args=(self.wiki_page1.id,)) + ) + self.assertEqual(response.status_code, 404) + self.assertEqual(WikiPage.objects.all().count(), 2) + self.client.logout() +