From ac0345047b9f2e56eea7103bcc21beb5b8e3cea7 Mon Sep 17 00:00:00 2001 From: ikame Date: Wed, 30 Apr 2014 09:07:05 +0200 Subject: [PATCH] Some integration tests for auth api. --- tests/auth/test_api.py | 23 ---------- tests/factories.py | 61 ++++++++++++++++++++++--- tests/{auth => integration}/__init__.py | 0 tests/integration/test_auth_api.py | 55 ++++++++++++++++++++++ 4 files changed, 110 insertions(+), 29 deletions(-) delete mode 100644 tests/auth/test_api.py rename tests/{auth => integration}/__init__.py (100%) create mode 100644 tests/integration/test_auth_api.py diff --git a/tests/auth/test_api.py b/tests/auth/test_api.py deleted file mode 100644 index eb1390be..00000000 --- a/tests/auth/test_api.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -import pytest -from unittest import mock - -from rest_framework.reverse import reverse - -from ..factories import DomainFactory - -pytestmark = pytest.mark.django_db - - -def setup_module(module): - module.patcher = mock.patch("taiga.domains.base.get_default_domain", DomainFactory.build) - module.patcher.start() - - -def teardown_module(module): - module.patcher.stop() - - -def test_respond_400_if_credentials_are_invalid(client): - response = client.post(reverse("auth-list"), {"username": "john", "password": "smith"}) - assert response.status_code == 400 diff --git a/tests/factories.py b/tests/factories.py index 96a325f7..976afd7c 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -1,13 +1,62 @@ # -*- coding: utf-8 -*- -import factory +import uuid -from taiga.domains import models +import factory +from django.conf import settings + +import taiga.domains.models +import taiga.projects.models +import taiga.users.models class DomainFactory(factory.DjangoModelFactory): - FACTORY_FOR = models.Domain + FACTORY_FOR = taiga.domains.models.Domain + FACTORY_DJANGO_GET_OR_CREATE = ("domain",) - public_register = False + name = "Default domain" + domain = "default" scheme = None - name = "localhost" - domain = "localhost" + public_register = False + + +class ProjectTemplateFactory(factory.DjangoModelFactory): + FACTORY_FOR = taiga.projects.models.ProjectTemplate + + name = "Template name" + slug = settings.DEFAULT_PROJECT_TEMPLATE + default_owner_role = "tester" + + +class ProjectFactory(factory.DjangoModelFactory): + FACTORY_FOR = taiga.projects.models.Project + + name = factory.Sequence(lambda n: "Project {}".format(n)) + slug = factory.Sequence(lambda n: "project-{}-slug".format(n)) + description = "Project description" + owner = factory.SubFactory("tests.factories.UserFactory") + domain = factory.SubFactory("tests.factories.DomainFactory") + creation_template = factory.SubFactory("tests.factories.ProjectTemplateFactory") + + +class RoleFactory(factory.DjangoModelFactory): + FACTORY_FOR = taiga.users.models.Role + + name = "Tester" + project = factory.SubFactory("tests.factories.ProjectFactory") + + +class UserFactory(factory.DjangoModelFactory): + FACTORY_FOR = taiga.users.models.User + + username = factory.Sequence(lambda n: "user{}".format(n)) + email = factory.LazyAttribute(lambda obj: '%s@email.com' % obj.username) + password = factory.PostGeneration(lambda obj, *args, **kwargs: obj.set_password(obj.username)) + + +class MembershipFactory(factory.DjangoModelFactory): + FACTORY_FOR = taiga.projects.models.Membership + + token = factory.LazyAttribute(lambda obj: uuid.uuid1()) + project = factory.SubFactory("tests.factories.ProjectFactory") + role = factory.SubFactory("tests.factories.RoleFactory") + user = factory.SubFactory("tests.factories.UserFactory") diff --git a/tests/auth/__init__.py b/tests/integration/__init__.py similarity index 100% rename from tests/auth/__init__.py rename to tests/integration/__init__.py diff --git a/tests/integration/test_auth_api.py b/tests/integration/test_auth_api.py new file mode 100644 index 00000000..e4968fed --- /dev/null +++ b/tests/integration/test_auth_api.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +from unittest import mock + +import pytest + +from rest_framework.reverse import reverse + +from .. import factories + +pytestmark = pytest.mark.django_db + + +def setup_module(module): + module.patcher = mock.patch("taiga.domains.base.get_default_domain", + mock.Mock(return_value=factories.DomainFactory())) + module.patcher.start() + + +def teardown_module(module): + module.patcher.stop() + + +class TestPublicRegistration: + + @classmethod + def setup_class(cls): + cls.form = {"username": "username", "password": "password", "first_name": "fname", + "last_name": "lname", "email": "user@email.com", "type": "public"} + + def test_respond_201_if_domain_allows_public_registration(self, client): + domain = factories.DomainFactory(public_register=True) + response = client.post(reverse("auth-register"), self.form, HTTP_X_HOST=domain.domain) + assert response.status_code == 201 + + def test_respond_400_if_domain_does_not_allow_public_registration(self, client): + domain = factories.DomainFactory(public_register=False) + response = client.post(reverse("auth-register"), self.form, HTTP_X_HOST=domain.domain) + assert response.status_code == 400 + + +@pytest.mark.xfail +class TestPrivateRegistration: + + @classmethod + def setup_class(cls): + cls.form = {"username": "username", "password": "password", "first_name": "fname", + "last_name": "lname", "email": "user@email.com", "type": "private", + "existing": "1"} + + def test_respond_201_if_domain_allows_public_registration(self, client): + domain = factories.DomainFactory(public_register=True) + membership = factories.MembershipFactory() + headers = {"HTTP_X_HOST": domain.domain} + response = client.post(reverse("auth-register"), self.form, **headers) + assert response.status_code == 201