Fixing a lot of flake8 errors on tests

remotes/origin/enhancement/email-actions
Jesús Espino 2015-02-24 14:00:22 +01:00 committed by David Barragán Merino
parent 1ba41671b4
commit c328414b4d
50 changed files with 436 additions and 410 deletions

View File

@ -34,4 +34,3 @@ def pytest_runtest_setup(item):
def pytest_configure(config): def pytest_configure(config):
django.setup() django.setup()

View File

@ -83,6 +83,7 @@ def data():
return m return m
@pytest.fixture @pytest.fixture
def data_us(data): def data_us(data):
m = type("Models", (object,), {}) m = type("Models", (object,), {})
@ -97,6 +98,7 @@ def data_us(data):
content_object=m.private_user_story2) content_object=m.private_user_story2)
return m return m
@pytest.fixture @pytest.fixture
def data_task(data): def data_task(data):
m = type("Models", (object,), {}) m = type("Models", (object,), {})
@ -108,6 +110,7 @@ def data_task(data):
m.private_task2_attachment = f.TaskAttachmentFactory(project=data.private_project2, content_object=m.private_task2) m.private_task2_attachment = f.TaskAttachmentFactory(project=data.private_project2, content_object=m.private_task2)
return m return m
@pytest.fixture @pytest.fixture
def data_issue(data): def data_issue(data):
m = type("Models", (object,), {}) m = type("Models", (object,), {})
@ -119,6 +122,7 @@ def data_issue(data):
m.private_issue2_attachment = f.IssueAttachmentFactory(project=data.private_project2, content_object=m.private_issue2) m.private_issue2_attachment = f.IssueAttachmentFactory(project=data.private_project2, content_object=m.private_issue2)
return m return m
@pytest.fixture @pytest.fixture
def data_wiki(data): def data_wiki(data):
m = type("Models", (object,), {}) m = type("Models", (object,), {})
@ -130,6 +134,7 @@ def data_wiki(data):
m.private_wiki2_attachment = f.WikiAttachmentFactory(project=data.private_project2, content_object=m.private_wiki2) m.private_wiki2_attachment = f.WikiAttachmentFactory(project=data.private_project2, content_object=m.private_wiki2)
return m return m
def test_user_story_attachment_retrieve(client, data, data_us): def test_user_story_attachment_retrieve(client, data, data_us):
public_url = reverse('userstory-attachments-detail', kwargs={"pk": data_us.public_user_story_attachment.pk}) public_url = reverse('userstory-attachments-detail', kwargs={"pk": data_us.public_user_story_attachment.pk})
private_url1 = reverse('userstory-attachments-detail', kwargs={"pk": data_us.private_user_story1_attachment.pk}) private_url1 = reverse('userstory-attachments-detail', kwargs={"pk": data_us.private_user_story1_attachment.pk})
@ -507,6 +512,7 @@ def test_wiki_attachment_delete(client, data, data_wiki):
results = helper_test_http_method(client, 'delete', private_url2, None, users) results = helper_test_http_method(client, 'delete', private_url2, None, users)
assert results == [401, 403, 403, 204] assert results == [401, 403, 403, 204]
def test_user_story_attachment_create(client, data, data_us): def test_user_story_attachment_create(client, data, data_us):
url = reverse('userstory-attachments-list') url = reverse('userstory-attachments-list')

View File

@ -1,6 +1,5 @@
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from taiga.permissions.permissions import MEMBERS_PERMISSIONS, ANON_PERMISSIONS, USER_PERMISSIONS
from taiga.base.utils import json from taiga.base.utils import json
from tests import factories as f from tests import factories as f

View File

@ -75,6 +75,7 @@ def data():
is_owner=True) is_owner=True)
return m return m
@pytest.fixture @pytest.fixture
def data_us(data): def data_us(data):
m = type("Models", (object,), {}) m = type("Models", (object,), {})
@ -83,6 +84,7 @@ def data_us(data):
m.private_user_story2 = f.UserStoryFactory(project=data.private_project2, ref=9) m.private_user_story2 = f.UserStoryFactory(project=data.private_project2, ref=9)
return m return m
@pytest.fixture @pytest.fixture
def data_task(data): def data_task(data):
m = type("Models", (object,), {}) m = type("Models", (object,), {})
@ -91,6 +93,7 @@ def data_task(data):
m.private_task2 = f.TaskFactory(project=data.private_project2, ref=10) m.private_task2 = f.TaskFactory(project=data.private_project2, ref=10)
return m return m
@pytest.fixture @pytest.fixture
def data_issue(data): def data_issue(data):
m = type("Models", (object,), {}) m = type("Models", (object,), {})
@ -99,6 +102,7 @@ def data_issue(data):
m.private_issue2 = f.IssueFactory(project=data.private_project2, ref=11) m.private_issue2 = f.IssueFactory(project=data.private_project2, ref=11)
return m return m
@pytest.fixture @pytest.fixture
def data_wiki(data): def data_wiki(data):
m = type("Models", (object,), {}) m = type("Models", (object,), {})

View File

@ -135,7 +135,7 @@ def test_issue_update(client, data):
data.project_owner data.project_owner
] ]
with mock.patch.object(OCCResourceMixin, "_validate_and_update_version") as _validate_and_update_version_mock: with mock.patch.object(OCCResourceMixin, "_validate_and_update_version"):
issue_data = IssueSerializer(data.public_issue).data issue_data = IssueSerializer(data.public_issue).data
issue_data["subject"] = "test" issue_data["subject"] = "test"
issue_data = json.dumps(issue_data) issue_data = json.dumps(issue_data)
@ -285,7 +285,7 @@ def test_issue_patch(client, data):
data.project_owner data.project_owner
] ]
with mock.patch.object(OCCResourceMixin, "_validate_and_update_version") as _validate_and_update_version_mock: with mock.patch.object(OCCResourceMixin, "_validate_and_update_version"):
patch_data = json.dumps({"subject": "test", "version": data.public_issue.version}) patch_data = json.dumps({"subject": "test", "version": data.public_issue.version})
results = helper_test_http_method(client, 'patch', public_url, patch_data, users) results = helper_test_http_method(client, 'patch', public_url, patch_data, users)
assert results == [401, 403, 403, 200, 200] assert results == [401, 403, 403, 200, 200]
@ -412,6 +412,7 @@ def test_issue_voters_list(client, data):
results = helper_test_http_method(client, 'get', private_url2, None, users) results = helper_test_http_method(client, 'get', private_url2, None, users)
assert results == [401, 403, 403, 200, 200] assert results == [401, 403, 403, 200, 200]
def test_issue_voters_retrieve(client, data): def test_issue_voters_retrieve(client, data):
add_vote(data.public_issue, data.project_owner) add_vote(data.public_issue, data.project_owner)
public_url = reverse('issue-voters-detail', kwargs={"issue_id": data.public_issue.pk, "pk": data.project_owner.pk}) public_url = reverse('issue-voters-detail', kwargs={"issue_id": data.public_issue.pk, "pk": data.project_owner.pk})

View File

@ -1489,6 +1489,7 @@ def test_membership_patch(client, data):
results = helper_test_http_method(client, 'patch', private2_url, '{"name": "Test"}', users) results = helper_test_http_method(client, 'patch', private2_url, '{"name": "Test"}', users)
assert results == [401, 403, 403, 403, 200] assert results == [401, 403, 403, 403, 200]
def test_membership_create(client, data): def test_membership_create(client, data):
url = reverse('memberships-list') url = reverse('memberships-list')

View File

@ -1,6 +1,5 @@
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from taiga.base.utils import json
from taiga.permissions.permissions import MEMBERS_PERMISSIONS, ANON_PERMISSIONS, USER_PERMISSIONS from taiga.permissions.permissions import MEMBERS_PERMISSIONS, ANON_PERMISSIONS, USER_PERMISSIONS
from tests import factories as f from tests import factories as f

View File

@ -1,6 +1,5 @@
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from taiga.projects.issues.serializers import IssueSerializer
from taiga.permissions.permissions import MEMBERS_PERMISSIONS, ANON_PERMISSIONS, USER_PERMISSIONS from taiga.permissions.permissions import MEMBERS_PERMISSIONS, ANON_PERMISSIONS, USER_PERMISSIONS
from tests import factories as f from tests import factories as f

View File

@ -1,8 +1,6 @@
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from taiga.base.utils import json from taiga.base.utils import json
from taiga.permissions.permissions import MEMBERS_PERMISSIONS, ANON_PERMISSIONS, USER_PERMISSIONS
from taiga.projects.votes.services import add_vote
from taiga.userstorage.serializers import StorageEntrySerializer from taiga.userstorage.serializers import StorageEntrySerializer
from taiga.userstorage.models import StorageEntry from taiga.userstorage.models import StorageEntry

View File

@ -135,7 +135,7 @@ def test_task_update(client, data):
data.project_owner data.project_owner
] ]
with mock.patch.object(OCCResourceMixin, "_validate_and_update_version") as _validate_and_update_version_mock: with mock.patch.object(OCCResourceMixin, "_validate_and_update_version"):
task_data = TaskSerializer(data.public_task).data task_data = TaskSerializer(data.public_task).data
task_data["subject"] = "test" task_data["subject"] = "test"
task_data = json.dumps(task_data) task_data = json.dumps(task_data)
@ -256,7 +256,7 @@ def test_task_patch(client, data):
data.project_owner data.project_owner
] ]
with mock.patch.object(OCCResourceMixin, "_validate_and_update_version") as _validate_and_update_version_mock: with mock.patch.object(OCCResourceMixin, "_validate_and_update_version"):
patch_data = json.dumps({"subject": "test", "version": data.public_task.version}) patch_data = json.dumps({"subject": "test", "version": data.public_task.version})
results = helper_test_http_method(client, 'patch', public_url, patch_data, users) results = helper_test_http_method(client, 'patch', public_url, patch_data, users)
assert results == [401, 403, 403, 200, 200] assert results == [401, 403, 403, 200, 200]

View File

@ -148,6 +148,7 @@ def test_user_patch(client, data):
results = helper_test_http_method(client, 'patch', url, patch_data, users) results = helper_test_http_method(client, 'patch', url, patch_data, users)
assert results == [401, 200, 403, 200] assert results == [401, 200, 403, 200]
def test_user_action_change_password(client, data): def test_user_action_change_password(client, data):
url = reverse('users-change-password') url = reverse('users-change-password')
@ -165,7 +166,6 @@ def test_user_action_change_password(client, data):
data.superuser, data.superuser,
] ]
post_data = json.dumps({"current_password": "test-current-password", "password": "test-password"}) post_data = json.dumps({"current_password": "test-current-password", "password": "test-password"})
results = helper_test_http_method(client, 'post', url, post_data, users) results = helper_test_http_method(client, 'post', url, post_data, users)
assert results == [401, 204, 204, 204] assert results == [401, 204, 204, 204]
@ -236,6 +236,7 @@ def test_user_action_change_password_from_recovery(client, data):
results = helper_test_http_method(client, 'post', url, patch_data, users, reset_token) results = helper_test_http_method(client, 'post', url, patch_data, users, reset_token)
assert results == [204, 204, 204, 204] assert results == [204, 204, 204, 204]
def test_user_action_password_recovery(client, data): def test_user_action_password_recovery(client, data):
url = reverse('users-password-recovery') url = reverse('users-password-recovery')
@ -252,6 +253,7 @@ def test_user_action_password_recovery(client, data):
results = helper_test_http_method(client, 'post', url, patch_data, users) results = helper_test_http_method(client, 'post', url, patch_data, users)
assert results == [200, 200, 200, 200] assert results == [200, 200, 200, 200]
def test_user_action_change_email(client, data): def test_user_action_change_email(client, data):
url = reverse('users-change-email') url = reverse('users-change-email')

View File

@ -133,7 +133,7 @@ def test_user_story_update(client, data):
data.project_owner data.project_owner
] ]
with mock.patch.object(OCCResourceMixin, "_validate_and_update_version") as _validate_and_update_version_mock: with mock.patch.object(OCCResourceMixin, "_validate_and_update_version"):
user_story_data = UserStorySerializer(data.public_user_story).data user_story_data = UserStorySerializer(data.public_user_story).data
user_story_data["subject"] = "test" user_story_data["subject"] = "test"
user_story_data = json.dumps(user_story_data) user_story_data = json.dumps(user_story_data)
@ -239,7 +239,7 @@ def test_user_story_patch(client, data):
data.project_owner data.project_owner
] ]
with mock.patch.object(OCCResourceMixin, "_validate_and_update_version") as _validate_and_update_version_mock: with mock.patch.object(OCCResourceMixin, "_validate_and_update_version"):
patch_data = json.dumps({"subject": "test", "version": data.public_user_story.version}) patch_data = json.dumps({"subject": "test", "version": data.public_user_story.version})
results = helper_test_http_method(client, 'patch', public_url, patch_data, users) results = helper_test_http_method(client, 'patch', public_url, patch_data, users)
assert results == [401, 403, 403, 200, 200] assert results == [401, 403, 403, 200, 200]

View File

