Compare commits

...

36 Commits

Author SHA1 Message Date
Surya Gaddipati
7e49946bed [maven-release-plugin] prepare release github-api-1.57 2014-08-19 13:29:37 -05:00
Surya Gaddipati
1e81ab1017 Merge pull request #112 from lucamilanesio/master
Get all orgs/teams/permissions in a single GitHub API call
2014-08-19 12:57:39 -05:00
Luca Milanesio
0b92fa5615 Get all orgs/teams/permissions in a single GitHub API call
Exposes a new API call at GitHub root level to build the complete
set of organisations and teams that current user belongs to.

This change allows to massively reduce the number of calls to GitHub 
especially for people that belongs to multiple organisations with 
lots of teams and members.

Signed-off-by: Luca Milanesio <luca.milanesio@gmail.com>
2014-07-24 23:42:37 +01:00
Kohsuke Kawaguchi
590f7ba511 Merge pull request #106 from lucamilanesio/master
Implement pagination on list of private+public repos of a user.
2014-07-04 19:13:04 -07:00
Luca Milanesio
449909b0e8 Implement pagination on list of private+public repos of a user.
The paginated version of listRepositories() was 
missing at GHMyself: as side-effect of this bug
when requesting a paginated list of repositories
the ones privately owned by a user were not shown.

This was caused by the missing override of the 
listRepositories(final int pageSize) at GHMyself
that caused the GHPerson implementation to invoked.

The GHPerson version uses the /users/:org/repos?per_page=x
URL which *works fine* for organisations but unfortunately
*does not return* private repositories for users.

IMHO GitHub API are quite inconsistent form this 
point of view, but they are documented in this way
so that work (inconsistently) as designed.
2014-07-03 10:05:17 +01:00
Kohsuke Kawaguchi
40780525f8 Bumping up the version in the hope of fixing site plugin problem 2014-07-02 21:39:13 -07:00
Kohsuke Kawaguchi
0e3707d1c3 [maven-release-plugin] prepare for next development iteration 2014-07-02 21:28:38 -07:00
Kohsuke Kawaguchi
8ddbef093b [maven-release-plugin] prepare release github-api-1.56 2014-07-02 21:28:34 -07:00
Kohsuke Kawaguchi
4ccdfccdf0 Oops forgot to commit this change 2014-07-02 21:27:11 -07:00
Kohsuke Kawaguchi
3c8aa0c630 Convention dictates that the method name be "listXyz"
getCollaborators() only fetching the first page is a bug, so we should fix that too.
2014-07-02 21:24:17 -07:00
Kohsuke Kawaguchi
ba519f996a Extracted non-formatting changes from pull request #98
The original commit has too many whitespace noise changes.

Reference: https://github.com/kohsuke/github-api/pull/98
2014-07-02 21:22:17 -07:00
Kohsuke Kawaguchi
62d9b92e6e Merge pull request #103 from rtyley/okhttp-2.0.0
Update to OkHttp 2.0.0, which has a new OkUrlFactory
2014-07-02 21:13:37 -07:00
Kohsuke Kawaguchi
d2c909584d Merge pull request #102 from jglick/clearer-FNFE
Better FNFE from delete()
2014-07-02 21:13:16 -07:00
Kohsuke Kawaguchi
219916eb14 Merge pull request #101 from farmdawgnation/final-answer
Un-finalize a handful of classes.
2014-07-02 21:12:59 -07:00
Roberto Tyley
0a37ac901f Update to OkHttp 2.0.0, which has a new OkUrlFactory
OkHttp changed API with v2.0.0, and the `client.open(url)` method no
longer exists:

"URLConnection support has moved to the okhttp-urlconnection module.
If you're upgrading from 1.x, this change will impact you. You will
need to add the okhttp-urlconnection module to your project and use
the OkUrlFactory to create new instances of HttpURLConnection"

