Skip to content

Commit 17089c0

Browse files
authored
Merge pull request #351 from superannotateai/friday
Added tests
2 parents b34e151 + d4df27b commit 17089c0

File tree

4 files changed

+89
-48
lines changed

4 files changed

+89
-48
lines changed

src/superannotate/lib/app/interface/sdk_interface.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
2121
from lib.app.interface.types import AnnotationStatuses
2222
from lib.app.interface.types import AnnotationType
2323
from lib.app.interface.types import AnnotatorRole
24+
from lib.app.interface.types import EmailStr
2425
from lib.app.interface.types import ImageQualityChoices
2526
from lib.app.interface.types import NotEmptyStr
2627
from lib.app.interface.types import ProjectTypes
2728
from lib.app.interface.types import validate_arguments
28-
from lib.app.interface.types import EmailStr
2929
from lib.app.mixp.decorators import Trackable
3030
from lib.app.serializers import BaseSerializers
3131
from lib.app.serializers import ImageSerializer

src/superannotate/lib/core/usecases/projects.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -999,11 +999,11 @@ def execute(self):
999999
],
10001000
)
10011001
if response and not response.get("invalidUsers"):
1002-
self._response.data = to_add, to_skip
10031002
self.reporter.log_info(
10041003
f"Added {len(to_add)}/{len(self._emails)} "
10051004
"contributors to the project <project_name> with the <role> role."
10061005
)
1006+
self._response.data = to_add, to_skip
10071007
return self._response
10081008

10091009

@@ -1053,8 +1053,8 @@ def execute(self):
10531053
emails=to_add
10541054
)
10551055
if response:
1056-
self._response.data = to_add, to_skip
10571056
self.reporter.log_info(
10581057
f"Sent team <admin/contributor> invitations to {len(to_add)}/{len(self._emails)}."
10591058
)
1059+
self._response.data = to_add, to_skip
10601060
return self._response

src/superannotate/lib/infrastructure/controller.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,10 @@ def s3_repo(self):
246246
def annotation_validators(self):
247247
return AnnotationValidator()
248248

249+
@property
250+
def backend_client(self):
251+
return self._backend_client
252+
249253

250254
class Controller(BaseController):
251255
def __init__(self, config_path=constances.CONFIG_FILE_LOCATION):
@@ -1569,17 +1573,17 @@ def add_contributors_to_project(self, project_name: str, emails: list, role: str
15691573
project=project.data["project"],
15701574
emails=emails,
15711575
role=role,
1572-
service=self._backend_client,
1576+
service=self.backend_client,
15731577
)
15741578
return use_case.execute()
15751579