@ -3,7 +3,6 @@ from django.core.urlresolvers import reverse
from taiga.base.utils import json from taiga.base.utils import json
from taiga.webhooks.serializers import WebhookSerializer from taiga.webhooks.serializers import WebhookSerializer
from taiga.webhooks.models import Webhook from taiga.webhooks.models import Webhook
from taiga.webhooks import tasks
from tests import factories as f from tests import factories as f
from tests.utils import helper_test_http_method, disconnect_signals, reconnect_signals from tests.utils import helper_test_http_method, disconnect_signals, reconnect_signals
@ -187,12 +186,12 @@ def test_webhook_action_test(client, data):
with mock.patch('taiga.webhooks.tasks._send_request') as _send_request_mock: with mock.patch('taiga.webhooks.tasks._send_request') as _send_request_mock:
results = helper_test_http_method(client, 'post', url1, None, users) results = helper_test_http_method(client, 'post', url1, None, users)
assert results == [404, 404, 200] assert results == [404, 404, 200]
assert _send_request_mock.called == True assert _send_request_mock.called is True
with mock.patch('taiga.webhooks.tasks._send_request') as _send_request_mock: with mock.patch('taiga.webhooks.tasks._send_request') as _send_request_mock:
results = helper_test_http_method(client, 'post', url2, None, users) results = helper_test_http_method(client, 'post', url2, None, users)
assert results == [404, 404, 404] assert results == [404, 404, 404]
assert _send_request_mock.called == False assert _send_request_mock.called is False
def test_webhooklogs_list(client, data): def test_webhooklogs_list(client, data):

View File

@ -124,7 +124,7 @@ def test_wiki_page_update(client, data):
data.project_owner data.project_owner
] ]
with mock.patch.object(OCCResourceMixin, "_validate_and_update_version") as _validate_and_update_version_mock: with mock.patch.object(OCCResourceMixin, "_validate_and_update_version"):
wiki_page_data = WikiPageSerializer(data.public_wiki_page).data wiki_page_data = WikiPageSerializer(data.public_wiki_page).data
wiki_page_data["content"] = "test" wiki_page_data["content"] = "test"
wiki_page_data = json.dumps(wiki_page_data) wiki_page_data = json.dumps(wiki_page_data)
@ -242,7 +242,7 @@ def test_wiki_page_patch(client, data):
data.project_owner data.project_owner
] ]
with mock.patch.object(OCCResourceMixin, "_validate_and_update_version") as _validate_and_update_version_mock: with mock.patch.object(OCCResourceMixin, "_validate_and_update_version"):
patch_data = json.dumps({"content": "test", "version": data.public_wiki_page.version}) patch_data = json.dumps({"content": "test", "version": data.public_wiki_page.version})
results = helper_test_http_method(client, 'patch', public_url, patch_data, users) results = helper_test_http_method(client, 'patch', public_url, patch_data, users)
assert results == [401, 200, 200, 200, 200] assert results == [401, 200, 200, 200, 200]
@ -255,6 +255,7 @@ def test_wiki_page_patch(client, data):
results = helper_test_http_method(client, 'patch', private_url2, patch_data, users) results = helper_test_http_method(client, 'patch', private_url2, patch_data, users)
assert results == [401, 403, 403, 200, 200] assert results == [401, 403, 403, 200, 200]
def test_wiki_page_action_render(client, data): def test_wiki_page_action_render(client, data):
url = reverse('wiki-render') url = reverse('wiki-render')
@ -305,7 +306,7 @@ def test_wiki_link_update(client, data):
data.project_owner data.project_owner
] ]
with mock.patch.object(OCCResourceMixin, "_validate_and_update_version") as _validate_and_update_version_mock: with mock.patch.object(OCCResourceMixin, "_validate_and_update_version"):
wiki_link_data = WikiLinkSerializer(data.public_wiki_link).data wiki_link_data = WikiLinkSerializer(data.public_wiki_link).data
wiki_link_data["title"] = "test" wiki_link_data["title"] = "test"
wiki_link_data = json.dumps(wiki_link_data) wiki_link_data = json.dumps(wiki_link_data)
@ -423,7 +424,7 @@ def test_wiki_link_patch(client, data):
data.project_owner data.project_owner
] ]
with mock.patch.object(OCCResourceMixin, "_validate_and_update_version") as _validate_and_update_version_mock: with mock.patch.object(OCCResourceMixin, "_validate_and_update_version"):
patch_data = json.dumps({"title": "test"}) patch_data = json.dumps({"title": "test"})
results = helper_test_http_method(client, 'patch', public_url, patch_data, users) results = helper_test_http_method(client, 'patch', public_url, patch_data, users)
assert results == [401, 200, 200, 200, 200] assert results == [401, 200, 200, 200, 200]

View File

