Created tests to wiki app

remotes/origin/enhancement/email-actions
David Barragán Merino 2013-10-11 09:38:54 +02:00
parent e0257ba7c6
commit 579c84a9a6
4 changed files with 467 additions and 17 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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()