# Copyright (C) 2014 Andrey Antukh # Copyright (C) 2014 Jesús Espino # Copyright (C) 2014 David Barragán # Copyright (C) 2014 Anler Hernández # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import pytest from unittest.mock import patch, Mock from django.apps import apps from django.core.urlresolvers import reverse from django.core import mail from .. import factories from taiga.front import resolve as resolve_front_url from taiga.users import models from taiga.auth.tokens import get_token_for_user from taiga_contrib_github_auth import connector as github_connector pytestmark = pytest.mark.django_db @pytest.fixture def register_form(): return {"username": "username", "password": "password", "full_name": "fname", "email": "user@email.com", "type": "public"} def test_respond_201_when_public_registration_is_enabled(client, settings, register_form): settings.PUBLIC_REGISTER_ENABLED = True response = client.post(reverse("auth-register"), register_form) assert response.status_code == 201 def test_respond_400_when_public_registration_is_disabled(client, register_form, settings): settings.PUBLIC_REGISTER_ENABLED = False response = client.post(reverse("auth-register"), register_form) assert response.status_code == 400 def test_respond_201_with_invitation_without_public_registration(client, register_form, settings): settings.PUBLIC_REGISTER_ENABLED = False user = factories.UserFactory() membership = factories.MembershipFactory(user=user) register_form.update({ "type": "private", "existing": "1", "token": membership.token, "username": user.username, "email": user.email, "password": user.username, }) response = client.post(reverse("auth-register"), register_form) assert response.status_code == 201, response.data def test_response_200_in_public_registration(client, settings): settings.PUBLIC_REGISTER_ENABLED = True form = { "type": "public", "username": "mmcfly", "full_name": "martin seamus mcfly", "email": "mmcfly@bttf.com", "password": "password", } response = client.post(reverse("auth-register"), form) assert response.status_code == 201 assert response.data["username"] == "mmcfly" assert response.data["email"] == "mmcfly@bttf.com" assert response.data["full_name"] == "martin seamus mcfly" assert len(mail.outbox) == 1 assert mail.outbox[0].subject == "You've been Taigatized!" def test_response_200_in_registration_with_github_account(client, settings): settings.PUBLIC_REGISTER_ENABLED = False form = {"type": "github", "code": "xxxxxx"} auth_data_model = apps.get_model("users", "AuthData") with patch("taiga_contrib_github_auth.connector.me") as m_me: m_me.return_value = ("mmcfly@bttf.com", github_connector.User(id=1955, username="mmcfly", full_name="martin seamus mcfly", bio="time traveler")) response = client.post(reverse("auth-list"), form) assert response.status_code == 200 assert response.data["username"] == "mmcfly" assert response.data["auth_token"] != "" and response.data["auth_token"] != None assert response.data["email"] == "mmcfly@bttf.com" assert response.data["full_name"] == "martin seamus mcfly" assert response.data["bio"] == "time traveler" assert auth_data_model.objects.filter(user__username="mmcfly", key="github", value="1955").count() == 1 def test_response_200_in_registration_with_github_account_and_existed_user_by_email(client, settings): settings.PUBLIC_REGISTER_ENABLED = False form = {"type": "github", "code": "xxxxxx"} user = factories.UserFactory() user.email = "mmcfly@bttf.com" user.save() with patch("taiga_contrib_github_auth.connector.me") as m_me: m_me.return_value = ("mmcfly@bttf.com", github_connector.User(id=1955, username="mmcfly", full_name="martin seamus mcfly", bio="time traveler")) response = client.post(reverse("auth-list"), form) assert response.status_code == 200 assert response.data["username"] == user.username assert response.data["auth_token"] != "" and response.data["auth_token"] != None assert response.data["email"] == user.email assert response.data["full_name"] == user.full_name assert response.data["bio"] == user.bio assert user.auth_data.filter(key="github", value="1955").count() == 1 def test_response_200_in_registration_with_github_account_and_existed_user_by_github_id(client, settings): settings.PUBLIC_REGISTER_ENABLED = False form = {"type": "github", "code": "xxxxxx"} user = factories.UserFactory.create() auth_data_model = apps.get_model("users", "AuthData") auth_data_model.objects.create(user=user, key="github", value="1955", extra={}) with patch("taiga_contrib_github_auth.connector.me") as m_me: m_me.return_value = ("mmcfly@bttf.com", github_connector.User(id=1955, username="mmcfly", full_name="martin seamus mcfly", bio="time traveler")) response = client.post(reverse("auth-list"), form) assert response.status_code == 200 assert response.data["username"] != "mmcfly" assert response.data["auth_token"] != "" and response.data["auth_token"] != None assert response.data["email"] != "mmcfly@bttf.com" assert response.data["full_name"] != "martin seamus mcfly" assert response.data["bio"] != "time traveler" def test_response_200_in_registration_with_github_account_and_change_github_username(client, settings): settings.PUBLIC_REGISTER_ENABLED = False form = {"type": "github", "code": "xxxxxx"} user = factories.UserFactory() user.username = "mmcfly" user.save() auth_data_model = apps.get_model("users", "AuthData") with patch("taiga_contrib_github_auth.connector.me") as m_me: m_me.return_value = ("mmcfly@bttf.com", github_connector.User(id=1955, username="mmcfly", full_name="martin seamus mcfly", bio="time traveler")) response = client.post(reverse("auth-list"), form) assert response.status_code == 200 assert response.data["username"] == "mmcfly-1" assert response.data["auth_token"] != "" and response.data["auth_token"] != None assert response.data["email"] == "mmcfly@bttf.com" assert response.data["full_name"] == "martin seamus mcfly" assert response.data["bio"] == "time traveler" assert auth_data_model.objects.filter(user__username="mmcfly-1", key="github", value="1955").count() == 1 def test_response_200_in_registration_with_github_account_in_a_project(client, settings): settings.PUBLIC_REGISTER_ENABLED = False membership_model = apps.get_model("projects", "Membership") membership = factories.MembershipFactory(user=None) form = {"type": "github", "code": "xxxxxx", "token": membership.token} with patch("taiga_contrib_github_auth.connector.me") as m_me: m_me.return_value = ("mmcfly@bttf.com", github_connector.User(id=1955, username="mmcfly", full_name="martin seamus mcfly", bio="time traveler")) response = client.post(reverse("auth-list"), form) assert response.status_code == 200 assert membership_model.objects.get(token=form["token"]).user.username == "mmcfly" def test_response_404_in_registration_with_github_in_a_project_with_invalid_token(client, settings): settings.PUBLIC_REGISTER_ENABLED = False form = {"type": "github", "code": "xxxxxx", "token": "123456"} with patch("taiga_contrib_github_auth.connector.me") as m_me: m_me.return_value = ("mmcfly@bttf.com", github_connector.User(id=1955, username="mmcfly", full_name="martin seamus mcfly", bio="time traveler")) response = client.post(reverse("auth-list"), form) assert response.status_code == 404 def test_respond_400_if_username_is_invalid(client, settings, register_form): settings.PUBLIC_REGISTER_ENABLED = True register_form.update({"username": "User Examp:/e"}) response = client.post(reverse("auth-register"), register_form) assert response.status_code == 400 register_form.update({"username": 300*"a"}) response = client.post(reverse("auth-register"), register_form) assert response.status_code == 400 def test_respond_400_if_username_or_email_is_duplicate(client, settings, register_form): settings.PUBLIC_REGISTER_ENABLED = True response = client.post(reverse("auth-register"), register_form) assert response.status_code == 201 register_form["username"] = "username" register_form["email"] = "ff@dd.com" response = client.post(reverse("auth-register"), register_form) assert response.status_code == 400