import json from unittest.mock import patch from db import db from tests.test_utils import FixtureLoader from models import models, Project from tests import BaseTestCase, mock_for_user from tests.projects.fixtures.project_sharing_fixture import fixture user5Mock = mock_for_user(5, "dev-marketing-user-5@example.com", "sme-dna|1mk0091d6cuhjp30fe6optiii") user10Mock = mock_for_user(10, "dev-marketing-10@example.com", "sme-dna|phn0077d6cuhjp30fe6oadm10") user1Mock = mock_for_user(1, "dev-marketing-user-1@example.com", "sme-dna|5cf0091d6c91d310fe6fcdc6") EDITOR = 1 VIEWER = 3 APPROVER = 4 class TestProjectSharing(BaseTestCase): url = "/projects/{}/sharing" def setUp(self): super().setUp() FixtureLoader(models=models).import_as_sql(fixture) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user5Mock.jwt_decode) def test_get_project_sharing_with_label_admin_that_in_artist_team(self): response = self.client.get(self.url.format(500), headers=self.headers) self.assertEqual(200, response.status_code) data = response.json project_team = data.get("projectTeam") approvers = data.get("approvers") artist_team_and_admins = data.get("artistTeamAndAdmins") self.soft_assert(self.assertIsNotNone, approvers) self.soft_assert(self.assertIsNotNone, project_team) self.soft_assert(self.assertIsNotNone, artist_team_and_admins) self.soft_assert_equal(len(project_team), 4) self.soft_assert_equal(len(approvers), 0) self.soft_assert_equal(len(artist_team_and_admins), 2) self.soft_assert_equal(artist_team_and_admins[0]["id"], 8) self.soft_assert_equal(artist_team_and_admins[0]["name"], 'Perfect admin') self.soft_assert_equal(artist_team_and_admins[0]["role"]["name"], "Admin") self.soft_assert_equal(artist_team_and_admins[1]["id"], 7) # this user have artist team self.soft_assert_equal(artist_team_and_admins[1]["name"], 'dev-marketing-user-7') self.soft_assert_equal(artist_team_and_admins[1]["role"]["name"], "Admin") self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user10Mock.jwt_decode) def test_get_project_sharing_with_user_in_project_team_and_approvers(self): response = self.client.get(self.url.format(507), headers=self.headers) self.assertEqual(200, response.status_code) data = response.json approvers = data.get("approvers") project_team = data.get("projectTeam") self.soft_assert_equal(approvers[0]["role"]["name"], "Approver") self.soft_assert_equal(approvers[0]["id"], 10) self.soft_assert_equal(project_team[0]["role"]["name"], "Editor") self.soft_assert_equal(project_team[0]["id"], 10) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user5Mock.jwt_decode) def test_get_sharing_when_user_not_related_to_project(self): response = self.client.get(self.url.format(503), headers=self.headers) self.assertEqual(403, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user5Mock.jwt_decode) def test_get_sharing_when_project_not_exist(self): response = self.client.get(self.url.format(1001), headers=self.headers) self.assertEqual(404, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_get_project_sharing_for_confidential_project_without_access(self): response = self.client.get(self.url.format(508), headers=self.headers) self.assertEqual(403, response.status_code) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_add_multiple_editors(self): data = { "usersIds": [10, 2], "roleId": EDITOR } response = self.execute_post(self.url.format(500), data=json.dumps(data), headers=self.headers) self.assertEqual(response.status_code, 204) response = self.execute_get(self.url.format(500), headers=self.headers) self.assertEqual(response.status_code, 200) data = response.json project_team = data.get("projectTeam") self.soft_assert_equal(len(project_team), 6) self.assert_all() @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_add_same_user_few_times(self): data = { "usersIds": [10, 10], "roleId": EDITOR } response = self.execute_post(self.url.format(500), headers=self.headers, data=json.dumps(data)) self.assertEqual(response.status_code, 422) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_add_user_that_already_in_team_change_role_or_not_do_if_role_the_same(self): data = { "usersIds": [1], "roleId": VIEWER } response = self.execute_post(self.url.format(500), headers=self.headers, data=json.dumps(data)) self.assertEqual(response.status_code, 204) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_update_user_role_from_viewer_to_editor(self): data = { "userId": 5, "roleId": EDITOR } response = self.execute_patch(self.url.format(500), headers=self.headers, data=json.dumps(data)) self.assertEqual(response.status_code, 204) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_update_user_role_from_editor_to_viewer(self): data = { "userId": 1, "roleId": VIEWER } response = self.execute_patch(self.url.format(500), headers=self.headers, data=json.dumps(data)) self.assertEqual(response.status_code, 204) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def test_add_user_role_for_approver(self): response = self.execute_post(self.url.format(500), headers=self.headers, data=json.dumps({ "usersIds": [42], "roleId": EDITOR })) self.assertEqual(response.status_code, 204) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def delete_approver_role(self): data = { "userId": 42, "roleId": APPROVER } response = self.execute_delete(self.url.format(505), headers=self.headers, data=json.dumps(data)) self.assertEqual(response.status_code, 204) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def delete_user_from_project_team_with_incorrect_role_raise_error(self): data = { "userId": 1, "roleId": VIEWER } response = self.execute_delete(self.url.format(500), headers=self.headers, data=json.dumps(data)) self.assertEqual(response.status_code, 403) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def delete_from_project_team_user_that_approver_still_approver(self): data = { "userId": 42, "roleId": EDITOR } response = self.execute_delete(self.url.format(505), headers=self.headers, data=json.dumps(data)) self.assertEqual(response.status_code, 204) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def delete_approver_user_with_other_role_remove_only_approver_role(self): data = { "userId": 42, "roleId": APPROVER } response = self.execute_delete(self.url.format(505), headers=self.headers, data=json.dumps(data)) self.assertEqual(response.status_code, 204) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def action_with_not_existed_user_raise_404(self): data = { "usersIds": [69], "roleId": EDITOR, } response = self.execute_post(self.url.format(500), headers=self.headers, data=json.dumps(data)) self.assertEqual(response.status_code, 404) data = { "userId": 69, "roleId": EDITOR, } response = self.execute_patch(self.url.format(500), headers=self.headers, data=json.dumps(data)) self.assertEqual(response.status_code, 404) response = self.execute_delete(self.url.format(500), headers=self.headers, data=json.dumps(data)) self.assertEqual(response.status_code, 404) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def add_users_to_the_team_that_already_in_artist_team_raise_400(self): data = { "usersIds": [8], "roleId": EDITOR, } response = self.execute_post(self.url.format(500), headers=self.headers, data=json.dumps(data)) self.assertEqual(response.status_code, 400) @patch("auth.atlas.atlas_token_decoder.jwt.decode", user1Mock.jwt_decode) def claiming_unclaiming_project_adding_removing_user(self): data = { "usersIds": [8], "roleId": EDITOR, } project = db.session.query(Project).filter(Project.id == 510).one() self.assertEqual(project.is_claimed, False) response = self.execute_post(self.url.format(510), headers=self.headers, data=json.dumps(data)) self.assertEqual(response.status_code, 200) project = db.session.query(Project).filter(Project.id == 510).one() self.assertEqual(project.is_claimed, True) response = self.execute_delete(self.url.format(510), headers=self.headers, data=json.dumps({ "userId": 8, "roleId": EDITOR })) self.assertEqual(response.status_code, 204) project = db.session.query(Project).filter(Project.id == 510).one() self.assertEqual(project.is_claimed, False)