https://github.com/square/okhttp/blob/master/CHANGELOG.md#version-200-rc1
2014-06-28 11:12:25 +01:00
Jesse Glick
4586baea27 Explain what a FNFE from delete() may just mean your token is lacking delete_repo. 2014-06-24 10:38:13 -04:00
Matt Farmer
d83961e85b Un-finalize a handful of classes. 2014-06-14 19:34:42 -04:00
Kohsuke Kawaguchi
7e35716ff0 [maven-release-plugin] prepare for next development iteration 2014-06-08 10:37:21 -07:00
Kohsuke Kawaguchi
d0cf1ac605 [maven-release-plugin] prepare release github-api-1.55 2014-06-08 10:37:17 -07:00
Kohsuke Kawaguchi
9a19d07ab8 I'm getting "the key is already in use" error.
Creating a new thro-away key
2014-06-08 10:36:05 -07:00
Kohsuke Kawaguchi
922be0b164 make sure the key gets deleted no matter what 2014-06-08 10:31:15 -07:00
Kohsuke Kawaguchi
d0b8e2e37e Merge pull request #97 from suryagaddipati/add_context_to_commit_status
Add support for adding context to commit status.
2014-06-08 10:21:43 -07:00
Surya Gaddipati
e3d6e08b6a Preserve api compatablity with previous version.
Support adding commitstatus without context.
2014-06-07 14:43:09 -05:00
Surya Gaddipati
16a6623095 Add support for adding context to commit status.
This groups statuses from multiple contexts to return single combined
status. More information here:
https://developer.github.com/changes/2014-03-27-combined-status-api/
2014-06-07 14:29:25 -05:00
Kohsuke Kawaguchi
7bf31ca149 [maven-release-plugin] prepare for next development iteration 2014-06-05 10:30:01 -07:00
Kohsuke Kawaguchi
030f2360ca [maven-release-plugin] prepare release github-api-1.54 2014-06-05 10:29:56 -07:00
Kohsuke Kawaguchi
08eafc4214 Merge pull request #94 from suryagaddipati/master
Add support for adding deploykeys to repo
2014-06-05 10:28:19 -07:00
Kohsuke Kawaguchi
134ece9385 Merge pull request #95 from suryagaddipati/ghref
Add support for retriving a single ref
2014-06-05 10:27:42 -07:00
Surya Gaddipati
3e4b06e959 Add support for retriving a single ref
Implements the following api method
https://developer.github.com/v3/git/refs/#get-a-reference
2014-06-04 15:11:27 -05:00
Surya Gaddipati
3e3c6f70ba Add support for adding deploykeys to repo
Implements https://developer.github.com/v3/repos/keys/
2014-06-03 15:26:04 -05:00
Kohsuke Kawaguchi
3097378a10 Merge pull request #93 from vr100/master
Upgrading to 1.12 version for bridge-method-annotation and bridge-method-injector - fix for #91
2014-05-28 20:52:07 -07:00
vr100
53f7a0f78a Upgrading to 1.12 version for bridge-method-annotation and bridge-method-injector - fix for #91 2014-05-28 12:41:19 +05:30
Kohsuke Kawaguchi
45a6841772 added a method to visit sub-directory 2014-05-27 20:57:42 -07:00
Kohsuke Kawaguchi
80b93a6e33 doc improvement 2014-05-27 20:44:44 -07:00
Kohsuke Kawaguchi
6aaab641be Using the latest 2014-05-10 15:57:56 -07:00
Kohsuke Kawaguchi
4999490c06 [maven-release-plugin] prepare for next development iteration 2014-05-10 15:52:17 -07:00
15 changed files with 386 additions and 29 deletions

19
pom.xml
View File

