From 7c4ab12ec5f2c85ce1f8365d519b2eef98265171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Mon, 7 Oct 2013 13:20:23 +0200 Subject: [PATCH] Created tests to projects app --- greenmine/base/notifications/models.py | 8 +- greenmine/projects/serializers.py | 13 +- greenmine/projects/tests/__init__.py | 31 ++++ greenmine/projects/tests/tests_api.py | 232 +++++++++++++++++++++++++ 4 files changed, 272 insertions(+), 12 deletions(-) create mode 100644 greenmine/projects/tests/__init__.py create mode 100644 greenmine/projects/tests/tests_api.py diff --git a/greenmine/base/notifications/models.py b/greenmine/base/notifications/models.py index cf581f92..df2b02b7 100644 --- a/greenmine/base/notifications/models.py +++ b/greenmine/base/notifications/models.py @@ -80,24 +80,24 @@ class WatchedMixin(object): watchers_to_notify = set() watchers_by_role = self._get_watchers_by_role() - owner = watchers_by_role.get("owner") + owner = watchers_by_role.get("owner", None) if (owner and owner.allow_notify_owned() and owner.allow_notify_by_me(changer)): watchers_to_notify.add(owner) - assigned_to = watchers_by_role.get("assigned_to") + assigned_to = watchers_by_role.get("assigned_to", None) if (assigned_to and assigned_to.allow_notify_assigned_to() and assigned_to.allow_notify_by_me(changer)): watchers_to_notify.add(assigned_to) - suscribed_watchers = watchers_by_role.get("suscribed_watchers") + suscribed_watchers = watchers_by_role.get("suscribed_watchers", None) if suscribed_watchers: for suscribed_watcher in suscribed_watchers: if (suscribed_watcher and suscribed_watcher.allow_notify_suscribed() and suscribed_watcher.allow_notify_by_me(changer)): watchers_to_notify.add(suscribed_watcher) - (project, project_owner) = watchers_by_role.get("project_owner") + (project, project_owner) = watchers_by_role.get("project_owner", (None, None)) if project_owner \ and project_owner.allow_notify_project(project) \ and project_owner.allow_notify_by_me(self._changer): diff --git a/greenmine/projects/serializers.py b/greenmine/projects/serializers.py index 2840a555..665d2731 100644 --- a/greenmine/projects/serializers.py +++ b/greenmine/projects/serializers.py @@ -11,25 +11,22 @@ class AttachmentSerializer(serializers.ModelSerializer): url = serializers.SerializerMethodField("get_url") def get_url(self, obj): - # FIXME: add sites or correct url. - if obj.attached_file: - return "http://localhost:8000{0}".format(obj.attached_file.url) - return None + return obj.attached_file.url if obj and obj.attached_file else "" class Meta: model = models.Attachment - fields = ("id", "project", "owner", "attached_file", - "created_date", "object_id", "url") + fields = ("id", "project", "owner", "attached_file", "created_date", + "modified_date", "object_id", "url") read_only_fields = ("owner",) - fields = () class ProjectSerializer(serializers.ModelSerializer): - tags = PickleField() + tags = PickleField(required=False) list_of_milestones = serializers.Field(source="list_of_milestones") class Meta: model = models.Project + read_only_fields = ("owner",) # User Stories common serializers diff --git a/greenmine/projects/tests/__init__.py b/greenmine/projects/tests/__init__.py new file mode 100644 index 00000000..e2052b93 --- /dev/null +++ b/greenmine/projects/tests/__init__.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- + +from django.db.models.loading import get_model + + +def create_project(id, owner, save=True): + model = get_model("projects", "Project") + + instance = model( + name="Project {0}".format(id), + description="This is a test project", + owner=owner, + total_story_points=id + ) + + if save: + instance.save() + return instance + + +def add_membership(project, user, role_slug="dev"): + model = get_model("users", "Role") + role = model.objects.get(slug=role_slug) + + model = get_model("projects", "Membership") + instance = model.objects.create( + project=project, + user=user, + role=role + ) + return instance diff --git a/greenmine/projects/tests/tests_api.py b/greenmine/projects/tests/tests_api.py new file mode 100644 index 00000000..bd399d95 --- /dev/null +++ b/greenmine/projects/tests/tests_api.py @@ -0,0 +1,232 @@ +# -*- coding: utf-8 -*- + +import json + +from django import test +from django.core.urlresolvers import reverse + +from greenmine.base.users.tests import create_user +from greenmine.projects.models import Project + +from . import create_project, add_membership + + +class ProjectsTestCase(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.project1 = create_project(1, self.user1) + self.project2 = create_project(2, self.user1) + self.project3 = create_project(3, self.user2) + + add_membership(self.project1, self.user3, "dev") + add_membership(self.project3, self.user3, "dev") + + def test_list_projects_by_anon(self): + response = self.client.get(reverse("projects-list")) + self.assertEqual(response.status_code, 401) + + def test_list_projects_by_owner(self): + response = self.client.login(username=self.user1.username, + password=self.user1.username) + self.assertTrue(response) + response = self.client.get(reverse("projects-list")) + self.assertEqual(response.status_code, 200) + projects_list = response.data + self.assertEqual(len(projects_list), 2) + self.client.logout() + + response = self.client.login(username=self.user2.username, + password=self.user2.username) + self.assertTrue(response) + response = self.client.get(reverse("projects-list")) + self.assertEqual(response.status_code, 200) + projects_list = response.data + self.assertEqual(len(projects_list), 1) + self.client.logout() + + def test_list_projects_by_membership(self): + response = self.client.login(username=self.user3.username, + password=self.user3.username) + self.assertTrue(response) + response = self.client.get(reverse("projects-list")) + self.assertEqual(response.status_code, 200) + projects_list = response.data + self.assertEqual(len(projects_list), 2) + self.client.logout() + + def test_view_project_by_anon(self): + response = self.client.get(reverse("projects-detail", args=(self.project1.id,))) + self.assertEqual(response.status_code, 401) + + def test_view_project_by_owner(self): + response = self.client.login(username=self.user1.username, + password=self.user1.username) + self.assertTrue(response) + response = self.client.get(reverse("projects-detail", args=(self.project1.id,))) + self.assertEqual(response.status_code, 200) + response = self.client.get(reverse("projects-detail", args=(self.project2.id,))) + self.assertEqual(response.status_code, 200) + self.client.logout() + + def test_view_project_by_membership(self): + response = self.client.login(username=self.user3.username, + password=self.user3.username) + self.assertTrue(response) + response = self.client.get(reverse("projects-detail", args=(self.project1.id,))) + self.assertEqual(response.status_code, 200) + response = self.client.get(reverse("projects-detail", args=(self.project3.id,))) + self.assertEqual(response.status_code, 200) + self.client.logout() + + def test_view_project_by_not_membership(self): + response = self.client.login(username=self.user1.username, + password=self.user1.username) + self.assertTrue(response) + response = self.client.get(reverse("projects-detail", args=(self.project3.id,))) + self.assertEqual(response.status_code, 404) + self.client.logout() + + def test_create_project_by_anon(self): + data = { + "name": "Test Project", + "description": "A new Test Project", + "total_story_points": 10 + } + + self.assertEqual(Project.objects.all().count(), 3) + response = self.client.post( + reverse("projects-list"), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 401) + self.assertEqual(Project.objects.all().count(), 3) + + def test_create_project_by_auth(self): + data = { + "name": "Test Project", + "description": "A new Test Project", + "total_story_points": 10 + } + + self.assertEqual(Project.objects.all().count(), 3) + response = self.client.login(username=self.user1.username, + password=self.user1.username) + self.assertTrue(response) + response = self.client.post( + reverse("projects-list"), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 201) + self.assertEqual(Project.objects.all().count(), 4) + self.client.logout() + + def test_edit_project_by_anon(self): + data = { + "description": "Edited project description", + } + + self.assertEqual(Project.objects.all().count(), 3) + self.assertNotEqual(data["description"], self.project1.description) + response = self.client.patch( + reverse("projects-detail", args=(self.project1.id,)), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 401) + self.assertEqual(Project.objects.all().count(), 3) + + def test_edit_project_by_owner(self): + data = { + "description": "Modified project description", + } + + self.assertEqual(Project.objects.all().count(), 3) + self.assertNotEqual(data["description"], self.project1.description) + response = self.client.login(username=self.user1.username, + password=self.user1.username) + self.assertTrue(response) + response = self.client.patch( + reverse("projects-detail", args=(self.project1.id,)), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 200) + self.assertEqual(data["description"], response.data["description"]) + self.assertEqual(Project.objects.all().count(), 3) + self.client.logout() + + def test_edit_project_by_membership(self): + data = { + "description": "Edited project description", + } + + self.assertEqual(Project.objects.all().count(), 3) + self.assertNotEqual(data["description"], self.project1.description) + response = self.client.login(username=self.user3.username, + password=self.user3.username) + self.assertTrue(response) + response = self.client.patch( + reverse("projects-detail", args=(self.project1.id,)), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 200) + self.assertEqual(data["description"], response.data["description"]) + self.assertEqual(Project.objects.all().count(), 3) + self.client.logout() + + def test_edit_project_by_not_membership(self): + data = { + "description": "Edited project description", + } + + self.assertEqual(Project.objects.all().count(), 3) + self.assertNotEqual(data["description"], self.project1.description) + response = self.client.login(username=self.user2.username, + password=self.user2.username) + self.assertTrue(response) + response = self.client.patch( + reverse("projects-detail", args=(self.project1.id,)), + json.dumps(data), + content_type="application/json") + self.assertEqual(response.status_code, 404) + self.assertEqual(Project.objects.all().count(), 3) + self.client.logout() + + def test_delete_project_by_anon(self): + self.assertEqual(Project.objects.all().count(), 3) + response = self.client.delete(reverse("projects-detail", args=(self.project1.id,))) + self.assertEqual(response.status_code, 401) + self.assertEqual(Project.objects.all().count(), 3) + + def test_delete_project_by_owner(self): + self.assertEqual(Project.objects.all().count(), 3) + response = self.client.login(username=self.user1.username, + password=self.user1.username) + self.assertTrue(response) + response = self.client.delete(reverse("projects-detail", args=(self.project1.id,))) + self.assertEqual(response.status_code, 204) + self.assertEqual(Project.objects.all().count(), 2) + self.client.logout() + + def test_delete_project_by_membership(self): + self.assertEqual(Project.objects.all().count(), 3) + response = self.client.login(username=self.user3.username, + password=self.user3.username) + self.assertTrue(response) + response = self.client.delete(reverse("projects-detail", args=(self.project1.id,))) + self.assertEqual(response.status_code, 204) + self.assertEqual(Project.objects.all().count(), 2) + self.client.logout() + + def test_delete_project_by_not_membership(self): + self.assertEqual(Project.objects.all().count(), 3) + response = self.client.login(username=self.user1.username, + password=self.user1.username) + self.assertTrue(response) + response = self.client.delete(reverse("projects-detail", args=(self.project3.id,))) + self.assertEqual(response.status_code, 404) + self.assertEqual(Project.objects.all().count(), 3) + self.client.logout()