diff --git a/pom.xml b/pom.xml index 8d8bf52cbe..79c521c4a4 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ github-api - 1.55 + 1.56 GitHub API for Java http://github-api.kohsuke.org/ GitHub API for Java @@ -16,7 +16,7 @@ scm:git:git@github.com/kohsuke/${project.artifactId}.git scm:git:ssh://git@github.com/kohsuke/${project.artifactId}.git http://${project.artifactId}.kohsuke.org/ - github-api-1.55 + github-api-1.56 @@ -93,8 +93,8 @@ com.squareup.okhttp - okhttp - 1.5.3 + okhttp-urlconnection + 2.0.0 true @@ -103,6 +103,11 @@ 1.2 test + + org.mockito + mockito-all + 1.9.5 + diff --git a/src/main/java/org/kohsuke/github/GHContentUpdateResponse.java b/src/main/java/org/kohsuke/github/GHContentUpdateResponse.java index faa0545ad6..07f10d710c 100644 --- a/src/main/java/org/kohsuke/github/GHContentUpdateResponse.java +++ b/src/main/java/org/kohsuke/github/GHContentUpdateResponse.java @@ -4,7 +4,7 @@ * The response that is returned when updating * repository content. **/ -public final class GHContentUpdateResponse { +public class GHContentUpdateResponse { private GHContent content; private GHCommit commit; diff --git a/src/main/java/org/kohsuke/github/GHGist.java b/src/main/java/org/kohsuke/github/GHGist.java index 9f757be73b..6cfada36d0 100644 --- a/src/main/java/org/kohsuke/github/GHGist.java +++ b/src/main/java/org/kohsuke/github/GHGist.java @@ -17,7 +17,7 @@ * @see GitHub#getGist(String) * @see GitHub#createGist() */ -public final class GHGist { +public class GHGist { /*package almost final*/ GHUser owner; /*package almost final*/ GitHub root; diff --git a/src/main/java/org/kohsuke/github/GHHook.java b/src/main/java/org/kohsuke/github/GHHook.java index aca2b6dc01..4a8ce78b88 100644 --- a/src/main/java/org/kohsuke/github/GHHook.java +++ b/src/main/java/org/kohsuke/github/GHHook.java @@ -10,7 +10,7 @@ /** * @author Kohsuke Kawaguchi */ -public final class GHHook { +public class GHHook { /** * Repository that the hook belongs to. */ diff --git a/src/main/java/org/kohsuke/github/GHPersonSet.java b/src/main/java/org/kohsuke/github/GHPersonSet.java index 824febee39..1c1d43dccb 100644 --- a/src/main/java/org/kohsuke/github/GHPersonSet.java +++ b/src/main/java/org/kohsuke/github/GHPersonSet.java @@ -9,7 +9,7 @@ * * @author Kohsuke Kawaguchi */ -public final class GHPersonSet extends HashSet { +public class GHPersonSet extends HashSet { public GHPersonSet() { } diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java index 294347b596..b6985f99fa 100644 --- a/src/main/java/org/kohsuke/github/GHRepository.java +++ b/src/main/java/org/kohsuke/github/GHRepository.java @@ -25,6 +25,7 @@ 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 int getSize() { */ @WithBridgeMethods(Set.class) public GHPersonSet getCollaborators() throws IOException { - return new GHPersonSet(GHUser.wrap(root.retrieve().to("/repos/" + owner.login + "/" + name + "/collaborators", GHUser[].class),root)); + return new GHPersonSet(listCollaborators().asList()); + } + + /** + * Lists up the collaborators on this repository. + * + * @return Users + * @throws IOException + */ + public PagedIterable listCollaborators() throws IOException { + return new PagedIterable() { + public PagedIterator iterator() { + + return new PagedIterator(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 void setHomepage(String value) throws IOException { * 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); + } } /** diff --git a/src/main/java/org/kohsuke/github/extras/OkHttpConnector.java b/src/main/java/org/kohsuke/github/extras/OkHttpConnector.java index 671c32eaca..faa06b0d3b 100644 --- a/src/main/java/org/kohsuke/github/extras/OkHttpConnector.java +++ b/src/main/java/org/kohsuke/github/extras/OkHttpConnector.java @@ -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 @@ * @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); } } diff --git a/src/test/java/org/kohsuke/github/RepositoryTest.java b/src/test/java/org/kohsuke/github/RepositoryTest.java new file mode 100644 index 0000000000..1bc612b29c --- /dev/null +++ b/src/test/java/org/kohsuke/github/RepositoryTest.java @@ -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 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 pagedIterable = Mockito.mock(PagedIterable.class); + when(mockRepository.listCollaborators()).thenReturn(pagedIterable); + + PagedIterator userPagedIterator = new PagedIterator(iterator) { + @Override + protected void wrapUp(GHUser[] page) { + + } + }; + PagedIterator userPagedIterator2 = new PagedIterator(iterator) { + @Override + protected void wrapUp(GHUser[] page) { + + } + }; + + + when(pagedIterable.iterator()).thenReturn(userPagedIterator, userPagedIterator2); + + Iterator 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); + + + } +}