@@ -3,11 +3,11 @@
<parent>
<groupId>org.kohsuke</groupId>
<artifactId>pom</artifactId>
<version>6</version>
<version>9</version>
</parent>
<artifactId>github-api</artifactId>
<version>1.53</version>
<version>1.57</version>
<name>GitHub API for Java</name>
<url>http://github-api.kohsuke.org/</url>
<description>GitHub API for Java</description>
@@ -16,7 +16,7 @@
<connection>scm:git:git@github.com/kohsuke/${project.artifactId}.git</connection>
<developerConnection>scm:git:ssh://git@github.com/kohsuke/${project.artifactId}.git</developerConnection>
<url>http://${project.artifactId}.kohsuke.org/</url>
<tag>github-api-1.53</tag>
<tag>HEAD</tag>
</scm>
<distributionManagement>
@@ -35,7 +35,7 @@
<plugin>
<groupId>com.infradna.tool</groupId>
<artifactId>bridge-method-injector</artifactId>
<version>1.8</version>
<version>1.12</version>
<executions>
<execution>
<goals>
@@ -77,7 +77,7 @@
<dependency>
<groupId>com.infradna.tool</groupId>
<artifactId>bridge-method-annotation</artifactId>
<version>1.8</version>
<version>1.12</version>
</dependency>
<dependency>
<groupId>org.kohsuke.stapler</groupId>
@@ -93,8 +93,8 @@
</dependency>
<dependency>
<groupId>com.squareup.okhttp</groupId>
<artifactId>okhttp</artifactId>
<version>1.5.3</version>
<artifactId>okhttp-urlconnection</artifactId>
<version>2.0.0</version>
<optional>true</optional>
</dependency>
<dependency>
@@ -103,6 +103,11 @@
<version>1.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
</dependency>
</dependencies>
<repositories>
<repository>

View File

