Skip to content

Commit 8c4b2ae

Browse files
committed
Add tests for GHTeam add/remove members
1 parent 0fad916 commit 8c4b2ae

20 files changed

+873
-1
lines changed

src/main/java/org/kohsuke/github/GHTeam.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import java.io.IOException;
77
import java.net.URL;
8+
import java.util.Locale;
89
import java.util.Map;
910
import java.util.Objects;
1011
import java.util.Optional;
@@ -151,6 +152,19 @@ public PagedIterable<GHUser> listMembers(String role) throws IOException {
151152
return root().createRequest().withUrlPath(api("/members")).with("role", role).toIterable(GHUser[].class, null);
152153
}
153154

155+
/**
156+
* List members with specified role paged iterable.
157+
*
158+
* @param role
159+
* the role
160+
* @return the paged iterable
161+
* @throws IOException
162+
* the io exception
163+
*/
164+
public PagedIterable<GHUser> listMembers(Role role) throws IOException {
165+
return listMembers(role.name().toLowerCase(Locale.ROOT));
166+
}
167+
154168
/**
155169
* Gets a single discussion by ID.
156170
*

src/test/java/org/kohsuke/github/GHTeamTest.java

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,18 @@
22

33
import org.junit.Test;
44
import org.kohsuke.github.GHTeam.Privacy;
5+
import org.kohsuke.github.GHTeam.Role;
56

67
import java.io.IOException;
78
import java.util.List;
89
import java.util.Set;
910

10-
import static org.hamcrest.Matchers.*;
11+
import static org.hamcrest.Matchers.containsInAnyOrder;
12+
import static org.hamcrest.Matchers.empty;
13+
import static org.hamcrest.Matchers.equalTo;
14+
import static org.hamcrest.Matchers.hasProperty;
15+
import static org.hamcrest.Matchers.is;
16+
import static org.hamcrest.Matchers.notNullValue;
1117

1218
public class GHTeamTest extends AbstractGitHubWireMockTest {
1319

@@ -137,4 +143,66 @@ public void testFetchEmptyChildTeams() throws IOException {
137143
assertThat(result, is(empty()));
138144
}
139145

146+
@Test
147+
public void addRemoveMember() throws IOException {
148+
String teamSlug = "dummy-team";
149+
150+
GHTeam team = gitHub.getOrganization(GITHUB_API_TEST_ORG).getTeamBySlug(teamSlug);
151+
152+
List<GHUser> members = team.listMembers().toList();
153+
154+
assertThat(members, notNullValue());
155+
assertThat("One admin in dummy team", members.size(), equalTo(1));
156+
assertThat("Specific user in admin team",
157+
members.stream().anyMatch(ghUser -> ghUser.getLogin().equals("bitwiseman")));
158+
159+
GHUser user = gitHub.getUser("gsmet");
160+
161+
try {
162+
team.add(user, Role.MAINTAINER);
163+
164+
// test all
165+
members = team.listMembers().toList();
166+
167+
assertThat(members, notNullValue());
168+
assertThat("Two members for all roles in dummy team", members.size(), equalTo(2));
169+
assertThat("Specific users in team",
170+
members,
171+
containsInAnyOrder(hasProperty("login", equalTo("bitwiseman")),
172+
hasProperty("login", equalTo("gsmet"))));
173+
174+
// test maintainer role filter
175+
members = team.listMembers(Role.MAINTAINER).toList();
176+
177+
assertThat(members, notNullValue());
178+
assertThat("Two members for all roles in dummy team", members.size(), equalTo(2));
179+
assertThat("Specific users in team",
180+
members,
181+
containsInAnyOrder(hasProperty("login", equalTo("bitwiseman")),
182+
hasProperty("login", equalTo("gsmet"))));
183+
184+
// test member role filter
185+
// it's hard to test this as owner of the org are automatically made maintainer
186+
// so let's just test that we don't have any members around
187+
members = team.listMembers(Role.MEMBER).toList();
188+
189+
assertThat(members, notNullValue());
190+
assertThat("No members in dummy team", members.size(), equalTo(0));
191+
192+
// test removing the user has effect
193+
team.remove(user);
194+
195+
members = team.listMembers().toList();
196+
197+
assertThat(members, notNullValue());
198+
assertThat("One member for all roles in dummy team", members.size(), equalTo(1));
199+
assertThat("Specific user in team",
200+
members,
201+
containsInAnyOrder(hasProperty("login", equalTo("bitwiseman"))));
202+
} finally {
203+
if (team.hasMember(user)) {
204+
team.remove(user);
205+
}
206+
}
207+
}
140208
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
[
2+
{
3+
"login": "bitwiseman",
4+
"id": 1958953,
5+
"node_id": "MDQ6VXNlcjE5NTg5NTM=",
6+
"avatar_url": "https://avatars.githubusercontent.com/u/1958953?v=4",
7+
"gravatar_id": "",
8+
"url": "https://api.github.com/users/bitwiseman",
9+
"html_url": "https://github.com/bitwiseman",
10+
"followers_url": "https://api.github.com/users/bitwiseman/followers",
11+
"following_url": "https://api.github.com/users/bitwiseman/following{/other_user}",
12+
"gists_url": "https://api.github.com/users/bitwiseman/gists{/gist_id}",
13+
"starred_url": "https://api.github.com/users/bitwiseman/starred{/owner}{/repo}",
14+
"subscriptions_url": "https://api.github.com/users/bitwiseman/subscriptions",
15+
"organizations_url": "https://api.github.com/users/bitwiseman/orgs",
16+
"repos_url": "https://api.github.com/users/bitwiseman/repos",
17+
"events_url": "https://api.github.com/users/bitwiseman/events{/privacy}",
18+
"received_events_url": "https://api.github.com/users/bitwiseman/received_events",
19+
"type": "User",
20+
"site_admin": false
21+
}
22+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
[
2+
{
3+
"login": "bitwiseman",
4+
"id": 1958953,
5+
"node_id": "MDQ6VXNlcjE5NTg5NTM=",
6+
"avatar_url": "https://avatars.githubusercontent.com/u/1958953?v=4",
7+
"gravatar_id": "",
8+
"url": "https://api.github.com/users/bitwiseman",
9+
"html_url": "https://github.com/bitwiseman",
10+
"followers_url": "https://api.github.com/users/bitwiseman/followers",
11+
"following_url": "https://api.github.com/users/bitwiseman/following{/other_user}",
12+
"gists_url": "https://api.github.com/users/bitwiseman/gists{/gist_id}",
13+
"starred_url": "https://api.github.com/users/bitwiseman/starred{/owner}{/repo}",
14+
"subscriptions_url": "https://api.github.com/users/bitwiseman/subscriptions",
15+
"organizations_url": "https://api.github.com/users/bitwiseman/orgs",
16+
"repos_url": "https://api.github.com/users/bitwiseman/repos",
17+
"events_url": "https://api.github.com/users/bitwiseman/events{/privacy}",
18+
"received_events_url": "https://api.github.com/users/bitwiseman/received_events",
19+
"type": "User",
20+
"site_admin": false
21+
}
22+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
[
2+
{
3+
"login": "gsmet",
4+
"id": 1279749,
5+
"node_id": "MDQ6VXNlcjEyNzk3NDk=",
6+
"avatar_url": "https://avatars.githubusercontent.com/u/1279749?u=e462a6165ea17647aed446ca31fae604338ae18c&v=4",
7+
"gravatar_id": "",
8+
"url": "https://api.github.com/users/gsmet",
9+
"html_url": "https://github.com/gsmet",
10+
"followers_url": "https://api.github.com/users/gsmet/followers",
11+
"following_url": "https://api.github.com/users/gsmet/following{/other_user}",
12+
"gists_url": "https://api.github.com/users/gsmet/gists{/gist_id}",
13+
"starred_url": "https://api.github.com/users/gsmet/starred{/owner}{/repo}",
14+
"subscriptions_url": "https://api.github.com/users/gsmet/subscriptions",
15+
"organizations_url": "https://api.github.com/users/gsmet/orgs",
16+
"repos_url": "https://api.github.com/users/gsmet/repos",
17+
"events_url": "https://api.github.com/users/gsmet/events{/privacy}",
18+
"received_events_url": "https://api.github.com/users/gsmet/received_events",
19+
"type": "User",
20+
"site_admin": false
21+
},
22+
{
23+
"login": "bitwiseman",
24+
"id": 1958953,
25+
"node_id": "MDQ6VXNlcjE5NTg5NTM=",
26+
"avatar_url": "https://avatars.githubusercontent.com/u/1958953?v=4",
27+
"gravatar_id": "",
28+
"url": "https://api.github.com/users/bitwiseman",
29+
"html_url": "https://github.com/bitwiseman",
30+
"followers_url": "https://api.github.com/users/bitwiseman/followers",
31+
"following_url": "https://api.github.com/users/bitwiseman/following{/other_user}",
32+
"gists_url": "https://api.github.com/users/bitwiseman/gists{/gist_id}",
33+
"starred_url": "https://api.github.com/users/bitwiseman/starred{/owner}{/repo}",
34+
"subscriptions_url": "https://api.github.com/users/bitwiseman/subscriptions",
35+
"organizations_url": "https://api.github.com/users/bitwiseman/orgs",
36+
"repos_url": "https://api.github.com/users/bitwiseman/repos",
37+
"events_url": "https://api.github.com/users/bitwiseman/events{/privacy}",
38+
"received_events_url": "https://api.github.com/users/bitwiseman/received_events",
39+
"type": "User",
40+
"site_admin": false
41+
}
42+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
[
2+
{
3+
"login": "gsmet",
4+
"id": 1279749,
5+
"node_id": "MDQ6VXNlcjEyNzk3NDk=",
6+
"avatar_url": "https://avatars.githubusercontent.com/u/1279749?u=e462a6165ea17647aed446ca31fae604338ae18c&v=4",
7+
"gravatar_id": "",
8+
"url": "https://api.github.com/users/gsmet",
9+
"html_url": "https://github.com/gsmet",
10+
"followers_url": "https://api.github.com/users/gsmet/followers",
11+
"following_url": "https://api.github.com/users/gsmet/following{/other_user}",
12+
"gists_url": "https://api.github.com/users/gsmet/gists{/gist_id}",
13+
"starred_url": "https://api.github.com/users/gsmet/starred{/owner}{/repo}",
14+
"subscriptions_url": "https://api.github.com/users/gsmet/subscriptions",
15+
"organizations_url": "https://api.github.com/users/gsmet/orgs",
16+
"repos_url": "https://api.github.com/users/gsmet/repos",
17+
"events_url": "https://api.github.com/users/gsmet/events{/privacy}",
18+
"received_events_url": "https://api.github.com/users/gsmet/received_events",
19+
"type": "User",
20+
"site_admin": false
21+
},
22+
{
23+
"login": "bitwiseman",
24+
"id": 1958953,
25+
"node_id": "MDQ6VXNlcjE5NTg5NTM=",
26+
"avatar_url": "https://avatars.githubusercontent.com/u/1958953?v=4",
27+
"gravatar_id": "",
28+
"url": "https://api.github.com/users/bitwiseman",
29+
"html_url": "https://github.com/bitwiseman",
30+
"followers_url": "https://api.github.com/users/bitwiseman/followers",
31+
"following_url": "https://api.github.com/users/bitwiseman/following{/other_user}",
32+
"gists_url": "https://api.github.com/users/bitwiseman/gists{/gist_id}",
33+
"starred_url": "https://api.github.com/users/bitwiseman/starred{/owner}{/repo}",
34+
"subscriptions_url": "https://api.github.com/users/bitwiseman/subscriptions",
35+
"organizations_url": "https://api.github.com/users/bitwiseman/orgs",
36+
"repos_url": "https://api.github.com/users/bitwiseman/repos",
37+
"events_url": "https://api.github.com/users/bitwiseman/events{/privacy}",
38+
"received_events_url": "https://api.github.com/users/bitwiseman/received_events",
39+
"type": "User",
40+
"site_admin": false
41+
}
42+
]
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"login": "hub4j-test-org",
3+
"id": 7544739,
4+
"node_id": "MDEyOk9yZ2FuaXphdGlvbjc1NDQ3Mzk=",
5+
"url": "https://api.github.com/orgs/hub4j-test-org",
6+
"repos_url": "https://api.github.com/orgs/hub4j-test-org/repos",
7+
"events_url": "https://api.github.com/orgs/hub4j-test-org/events",
8+
"hooks_url": "https://api.github.com/orgs/hub4j-test-org/hooks",
9+
"issues_url": "https://api.github.com/orgs/hub4j-test-org/issues",
10+
"members_url": "https://api.github.com/orgs/hub4j-test-org/members{/member}",
11+
"public_members_url": "https://api.github.com/orgs/hub4j-test-org/public_members{/member}",
12+
"avatar_url": "https://avatars.githubusercontent.com/u/7544739?v=4",
13+
"description": "Hub4j Test Org Description (this could be null or blank too)",
14+
"name": "Hub4j Test Org Name (this could be null or blank too)",
15+
"company": null,
16+
"blog": "https://hub4j.url.io/could/be/null",
17+
"location": "Hub4j Test Org Location (this could be null or blank too)",
18+
"email": "[email protected]",
19+
"twitter_username": null,
20+
"is_verified": false,
21+
"has_organization_projects": true,
22+
"has_repository_projects": true,
23+
"public_repos": 49,
24+
"public_gists": 0,
25+
"followers": 0,
26+
"following": 0,
27+
"html_url": "https://github.com/hub4j-test-org",
28+
"created_at": "2014-05-10T19:39:11Z",
29+
"updated_at": "2020-06-04T05:56:10Z",
30+
"type": "Organization",
31+
"total_private_repos": 4,
32+
"owned_private_repos": 4,
33+
"private_gists": 0,
34+
"disk_usage": 11979,
35+
"collaborators": 0,
36+
"billing_email": "[email protected]",
37+
"default_repository_permission": "none",
38+
"members_can_create_repositories": false,
39+
"two_factor_requirement_enabled": false,
40+
"members_allowed_repository_creation_type": "none",
41+
"members_can_create_public_repositories": false,
42+
"members_can_create_private_repositories": false,
43+
"members_can_create_internal_repositories": false,
44+
"members_can_create_pages": true,
45+
"members_can_fork_private_repositories": false,
46+
"members_can_create_public_pages": true,
47+
"members_can_create_private_pages": true,
48+
"plan": {
49+
"name": "free",
50+
"space": 976562499,
51+
"private_repos": 10000,
52+
"filled_seats": 37,
53+
"seats": 3
54+
}
55+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
{
2+
"name": "dummy-team",
3+
"id": 3451996,
4+
"node_id": "MDQ6VGVhbTM0NTE5OTY=",
5+
"slug": "dummy-team",
6+
"description": "Updated by API TestModified",
7+
"privacy": "closed",
8+
"url": "https://api.github.com/organizations/7544739/team/3451996",
9+
"html_url": "https://github.com/orgs/hub4j-test-org/teams/dummy-team",
10+
"members_url": "https://api.github.com/organizations/7544739/team/3451996/members{/member}",
11+
"repositories_url": "https://api.github.com/organizations/7544739/team/3451996/repos",
12+
"permission": "pull",
13+
"created_at": "2019-10-03T21:46:12Z",
14+
"updated_at": "2022-03-04T10:36:59Z",
15+
"members_count": 1,
16+
"repos_count": 1,
17+
"organization": {
18+
"login": "hub4j-test-org",
19+
"id": 7544739,
20+
"node_id": "MDEyOk9yZ2FuaXphdGlvbjc1NDQ3Mzk=",
21+
"url": "https://api.github.com/orgs/hub4j-test-org",
22+
"repos_url": "https://api.github.com/orgs/hub4j-test-org/repos",
23+
"events_url": "https://api.github.com/orgs/hub4j-test-org/events",
24+
"hooks_url": "https://api.github.com/orgs/hub4j-test-org/hooks",
25+
"issues_url": "https://api.github.com/orgs/hub4j-test-org/issues",
26+
"members_url": "https://api.github.com/orgs/hub4j-test-org/members{/member}",
27+
"public_members_url": "https://api.github.com/orgs/hub4j-test-org/public_members{/member}",
28+
"avatar_url": "https://avatars.githubusercontent.com/u/7544739?v=4",
29+
"description": "Hub4j Test Org Description (this could be null or blank too)",
30+
"name": "Hub4j Test Org Name (this could be null or blank too)",
31+
"company": null,
32+
"blog": "https://hub4j.url.io/could/be/null",
33+
"location": "Hub4j Test Org Location (this could be null or blank too)",
34+
"email": "[email protected]",
35+
"twitter_username": null,
36+
"is_verified": false,
37+
"has_organization_projects": true,
38+
"has_repository_projects": true,
39+
"public_repos": 49,
40+
"public_gists": 0,
41+
"followers": 0,
42+
"following": 0,
43+
"html_url": "https://github.com/hub4j-test-org",
44+
"created_at": "2014-05-10T19:39:11Z",
45+
"updated_at": "2020-06-04T05:56:10Z",
46+
"type": "Organization"
47+
},
48+
"parent": null
49+
}

0 commit comments

Comments
 (0)