44there are a few limitations due to actions that cannot be performed through
55the API, notably :
66- Create the workspace
7- - Create members
8- - Add deleted members back to the workspace
9- - Integrate a source
7+ - We cannot create members, so there must exist a minimum amount of members in the workspace
8+ - This also means deleted members cannot be brought back from the script
9+ - We cannot integrate a source entirely from the public API
10+ - There must exist a source in the workspace
1011"""
1112
1213import os
5051PYGITGUARDIAN_TEST_TEAM = "PyGitGuardian team"
5152
5253
53- def ensure_not_detail (var : T | Detail ) -> T :
54+ def ensure_success (var : T | Detail ) -> T :
5455 if not isinstance (var , Detail ):
5556 return var
5657 else :
@@ -60,12 +61,21 @@ def ensure_not_detail(var: T | Detail) -> T:
6061def unwrap_paginated_response (
6162 var : CursorPaginatedResponse [PaginatedDataType ] | Detail ,
6263) -> List [PaginatedDataType ]:
63- data = ensure_not_detail (var )
64+ data = ensure_success (var )
6465
6566 return data .data
6667
6768
6869def ensure_member_coherence ():
70+ """
71+ This function ensures that the workspace :
72+ - Has no deactivated members
73+ - If there are, they will be activated
74+ - Has at most 1 admin / manager (excluding owner)
75+ - It may demote some manager to member
76+ - There is at least `MIN_NB_MEMBER`
77+ """
78+
6979 deactivated_members = unwrap_paginated_response (
7080 client .list_members (MembersParameters (active = False ))
7181 )
@@ -78,7 +88,7 @@ def ensure_member_coherence():
7888
7989 if len (admin_members ) > 1 :
8090 for member in admin_members [1 :]:
81- ensure_not_detail (
91+ ensure_success (
8292 client .update_member (UpdateMember (member .id , AccessLevel .MEMBER ))
8393 )
8494 else :
@@ -89,20 +99,22 @@ def ensure_member_coherence():
8999 len (members ) > 0
90100 ), "There must be at least one member with access level member in the workspace"
91101
92- ensure_not_detail (
102+ ensure_success (
93103 client .update_member (UpdateMember (members [0 ].id , AccessLevel .MANAGER ))
94104 )
95105
96- members = ensure_not_detail (client .list_members (MembersParameters (per_page = 5 )))
106+ members = ensure_success (client .list_members (MembersParameters (per_page = 5 )))
97107
98- assert len (members .data ) > 3 , "There must be at least 3 members in the workspace"
108+ assert (
109+ len (members .data ) > MIN_NB_MEMBER
110+ ), "There must be at least 3 members in the workspace"
99111
100112
101113def add_source_to_team (team : Team , available_sources : Iterable [Source ] | None = None ):
102114 if available_sources is None :
103- available_sources = ensure_not_detail (client .list_sources ()).data
115+ available_sources = ensure_success (client .list_sources ()).data
104116
105- ensure_not_detail (
117+ ensure_success (
106118 client .update_team_source (
107119 UpdateTeamSource (team .id , [source .id for source in available_sources ], [])
108120 )
@@ -133,7 +145,7 @@ def add_team_members(
133145 )
134146 assert admin_member is not None , "There should be at least one admin member"
135147
136- ensure_not_detail (
148+ ensure_success (
137149 client .create_team_member (
138150 team .id ,
139151 CreateTeamMember (
@@ -163,7 +175,7 @@ def add_team_members(
163175 if to_add_member .access_level == AccessLevel .MANAGER :
164176 is_team_leader = True
165177
166- ensure_not_detail (
178+ ensure_success (
167179 client .create_team_member (
168180 team .id ,
169181 CreateTeamMember (
@@ -176,6 +188,17 @@ def add_team_members(
176188
177189
178190def ensure_team_coherence ():
191+ """
192+ This function ensures that the workspace :
193+ - Has no team with name prefixed by `PYGITGUARDIAN_TEST_TEAM`
194+ - At least `MIN_NB_TEAM` exist
195+ - If not they will be created
196+ - Every team has at least one source
197+ - If possible, it will try to add at least one source
198+ - Every team has at least 2 members, an admin and a member
199+ - If possible, it will try to add those members
200+ """
201+
179202 pygitguardian_teams = []
180203 try :
181204 pygitguardian_teams = unwrap_paginated_response (
@@ -186,7 +209,7 @@ def ensure_team_coherence():
186209 raise
187210 finally :
188211 for team in pygitguardian_teams :
189- ensure_not_detail (client .delete_team (team .id ))
212+ ensure_success (client .delete_team (team .id ))
190213
191214 teams = unwrap_paginated_response (
192215 # exclude global team since we can't add sources / members to it
@@ -196,7 +219,7 @@ def ensure_team_coherence():
196219 nb_teams = len (teams )
197220 if nb_teams < MIN_NB_TEAM :
198221 for i in range (MIN_NB_TEAM - nb_teams ):
199- new_team = ensure_not_detail (
222+ new_team = ensure_success (
200223 client .create_team (CreateTeam (name = f"PyGitGuardian Team { i } " ))
201224 )
202225 teams .append (new_team )
@@ -217,16 +240,25 @@ def ensure_team_coherence():
217240
218241
219242def ensure_invitation_coherence ():
243+ """
244+ This function ensures that the workspace :
245+ - Has no invitation for emails starting with `pygitguardian`
246+ - There is at least one pending invitation
247+ - If not, an invitation will be sent to `pygitguardian@example.com`
248+ - All team have attached team invitations
249+ - If not, they will be created
250+ """
251+
220252 test_invitation = unwrap_paginated_response (
221253 client .list_invitations (InvitationParameters (search = "pygitguardian" ))
222254 )
223255
224256 for invitation in test_invitation :
225- ensure_not_detail (client .delete_invitation (invitation .id ))
257+ ensure_success (client .delete_invitation (invitation .id ))
226258 invitations = unwrap_paginated_response (client .list_invitations ())
227259
228260 if len (invitations ) < 1 :
229- invitation = ensure_not_detail (
261+ invitation = ensure_success (
230262 client .create_invitation (
231263 CreateInvitation (
232264 email = "pygitguardian@invitation.com" ,
@@ -243,7 +275,7 @@ def ensure_invitation_coherence():
243275 client .list_team_invitations (team .id )
244276 )
245277 if not team_invitations :
246- ensure_not_detail (
278+ ensure_success (
247279 client .create_team_invitation (
248280 team .id ,
249281 CreateTeamInvitation (
0 commit comments