1576-
def invite_contributors_to_team(self, emails: list, set_admin: str):
1580+
def invite_contributors_to_team(self, emails: list, set_admin: bool):
15771581
team = self.get_team()
15781582
use_case = usecases.InviteContributorsToTeam(
15791583
reporter=self.default_reporter,
15801584
team=team.data,
15811585
emails=emails,
15821586
set_admin=set_admin,
1583-
service=self._backend_client,
1587+
service=self.backend_client,
15841588
)
15851589
return use_case.execute()
Lines changed: 79 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,79 @@
1-
# import random
2-
# import string
3-
# from unittest.mock import patch
4-
#
5-
# import src.superannotate as sa
6-
# from src.superannotate import controller
7-
# from src.superannotate.lib.core.entities import TeamEntity
8-
# from src.superannotate.lib.core.entities import ProjectEntity
9-
# from src.superannotate.lib.core.entities import UserEntity
10-
#
11-
# from tests.integration.base import BaseTestCase
12-
#
13-
#
14-
# class TestProject(BaseTestCase):
15-
# PROJECT_NAME = "add_contributors_to_project"
16-
# PROJECT_TYPE = "Vector"
17-
# PROJECT_DESCRIPTION = "DESCRIPTION"
18-
# TEST_EMAILS = ()
19-
#
20-
# @property
21-
# def random_email(self):
22-
# return f"{''.join(random.choice(string.ascii_letters) for _ in range(7))}@gmail.com"
23-
#
24-
# @patch("src.superannotate.lib.infrastructure.controller.Controller.get_team")
25-
# @patch("src.superannotate.lib.infrastructure.controller.Controller.get_project_metadata")
26-
# def test_add_contributors(self, get_team_mock, get_project_metadata_mock):
27-
#
28-
# random_emails = [self.random_email for i in range(30)]
29-
#
30-
# team_users = [UserEntity(email=email) for email in random_emails[: 10]]
31-
# to_add_emails = random_emails[8: 18]
32-
# pending_users = random_emails[15: 20]
33-
# unverified_users = random_emails[20: 30]
34-
#
35-
# get_team_mock.return_value = TeamEntity(uuid=controller.team_id, users=team_users)
36-
# get_project_metadata_mock.return_value = dict(
37-
# data=ProjectEntity(
38-
# uuid=controller.team_id,
39-
# users=team_users
40-
# )
41-
# )
42-
# # added, skipped = sa.add_contributors_to_project(self.PROJECT_NAME)
1+
import random
2+
import string
3+
from unittest.mock import patch
4+
from unittest.mock import MagicMock
5+
from unittest.mock import PropertyMock
6+
7+
import src.superannotate as sa
8+
from src.superannotate import controller
9+
from src.superannotate.lib.core.entities import TeamEntity
10+
from src.superannotate.lib.core.entities import ProjectEntity
11+
from src.superannotate.lib.core.entities import UserEntity
12+
13+
from tests.integration.base import BaseTestCase
14+
15+
16+
class TestProject(BaseTestCase):
17+
PROJECT_NAME = "add_contributors_to_project"
18+
PROJECT_TYPE = "Vector"
19+
PROJECT_DESCRIPTION = "DESCRIPTION"
20+
TEST_EMAILS = ()
21+
22+
@property
23+
def random_email(self):
24+
return f"{''.join(random.choice(string.ascii_letters) for _ in range(7))}@gmail.com"
25+
26+
@patch("lib.infrastructure.controller.Controller.get_team")
27+
@patch("lib.infrastructure.controller.Controller.get_project_metadata")
28+
@patch("lib.infrastructure.controller.Controller.backend_client", new_callable=PropertyMock)
29+
def test_add_contributors(self, client, get_project_metadata_mock, get_team_mock):
30+
client.return_value.share_project_bulk.return_value = dict(invalidUsers=[])
31+
32+
random_emails = [self.random_email for i in range(20)]
33+
34+
team_users = [UserEntity(email=email, user_role=3) for email in random_emails[: 10]]
35+
project_users = [dict(user_id=email, user_role=4) for email in random_emails[: 10]]
36+
to_add_emails = random_emails[8: 18]
37+
pending_users = [dict(email=email, user_role=3) for email in random_emails[15: 20]]
38+
unverified_users = [dict(email=email, user_role=4) for email in random_emails[18: 20]]
39+
40+
team_data = MagicMock()
41+
project_data = MagicMock()
42+
get_team_mock.return_value = team_data
43+
team_data.data = TeamEntity(
44+
uuid=controller.team_id,
45+
users=team_users,
46+
pending_invitations=pending_users
47+
)
48+
get_project_metadata_mock.return_value = project_data
49+
project_data.data = dict(
50+
project=ProjectEntity(
51+
uuid=controller.team_id,
52+
users=project_users,
53+
unverified_users=unverified_users,
54+
)
55+
)
56+
added, skipped = sa.add_contributors_to_project(self.PROJECT_NAME, to_add_emails, "QA")
57+
self.assertEqual(len(added), 3)
58+
self.assertEqual(len(skipped), 7)
59+
60+
@patch("lib.infrastructure.controller.Controller.get_team")
61+
@patch("lib.infrastructure.controller.Controller.backend_client", MagicMock())
62+
def test_invite_contributors(self, get_team_mock):
63+
random_emails = [self.random_email for i in range(20)]
64+
65+
team_users = [UserEntity(email=email, user_role=3) for email in random_emails[: 10]]
66+
to_add_emails = random_emails[8: 18]
67+
pending_users = [dict(email=email, user_role=3) for email in random_emails[15: 20]]
68+
69+
team_data = MagicMock()
70+
get_team_mock.return_value = team_data
71+
team_data.data = TeamEntity(
72+
uuid=controller.team_id,
73+
users=team_users,
74+
pending_invitations=pending_users
75+
)
76+
77+
added, skipped = sa.invite_contributors_to_team(to_add_emails, False)
78+
self.assertEqual(len(added), 5)
79+
self.assertEqual(len(skipped), 5)

0 commit comments

Comments
 (0)