Created tests to wiki app
parent
e0257ba7c6
commit
579c84a9a6
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
|
@ -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()
|
||||
|
Loading…
Reference in New Issue