4
4
there are a few limitations due to actions that cannot be performed through
5
5
the API, notably :
6
6
- 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
10
11
"""
11
12
12
13
import os
50
51
PYGITGUARDIAN_TEST_TEAM = "PyGitGuardian team"
51
52
52
53
53
- def ensure_not_detail (var : T | Detail ) -> T :
54
+ def ensure_success (var : T | Detail ) -> T :
54
55
if not isinstance (var , Detail ):
55
56
return var
56
57
else :
@@ -60,12 +61,21 @@ def ensure_not_detail(var: T | Detail) -> T:
60
61
def unwrap_paginated_response (
61
62
var : CursorPaginatedResponse [PaginatedDataType ] | Detail ,
62
63
) -> List [PaginatedDataType ]:
63
- data = ensure_not_detail (var )
64
+ data = ensure_success (var )
64
65
65
66
return data .data
66
67
67
68
68
69
def 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
+
69
79
deactivated_members = unwrap_paginated_response (
70
80
client .list_members (MembersParameters (active = False ))
71
81
)
@@ -78,7 +88,7 @@ def ensure_member_coherence():
78
88
79
89
if len (admin_members ) > 1 :
80
90
for member in admin_members [1 :]:
81
- ensure_not_detail (
91
+ ensure_success (
82
92
client .update_member (UpdateMember (member .id , AccessLevel .MEMBER ))
83
93
)
84
94
else :
@@ -89,20 +99,22 @@ def ensure_member_coherence():
89
99
len (members ) > 0
90
100
), "There must be at least one member with access level member in the workspace"
91
101
92
- ensure_not_detail (
102
+ ensure_success (
93
103
client .update_member (UpdateMember (members [0 ].id , AccessLevel .MANAGER ))
94
104
)
95
105
96
- members = ensure_not_detail (client .list_members (MembersParameters (per_page = 5 )))
106
+ members = ensure_success (client .list_members (MembersParameters (per_page = 5 )))
97
107
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"
99
111
100
112
101
113
def add_source_to_team (team : Team , available_sources : Iterable [Source ] | None = None ):
102
114
if available_sources is None :
103
- available_sources = ensure_not_detail (client .list_sources ()).data
115
+ available_sources = ensure_success (client .list_sources ()).data
104
116
105
- ensure_not_detail (
117
+ ensure_success (
106
118
client .update_team_source (
107
119
UpdateTeamSource (team .id , [source .id for source in available_sources ], [])
108
120
)
@@ -133,7 +145,7 @@ def add_team_members(
133
145
)
134
146
assert admin_member is not None , "There should be at least one admin member"
135
147
136
- ensure_not_detail (
148
+ ensure_success (
137
149
client .create_team_member (
138
150
team .id ,
139
151
CreateTeamMember (
@@ -163,7 +175,7 @@ def add_team_members(
163
175
if to_add_member .access_level == AccessLevel .MANAGER :
164
176
is_team_leader = True
165
177
166
- ensure_not_detail (
178
+ ensure_success (
167
179
client .create_team_member (
168
180
team .id ,
169
181
CreateTeamMember (
@@ -176,6 +188,17 @@ def add_team_members(
176
188
177
189
178
190
def 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
+
179
202
pygitguardian_teams = []
180
203
try :
181
204
pygitguardian_teams = unwrap_paginated_response (
@@ -186,7 +209,7 @@ def ensure_team_coherence():
186
209
raise
187
210
finally :
188
211
for team in pygitguardian_teams :
189
- ensure_not_detail (client .delete_team (team .id ))
212
+ ensure_success (client .delete_team (team .id ))
190
213
191
214
teams = unwrap_paginated_response (
192
215
# exclude global team since we can't add sources / members to it
@@ -196,7 +219,7 @@ def ensure_team_coherence():
196
219
nb_teams = len (teams )
197
220
if nb_teams < MIN_NB_TEAM :
198
221
for i in range (MIN_NB_TEAM - nb_teams ):
199
- new_team = ensure_not_detail (
222
+ new_team = ensure_success (
200
223
client .create_team (CreateTeam (name = f"PyGitGuardian Team { i } " ))
201
224
)
202
225
teams .append (new_team )
@@ -217,16 +240,25 @@ def ensure_team_coherence():
217
240
218
241
219
242
def 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
+
220
252
test_invitation = unwrap_paginated_response (
221
253
client .list_invitations (InvitationParameters (search = "pygitguardian" ))
222
254
)
223
255
224
256
for invitation in test_invitation :
225
- ensure_not_detail (client .delete_invitation (invitation .id ))
257
+ ensure_success (client .delete_invitation (invitation .id ))
226
258
invitations = unwrap_paginated_response (client .list_invitations ())
227
259
228
260
if len (invitations ) < 1 :
229
- invitation = ensure_not_detail (
261
+ invitation = ensure_success (
230
262
client .create_invitation (
231
263
CreateInvitation (
232
264
email = "pygitguardian@invitation.com" ,
@@ -243,7 +275,7 @@ def ensure_invitation_coherence():
243
275
client .list_team_invitations (team .id )
244
276
)
245
277
if not team_invitations :
246
- ensure_not_detail (
278
+ ensure_success (
247
279
client .create_team_invitation (
248
280
team .id ,
249
281
CreateTeamInvitation (
0 commit comments