@@ -16,6 +16,7 @@ public class GHCommitStatus {
String target_url,description;
int id;
String url;
String context;
GHUser creator;
private GitHub root;
@@ -69,4 +70,8 @@ public class GHCommitStatus {
public GHUser getCreator() {
return creator;
}
public String getContext() {
return context;
}
}

View File

@@ -1,6 +1,8 @@
package org.kohsuke.github;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import javax.xml.bind.DatatypeConverter;
@@ -8,7 +10,9 @@ import javax.xml.bind.DatatypeConverter;
* A Content of a repository.
*
* @author Alexandre COLLIGNON
* @see GHRepository#getFileContent(String)
*/
@SuppressWarnings({"UnusedDeclaration"})
public class GHContent {
private GHRepository owner;
@@ -105,6 +109,25 @@ public class GHContent {
return "dir".equals(type);
}
/**
* List immediate children of this directory.
*/
public PagedIterable<GHContent> listDirectoryContent() throws IOException {
if (!isDirectory())
throw new IllegalStateException(path+" is not a directory");
return new PagedIterable<GHContent>() {
public PagedIterator<GHContent> iterator() {
return new PagedIterator<GHContent>(owner.root.retrieve().asIterator(url, GHContent[].class)) {
@Override
protected void wrapUp(GHContent[] page) {
GHContent.wrap(page,owner);
}
};
}
};
}
public GHContentUpdateResponse update(String newContent, String commitMessage) throws IOException {
return update(newContent, commitMessage, null);
}

View File

@@ -4,7 +4,7 @@ package org.kohsuke.github;
* The response that is returned when updating
* repository content.
**/
public final class GHContentUpdateResponse {
public class GHContentUpdateResponse {
private GHContent content;
private GHCommit commit;

View File

@@ -0,0 +1,46 @@
package org.kohsuke.github;
import java.io.IOException;
import org.apache.commons.lang.builder.ToStringBuilder;
public class GHDeployKey {
protected String url, key, title;
protected boolean verified;
protected int id;
private GHRepository owner;
public int getId() {
return id;
}
public String getKey() {
return key;
}
public String getTitle() {
return title;
}
public String getUrl() {
return url;
}
public boolean isVerified() {
return verified;
}
public GHDeployKey wrap(GHRepository repo) {
this.owner = repo;
return this;
}
public String toString() {
return new ToStringBuilder(this).append("title",title).append("id",id).append("key",key).toString();
}
public void delete() throws IOException {
new Requester(owner.root).method("DELETE").to(String.format("/repos/%s/%s/keys/%d", owner.getOwnerName(), owner.getName(), id));
}
}

View File

@@ -17,7 +17,7 @@ import java.util.Map.Entry;
* @see GitHub#getGist(String)
* @see GitHub#createGist()
*/
public final class GHGist {
public class GHGist {
/*package almost final*/ GHUser owner;
/*package almost final*/ GitHub root;

View File

@@ -10,7 +10,7 @@ import java.util.Map;
/**
* @author Kohsuke Kawaguchi
*/
public final class GHHook {
public class GHHook {
/**
* Repository that the hook belongs to.
*/

View File

@@ -101,12 +101,24 @@ public class GHMyself extends GHUser {
* Lists up all repositories this user owns (public and private).
*
* Unlike {@link #getAllRepositories()}, this does not wait until all the repositories are returned.
* Repositories are returned by GitHub API with a 30 items per page.
*/
@Override
public PagedIterable<GHRepository> listRepositories() {
return listRepositories(30);
}
/**
* Lists up all the repositories this user owns (public and private) using the specified page size.
*
* @param pageSize size for each page of items returned by GitHub. Maximum page size is 100.
*
* Unlike {@link #getRepositories()}, this does not wait until all the repositories are returned.
*/
public PagedIterable<GHRepository> listRepositories(final int pageSize) {
return new PagedIterable<GHRepository>() {
public PagedIterator<GHRepository> iterator() {
return new PagedIterator<GHRepository>(root.retrieve().asIterator("/user/repos", GHRepository[].class)) {
return new PagedIterator<GHRepository>(root.retrieve().asIterator("/user/repos?per_page=" + pageSize, GHRepository[].class)) {
@Override
protected void wrapUp(GHRepository[] page) {
for (GHRepository c : page)

View File

@@ -9,7 +9,7 @@ import java.util.HashSet;
*
* @author Kohsuke Kawaguchi
*/
public final class GHPersonSet<T extends GHPerson> extends HashSet<T> {
public class GHPersonSet<T extends GHPerson> extends HashSet<T> {
public GHPersonSet() {
}

View File

@@ -25,6 +25,7 @@ package org.kohsuke.github;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
import java.io.FileNotFoundException;
import javax.xml.bind.DatatypeConverter;
import java.io.IOException;
@@ -321,7 +322,32 @@ public class GHRepository {
*/
@WithBridgeMethods(Set.class)
public GHPersonSet<GHUser> getCollaborators() throws IOException {
return new GHPersonSet<GHUser>(GHUser.wrap(root.retrieve().to("/repos/" + owner.login + "/" + name + "/collaborators", GHUser[].class),root));
return new GHPersonSet<GHUser>(listCollaborators().asList());
}
/**
* Lists up the collaborators on this repository.
*
* @return Users
* @throws IOException
*/
public PagedIterable<GHUser> listCollaborators() throws IOException {
return new PagedIterable<GHUser>() {
public PagedIterator<GHUser> iterator() {
return new PagedIterator<GHUser>(root.retrieve().asIterator("/repos/" + owner.login + "/" + name + "/collaborators", GHUser[].class)) {
@Override
protected void wrapUp(GHUser[] users) {
for (GHUser user : users) {
user.wrapUp(root);
}
}
};
}
};
}
/**
@@ -416,7 +442,11 @@ public class GHRepository {
* Deletes this repository.
*/
public void delete() throws IOException {
new Requester(root).method("DELETE").to("/repos/" + owner.login + "/" + name);
try {
new Requester(root).method("DELETE").to("/repos/" + owner.login + "/" + name);
} catch (FileNotFoundException x) {
throw (FileNotFoundException) new FileNotFoundException("Failed to delete " + owner.login + "/" + name + "; might not exist, or you might need the delete_repo scope in your token: http://stackoverflow.com/a/19327004/12916").initCause(x);
}
}
/**
@@ -561,7 +591,19 @@ public class GHRepository {
public GHRef[] getRefs(String refType) throws IOException {
return root.retrieve().to(String.format("/repos/%s/%s/git/refs/%s", owner.login, name, refType), GHRef[].class);
}
/**
* Retrive a ref of the given type for the current GitHub repository.
*
* @param refName
* eg: heads/branch
* @return refs matching the request type
* @throws IOException
* on failure communicating with GitHub, potentially due to an
* invalid ref type being requested
*/
public GHRef getRef(String refName) throws IOException {
return root.retrieve().to(String.format("/repos/%s/%s/git/refs/%s", owner.login, name, refName), GHRef.class);
}
/**
* Gets a commit object in this repository.
*/
@@ -646,14 +688,24 @@ public class GHRepository {
* Optional parameter that points to the URL that has more details.
* @param description
* Optional short description.
* @param context
* Optinal commit status context.
*/
public GHCommitStatus createCommitStatus(String sha1, GHCommitState state, String targetUrl, String description) throws IOException {
public GHCommitStatus createCommitStatus(String sha1, GHCommitState state, String targetUrl, String description, String context) throws IOException {
return new Requester(root)
.with("state", state.name().toLowerCase(Locale.ENGLISH))
.with("target_url", targetUrl)
.with("description", description)
.with("context", context)
.to(String.format("/repos/%s/%s/statuses/%s",owner.login,this.name,sha1),GHCommitStatus.class).wrapUp(root);
}
/**
* @see {@link #createCommitStatus(String, GHCommitState,String,String,String) createCommitStatus}
*/
public GHCommitStatus createCommitStatus(String sha1, GHCommitState state, String targetUrl, String description) throws IOException {
return createCommitStatus(sha1, state, targetUrl, description,null);
}
/**
* Lists repository events.
@@ -907,6 +959,22 @@ public class GHRepository {
return new Requester(root)
.with("title", title).with("description", description).method("POST").to(getApiTailUrl("milestones"), GHMilestone.class).wrap(this);
}
public GHDeployKey addDeployKey(String title,String key) throws IOException {
return new Requester(root)
.with("title", title).with("key", key).method("POST").to(getApiTailUrl("keys"), GHDeployKey.class).wrap(this);
}
public List<GHDeployKey> getDeployKeys() throws IOException{
List<GHDeployKey> list = new ArrayList<GHDeployKey>(Arrays.asList(
root.retrieve().to(String.format("/repos/%s/%s/keys", owner.login, name), GHDeployKey[].class)));
for (GHDeployKey h : list)
h.wrap(this);
return list;
}
@Override
public String toString() {

View File

@@ -15,6 +15,7 @@ import java.util.TreeMap;
public class GHTeam {
private String name,permission;
private int id;
private GHOrganization organization; // populated by GET /user/teams where Teams+Orgs are returned together
protected /*final*/ GHOrganization org;
@@ -23,6 +24,11 @@ public class GHTeam {
return this;
}
/*package*/ GHTeam wrapUp(GitHub root) { // auto-wrapUp when organization is known from GET /user/teams
this.organization.wrapUp(root);
return wrapUp(organization);
}
/*package*/ static GHTeam[] wrapUp(GHTeam[] teams, GHOrganization owner) {
for (GHTeam t : teams) {
t.wrapUp(owner);
@@ -95,4 +101,8 @@ public class GHTeam {
private String api(String tail) {
return "/teams/"+id+tail;
}
public GHOrganization getOrganization() {
return org;
}
}

View File

@@ -23,7 +23,8 @@
*/
package org.kohsuke.github;
import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.*;
import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.ANY;
import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE;
import java.io.File;
import java.io.FileInputStream;
@@ -38,9 +39,11 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.TimeZone;
import org.apache.commons.codec.binary.Base64;
@@ -328,6 +331,28 @@ public class GitHub {
return r;
}
/**
* Gets complete map of organizations/teams that current user belongs to.
*
* Leverages the new GitHub API /user/teams made available recently to
* get in a single call the complete set of organizations, teams and permissions
* in a single call.
*/
public Map<String, Set<GHTeam>> getMyTeams() throws IOException {
Map<String, Set<GHTeam>> allMyTeams = new HashMap<String, Set<GHTeam>>();
for (GHTeam team : retrieve().to("/user/teams", GHTeam[].class)) {
team.wrapUp(this);
String orgLogin = team.getOrganization().getLogin();
Set<GHTeam> teamsPerOrg = allMyTeams.get(orgLogin);
if (teamsPerOrg == null) {
teamsPerOrg = new HashSet<GHTeam>();
}
teamsPerOrg.add(team);
allMyTeams.put(orgLogin, teamsPerOrg);
}
return allMyTeams;
}
/**
* Public events visible to you. Equivalent of what's displayed on https://github.com/
*/

View File

@@ -1,6 +1,7 @@
package org.kohsuke.github.extras;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.OkUrlFactory;
import org.kohsuke.github.HttpConnector;
import java.io.IOException;
@@ -19,13 +20,13 @@ import java.net.URL;
* @author Kohsuke Kawaguchi
*/
public class OkHttpConnector implements HttpConnector {
private final OkHttpClient client;
private final OkUrlFactory urlFactory;
public OkHttpConnector(OkHttpClient client) {
this.client = client;
public OkHttpConnector(OkUrlFactory urlFactory) {
this.urlFactory = urlFactory;
}
public HttpURLConnection connect(URL url) throws IOException {
return client.open(url);
return urlFactory.open(url);
}
}

View File

@@ -3,24 +3,20 @@ package org.kohsuke.github;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.UUID;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Assume;
import org.junit.Test;
import org.kohsuke.github.GHCommit.File;
import org.kohsuke.github.GHOrganization.Permission;
import java.util.Date;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
/**
* Unit test for simple App.
@@ -166,6 +162,35 @@ public class AppTest extends AbstractGitHubApiTestBase {
System.out.println(org);
}
@Test
public void testMyTeamsContainsAllMyOrganizations() throws IOException {
Map<String, Set<GHTeam>> teams = gitHub.getMyTeams();
Map<String, GHOrganization> myOrganizations = gitHub.getMyOrganizations();
assertEquals(teams.keySet(), myOrganizations.keySet());
}
@Test
public void testMyTeamsShouldIncludeMyself() throws IOException {
Map<String, Set<GHTeam>> teams = gitHub.getMyTeams();
for (Entry<String, Set<GHTeam>> teamsPerOrg : teams.entrySet()) {
String organizationName = teamsPerOrg.getKey();
for (GHTeam team : teamsPerOrg.getValue()) {
String teamName = team.getName();
assertTrue("Team " + teamName + " in organization " + organizationName
+ " does not contain myself",
shouldBelongToTeam(organizationName, teamName));
}
}
}
private boolean shouldBelongToTeam(String organizationName, String teamName) throws IOException {
GHOrganization org = gitHub.getOrganization(organizationName);
assertNotNull(org);
GHTeam team = org.getTeamByName(teamName);
assertNotNull(team);
return team.hasMember(gitHub.getMyself());
}
@Test
public void testFetchPullRequest() throws Exception {
GHRepository r = gitHub.getOrganization("jenkinsci").getRepository("jenkins");
@@ -529,6 +554,52 @@ public class AppTest extends AbstractGitHubApiTestBase {
}
}
@Test
public void testRef() throws IOException {
GHRef masterRef = gitHub.getRepository("jenkinsci/jenkins").getRef("heads/master");
assertEquals("https://api.github.com/repos/jenkinsci/jenkins/git/refs/heads/master", masterRef.getUrl().toString());
}
@Test
public void directoryListing() throws IOException {
List<GHContent> children = gitHub.getRepository("jenkinsci/jenkins").getDirectoryContent("core");
for (GHContent c : children) {
System.out.println(c.getName());
if (c.isDirectory()) {
for (GHContent d : c.listDirectoryContent()) {
System.out.println(" "+d.getName());
}
}
}
}
@Test
public void testAddDeployKey() throws IOException {
GHRepository myRepository = Iterables.get(gitHub.getMyself().getRepositories().values(),0);
final GHDeployKey newDeployKey = myRepository.addDeployKey("test", "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDUt0RAycC5cS42JKh6SecfFZBR1RrF+2hYMctz4mk74/arBE+wFb7fnSHGzdGKX2h5CFOWODifRCJVhB7hlVxodxe+QkQQYAEL/x1WVCJnGgTGQGOrhOMj95V3UE5pQKhsKD608C+u5tSofcWXLToP1/wZ7U4/AHjqYi08OLsWToHCax55TZkvdt2jo0hbIoYU+XI9Q8Uv4ONDN1oabiOdgeKi8+crvHAuvNleiBhWVBzFh8KdfzaH5uNdw7ihhFjEd1vzqACsjCINCjdMfzl6jD9ExuWuE92nZJnucls2cEoNC6k2aPmrZDg9hA32FXVpyseY+bDUWFU6LO2LG6PB kohsuke@atlas");
try {
assertNotNull(newDeployKey.getId());
GHDeployKey k = Iterables.find(myRepository.getDeployKeys(), new Predicate<GHDeployKey>() {
public boolean apply(GHDeployKey deployKey) {
return newDeployKey.getId() == deployKey.getId();
}
});
assertNotNull(k);
} finally {
newDeployKey.delete();
}
}
@Test
public void testCommitStatusContext() throws IOException {
GHRepository myRepository = Iterables.get(gitHub.getMyself().getRepositories().values(), 0);
GHRef masterRef = myRepository.getRef("heads/master");
GHCommitStatus commitStatus = myRepository.createCommitStatus(masterRef.getObject().getSha(), GHCommitState.SUCCESS, "http://www.example.com", "test", "test/context");
assertEquals("test/context", commitStatus.getContext());
}
private void kohsuke() {
String login = getUser().getLogin();
Assume.assumeTrue(login.equals("kohsuke") || login.equals("kohsuke2"));

View File

@@ -0,0 +1,91 @@
package org.kohsuke.github;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import java.util.Iterator;
import static org.mockito.Mockito.when;
/**
* @author Luciano P. Sabenca (luciano.sabenca [at] movile [com] | lucianosabenca [at] gmail [dot] com
*/
public class RepositoryTest {
@Mock
GitHub mockGitHub;
@Mock
Iterator<GHUser[]> iterator;
@Mock
GHRepository mockRepository;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void listCollaborators() throws Exception {
GHUser user1 = new GHUser();
user1.login = "login1";
GHUser user2 = new GHUser();
user2.login = "login2";
when(iterator.hasNext()).thenReturn(true, false, true);
when(iterator.next()).thenReturn(new GHUser[]{user1}, new GHUser[]{user2});
Requester requester = Mockito.mock(Requester.class);
when(mockGitHub.retrieve()).thenReturn(requester);
when(requester.asIterator("/repos/*/*/collaborators",
GHUser[].class)).thenReturn(iterator, iterator);
PagedIterable<GHUser> pagedIterable = Mockito.mock(PagedIterable.class);
when(mockRepository.listCollaborators()).thenReturn(pagedIterable);
PagedIterator<GHUser> userPagedIterator = new PagedIterator<GHUser>(iterator) {
@Override
protected void wrapUp(GHUser[] page) {
}
};
PagedIterator<GHUser> userPagedIterator2 = new PagedIterator<GHUser>(iterator) {
@Override
protected void wrapUp(GHUser[] page) {
}
};
when(pagedIterable.iterator()).thenReturn(userPagedIterator, userPagedIterator2);
Iterator<GHUser> returnIterator1 = mockRepository.listCollaborators().iterator();
Assert.assertTrue(returnIterator1.hasNext());
GHUser user = returnIterator1.next();
Assert.assertEquals(user, user1);
Assert.assertFalse(returnIterator1.hasNext());
Iterator returnIterator2 = mockRepository.listCollaborators().iterator();
Assert.assertTrue(returnIterator2.hasNext());
user = returnIterator1.next();
Assert.assertEquals(user, user2);
}
}