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 rest_framework.permissions import IsAuthenticated
from greenmine.base import filters from greenmine.base import filters
from greenmine.base import exceptions as exc
from greenmine.base.api import ModelCrudViewSet, ModelListViewSet from greenmine.base.api import ModelCrudViewSet, ModelListViewSet
from greenmine.base.notifications.api import NotificationSenderMixin from greenmine.base.notifications.api import NotificationSenderMixin
from greenmine.projects.permissions import AttachmentPermission from greenmine.projects.permissions import AttachmentPermission
@ -29,12 +30,21 @@ class WikiAttachmentViewSet(ModelCrudViewSet):
qs = qs.filter(content_type=ct) qs = qs.filter(content_type=ct)
return qs.distinct() 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): def pre_save(self, obj):
super(WikiAttachmentViewSet, self).pre_save(obj)
if not obj.id: if not obj.id:
obj.content_type = ContentType.objects.get_for_model(models.Wiki) obj.content_type = ContentType.objects.get_for_model(models.Wiki)
obj.owner = self.request.user obj.owner = self.request.user
super(WikiAttachmentViewSet, self).pre_save(obj)
class WikiViewSet(ModelCrudViewSet): class WikiViewSet(ModelCrudViewSet):
model = models.WikiPage model = models.WikiPage
@ -43,6 +53,16 @@ class WikiViewSet(ModelCrudViewSet):
filter_backends = (filters.IsProjectMemberFilterBackend,) filter_backends = (filters.IsProjectMemberFilterBackend,)
filter_fields = ["project", "slug"] 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): def pre_save(self, obj):
if not obj.owner: if not obj.owner:
obj.owner = self.request.user 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): class WikiPage(models.Model):
project = models.ForeignKey('projects.Project', null=False, blank=False, project = models.ForeignKey("projects.Project", null=False, blank=False,
related_name='wiki_pages', verbose_name=_('project')) related_name="wiki_pages", verbose_name=_("project"))
slug = models.SlugField(max_length=500, db_index=True, null=False, blank=False, 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, content = models.TextField(null=False, blank=True,
verbose_name=_('content')) verbose_name=_("content"))
owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, 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, watchers = models.ManyToManyField(settings.AUTH_USER_MODEL, null=True, blank=True,
related_name='watched_wiki_pages', related_name="watched_wiki_pages",
verbose_name=_('watchers')) verbose_name=_("watchers"))
created_date = models.DateTimeField(auto_now_add=True, null=False, blank=False, 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, modified_date = models.DateTimeField(auto_now=True, null=False, blank=False,
verbose_name=_('modified date')) verbose_name=_("modified date"))
class Meta: class Meta:
verbose_name = u'wiki page' verbose_name = "wiki page"
verbose_name_plural = u'wiki pages' verbose_name_plural = "wiki pages"
ordering = ['project', 'slug'] ordering = ["project", "slug"]
unique_together = ('project', 'slug',) unique_together = ("project", "slug",)
permissions = ( permissions = (
('view_wikipage', 'Can modify owned wiki pages'), ("view_wikipage", "Can modify owned wiki pages"),
('change_owned_wikipage', 'Can modify owned wiki pages'), ("change_owned_wikipage", "Can modify owned wiki pages"),
) )
def __str__(self): 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()