@ -1,10 +1,8 @@
import pytest import pytest
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.core.files.base import File
from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile
from taiga.projects.attachments.serializers import AttachmentSerializer
from .. import factories as f from .. import factories as f
pytestmark = pytest.mark.django_db pytestmark = pytest.mark.django_db
@ -15,7 +13,7 @@ def test_create_user_story_attachment_without_file(client):
Bug test "Don't create attachments without attached_file" Bug test "Don't create attachments without attached_file"
""" """
us = f.UserStoryFactory.create() us = f.UserStoryFactory.create()
membership = f.MembershipFactory(project=us.project, user=us.owner, is_owner=True) f.MembershipFactory(project=us.project, user=us.owner, is_owner=True)
attachment_data = { attachment_data = {
"description": "test", "description": "test",
"attached_file": None, "attached_file": None,
@ -32,7 +30,7 @@ def test_create_user_story_attachment_without_file(client):
def test_create_attachment_on_wrong_project(client): def test_create_attachment_on_wrong_project(client):
issue1 = f.create_issue() issue1 = f.create_issue()
issue2 = f.create_issue(owner=issue1.owner) issue2 = f.create_issue(owner=issue1.owner)
membership = f.MembershipFactory(project=issue1.project, user=issue1.owner, is_owner=True) f.MembershipFactory(project=issue1.project, user=issue1.owner, is_owner=True)
assert issue1.owner == issue2.owner assert issue1.owner == issue2.owner
assert issue1.project.owner == issue2.project.owner assert issue1.project.owner == issue2.project.owner

View File

@ -1,7 +1,6 @@
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from tests import factories as f from tests import factories as f
from tests.utils import helper_test_http_method
from taiga.base.utils import json from taiga.base.utils import json

View File

@ -16,7 +16,6 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import pytest import pytest
from unittest.mock import MagicMock
from unittest.mock import patch from unittest.mock import patch
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
@ -83,6 +82,7 @@ def test_take_two_snapshots_without_changes():
assert qs_created.count() == 1 assert qs_created.count() == 1
assert qs_hidden.count() == 0 assert qs_hidden.count() == 0
def test_take_snapshot_from_deleted_object(): def test_take_snapshot_from_deleted_object():
issue = f.IssueFactory.create() issue = f.IssueFactory.create()
@ -143,7 +143,7 @@ def test_issue_resource_history_test(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
role = f.RoleFactory.create(project=project) role = f.RoleFactory.create(project=project)
membership = f.MembershipFactory.create(project=project, user=user, role=role, is_owner=True) f.MembershipFactory.create(project=project, user=user, role=role, is_owner=True)
issue = f.IssueFactory.create(owner=user, project=project) issue = f.IssueFactory.create(owner=user, project=project)
mock_path = "taiga.projects.issues.api.IssueViewSet.pre_conditions_on_save" mock_path = "taiga.projects.issues.api.IssueViewSet.pre_conditions_on_save"
@ -158,7 +158,7 @@ def test_issue_resource_history_test(client):
assert qs_all.count() == 0 assert qs_all.count() == 0
with patch(mock_path) as m: with patch(mock_path):
data = {"subject": "Fooooo", "version": issue.version} data = {"subject": "Fooooo", "version": issue.version}
response = client.patch(url, json.dumps(data), content_type="application/json") response = client.patch(url, json.dumps(data), content_type="application/json")
assert response.status_code == 200 assert response.status_code == 200
@ -168,7 +168,7 @@ def test_issue_resource_history_test(client):
assert qs_changed.count() == 0 assert qs_changed.count() == 0
assert qs_deleted.count() == 0 assert qs_deleted.count() == 0
with patch(mock_path) as m: with patch(mock_path):
response = client.delete(url) response = client.delete(url)
assert response.status_code == 204 assert response.status_code == 204
@ -200,7 +200,7 @@ def test_take_hidden_snapshot():
def test_history_with_only_comment_shouldnot_be_hidden(client): def test_history_with_only_comment_shouldnot_be_hidden(client):
project = f.create_project() project = f.create_project()
us = f.create_userstory(project=project) us = f.create_userstory(project=project)
membership = f.MembershipFactory.create(project=project, user=project.owner, is_owner=True) f.MembershipFactory.create(project=project, user=project.owner, is_owner=True)
qs_all = HistoryEntry.objects.all() qs_all = HistoryEntry.objects.all()
qs_hidden = qs_all.filter(is_hidden=True) qs_hidden = qs_all.filter(is_hidden=True)
@ -221,7 +221,7 @@ def test_history_with_only_comment_shouldnot_be_hidden(client):
def test_delete_comment_by_project_owner(client): def test_delete_comment_by_project_owner(client):
project = f.create_project() project = f.create_project()
us = f.create_userstory(project=project) us = f.create_userstory(project=project)
membership = f.MembershipFactory.create(project=project, user=project.owner, is_owner=True) f.MembershipFactory.create(project=project, user=project.owner, is_owner=True)
key = make_key_from_model_object(us) key = make_key_from_model_object(us)
history_entry = f.HistoryEntryFactory.create(type=HistoryType.change, history_entry = f.HistoryEntryFactory.create(type=HistoryType.change,
comment="testing", comment="testing",

View File

@ -14,15 +14,12 @@ from taiga.hooks.exceptions import ActionSyntaxException
from taiga.projects.issues.models import Issue from taiga.projects.issues.models import Issue
from taiga.projects.tasks.models import Task from taiga.projects.tasks.models import Task
from taiga.projects.userstories.models import UserStory from taiga.projects.userstories.models import UserStory
from taiga.projects.models import Membership
from taiga.projects.history.services import get_history_queryset_by_model_instance, take_snapshot
from taiga.projects.notifications.choices import NotifyLevel
from taiga.projects.notifications.models import NotifyPolicy
from taiga.projects import services from taiga.projects import services
from .. import factories as f from .. import factories as f
pytestmark = pytest.mark.django_db pytestmark = pytest.mark.django_db
def test_bad_signature(client): def test_bad_signature(client):
project = f.ProjectFactory() project = f.ProjectFactory()
f.ProjectModulesConfigFactory(project=project, config={ f.ProjectModulesConfigFactory(project=project, config={
@ -57,6 +54,7 @@ def test_ok_signature(client):
REMOTE_ADDR=settings.BITBUCKET_VALID_ORIGIN_IPS[0]) REMOTE_ADDR=settings.BITBUCKET_VALID_ORIGIN_IPS[0])
assert response.status_code == 204 assert response.status_code == 204
def test_invalid_ip(client): def test_invalid_ip(client):
project = f.ProjectFactory() project = f.ProjectFactory()
f.ProjectModulesConfigFactory(project=project, config={ f.ProjectModulesConfigFactory(project=project, config={
@ -114,7 +112,7 @@ def test_push_event_detected(client):
def test_push_event_issue_processing(client): def test_push_event_issue_processing(client):
creation_status = f.IssueStatusFactory() creation_status = f.IssueStatusFactory()
role = f.RoleFactory(project=creation_status.project, permissions=["view_issues"]) role = f.RoleFactory(project=creation_status.project, permissions=["view_issues"])
membership = f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner)
new_status = f.IssueStatusFactory(project=creation_status.project) new_status = f.IssueStatusFactory(project=creation_status.project)
issue = f.IssueFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) issue = f.IssueFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner)
payload = [ payload = [
@ -131,7 +129,7 @@ def test_push_event_issue_processing(client):
def test_push_event_task_processing(client): def test_push_event_task_processing(client):
creation_status = f.TaskStatusFactory() creation_status = f.TaskStatusFactory()
role = f.RoleFactory(project=creation_status.project, permissions=["view_tasks"]) role = f.RoleFactory(project=creation_status.project, permissions=["view_tasks"])
membership = f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner)
new_status = f.TaskStatusFactory(project=creation_status.project) new_status = f.TaskStatusFactory(project=creation_status.project)
task = f.TaskFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) task = f.TaskFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner)
payload = [ payload = [
@ -148,7 +146,7 @@ def test_push_event_task_processing(client):
def test_push_event_user_story_processing(client): def test_push_event_user_story_processing(client):
creation_status = f.UserStoryStatusFactory() creation_status = f.UserStoryStatusFactory()
role = f.RoleFactory(project=creation_status.project, permissions=["view_us"]) role = f.RoleFactory(project=creation_status.project, permissions=["view_us"])
membership = f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner)
new_status = f.UserStoryStatusFactory(project=creation_status.project) new_status = f.UserStoryStatusFactory(project=creation_status.project)
user_story = f.UserStoryFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) user_story = f.UserStoryFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner)
payload = [ payload = [
@ -165,7 +163,7 @@ def test_push_event_user_story_processing(client):
def test_push_event_processing_case_insensitive(client): def test_push_event_processing_case_insensitive(client):
creation_status = f.TaskStatusFactory() creation_status = f.TaskStatusFactory()
role = f.RoleFactory(project=creation_status.project, permissions=["view_tasks"]) role = f.RoleFactory(project=creation_status.project, permissions=["view_tasks"])
membership = f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner)
new_status = f.TaskStatusFactory(project=creation_status.project) new_status = f.TaskStatusFactory(project=creation_status.project)
task = f.TaskFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) task = f.TaskFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner)
payload = [ payload = [
@ -227,7 +225,7 @@ def test_push_event_bad_processing_non_existing_status(client):
def test_api_get_project_modules(client): def test_api_get_project_modules(client):
project = f.create_project() project = f.create_project()
membership = f.MembershipFactory(project=project, user=project.owner, is_owner=True) f.MembershipFactory(project=project, user=project.owner, is_owner=True)
url = reverse("projects-modules", args=(project.id,)) url = reverse("projects-modules", args=(project.id,))
@ -242,7 +240,7 @@ def test_api_get_project_modules(client):
def test_api_patch_project_modules(client): def test_api_patch_project_modules(client):
project = f.create_project() project = f.create_project()
membership = f.MembershipFactory(project=project, user=project.owner, is_owner=True) f.MembershipFactory(project=project, user=project.owner, is_owner=True)
url = reverse("projects-modules", args=(project.id,)) url = reverse("projects-modules", args=(project.id,))
@ -261,6 +259,7 @@ def test_api_patch_project_modules(client):
assert config["bitbucket"]["secret"] == "test_secret" assert config["bitbucket"]["secret"] == "test_secret"
assert config["bitbucket"]["webhooks_url"] != "test_url" assert config["bitbucket"]["webhooks_url"] != "test_url"
def test_replace_bitbucket_references(): def test_replace_bitbucket_references():
assert event_hooks.replace_bitbucket_references("project-url", "#2") == "[BitBucket#2](project-url/issues/2)" assert event_hooks.replace_bitbucket_references("project-url", "#2") == "[BitBucket#2](project-url/issues/2)"
assert event_hooks.replace_bitbucket_references("project-url", "#2 ") == "[BitBucket#2](project-url/issues/2) " assert event_hooks.replace_bitbucket_references("project-url", "#2 ") == "[BitBucket#2](project-url/issues/2) "

View File

@ -76,7 +76,7 @@ def test_push_event_detected(client):
def test_push_event_issue_processing(client): def test_push_event_issue_processing(client):
creation_status = f.IssueStatusFactory() creation_status = f.IssueStatusFactory()
role = f.RoleFactory(project=creation_status.project, permissions=["view_issues"]) role = f.RoleFactory(project=creation_status.project, permissions=["view_issues"])
membership = f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner)
new_status = f.IssueStatusFactory(project=creation_status.project) new_status = f.IssueStatusFactory(project=creation_status.project)
issue = f.IssueFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) issue = f.IssueFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner)
payload = {"commits": [ payload = {"commits": [
@ -96,7 +96,7 @@ def test_push_event_issue_processing(client):
def test_push_event_task_processing(client): def test_push_event_task_processing(client):
creation_status = f.TaskStatusFactory() creation_status = f.TaskStatusFactory()
role = f.RoleFactory(project=creation_status.project, permissions=["view_tasks"]) role = f.RoleFactory(project=creation_status.project, permissions=["view_tasks"])
membership = f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner)
new_status = f.TaskStatusFactory(project=creation_status.project) new_status = f.TaskStatusFactory(project=creation_status.project)
task = f.TaskFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) task = f.TaskFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner)
payload = {"commits": [ payload = {"commits": [
@ -116,7 +116,7 @@ def test_push_event_task_processing(client):
def test_push_event_user_story_processing(client): def test_push_event_user_story_processing(client):
creation_status = f.UserStoryStatusFactory() creation_status = f.UserStoryStatusFactory()
role = f.RoleFactory(project=creation_status.project, permissions=["view_us"]) role = f.RoleFactory(project=creation_status.project, permissions=["view_us"])
membership = f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner)
new_status = f.UserStoryStatusFactory(project=creation_status.project) new_status = f.UserStoryStatusFactory(project=creation_status.project)
user_story = f.UserStoryFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) user_story = f.UserStoryFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner)
payload = {"commits": [ payload = {"commits": [
@ -137,7 +137,7 @@ def test_push_event_user_story_processing(client):
def test_push_event_processing_case_insensitive(client): def test_push_event_processing_case_insensitive(client):
creation_status = f.TaskStatusFactory() creation_status = f.TaskStatusFactory()
role = f.RoleFactory(project=creation_status.project, permissions=["view_tasks"]) role = f.RoleFactory(project=creation_status.project, permissions=["view_tasks"])
membership = f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner)
new_status = f.TaskStatusFactory(project=creation_status.project) new_status = f.TaskStatusFactory(project=creation_status.project)
task = f.TaskFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) task = f.TaskFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner)
payload = {"commits": [ payload = {"commits": [
@ -244,6 +244,7 @@ def test_issues_event_opened_issue(client):
assert Issue.objects.count() == 2 assert Issue.objects.count() == 2
assert len(mail.outbox) == 1 assert len(mail.outbox) == 1
def test_issues_event_other_than_opened_issue(client): def test_issues_event_other_than_opened_issue(client):
issue = f.IssueFactory.create() issue = f.IssueFactory.create()
issue.project.default_issue_status = issue.status issue.project.default_issue_status = issue.status
@ -271,6 +272,7 @@ def test_issues_event_other_than_opened_issue(client):
assert Issue.objects.count() == 1 assert Issue.objects.count() == 1
assert len(mail.outbox) == 0 assert len(mail.outbox) == 0
def test_issues_event_bad_issue(client): def test_issues_event_bad_issue(client):
issue = f.IssueFactory.create() issue = f.IssueFactory.create()
issue.project.default_issue_status = issue.status issue.project.default_issue_status = issue.status
@ -301,7 +303,7 @@ def test_issues_event_bad_issue(client):
def test_issue_comment_event_on_existing_issue_task_and_us(client): def test_issue_comment_event_on_existing_issue_task_and_us(client):
project = f.ProjectFactory() project = f.ProjectFactory()
role = f.RoleFactory(project=project, permissions=["view_tasks", "view_issues", "view_us"]) role = f.RoleFactory(project=project, permissions=["view_tasks", "view_issues", "view_us"])
membership = f.MembershipFactory(project=project, role=role, user=project.owner) f.MembershipFactory(project=project, role=role, user=project.owner)
user = f.UserFactory() user = f.UserFactory()
issue = f.IssueFactory.create(external_reference=["github", "http://github.com/test/project/issues/11"], owner=project.owner, project=project) issue = f.IssueFactory.create(external_reference=["github", "http://github.com/test/project/issues/11"], owner=project.owner, project=project)
@ -412,7 +414,7 @@ def test_issues_event_bad_comment(client):
def test_api_get_project_modules(client): def test_api_get_project_modules(client):
project = f.create_project() project = f.create_project()
membership = f.MembershipFactory(project=project, user=project.owner, is_owner=True) f.MembershipFactory(project=project, user=project.owner, is_owner=True)
url = reverse("projects-modules", args=(project.id,)) url = reverse("projects-modules", args=(project.id,))
@ -427,7 +429,7 @@ def test_api_get_project_modules(client):
def test_api_patch_project_modules(client): def test_api_patch_project_modules(client):
project = f.create_project() project = f.create_project()
membership = f.MembershipFactory(project=project, user=project.owner, is_owner=True) f.MembershipFactory(project=project, user=project.owner, is_owner=True)
url = reverse("projects-modules", args=(project.id,)) url = reverse("projects-modules", args=(project.id,))
@ -446,6 +448,7 @@ def test_api_patch_project_modules(client):
assert config["github"]["secret"] == "test_secret" assert config["github"]["secret"] == "test_secret"
assert config["github"]["webhooks_url"] != "test_url" assert config["github"]["webhooks_url"] != "test_url"
def test_replace_github_references(): def test_replace_github_references():
assert event_hooks.replace_github_references("project-url", "#2") == "[GitHub#2](project-url/issues/2)" assert event_hooks.replace_github_references("project-url", "#2") == "[GitHub#2](project-url/issues/2)"
assert event_hooks.replace_github_references("project-url", "#2 ") == "[GitHub#2](project-url/issues/2) " assert event_hooks.replace_github_references("project-url", "#2 ") == "[GitHub#2](project-url/issues/2) "

View File

@ -13,7 +13,6 @@ from taiga.projects.issues.models import Issue
from taiga.projects.tasks.models import Task from taiga.projects.tasks.models import Task
from taiga.projects.userstories.models import UserStory from taiga.projects.userstories.models import UserStory
from taiga.projects.models import Membership from taiga.projects.models import Membership
from taiga.projects.history.services import get_history_queryset_by_model_instance, take_snapshot
from taiga.projects.notifications.choices import NotifyLevel from taiga.projects.notifications.choices import NotifyLevel
from taiga.projects.notifications.models import NotifyPolicy from taiga.projects.notifications.models import NotifyPolicy
from taiga.projects import services from taiga.projects import services
@ -21,6 +20,7 @@ from .. import factories as f
pytestmark = pytest.mark.django_db pytestmark = pytest.mark.django_db
def test_bad_signature(client): def test_bad_signature(client):
project = f.ProjectFactory() project = f.ProjectFactory()
f.ProjectModulesConfigFactory(project=project, config={ f.ProjectModulesConfigFactory(project=project, config={
@ -121,7 +121,7 @@ def test_push_event_detected(client):
def test_push_event_issue_processing(client): def test_push_event_issue_processing(client):
creation_status = f.IssueStatusFactory() creation_status = f.IssueStatusFactory()
role = f.RoleFactory(project=creation_status.project, permissions=["view_issues"]) role = f.RoleFactory(project=creation_status.project, permissions=["view_issues"])
membership = f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner)
new_status = f.IssueStatusFactory(project=creation_status.project) new_status = f.IssueStatusFactory(project=creation_status.project)
issue = f.IssueFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) issue = f.IssueFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner)
payload = {"commits": [ payload = {"commits": [
@ -141,7 +141,7 @@ def test_push_event_issue_processing(client):
def test_push_event_task_processing(client): def test_push_event_task_processing(client):
creation_status = f.TaskStatusFactory() creation_status = f.TaskStatusFactory()
role = f.RoleFactory(project=creation_status.project, permissions=["view_tasks"]) role = f.RoleFactory(project=creation_status.project, permissions=["view_tasks"])
membership = f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner)
new_status = f.TaskStatusFactory(project=creation_status.project) new_status = f.TaskStatusFactory(project=creation_status.project)
task = f.TaskFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) task = f.TaskFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner)
payload = {"commits": [ payload = {"commits": [
@ -161,7 +161,7 @@ def test_push_event_task_processing(client):
def test_push_event_user_story_processing(client): def test_push_event_user_story_processing(client):
creation_status = f.UserStoryStatusFactory() creation_status = f.UserStoryStatusFactory()
role = f.RoleFactory(project=creation_status.project, permissions=["view_us"]) role = f.RoleFactory(project=creation_status.project, permissions=["view_us"])
membership = f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner)
new_status = f.UserStoryStatusFactory(project=creation_status.project) new_status = f.UserStoryStatusFactory(project=creation_status.project)
user_story = f.UserStoryFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) user_story = f.UserStoryFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner)
payload = {"commits": [ payload = {"commits": [
@ -182,7 +182,7 @@ def test_push_event_user_story_processing(client):
def test_push_event_processing_case_insensitive(client): def test_push_event_processing_case_insensitive(client):
creation_status = f.TaskStatusFactory() creation_status = f.TaskStatusFactory()
role = f.RoleFactory(project=creation_status.project, permissions=["view_tasks"]) role = f.RoleFactory(project=creation_status.project, permissions=["view_tasks"])
membership = f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner) f.MembershipFactory(project=creation_status.project, role=role, user=creation_status.project.owner)
new_status = f.TaskStatusFactory(project=creation_status.project) new_status = f.TaskStatusFactory(project=creation_status.project)
task = f.TaskFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner) task = f.TaskFactory.create(status=creation_status, project=creation_status.project, owner=creation_status.project.owner)
payload = {"commits": [ payload = {"commits": [
@ -342,7 +342,7 @@ def test_issues_event_bad_issue(client):
def test_api_get_project_modules(client): def test_api_get_project_modules(client):
project = f.create_project() project = f.create_project()
membership = f.MembershipFactory(project=project, user=project.owner, is_owner=True) f.MembershipFactory(project=project, user=project.owner, is_owner=True)
url = reverse("projects-modules", args=(project.id,)) url = reverse("projects-modules", args=(project.id,))
@ -357,7 +357,7 @@ def test_api_get_project_modules(client):
def test_api_patch_project_modules(client): def test_api_patch_project_modules(client):
project = f.create_project() project = f.create_project()
membership = f.MembershipFactory(project=project, user=project.owner, is_owner=True) f.MembershipFactory(project=project, user=project.owner, is_owner=True)
url = reverse("projects-modules", args=(project.id,)) url = reverse("projects-modules", args=(project.id,))
@ -376,6 +376,7 @@ def test_api_patch_project_modules(client):
assert config["gitlab"]["secret"] == "test_secret" assert config["gitlab"]["secret"] == "test_secret"
assert config["gitlab"]["webhooks_url"] != "test_url" assert config["gitlab"]["webhooks_url"] != "test_url"
def test_replace_gitlab_references(): def test_replace_gitlab_references():
assert event_hooks.replace_gitlab_references("project-url", "#2") == "[GitLab#2](project-url/issues/2)" assert event_hooks.replace_gitlab_references("project-url", "#2") == "[GitLab#2](project-url/issues/2)"
assert event_hooks.replace_gitlab_references("project-url", "#2 ") == "[GitLab#2](project-url/issues/2) " assert event_hooks.replace_gitlab_references("project-url", "#2 ") == "[GitLab#2](project-url/issues/2) "

View File

@ -16,7 +16,6 @@
import pytest import pytest
import base64 import base64
import datetime
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
@ -30,9 +29,6 @@ from taiga.projects.userstories.models import UserStory
from taiga.projects.tasks.models import Task from taiga.projects.tasks.models import Task
from taiga.projects.wiki.models import WikiPage from taiga.projects.wiki.models import WikiPage
from taiga.export_import.service import project_to_dict
from taiga.export_import.dump_service import dict_to_project
pytestmark = pytest.mark.django_db pytestmark = pytest.mark.django_db
@ -46,6 +42,7 @@ def test_invalid_project_import(client):
response = client.post(url, json.dumps(data), content_type="application/json") response = client.post(url, json.dumps(data), content_type="application/json")
assert response.status_code == 400 assert response.status_code == 400
def test_valid_project_import_without_extra_data(client): def test_valid_project_import_without_extra_data(client):
user = f.UserFactory.create() user = f.UserFactory.create()
client.login(user) client.login(user)
@ -68,6 +65,7 @@ def test_valid_project_import_without_extra_data(client):
assert all(map(lambda x: len(response_data[x]) == 0, must_empty_children)) assert all(map(lambda x: len(response_data[x]) == 0, must_empty_children))
assert response_data["owner"] == user.email assert response_data["owner"] == user.email
def test_valid_project_import_with_not_existing_memberships(client): def test_valid_project_import_with_not_existing_memberships(client):
user = f.UserFactory.create() user = f.UserFactory.create()
client.login(user) client.login(user)
@ -89,6 +87,7 @@ def test_valid_project_import_with_not_existing_memberships(client):
# The new membership and the owner membership # The new membership and the owner membership
assert len(response_data["memberships"]) == 2 assert len(response_data["memberships"]) == 2
def test_valid_project_import_with_extra_data(client): def test_valid_project_import_with_extra_data(client):
user = f.UserFactory.create() user = f.UserFactory.create()
client.login(user) client.login(user)
@ -142,6 +141,7 @@ def test_valid_project_import_with_extra_data(client):
assert all(map(lambda x: len(response_data[x]) == 1, must_one_instance_children)) assert all(map(lambda x: len(response_data[x]) == 1, must_one_instance_children))
assert response_data["owner"] == user.email assert response_data["owner"] == user.email
def test_invalid_project_import_with_extra_data(client): def test_invalid_project_import_with_extra_data(client):
user = f.UserFactory.create() user = f.UserFactory.create()
client.login(user) client.login(user)
@ -166,10 +166,11 @@ def test_invalid_project_import_with_extra_data(client):
assert len(response_data) == 8 assert len(response_data) == 8
assert Project.objects.filter(slug="imported-project").count() == 0 assert Project.objects.filter(slug="imported-project").count() == 0
def test_invalid_issue_import(client): def test_invalid_issue_import(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
url = reverse("importer-issue", args=[project.pk]) url = reverse("importer-issue", args=[project.pk])
@ -178,10 +179,11 @@ def test_invalid_issue_import(client):
response = client.post(url, json.dumps(data), content_type="application/json") response = client.post(url, json.dumps(data), content_type="application/json")
assert response.status_code == 400 assert response.status_code == 400
def test_valid_user_story_import(client): def test_valid_user_story_import(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
project.default_us_status = f.UserStoryStatusFactory.create(project=project) project.default_us_status = f.UserStoryStatusFactory.create(project=project)
project.save() project.save()
client.login(user) client.login(user)
@ -202,7 +204,7 @@ def test_valid_user_story_import(client):
def test_valid_issue_import_without_extra_data(client): def test_valid_issue_import_without_extra_data(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
project.default_issue_type = f.IssueTypeFactory.create(project=project) project.default_issue_type = f.IssueTypeFactory.create(project=project)
project.default_issue_status = f.IssueStatusFactory.create(project=project) project.default_issue_status = f.IssueStatusFactory.create(project=project)
project.default_severity = f.SeverityFactory.create(project=project) project.default_severity = f.SeverityFactory.create(project=project)
@ -221,10 +223,11 @@ def test_valid_issue_import_without_extra_data(client):
assert response_data["owner"] == user.email assert response_data["owner"] == user.email
assert response_data["ref"] is not None assert response_data["ref"] is not None
def test_valid_issue_import_with_extra_data(client): def test_valid_issue_import_with_extra_data(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
project.default_issue_type = f.IssueTypeFactory.create(project=project) project.default_issue_type = f.IssueTypeFactory.create(project=project)
project.default_issue_status = f.IssueStatusFactory.create(project=project) project.default_issue_status = f.IssueStatusFactory.create(project=project)
project.default_severity = f.SeverityFactory.create(project=project) project.default_severity = f.SeverityFactory.create(project=project)
@ -254,10 +257,11 @@ def test_valid_issue_import_with_extra_data(client):
assert response_data["ref"] is not None assert response_data["ref"] is not None
assert response_data["finished_date"] == "2014-10-24T00:00:00+0000" assert response_data["finished_date"] == "2014-10-24T00:00:00+0000"
def test_invalid_issue_import_with_extra_data(client): def test_invalid_issue_import_with_extra_data(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
project.default_issue_type = f.IssueTypeFactory.create(project=project) project.default_issue_type = f.IssueTypeFactory.create(project=project)
project.default_issue_status = f.IssueStatusFactory.create(project=project) project.default_issue_status = f.IssueStatusFactory.create(project=project)
project.default_severity = f.SeverityFactory.create(project=project) project.default_severity = f.SeverityFactory.create(project=project)
@ -278,10 +282,11 @@ def test_invalid_issue_import_with_extra_data(client):
assert len(response_data) == 1 assert len(response_data) == 1
assert Issue.objects.filter(subject="Imported issue").count() == 0 assert Issue.objects.filter(subject="Imported issue").count() == 0
def test_invalid_issue_import_with_bad_choices(client): def test_invalid_issue_import_with_bad_choices(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
project.default_issue_type = f.IssueTypeFactory.create(project=project) project.default_issue_type = f.IssueTypeFactory.create(project=project)
project.default_issue_status = f.IssueStatusFactory.create(project=project) project.default_issue_status = f.IssueStatusFactory.create(project=project)
project.default_severity = f.SeverityFactory.create(project=project) project.default_severity = f.SeverityFactory.create(project=project)
@ -337,10 +342,11 @@ def test_invalid_issue_import_with_bad_choices(client):
response_data = json.loads(response.content.decode("utf-8")) response_data = json.loads(response.content.decode("utf-8"))
assert len(response_data) == 1 assert len(response_data) == 1
def test_invalid_us_import(client): def test_invalid_us_import(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
url = reverse("importer-us", args=[project.pk]) url = reverse("importer-us", args=[project.pk])
@ -349,10 +355,11 @@ def test_invalid_us_import(client):
response = client.post(url, json.dumps(data), content_type="application/json") response = client.post(url, json.dumps(data), content_type="application/json")
assert response.status_code == 400 assert response.status_code == 400
def test_valid_us_import_without_extra_data(client): def test_valid_us_import_without_extra_data(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
project.default_us_status = f.UserStoryStatusFactory.create(project=project) project.default_us_status = f.UserStoryStatusFactory.create(project=project)
project.save() project.save()
client.login(user) client.login(user)
@ -368,10 +375,11 @@ def test_valid_us_import_without_extra_data(client):
assert response_data["owner"] == user.email assert response_data["owner"] == user.email
assert response_data["ref"] is not None assert response_data["ref"] is not None
def test_valid_us_import_with_extra_data(client): def test_valid_us_import_with_extra_data(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
project.default_us_status = f.UserStoryStatusFactory.create(project=project) project.default_us_status = f.UserStoryStatusFactory.create(project=project)
project.save() project.save()
client.login(user) client.login(user)
@ -396,10 +404,11 @@ def test_valid_us_import_with_extra_data(client):
assert response_data["owner"] == user.email assert response_data["owner"] == user.email
assert response_data["ref"] is not None assert response_data["ref"] is not None
def test_invalid_us_import_with_extra_data(client): def test_invalid_us_import_with_extra_data(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
project.default_us_status = f.UserStoryStatusFactory.create(project=project) project.default_us_status = f.UserStoryStatusFactory.create(project=project)
project.save() project.save()
client.login(user) client.login(user)
@ -417,10 +426,11 @@ def test_invalid_us_import_with_extra_data(client):
assert len(response_data) == 1 assert len(response_data) == 1
assert UserStory.objects.filter(subject="Imported us").count() == 0 assert UserStory.objects.filter(subject="Imported us").count() == 0
def test_invalid_us_import_with_bad_choices(client): def test_invalid_us_import_with_bad_choices(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
project.default_us_status = f.UserStoryStatusFactory.create(project=project) project.default_us_status = f.UserStoryStatusFactory.create(project=project)
project.save() project.save()
client.login(user) client.login(user)
@ -437,10 +447,11 @@ def test_invalid_us_import_with_bad_choices(client):
response_data = json.loads(response.content.decode("utf-8")) response_data = json.loads(response.content.decode("utf-8"))
assert len(response_data) == 1 assert len(response_data) == 1
def test_invalid_task_import(client): def test_invalid_task_import(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
url = reverse("importer-task", args=[project.pk]) url = reverse("importer-task", args=[project.pk])
@ -449,10 +460,11 @@ def test_invalid_task_import(client):
response = client.post(url, json.dumps(data), content_type="application/json") response = client.post(url, json.dumps(data), content_type="application/json")
assert response.status_code == 400 assert response.status_code == 400
def test_valid_task_import_without_extra_data(client): def test_valid_task_import_without_extra_data(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
project.default_task_status = f.TaskStatusFactory.create(project=project) project.default_task_status = f.TaskStatusFactory.create(project=project)
project.save() project.save()
client.login(user) client.login(user)
@ -468,10 +480,11 @@ def test_valid_task_import_without_extra_data(client):
assert response_data["owner"] == user.email assert response_data["owner"] == user.email
assert response_data["ref"] is not None assert response_data["ref"] is not None
def test_valid_task_import_with_extra_data(client): def test_valid_task_import_with_extra_data(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
project.default_task_status = f.TaskStatusFactory.create(project=project) project.default_task_status = f.TaskStatusFactory.create(project=project)
project.save() project.save()
client.login(user) client.login(user)
@ -496,10 +509,11 @@ def test_valid_task_import_with_extra_data(client):
assert response_data["owner"] == user.email assert response_data["owner"] == user.email
assert response_data["ref"] is not None assert response_data["ref"] is not None
def test_invalid_task_import_with_extra_data(client): def test_invalid_task_import_with_extra_data(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
project.default_task_status = f.TaskStatusFactory.create(project=project) project.default_task_status = f.TaskStatusFactory.create(project=project)
project.save() project.save()
client.login(user) client.login(user)
@ -517,10 +531,11 @@ def test_invalid_task_import_with_extra_data(client):
assert len(response_data) == 1 assert len(response_data) == 1
assert Task.objects.filter(subject="Imported task").count() == 0 assert Task.objects.filter(subject="Imported task").count() == 0
def test_invalid_task_import_with_bad_choices(client): def test_invalid_task_import_with_bad_choices(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
project.default_task_status = f.TaskStatusFactory.create(project=project) project.default_task_status = f.TaskStatusFactory.create(project=project)
project.save() project.save()
client.login(user) client.login(user)
@ -537,10 +552,11 @@ def test_invalid_task_import_with_bad_choices(client):
response_data = json.loads(response.content.decode("utf-8")) response_data = json.loads(response.content.decode("utf-8"))
assert len(response_data) == 1 assert len(response_data) == 1
def test_valid_task_with_user_story(client): def test_valid_task_with_user_story(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
project.default_task_status = f.TaskStatusFactory.create(project=project) project.default_task_status = f.TaskStatusFactory.create(project=project)
us = f.UserStoryFactory.create(project=project) us = f.UserStoryFactory.create(project=project)
project.save() project.save()
@ -557,10 +573,11 @@ def test_valid_task_with_user_story(client):
assert response.status_code == 201 assert response.status_code == 201
assert us.tasks.all().count() == 1 assert us.tasks.all().count() == 1
def test_invalid_wiki_page_import(client): def test_invalid_wiki_page_import(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
url = reverse("importer-wiki-page", args=[project.pk]) url = reverse("importer-wiki-page", args=[project.pk])
@ -569,10 +586,11 @@ def test_invalid_wiki_page_import(client):
response = client.post(url, json.dumps(data), content_type="application/json") response = client.post(url, json.dumps(data), content_type="application/json")
assert response.status_code == 400 assert response.status_code == 400
def test_valid_wiki_page_import_without_extra_data(client): def test_valid_wiki_page_import_without_extra_data(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
url = reverse("importer-wiki-page", args=[project.pk]) url = reverse("importer-wiki-page", args=[project.pk])
@ -585,10 +603,11 @@ def test_valid_wiki_page_import_without_extra_data(client):
response_data = json.loads(response.content.decode("utf-8")) response_data = json.loads(response.content.decode("utf-8"))
assert response_data["owner"] == user.email assert response_data["owner"] == user.email
def test_valid_wiki_page_import_with_extra_data(client): def test_valid_wiki_page_import_with_extra_data(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
url = reverse("importer-wiki-page", args=[project.pk]) url = reverse("importer-wiki-page", args=[project.pk])
@ -610,10 +629,11 @@ def test_valid_wiki_page_import_with_extra_data(client):
assert len(response_data["attachments"]) == 1 assert len(response_data["attachments"]) == 1
assert response_data["owner"] == user.email assert response_data["owner"] == user.email
def test_invalid_wiki_page_import_with_extra_data(client): def test_invalid_wiki_page_import_with_extra_data(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
url = reverse("importer-wiki-page", args=[project.pk]) url = reverse("importer-wiki-page", args=[project.pk])
@ -629,10 +649,11 @@ def test_invalid_wiki_page_import_with_extra_data(client):
assert len(response_data) == 1 assert len(response_data) == 1
assert WikiPage.objects.filter(slug="imported-wiki-page").count() == 0 assert WikiPage.objects.filter(slug="imported-wiki-page").count() == 0
def test_invalid_wiki_link_import(client): def test_invalid_wiki_link_import(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
url = reverse("importer-wiki-link", args=[project.pk]) url = reverse("importer-wiki-link", args=[project.pk])
@ -641,10 +662,11 @@ def test_invalid_wiki_link_import(client):
response = client.post(url, json.dumps(data), content_type="application/json") response = client.post(url, json.dumps(data), content_type="application/json")
assert response.status_code == 400 assert response.status_code == 400
def test_valid_wiki_link_import(client): def test_valid_wiki_link_import(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
url = reverse("importer-wiki-link", args=[project.pk]) url = reverse("importer-wiki-link", args=[project.pk])
@ -655,12 +677,13 @@ def test_valid_wiki_link_import(client):
response = client.post(url, json.dumps(data), content_type="application/json") response = client.post(url, json.dumps(data), content_type="application/json")
assert response.status_code == 201 assert response.status_code == 201
response_data = json.loads(response.content.decode("utf-8")) json.loads(response.content.decode("utf-8"))
def test_invalid_milestone_import(client): def test_invalid_milestone_import(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
url = reverse("importer-milestone", args=[project.pk]) url = reverse("importer-milestone", args=[project.pk])
@ -669,10 +692,11 @@ def test_invalid_milestone_import(client):
response = client.post(url, json.dumps(data), content_type="application/json") response = client.post(url, json.dumps(data), content_type="application/json")
assert response.status_code == 400 assert response.status_code == 400
def test_valid_milestone_import(client): def test_valid_milestone_import(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
url = reverse("importer-milestone", args=[project.pk]) url = reverse("importer-milestone", args=[project.pk])
@ -684,12 +708,13 @@ def test_valid_milestone_import(client):
response = client.post(url, json.dumps(data), content_type="application/json") response = client.post(url, json.dumps(data), content_type="application/json")
assert response.status_code == 201 assert response.status_code == 201
response_data = json.loads(response.content.decode("utf-8")) json.loads(response.content.decode("utf-8"))
def test_milestone_import_duplicated_milestone(client): def test_milestone_import_duplicated_milestone(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory(project=project, user=user, is_owner=True) f.MembershipFactory(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
url = reverse("importer-milestone", args=[project.pk]) url = reverse("importer-milestone", args=[project.pk])
@ -705,6 +730,7 @@ def test_milestone_import_duplicated_milestone(client):
response_data = json.loads(response.content.decode("utf-8")) response_data = json.loads(response.content.decode("utf-8"))
assert response_data["milestones"][0]["name"][0] == "Name duplicated for the project" assert response_data["milestones"][0]["name"][0] == "Name duplicated for the project"
def test_invalid_dump_import(client): def test_invalid_dump_import(client):
user = f.UserFactory.create() user = f.UserFactory.create()
client.login(user) client.login(user)
@ -719,6 +745,7 @@ def test_invalid_dump_import(client):
response_data = json.loads(response.content.decode("utf-8")) response_data = json.loads(response.content.decode("utf-8"))
assert response_data["_error_message"] == "Invalid dump format" assert response_data["_error_message"] == "Invalid dump format"
def test_valid_dump_import_with_celery_disabled(client, settings): def test_valid_dump_import_with_celery_disabled(client, settings):
settings.CELERY_ENABLED = False settings.CELERY_ENABLED = False
@ -740,6 +767,7 @@ def test_valid_dump_import_with_celery_disabled(client, settings):
assert "id" in response_data assert "id" in response_data
assert response_data["name"] == "Valid project" assert response_data["name"] == "Valid project"
def test_valid_dump_import_with_celery_enabled(client, settings): def test_valid_dump_import_with_celery_enabled(client, settings):
settings.CELERY_ENABLED = True settings.CELERY_ENABLED = True
@ -760,6 +788,7 @@ def test_valid_dump_import_with_celery_enabled(client, settings):
response_data = json.loads(response.content.decode("utf-8")) response_data = json.loads(response.content.decode("utf-8"))
assert "import_id" in response_data assert "import_id" in response_data
def test_dump_import_duplicated_project(client): def test_dump_import_duplicated_project(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
@ -780,6 +809,7 @@ def test_dump_import_duplicated_project(client):
assert response_data["name"] == "Test import" assert response_data["name"] == "Test import"
assert response_data["slug"] == "{}-test-import".format(user.username) assert response_data["slug"] == "{}-test-import".format(user.username)
def test_dump_import_throttling(client, settings): def test_dump_import_throttling(client, settings):
settings.REST_FRAMEWORK["DEFAULT_THROTTLE_RATES"]["import-dump-mode"] = "1/minute" settings.REST_FRAMEWORK["DEFAULT_THROTTLE_RATES"]["import-dump-mode"] = "1/minute"

View File

@ -45,7 +45,7 @@ def test_update_issues_order_in_bulk():
def test_api_create_issues_in_bulk(client): def test_api_create_issues_in_bulk(client):
project = f.create_project() project = f.create_project()
membership = f.MembershipFactory(project=project, user=project.owner, is_owner=True) f.MembershipFactory(project=project, user=project.owner, is_owner=True)
url = reverse("issues-bulk-create") url = reverse("issues-bulk-create")
@ -86,6 +86,7 @@ def test_api_filter_by_text_1(client):
assert response.status_code == 200 assert response.status_code == 200
assert number_of_issues == 1 assert number_of_issues == 1
def test_api_filter_by_text_2(client): def test_api_filter_by_text_2(client):
user = f.UserFactory(is_superuser=True) user = f.UserFactory(is_superuser=True)
f.create_issue(owner=user) f.create_issue(owner=user)
@ -100,6 +101,7 @@ def test_api_filter_by_text_2(client):
assert response.status_code == 200 assert response.status_code == 200
assert number_of_issues == 1 assert number_of_issues == 1
def test_api_filter_by_text_3(client): def test_api_filter_by_text_3(client):
user = f.UserFactory(is_superuser=True) user = f.UserFactory(is_superuser=True)
f.create_issue(owner=user) f.create_issue(owner=user)
@ -114,6 +116,7 @@ def test_api_filter_by_text_3(client):
assert response.status_code == 200 assert response.status_code == 200
assert number_of_issues == 2 assert number_of_issues == 2
def test_api_filter_by_text_4(client): def test_api_filter_by_text_4(client):
user = f.UserFactory(is_superuser=True) user = f.UserFactory(is_superuser=True)
f.create_issue(owner=user) f.create_issue(owner=user)
@ -128,6 +131,7 @@ def test_api_filter_by_text_4(client):
assert response.status_code == 200 assert response.status_code == 200
assert number_of_issues == 0 assert number_of_issues == 0
def test_api_filter_by_text_5(client): def test_api_filter_by_text_5(client):
user = f.UserFactory(is_superuser=True) user = f.UserFactory(is_superuser=True)
f.create_issue(owner=user) f.create_issue(owner=user)

View File

@ -34,7 +34,7 @@ def test_api_create_bulk_members(client):
joseph = f.UserFactory.create() joseph = f.UserFactory.create()
tester = f.RoleFactory(project=project, name="Tester") tester = f.RoleFactory(project=project, name="Tester")
gamer = f.RoleFactory(project=project, name="Gamer") gamer = f.RoleFactory(project=project, name="Gamer")
membership = f.MembershipFactory(project=project, user=project.owner, is_owner=True) f.MembershipFactory(project=project, user=project.owner, is_owner=True)
url = reverse("memberships-bulk-create") url = reverse("memberships-bulk-create")
@ -52,10 +52,11 @@ def test_api_create_bulk_members(client):
assert response.data[0]["email"] == john.email assert response.data[0]["email"] == john.email
assert response.data[1]["email"] == joseph.email assert response.data[1]["email"] == joseph.email
def test_api_create_bulk_members_with_extra_text(client, outbox): def test_api_create_bulk_members_with_extra_text(client, outbox):
project = f.ProjectFactory() project = f.ProjectFactory()
tester = f.RoleFactory(project=project, name="Tester") tester = f.RoleFactory(project=project, name="Tester")
membership = f.MembershipFactory(project=project, user=project.owner, is_owner=True) f.MembershipFactory(project=project, user=project.owner, is_owner=True)
url = reverse("memberships-bulk-create") url = reverse("memberships-bulk-create")
invitation_extra_text = "this is a not so random invitation text" invitation_extra_text = "this is a not so random invitation text"
@ -77,9 +78,10 @@ def test_api_create_bulk_members_with_extra_text(client, outbox):
assert message.to == ["john@email.com"] assert message.to == ["john@email.com"]
assert "this is a not so random invitation text" in message.body assert "this is a not so random invitation text" in message.body
def test_api_resend_invitation(client, outbox): def test_api_resend_invitation(client, outbox):
invitation = f.create_invitation() invitation = f.create_invitation()
membership = f.MembershipFactory(project=invitation.project, user=invitation.project.owner, is_owner=True) f.MembershipFactory(project=invitation.project, user=invitation.project.owner, is_owner=True)
url = reverse("memberships-resend-invitation", kwargs={"pk": invitation.pk}) url = reverse("memberships-resend-invitation", kwargs={"pk": invitation.pk})
client.login(invitation.project.owner) client.login(invitation.project.owner)
@ -94,7 +96,7 @@ def test_api_invite_existing_user(client, outbox):
"Should create the invitation linked to that user" "Should create the invitation linked to that user"
user = f.UserFactory.create() user = f.UserFactory.create()
role = f.RoleFactory.create() role = f.RoleFactory.create()
membership = f.MembershipFactory(project=role.project, user=role.project.owner, is_owner=True) f.MembershipFactory(project=role.project, user=role.project.owner, is_owner=True)
client.login(role.project.owner) client.login(role.project.owner)
@ -189,7 +191,7 @@ def test_api_delete_membership(client):
def test_api_delete_membership_without_user(client): def test_api_delete_membership_without_user(client):
membership_owner = f.MembershipFactory(is_owner=True) membership_owner = f.MembershipFactory(is_owner=True)
membership_without_user_one = f.MembershipFactory(project=membership_owner.project, user=None) membership_without_user_one = f.MembershipFactory(project=membership_owner.project, user=None)
membership_without_user_two = f.MembershipFactory(project=membership_owner.project, user=None) f.MembershipFactory(project=membership_owner.project, user=None)
client.login(membership_owner.user) client.login(membership_owner.user)
url = reverse("memberships-detail", args=[membership_without_user_one.id]) url = reverse("memberships-detail", args=[membership_without_user_one.id])
response = client.json.delete(url) response = client.json.delete(url)

View File

@ -16,9 +16,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import pytest import pytest
from unittest.mock import patch, Mock
from django.apps import apps
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from taiga.base.utils import json from taiga.base.utils import json
@ -29,13 +27,14 @@ from .. import factories as f
pytestmark = pytest.mark.django_db pytestmark = pytest.mark.django_db
def test_update_milestone_with_userstories_list(client): def test_update_milestone_with_userstories_list(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
role = f.RoleFactory.create(project=project) role = f.RoleFactory.create(project=project)
member = f.MembershipFactory.create(project=project, user=user, role=role, is_owner=True) f.MembershipFactory.create(project=project, user=user, role=role, is_owner=True)
sprint = f.MilestoneFactory.create(project=project, owner=user) sprint = f.MilestoneFactory.create(project=project, owner=user)
points = f.PointsFactory.create(project=project, value=None) f.PointsFactory.create(project=project, value=None)
us = f.UserStoryFactory.create(project=project, owner=user) us = f.UserStoryFactory.create(project=project, owner=user)
url = reverse("milestones-detail", args=[sprint.pk]) url = reverse("milestones-detail", args=[sprint.pk])

View File

@ -15,8 +15,6 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from functools import partial
import pytest import pytest
from taiga.projects.userstories.models import UserStory from taiga.projects.userstories.models import UserStory

View File

@ -45,7 +45,7 @@ def mail():
def test_attach_notify_policy_to_project_queryset(): def test_attach_notify_policy_to_project_queryset():
project1 = f.ProjectFactory.create() project1 = f.ProjectFactory.create()
project2 = f.ProjectFactory.create() f.ProjectFactory.create()
qs = project1.__class__.objects.order_by("id") qs = project1.__class__.objects.order_by("id")
qs = services.attach_notify_policy_to_project_queryset(project1.owner, qs) qs = services.attach_notify_policy_to_project_queryset(project1.owner, qs)
@ -115,7 +115,7 @@ def test_users_to_notify():
policy_model_cls = apps.get_model("notifications", "NotifyPolicy") policy_model_cls = apps.get_model("notifications", "NotifyPolicy")
policy1 = policy_model_cls.objects.get(user=member1.user) policy1 = policy_model_cls.objects.get(user=member1.user)
policy2 = policy_model_cls.objects.get(user=member2.user) policy_model_cls.objects.get(user=member2.user)
policy3 = policy_model_cls.objects.get(user=member3.user) policy3 = policy_model_cls.objects.get(user=member3.user)
history = MagicMock() history = MagicMock()
@ -197,7 +197,6 @@ def test_send_notifications_using_services_method(settings, mail):
services.send_notifications(issue, services.send_notifications(issue,
history=history_delete) history=history_delete)
# Userstories # Userstories
us = f.UserStoryFactory.create(project=project, owner=member2.user) us = f.UserStoryFactory.create(project=project, owner=member2.user)
take_snapshot(us) take_snapshot(us)
@ -240,6 +239,7 @@ def test_send_notifications_using_services_method(settings, mail):
services.process_sync_notifications() services.process_sync_notifications()
assert len(mail.outbox) == 12 assert len(mail.outbox) == 12
def test_resource_notification_test(client, settings, mail): def test_resource_notification_test(client, settings, mail):
settings.CHANGE_NOTIFICATIONS_MIN_INTERVAL = 1 settings.CHANGE_NOTIFICATIONS_MIN_INTERVAL = 1
@ -247,8 +247,8 @@ def test_resource_notification_test(client, settings, mail):
user2 = f.UserFactory.create() user2 = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user1) project = f.ProjectFactory.create(owner=user1)
role = f.RoleFactory.create(project=project, permissions=["view_issues"]) role = f.RoleFactory.create(project=project, permissions=["view_issues"])
member1 = f.MembershipFactory.create(project=project, user=user1, role=role, is_owner=True) f.MembershipFactory.create(project=project, user=user1, role=role, is_owner=True)
member2 = f.MembershipFactory.create(project=project, user=user2, role=role) f.MembershipFactory.create(project=project, user=user2, role=role)
issue = f.IssueFactory.create(owner=user2, project=project) issue = f.IssueFactory.create(owner=user2, project=project)
mock_path = "taiga.projects.issues.api.IssueViewSet.pre_conditions_on_save" mock_path = "taiga.projects.issues.api.IssueViewSet.pre_conditions_on_save"
@ -256,7 +256,7 @@ def test_resource_notification_test(client, settings, mail):
client.login(user1) client.login(user1)
with patch(mock_path) as m: with patch(mock_path):
data = {"subject": "Fooooo", "version": issue.version} data = {"subject": "Fooooo", "version": issue.version}
response = client.patch(url, json.dumps(data), content_type="application/json") response = client.patch(url, json.dumps(data), content_type="application/json")
assert response.status_code == 200 assert response.status_code == 200
@ -267,7 +267,7 @@ def test_resource_notification_test(client, settings, mail):
assert len(mail.outbox) == 1 assert len(mail.outbox) == 1
assert models.HistoryChangeNotification.objects.count() == 0 assert models.HistoryChangeNotification.objects.count() == 0
with patch(mock_path) as m: with patch(mock_path):
response = client.delete(url) response = client.delete(url)
assert response.status_code == 204 assert response.status_code == 204
assert len(mail.outbox) == 1 assert len(mail.outbox) == 1
@ -285,8 +285,8 @@ def test_watchers_assignation_for_issue(client):
project2 = f.ProjectFactory.create(owner=user2) project2 = f.ProjectFactory.create(owner=user2)
role1 = f.RoleFactory.create(project=project1) role1 = f.RoleFactory.create(project=project1)
role2 = f.RoleFactory.create(project=project2) role2 = f.RoleFactory.create(project=project2)
member1 = f.MembershipFactory.create(project=project1, user=user1, role=role1, is_owner=True) f.MembershipFactory.create(project=project1, user=user1, role=role1, is_owner=True)
member2 = f.MembershipFactory.create(project=project2, user=user2, role=role2) f.MembershipFactory.create(project=project2, user=user2, role=role2)
client.login(user1) client.login(user1)
@ -298,7 +298,6 @@ def test_watchers_assignation_for_issue(client):
response = client.json.patch(url, json.dumps(data)) response = client.json.patch(url, json.dumps(data))
assert response.status_code == 200, response.content assert response.status_code == 200, response.content
issue = f.create_issue(project=project1, owner=user1) issue = f.create_issue(project=project1, owner=user1)
data = {"version": issue.version, data = {"version": issue.version,
"watchers": [user1.pk, user2.pk]} "watchers": [user1.pk, user2.pk]}
@ -338,8 +337,8 @@ def test_watchers_assignation_for_task(client):
project2 = f.ProjectFactory.create(owner=user2) project2 = f.ProjectFactory.create(owner=user2)
role1 = f.RoleFactory.create(project=project1) role1 = f.RoleFactory.create(project=project1)
role2 = f.RoleFactory.create(project=project2) role2 = f.RoleFactory.create(project=project2)
member1 = f.MembershipFactory.create(project=project1, user=user1, role=role1, is_owner=True) f.MembershipFactory.create(project=project1, user=user1, role=role1, is_owner=True)
member2 = f.MembershipFactory.create(project=project2, user=user2, role=role2) f.MembershipFactory.create(project=project2, user=user2, role=role2)
client.login(user1) client.login(user1)
@ -351,7 +350,6 @@ def test_watchers_assignation_for_task(client):
response = client.json.patch(url, json.dumps(data)) response = client.json.patch(url, json.dumps(data))
assert response.status_code == 200, response.content assert response.status_code == 200, response.content
task = f.create_task(project=project1, owner=user1) task = f.create_task(project=project1, owner=user1)
data = {"version": task.version, data = {"version": task.version,
"watchers": [user1.pk, user2.pk]} "watchers": [user1.pk, user2.pk]}
@ -391,8 +389,8 @@ def test_watchers_assignation_for_us(client):
project2 = f.ProjectFactory.create(owner=user2) project2 = f.ProjectFactory.create(owner=user2)
role1 = f.RoleFactory.create(project=project1) role1 = f.RoleFactory.create(project=project1)
role2 = f.RoleFactory.create(project=project2) role2 = f.RoleFactory.create(project=project2)
member1 = f.MembershipFactory.create(project=project1, user=user1, role=role1, is_owner=True) f.MembershipFactory.create(project=project1, user=user1, role=role1, is_owner=True)
member2 = f.MembershipFactory.create(project=project2, user=user2, role=role2) f.MembershipFactory.create(project=project2, user=user2, role=role2)
client.login(user1) client.login(user1)
@ -404,7 +402,6 @@ def test_watchers_assignation_for_us(client):
response = client.json.patch(url, json.dumps(data)) response = client.json.patch(url, json.dumps(data))
assert response.status_code == 200 assert response.status_code == 200
us = f.create_userstory(project=project1, owner=user1) us = f.create_userstory(project=project1, owner=user1)
data = {"version": us.version, data = {"version": us.version,
"watchers": [user1.pk, user2.pk]} "watchers": [user1.pk, user2.pk]}
@ -440,7 +437,6 @@ def test_watchers_assignation_for_us(client):
def test_retrieve_notify_policies_by_anonymous_user(client): def test_retrieve_notify_policies_by_anonymous_user(client):
project = f.ProjectFactory.create() project = f.ProjectFactory.create()
policy_model_cls = apps.get_model("notifications", "NotifyPolicy")
policy = services.get_notify_policy(project, project.owner) policy = services.get_notify_policy(project, project.owner)
url = reverse("notifications-detail", args=[policy.pk]) url = reverse("notifications-detail", args=[policy.pk])

View File

@ -20,10 +20,6 @@ from unittest.mock import patch
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from taiga.base.utils import json from taiga.base.utils import json
from taiga.projects.issues.models import Issue
from taiga.projects.wiki.models import WikiPage
from taiga.projects.userstories.models import UserStory
from taiga.projects.tasks.models import Task
from .. import factories as f from .. import factories as f
@ -33,7 +29,7 @@ pytestmark = pytest.mark.django_db
def test_valid_us_creation(client): def test_valid_us_creation(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory.create(project=project, user=user, is_owner=True) f.MembershipFactory.create(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
@ -50,11 +46,11 @@ def test_valid_us_creation(client):
def test_invalid_concurrent_save_for_issue(client): def test_invalid_concurrent_save_for_issue(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory.create(project=project, user=user, is_owner=True) f.MembershipFactory.create(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
mock_path = "taiga.projects.issues.api.IssueViewSet.pre_conditions_on_save" mock_path = "taiga.projects.issues.api.IssueViewSet.pre_conditions_on_save"
with patch(mock_path) as m: with patch(mock_path):
url = reverse("issues-list") url = reverse("issues-list")
data = {"subject": "test", data = {"subject": "test",
"project": project.id, "project": project.id,
@ -79,11 +75,11 @@ def test_invalid_concurrent_save_for_issue(client):
def test_valid_concurrent_save_for_issue_different_versions(client): def test_valid_concurrent_save_for_issue_different_versions(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory.create(project=project, user=user, is_owner=True) f.MembershipFactory.create(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
mock_path = "taiga.projects.issues.api.IssueViewSet.pre_conditions_on_save" mock_path = "taiga.projects.issues.api.IssueViewSet.pre_conditions_on_save"
with patch(mock_path) as m: with patch(mock_path):
url = reverse("issues-list") url = reverse("issues-list")
data = {"subject": "test", data = {"subject": "test",
"project": project.id, "project": project.id,
@ -108,11 +104,11 @@ def test_valid_concurrent_save_for_issue_different_versions(client):
def test_valid_concurrent_save_for_issue_different_fields(client): def test_valid_concurrent_save_for_issue_different_fields(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory.create(project=project, user=user, is_owner=True) f.MembershipFactory.create(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
mock_path = "taiga.projects.issues.api.IssueViewSet.pre_conditions_on_save" mock_path = "taiga.projects.issues.api.IssueViewSet.pre_conditions_on_save"
with patch(mock_path) as m: with patch(mock_path):
url = reverse("issues-list") url = reverse("issues-list")
data = {"subject": "test", data = {"subject": "test",
"project": project.id, "project": project.id,
@ -137,11 +133,11 @@ def test_valid_concurrent_save_for_issue_different_fields(client):
def test_invalid_concurrent_save_for_wiki_page(client): def test_invalid_concurrent_save_for_wiki_page(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory.create(project=project, user=user, is_owner=True) f.MembershipFactory.create(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
mock_path = "taiga.projects.wiki.api.WikiViewSet.pre_conditions_on_save" mock_path = "taiga.projects.wiki.api.WikiViewSet.pre_conditions_on_save"
with patch(mock_path) as m: with patch(mock_path):
url = reverse("wiki-list") url = reverse("wiki-list")
data = {"project": project.id, "slug": "test"} data = {"project": project.id, "slug": "test"}
response = client.json.post(url, json.dumps(data)) response = client.json.post(url, json.dumps(data))
@ -161,11 +157,11 @@ def test_invalid_concurrent_save_for_wiki_page(client):
def test_valid_concurrent_save_for_wiki_page_different_versions(client): def test_valid_concurrent_save_for_wiki_page_different_versions(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory.create(project=project, user=user, is_owner=True) f.MembershipFactory.create(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
mock_path = "taiga.projects.wiki.api.WikiViewSet.pre_conditions_on_save" mock_path = "taiga.projects.wiki.api.WikiViewSet.pre_conditions_on_save"
with patch(mock_path) as m: with patch(mock_path):
url = reverse("wiki-list") url = reverse("wiki-list")
data = {"project": project.id, "slug": "test"} data = {"project": project.id, "slug": "test"}
response = client.json.post(url, json.dumps(data)) response = client.json.post(url, json.dumps(data))
@ -185,12 +181,12 @@ def test_valid_concurrent_save_for_wiki_page_different_versions(client):
def test_invalid_concurrent_save_for_us(client): def test_invalid_concurrent_save_for_us(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory.create(project=project, user=user, is_owner=True) f.MembershipFactory.create(project=project, user=user, is_owner=True)
userstory = f.UserStoryFactory.create(version=10, project=project) f.UserStoryFactory.create(version=10, project=project)
client.login(user) client.login(user)
mock_path = "taiga.projects.userstories.api.UserStoryViewSet.pre_conditions_on_save" mock_path = "taiga.projects.userstories.api.UserStoryViewSet.pre_conditions_on_save"
with patch(mock_path) as m: with patch(mock_path):
url = reverse("userstories-list") url = reverse("userstories-list")
data = {"subject": "test", data = {"subject": "test",
"project": project.id, "project": project.id,
@ -212,11 +208,11 @@ def test_invalid_concurrent_save_for_us(client):
def test_valid_concurrent_save_for_us_different_versions(client): def test_valid_concurrent_save_for_us_different_versions(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory.create(project=project, user=user, is_owner=True) f.MembershipFactory.create(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
mock_path = "taiga.projects.userstories.api.UserStoryViewSet.pre_conditions_on_save" mock_path = "taiga.projects.userstories.api.UserStoryViewSet.pre_conditions_on_save"
with patch(mock_path) as m: with patch(mock_path):
url = reverse("userstories-list") url = reverse("userstories-list")
data = {"subject": "test", data = {"subject": "test",
"project": project.id, "project": project.id,
@ -238,11 +234,11 @@ def test_valid_concurrent_save_for_us_different_versions(client):
def test_valid_concurrent_save_for_us_different_fields(client): def test_valid_concurrent_save_for_us_different_fields(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory.create(project=project, user=user, is_owner=True) f.MembershipFactory.create(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
mock_path = "taiga.projects.userstories.api.UserStoryViewSet.pre_conditions_on_save" mock_path = "taiga.projects.userstories.api.UserStoryViewSet.pre_conditions_on_save"
with patch(mock_path) as m: with patch(mock_path):
url = reverse("userstories-list") url = reverse("userstories-list")
data = {"subject": "test", data = {"subject": "test",
"project": project.id, "project": project.id,
@ -264,11 +260,11 @@ def test_valid_concurrent_save_for_us_different_fields(client):
def test_invalid_concurrent_save_for_task(client): def test_invalid_concurrent_save_for_task(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory.create(project=project, user=user, is_owner=True) f.MembershipFactory.create(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
mock_path = "taiga.projects.tasks.api.TaskViewSet.pre_conditions_on_save" mock_path = "taiga.projects.tasks.api.TaskViewSet.pre_conditions_on_save"
with patch(mock_path) as m: with patch(mock_path):
url = reverse("tasks-list") url = reverse("tasks-list")
data = {"subject": "test", data = {"subject": "test",
"project": project.id, "project": project.id,
@ -290,11 +286,11 @@ def test_invalid_concurrent_save_for_task(client):
def test_valid_concurrent_save_for_task_different_versions(client): def test_valid_concurrent_save_for_task_different_versions(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory.create(project=project, user=user, is_owner=True) f.MembershipFactory.create(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
mock_path = "taiga.projects.tasks.api.TaskViewSet.pre_conditions_on_save" mock_path = "taiga.projects.tasks.api.TaskViewSet.pre_conditions_on_save"
with patch(mock_path) as m: with patch(mock_path):
url = reverse("tasks-list") url = reverse("tasks-list")
data = {"subject": "test", data = {"subject": "test",
"project": project.id, "project": project.id,
@ -316,11 +312,11 @@ def test_valid_concurrent_save_for_task_different_versions(client):
def test_valid_concurrent_save_for_task_different_fields(client): def test_valid_concurrent_save_for_task_different_fields(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user) project = f.ProjectFactory.create(owner=user)
membership = f.MembershipFactory.create(project=project, user=user, is_owner=True) f.MembershipFactory.create(project=project, user=user, is_owner=True)
client.login(user) client.login(user)
mock_path = "taiga.projects.tasks.api.TaskViewSet.pre_conditions_on_save" mock_path = "taiga.projects.tasks.api.TaskViewSet.pre_conditions_on_save"
with patch(mock_path) as m: with patch(mock_path):
url = reverse("tasks-list") url = reverse("tasks-list")
data = {"subject": "test", data = {"subject": "test",
"project": project.id, "project": project.id,

View File

@ -88,16 +88,16 @@ def test_member_get_user_project_permissions():
def test_anon_user_has_perm(): def test_anon_user_has_perm():
project = factories.ProjectFactory() project = factories.ProjectFactory()
project.anon_permissions = ["test"] project.anon_permissions = ["test"]
assert service.user_has_perm(AnonymousUser(), "test", project) == True assert service.user_has_perm(AnonymousUser(), "test", project) is True
assert service.user_has_perm(AnonymousUser(), "fail", project) == False assert service.user_has_perm(AnonymousUser(), "fail", project) is False
def test_authenticated_user_has_perm_on_project(): def test_authenticated_user_has_perm_on_project():
user1 = factories.UserFactory() user1 = factories.UserFactory()
project = factories.ProjectFactory() project = factories.ProjectFactory()
project.public_permissions = ["test"] project.public_permissions = ["test"]
assert service.user_has_perm(user1, "test", project) == True assert service.user_has_perm(user1, "test", project) is True
assert service.user_has_perm(user1, "fail", project) == False assert service.user_has_perm(user1, "fail", project) is False
def test_authenticated_user_has_perm_on_project_related_object(): def test_authenticated_user_has_perm_on_project_related_object():
@ -106,10 +106,10 @@ def test_authenticated_user_has_perm_on_project_related_object():
project.public_permissions = ["test"] project.public_permissions = ["test"]
us = factories.UserStoryFactory(project=project) us = factories.UserStoryFactory(project=project)
assert service.user_has_perm(user1, "test", us) == True assert service.user_has_perm(user1, "test", us) is True
assert service.user_has_perm(user1, "fail", us) == False assert service.user_has_perm(user1, "fail", us) is False
def test_authenticated_user_has_perm_on_invalid_object(): def test_authenticated_user_has_perm_on_invalid_object():
user1 = factories.UserFactory() user1 = factories.UserFactory()
assert service.user_has_perm(user1, "test", user1) == False assert service.user_has_perm(user1, "test", user1) is False

View File

@ -118,7 +118,7 @@ def test_points_name_duplicated(client):
def test_update_points_when_not_null_values_for_points(client): def test_update_points_when_not_null_values_for_points(client):
points = f.PointsFactory(name="?", value="6") points = f.PointsFactory(name="?", value="6")
role = f.RoleFactory(project=points.project, computable=True) f.RoleFactory(project=points.project, computable=True)
assert points.project.points.filter(value__isnull=True).count() == 0 assert points.project.points.filter(value__isnull=True).count() == 0
points.project.update_role_points() points.project.update_role_points()
assert points.project.points.filter(value__isnull=True).count() == 1 assert points.project.points.filter(value__isnull=True).count() == 1
@ -130,25 +130,25 @@ def test_get_closed_bugs_per_member_stats():
membership_2 = f.MembershipFactory(project=project) membership_2 = f.MembershipFactory(project=project)
issue_closed_status = f.IssueStatusFactory(is_closed=True, project=project) issue_closed_status = f.IssueStatusFactory(is_closed=True, project=project)
issue_open_status = f.IssueStatusFactory(is_closed=False, project=project) issue_open_status = f.IssueStatusFactory(is_closed=False, project=project)
issue_closed = f.IssueFactory(project=project, f.IssueFactory(project=project,
status=issue_closed_status, status=issue_closed_status,
owner=membership_1.user, owner=membership_1.user,
assigned_to=membership_1.user) assigned_to=membership_1.user)
issue_open = f.IssueFactory(project=project, f.IssueFactory(project=project,
status=issue_open_status, status=issue_open_status,
owner=membership_2.user, owner=membership_2.user,
assigned_to=membership_2.user) assigned_to=membership_2.user)
task_closed_status = f.TaskStatusFactory(is_closed=True, project=project) task_closed_status = f.TaskStatusFactory(is_closed=True, project=project)
task_open_status = f.TaskStatusFactory(is_closed=False, project=project) task_open_status = f.TaskStatusFactory(is_closed=False, project=project)
task_closed = f.TaskFactory(project=project, f.TaskFactory(project=project,
status=task_closed_status, status=task_closed_status,
owner=membership_1.user, owner=membership_1.user,
assigned_to=membership_1.user) assigned_to=membership_1.user)
task_open = f.TaskFactory(project=project, f.TaskFactory(project=project,
status=task_open_status, status=task_open_status,
owner=membership_2.user, owner=membership_2.user,
assigned_to=membership_2.user) assigned_to=membership_2.user)
task_iocaine = f.TaskFactory(project=project, f.TaskFactory(project=project,
status=task_open_status, status=task_open_status,
owner=membership_2.user, owner=membership_2.user,
assigned_to=membership_2.user, assigned_to=membership_2.user,

View File

@ -17,9 +17,6 @@
import pytest import pytest
from django.core import management
from django.conf import settings
from .. import factories from .. import factories

View File

@ -16,31 +16,27 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import pytest import pytest
from unittest.mock import patch, Mock
from django.apps import apps
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from taiga.base.utils import json
from taiga.users.models import Role from taiga.users.models import Role
from taiga.projects.models import Membership from taiga.projects.models import Membership
from taiga.projects.models import Project from taiga.projects.models import Project
from taiga.projects.userstories.serializers import UserStorySerializer
from .. import factories as f from .. import factories as f
pytestmark = pytest.mark.django_db pytestmark = pytest.mark.django_db
def test_destroy_role_and_reassign_members(client): def test_destroy_role_and_reassign_members(client):
user1 = f.UserFactory.create() user1 = f.UserFactory.create()
user2 = f.UserFactory.create() user2 = f.UserFactory.create()
project = f.ProjectFactory.create(owner=user1) project = f.ProjectFactory.create(owner=user1)
role1 = f.RoleFactory.create(project=project) role1 = f.RoleFactory.create(project=project)
role2 = f.RoleFactory.create(project=project) role2 = f.RoleFactory.create(project=project)
member = f.MembershipFactory.create(project=project, user=user1, role=role1, is_owner=True) f.MembershipFactory.create(project=project, user=user1, role=role1, is_owner=True)
member = f.MembershipFactory.create(project=project, user=user2, role=role2) f.MembershipFactory.create(project=project, user=user2, role=role2)
url = reverse("roles-detail", args=[role2.pk]) + "?moveTo={}".format(role1.pk) url = reverse("roles-detail", args=[role2.pk]) + "?moveTo={}".format(role1.pk)
@ -58,6 +54,7 @@ def test_destroy_role_and_reassign_members(client):
qs = Membership.objects.filter(project=project, role_id=role1.pk) qs = Membership.objects.filter(project=project, role_id=role1.pk)
assert qs.count() == 2 assert qs.count() == 2
def test_destroy_role_and_reassign_members_with_deleted_project(client): def test_destroy_role_and_reassign_members_with_deleted_project(client):
""" """
Regression test, that fixes some 500 errors on production Regression test, that fixes some 500 errors on production
@ -68,8 +65,8 @@ def test_destroy_role_and_reassign_members_with_deleted_project(client):
project = f.ProjectFactory.create(owner=user1) project = f.ProjectFactory.create(owner=user1)
role1 = f.RoleFactory.create(project=project) role1 = f.RoleFactory.create(project=project)
role2 = f.RoleFactory.create(project=project) role2 = f.RoleFactory.create(project=project)
member = f.MembershipFactory.create(project=project, user=user1, role=role1) f.MembershipFactory.create(project=project, user=user1, role=role1)
member = f.MembershipFactory.create(project=project, user=user2, role=role2) f.MembershipFactory.create(project=project, user=user2, role=role2)
Project.objects.filter(pk=project.id).delete() Project.objects.filter(pk=project.id).delete()

View File

@ -70,7 +70,6 @@ def searches_initial_data():
m.us2 = m.role_points2.user_story m.us2 = m.role_points2.user_story
m.us3 = m.role_points3.user_story m.us3 = m.role_points3.user_story
m.tsk1 = f.TaskFactory.create(project=m.project2) m.tsk1 = f.TaskFactory.create(project=m.project2)
m.tsk2 = f.TaskFactory.create(project=m.project1) m.tsk2 = f.TaskFactory.create(project=m.project1)
m.tsk3 = f.TaskFactory.create(project=m.project1, subject="Back to the future") m.tsk3 = f.TaskFactory.create(project=m.project1, subject="Back to the future")
@ -139,4 +138,3 @@ def test_search_text_query_with_an_invalid_project_id(client, searches_initial_d
response = client.get(reverse("search-list"), {"project": "new", "text": "future"}) response = client.get(reverse("search-list"), {"project": "new", "text": "future"})
assert response.status_code == 404 assert response.status_code == 404

View File

@ -1,8 +1,5 @@
import pytest import pytest
from django.conf import settings
from django.core.urlresolvers import reverse
from .. import factories as f from .. import factories as f
from tests.utils import disconnect_signals, reconnect_signals from tests.utils import disconnect_signals, reconnect_signals

View File

@ -33,7 +33,7 @@ import_rate_path = "taiga.export_import.throttling.ImportModeRateThrottle.get_ra
def test_anonimous_throttling_policy(client, settings): def test_anonimous_throttling_policy(client, settings):
project = f.create_project() f.create_project()
url = reverse("projects-list") url = reverse("projects-list")
with mock.patch(anon_rate_path) as anon_rate, \ with mock.patch(anon_rate_path) as anon_rate, \
@ -54,7 +54,7 @@ def test_anonimous_throttling_policy(client, settings):
def test_user_throttling_policy(client, settings): def test_user_throttling_policy(client, settings):
project = f.create_project() project = f.create_project()
membership = f.MembershipFactory.create(project=project, user=project.owner, is_owner=True) f.MembershipFactory.create(project=project, user=project.owner, is_owner=True)
url = reverse("projects-detail", kwargs={"pk": project.pk}) url = reverse("projects-detail", kwargs={"pk": project.pk})
client.login(project.owner) client.login(project.owner)
@ -83,7 +83,7 @@ def test_user_throttling_policy(client, settings):
def test_import_mode_throttling_policy(client, settings): def test_import_mode_throttling_policy(client, settings):
project = f.create_project() project = f.create_project()
membership = f.MembershipFactory.create(project=project, user=project.owner, is_owner=True) f.MembershipFactory.create(project=project, user=project.owner, is_owner=True)
project.default_issue_type = f.IssueTypeFactory.create(project=project) project.default_issue_type = f.IssueTypeFactory.create(project=project)
project.default_issue_status = f.IssueStatusFactory.create(project=project) project.default_issue_status = f.IssueStatusFactory.create(project=project)
project.default_severity = f.SeverityFactory.create(project=project) project.default_severity = f.SeverityFactory.create(project=project)

View File

@ -19,7 +19,6 @@ import pytest
from .. import factories from .. import factories
from taiga.base.utils import json
from taiga.timeline import service from taiga.timeline import service
from taiga.timeline.models import Timeline from taiga.timeline.models import Timeline
@ -39,6 +38,7 @@ def test_add_to_object_timeline():
assert Timeline.objects.filter(object_id=user1.id).count() == 1 assert Timeline.objects.filter(object_id=user1.id).count() == 1
assert Timeline.objects.order_by("-id")[0].data == id(user2) assert Timeline.objects.order_by("-id")[0].data == id(user2)
def test_get_timeline(): def test_get_timeline():
Timeline.objects.all().delete() Timeline.objects.all().delete()

View File

@ -74,7 +74,7 @@ def test_update_user_with_valid_email(client):
assert response.status_code == 200 assert response.status_code == 200
user = models.User.objects.get(pk=user.id) user = models.User.objects.get(pk=user.id)
assert user.email_token != None assert user.email_token is not None
assert user.new_email == "new@email.com" assert user.new_email == "new@email.com"
@ -88,8 +88,8 @@ def test_validate_requested_email_change(client):
assert response.status_code == 204 assert response.status_code == 204
user = models.User.objects.get(pk=user.id) user = models.User.objects.get(pk=user.id)
assert user.email_token == None assert user.email_token is None
assert user.new_email == None assert user.new_email is None
assert user.email == "new@email.com" assert user.email == "new@email.com"

View File

@ -125,11 +125,11 @@ def test_update_userstory_points(client):
role1 = f.RoleFactory.create(project=project) role1 = f.RoleFactory.create(project=project)
role2 = f.RoleFactory.create(project=project) role2 = f.RoleFactory.create(project=project)
member = f.MembershipFactory.create(project=project, user=user1, role=role1, is_owner=True) f.MembershipFactory.create(project=project, user=user1, role=role1, is_owner=True)
member = f.MembershipFactory.create(project=project, user=user2, role=role2) f.MembershipFactory.create(project=project, user=user2, role=role2)
points1 = f.PointsFactory.create(project=project, value=None) f.PointsFactory.create(project=project, value=None)
points2 = f.PointsFactory.create(project=project, value=1) f.PointsFactory.create(project=project, value=1)
points3 = f.PointsFactory.create(project=project, value=2) points3 = f.PointsFactory.create(project=project, value=2)
us = f.UserStoryFactory.create(project=project, owner=user1) us = f.UserStoryFactory.create(project=project, owner=user1)
@ -155,7 +155,6 @@ def test_update_userstory_points(client):
data["points"] = copy.copy(usdata["points"]) data["points"] = copy.copy(usdata["points"])
data["points"].update({str(role1.pk): points3.pk}) data["points"].update({str(role1.pk): points3.pk})
response = client.json.patch(url, json.dumps(data)) response = client.json.patch(url, json.dumps(data))
us = models.UserStory.objects.get(pk=us.pk) us = models.UserStory.objects.get(pk=us.pk)
usdatanew = UserStorySerializer(us).data usdatanew = UserStorySerializer(us).data
@ -163,6 +162,7 @@ def test_update_userstory_points(client):
assert response.data["points"] == usdatanew['points'] assert response.data["points"] == usdatanew['points']
assert response.data["points"] != usdata['points'] assert response.data["points"] != usdata['points']
def test_update_userstory_rolepoints_on_add_new_role(client): def test_update_userstory_rolepoints_on_add_new_role(client):
# This test is explicitly without assertions. It simple should # This test is explicitly without assertions. It simple should
# works without raising any exception. # works without raising any exception.
@ -173,16 +173,16 @@ def test_update_userstory_rolepoints_on_add_new_role(client):
role1 = f.RoleFactory.create(project=project) role1 = f.RoleFactory.create(project=project)
member1 = f.MembershipFactory.create(project=project, user=user1, role=role1) f.MembershipFactory.create(project=project, user=user1, role=role1)
points1 = f.PointsFactory.create(project=project, value=2) f.PointsFactory.create(project=project, value=2)
us = f.UserStoryFactory.create(project=project, owner=user1) us = f.UserStoryFactory.create(project=project, owner=user1)
# url = reverse("userstories-detail", args=[us.pk]) # url = reverse("userstories-detail", args=[us.pk])
# client.login(user1) # client.login(user1)
role2 = f.RoleFactory.create(project=project, computable=True) role2 = f.RoleFactory.create(project=project, computable=True)
member2 = f.MembershipFactory.create(project=project, user=user2, role=role2) f.MembershipFactory.create(project=project, user=user2, role=role2)
us.save() us.save()
@ -210,6 +210,7 @@ def test_archived_filter(client):
response = client.get(url, data) response = client.get(url, data)
assert len(json.loads(response.content)) == 1 assert len(json.loads(response.content)) == 1
def test_get_total_points(client): def test_get_total_points(client):
project = f.ProjectFactory.create() project = f.ProjectFactory.create()

View File

@ -17,7 +17,6 @@
import pytest import pytest
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.contrib.contenttypes.models import ContentType
from .. import factories as f from .. import factories as f

View File

@ -18,7 +18,7 @@
from django.db import models from django.db import models
from taiga.base import tags from taiga.base import tags
class TaggedModel(tags.TaggedMixin, models.Model): class TaggedModel(tags.TaggedMixin, models.Model):
class Meta: class Meta:
app_label = "tests" app_label = "tests"

View File

@ -14,12 +14,9 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from taiga.base.api.permissions import (PermissionComponent, from taiga.base.api.permissions import (AllowAny as TruePermissionComponent,
AllowAny as TruePermissionComponent,
DenyAll as FalsePermissionComponent) DenyAll as FalsePermissionComponent)
import pytest
def test_permission_component_composition(): def test_permission_component_composition():
assert (TruePermissionComponent() | TruePermissionComponent()).check_permissions(None, None, None) assert (TruePermissionComponent() | TruePermissionComponent()).check_permissions(None, None, None)

View File

@ -19,6 +19,7 @@ from unittest import mock
from taiga import celery from taiga import celery
from taiga.deferred import defer, call_async, apply_async from taiga.deferred import defer, call_async, apply_async
def test_defer(): def test_defer():
# settings.CELERY_ALWAYS_EAGER = True # settings.CELERY_ALWAYS_EAGER = True
name = "task name" name = "task name"

View File

@ -101,18 +101,22 @@ def test_render_wikilink():
expected_result = "<p><a class=\"reference wiki\" href=\"http://localhost:9001/project/test/wiki/test\" title=\"test\">test</a></p>" expected_result = "<p><a class=\"reference wiki\" href=\"http://localhost:9001/project/test/wiki/test\" title=\"test\">test</a></p>"
assert render(dummy_project, "[[test]]") == expected_result assert render(dummy_project, "[[test]]") == expected_result
def test_render_wikilink_1(): def test_render_wikilink_1():
expected_result = "<p><a class=\"reference wiki\" href=\"http://localhost:9001/project/test/wiki/test\" title=\"test\">test</a></p>" expected_result = "<p><a class=\"reference wiki\" href=\"http://localhost:9001/project/test/wiki/test\" title=\"test\">test</a></p>"
assert render(dummy_project, "[[test]]") == expected_result assert render(dummy_project, "[[test]]") == expected_result
def test_render_wikilink_2(): def test_render_wikilink_2():
expected_result = "<p><a class=\"reference wiki\" href=\"http://localhost:9001/project/test/wiki/test-page\" title=\"test page\">test page</a></p>" expected_result = "<p><a class=\"reference wiki\" href=\"http://localhost:9001/project/test/wiki/test-page\" title=\"test page\">test page</a></p>"
assert render(dummy_project, "[[test page]]") == expected_result assert render(dummy_project, "[[test page]]") == expected_result
def test_render_wikilink_3(): def test_render_wikilink_3():
expected_result = "<p><a class=\"reference wiki\" href=\"http://localhost:9001/project/test/wiki/testpage\" title=\"TestPage\">TestPage</a></p>" expected_result = "<p><a class=\"reference wiki\" href=\"http://localhost:9001/project/test/wiki/testpage\" title=\"TestPage\">TestPage</a></p>"
assert render(dummy_project, "[[TestPage]]") == expected_result assert render(dummy_project, "[[TestPage]]") == expected_result
def test_render_wikilink_with_custom_title(): def test_render_wikilink_with_custom_title():
expected_result = "<p><a class=\"reference wiki\" href=\"http://localhost:9001/project/test/wiki/test\" title=\"custom\">custom</a></p>" expected_result = "<p><a class=\"reference wiki\" href=\"http://localhost:9001/project/test/wiki/test\" title=\"custom\">custom</a></p>"
assert render(dummy_project, "[[test|custom]]") == expected_result assert render(dummy_project, "[[test|custom]]") == expected_result

View File

@ -17,11 +17,9 @@
from taiga.permissions import service from taiga.permissions import service
from taiga.users.models import Role from taiga.users.models import Role
import pytest
def test_role_has_perm(): def test_role_has_perm():
role = Role() role = Role()
role.permissions = ["test"] role.permissions = ["test"]
assert service.role_has_perm(role, "test") assert service.role_has_perm(role, "test")
assert service.role_has_perm(role, "false") == False assert service.role_has_perm(role, "false") is False

View File

@ -43,6 +43,7 @@ def test_project_slug_with_special_chars():
assert project.slug == "test-han-zi" assert project.slug == "test-han-zi"
def test_project_with_existing_name_slug_with_special_chars(): def test_project_with_existing_name_slug_with_special_chars():
user = User.objects.create(username="test") user = User.objects.create(username="test")
Project.objects.create(name="漢字", description="漢字", owner=user) Project.objects.create(name="漢字", description="漢字", owner=user)

View File

@ -15,7 +15,7 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from unittest.mock import patch, MagicMock, call from unittest.mock import patch, call
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
@ -41,6 +41,7 @@ def test_push_to_timeline_many_objects():
with pytest.raises(Exception): with pytest.raises(Exception):
service.push_to_timeline(None, project, "test") service.push_to_timeline(None, project, "test")
def test_add_to_objects_timeline(): def test_add_to_objects_timeline():
with patch("taiga.timeline.service._add_to_object_timeline") as mock: with patch("taiga.timeline.service._add_to_object_timeline") as mock:
users = [User(), User(), User()] users = [User(), User(), User()]
@ -78,7 +79,7 @@ def test_get_impl_key_from_typename():
def test_get_class_implementation(): def test_get_class_implementation():
service._timeline_impl_map["timeline.timeline.test"] = "test" service._timeline_impl_map["timeline.timeline.test"] = "test"
assert service._get_class_implementation(Timeline, "test") == "test" assert service._get_class_implementation(Timeline, "test") == "test"
assert service._get_class_implementation(Timeline, "other") == None assert service._get_class_implementation(Timeline, "other") is None
def test_register_timeline_implementation(): def test_register_timeline_implementation():

View File

@ -25,6 +25,7 @@ from taiga.auth.tokens import get_token_for_user, get_user_for_token
pytestmark = pytest.mark.django_db pytestmark = pytest.mark.django_db
def test_valid_token(): def test_valid_token():
user = f.UserFactory.create(email="old@email.com") user = f.UserFactory.create(email="old@email.com")
token = get_token_for_user(user, "testing_scope") token = get_token_for_user(user, "testing_scope")
@ -34,19 +35,19 @@ def test_valid_token():
@pytest.mark.xfail(raises=exc.NotAuthenticated) @pytest.mark.xfail(raises=exc.NotAuthenticated)
def test_invalid_token(): def test_invalid_token():
user = f.UserFactory.create(email="old@email.com") f.UserFactory.create(email="old@email.com")
user_from_token = get_user_for_token("testing_invalid_token", "testing_scope") get_user_for_token("testing_invalid_token", "testing_scope")
@pytest.mark.xfail(raises=exc.NotAuthenticated) @pytest.mark.xfail(raises=exc.NotAuthenticated)
def test_invalid_token_expiration(): def test_invalid_token_expiration():
user = f.UserFactory.create(email="old@email.com") user = f.UserFactory.create(email="old@email.com")
token = get_token_for_user(user, "testing_scope") token = get_token_for_user(user, "testing_scope")
user_from_token = get_user_for_token(token, "testing_scope", max_age=1) get_user_for_token(token, "testing_scope", max_age=1)
@pytest.mark.xfail(raises=exc.NotAuthenticated) @pytest.mark.xfail(raises=exc.NotAuthenticated)
def test_invalid_token_scope(): def test_invalid_token_scope():
user = f.UserFactory.create(email="old@email.com") user = f.UserFactory.create(email="old@email.com")
token = get_token_for_user(user, "testing_scope") token = get_token_for_user(user, "testing_scope")
user_from_token = get_user_for_token(token, "testing_invalid_scope") get_user_for_token(token, "testing_invalid_scope")

View File

@ -14,7 +14,6 @@
# #
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import functools
from django.db.models import signals from django.db.models import signals
from taiga.base.utils import json from taiga.base.utils import json
@ -60,6 +59,7 @@ def _helper_test_http_method_responses(client, method, url, data, users, after_e
after_each_request() after_each_request()
return results return results
def helper_test_http_method(client, method, url, data, users, after_each_request=None, def helper_test_http_method(client, method, url, data, users, after_each_request=None,
content_type="application/json"): content_type="application/json"):
responses = _helper_test_http_method_responses(client, method, url, data, users, after_each_request, responses = _helper_test_http_method_responses(client, method, url, data, users, after_each_request,
@ -71,6 +71,7 @@ def helper_test_http_method_and_count(client, method, url, data, users, after_ea
responses = _helper_test_http_method_responses(client, method, url, data, users, after_each_request) responses = _helper_test_http_method_responses(client, method, url, data, users, after_each_request)
return list(map(lambda r: (r.status_code, len(json.loads(r.content.decode('utf-8')))), responses)) return list(map(lambda r: (r.status_code, len(json.loads(r.content.decode('utf-8')))), responses))
def helper_test_http_method_and_keys(client, method, url, data, users, after_each_request=None): def helper_test_http_method_and_keys(client, method, url, data, users, after_each_request=None):
responses = _helper_test_http_method_responses(client, method, url, data, users, after_each_request) responses = _helper_test_http_method_responses(client, method, url, data, users, after_each_request)
return list(map(lambda r: (r.status_code, set(json.loads(r.content.decode('utf-8')).keys())), responses)) return list(map(lambda r: (r.status_code, set(json.loads(r.content.decode('utf-8')).keys())), responses))