Skip to content

Commit

Permalink
Adds tests and integration tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Fede Fernández committed Mar 30, 2017
1 parent 7aafdfd commit 8c3d5a2
Show file tree
Hide file tree
Showing 8 changed files with 706 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* Copyright (c) 2016 47 Degrees, LLC. <http://www.47deg.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

package github4s.utils.integration

import github4s.Github
import github4s.Github._
import github4s.free.domain._
import github4s.js.Implicits._
import github4s.utils.TestUtils
import org.scalatest.{AsyncFlatSpec, Matchers}

class GHPullRequestsSpec extends AsyncFlatSpec with Matchers with TestUtils {

override implicit val executionContext =
scala.concurrent.ExecutionContext.Implicits.global

"PullRequests >> List" should "return a non empty list when valid repo is provided" in {

val response =
Github(accessToken).pullRequests
.list(validRepoOwner, validRepoName)
.execFuture(headerUserAgent)

testFutureIsRight[List[PullRequest]](response, { r =>
r.result.nonEmpty shouldBe true
r.statusCode shouldBe okStatusCode
})
}

it should "return a non empty list when valid repo and some filters are provided" in {

val response =
Github(accessToken).pullRequests
.list(
validRepoOwner,
validRepoName,
List(PRFilterAll, PRFilterSortCreated, PRFilterOrderAsc))
.execFuture(headerUserAgent)

testFutureIsRight[List[PullRequest]](response, { r =>
r.result.nonEmpty shouldBe true
r.statusCode shouldBe okStatusCode
})
}

it should "return error when an invalid repo name is passed" in {
val response =
Github(accessToken).pullRequests
.list(validRepoOwner, validRepoName)
.execFuture(headerUserAgent)

testFutureIsLeft(response)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
* Copyright (c) 2016 47 Degrees, LLC. <http://www.47deg.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

package github4s.integration

import cats.Id
import github4s.Github
import github4s.Github._
import github4s.free.domain.{PRFilterAll, PRFilterOrderAsc, PRFilterSortCreated}
import github4s.jvm.Implicits._
import github4s.utils.TestUtils
import org.scalatest.{FlatSpec, Matchers}

import scalaj.http.HttpResponse

class GHPullRequestsSpec extends FlatSpec with Matchers with TestUtils {

"Repos >> List" should "return a non empty list when valid repo is provided" in {

val response =
Github(accessToken).pullRequests
.list(validRepoOwner, validRepoName)
.exec[Id, HttpResponse[String]](headerUserAgent)
response should be('right)
response.toOption map { r
r.result.nonEmpty shouldBe true
r.statusCode shouldBe okStatusCode
}
}

it should "return a non empty list when valid repo and some filters are provided" in {

val response =
Github(accessToken).pullRequests
.list(
validRepoOwner,
validRepoName,
List(PRFilterAll, PRFilterSortCreated, PRFilterOrderAsc))
.exec[Id, HttpResponse[String]](headerUserAgent)
response should be('right)
response.toOption map { r
r.result.nonEmpty shouldBe true
r.statusCode shouldBe okStatusCode
}
}

it should "return error when an invalid repo name is passed" in {
val response =
Github(accessToken).pullRequests
.list(validRepoOwner, invalidRepoName)
.exec[Id, HttpResponse[String]](headerUserAgent)
response should be('left)
}

}
30 changes: 25 additions & 5 deletions github4s/jvm/src/test/scala/github4s/unit/ApiSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,12 @@ class ApiSpec
with DummyGithubUrls
with ImplicitsJVM {

val auth = new Auth[HttpResponse[String], Id]
val repos = new Repos[HttpResponse[String], Id]
val users = new Users[HttpResponse[String], Id]
val gists = new Gists[HttpResponse[String], Id]
val gitData = new GitData[HttpResponse[String], Id]
val auth = new Auth[HttpResponse[String], Id]
val repos = new Repos[HttpResponse[String], Id]
val users = new Users[HttpResponse[String], Id]
val gists = new Gists[HttpResponse[String], Id]
val gitData = new GitData[HttpResponse[String], Id]
val pullRequests = new PullRequests[HttpResponse[String], Id]

"Auth >> NewAuth" should "return a valid token when valid credential is provided" in {
val response = auth.newAuth(
Expand Down Expand Up @@ -444,4 +445,23 @@ class ApiSpec
response should be('left)
}

"PullRequests >> List" should "return the expected pull request list when valid repo is provided" in {

val response =
pullRequests.list(accessToken, headerUserAgent, validRepoOwner, validRepoName)
response should be('right)

response.toOption map { r
r.result.nonEmpty shouldBe true
r.statusCode shouldBe okStatusCode
}

}

it should "return error when an invalid repo name is passed" in {
val response =
repos.get(accessToken, headerUserAgent, validRepoOwner, invalidRepoName)
response should be('left)
}

}
56 changes: 56 additions & 0 deletions github4s/jvm/src/test/scala/github4s/unit/GHPullRequestsSpec.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* Copyright (c) 2016 47 Degrees, LLC. <http://www.47deg.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

package github4s.unit

import cats.free.Free
import github4s.GHPullRequests
import github4s.GithubResponses.{GHResponse, GHResult}
import github4s.app.GitHub4s
import github4s.free.algebra.PullRequestOps
import github4s.free.domain._
import github4s.utils.TestUtils
import org.mockito.ArgumentMatchers.any
import org.mockito.Mockito._
import org.scalatest.mockito.MockitoSugar.mock
import org.scalatest.{FlatSpec, Matchers}

class GHPullRequestsSpec extends FlatSpec with Matchers with TestUtils {

"GHPullRequests.list" should "call to PullRequestOps with the right parameters" in {

val response: Free[GitHub4s, GHResponse[List[PullRequest]]] =
Free.pure(Right(GHResult(List(pullRequest), okStatusCode, Map.empty)))

val pullRequestOps = mock[PullRequestOps[GitHub4s]]
when(
pullRequestOps
.listPullRequests(any[String], any[String], any[List[PRFilter]], any[Option[String]]))
.thenReturn(response)

val token = Some("token")
val ghPullRequests = new GHPullRequests(token)(pullRequestOps)
ghPullRequests.list(validRepoOwner, validRepoName)

verify(pullRequestOps).listPullRequests(validRepoOwner, validRepoName, Nil, token)
}

}
77 changes: 77 additions & 0 deletions github4s/jvm/src/test/scala/github4s/unit/PullRequestsSpec.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/*
* Copyright (c) 2016 47 Degrees, LLC. <http://www.47deg.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

package github4s.unit

import cats.Id
import cats.data.NonEmptyList
import github4s.GithubResponses.{GHResponse, GHResult}
import github4s.api.PullRequests
import github4s.free.domain._
import github4s.utils.{DummyGithubUrls, TestUtils}
import github4s.{HttpClient, HttpRequestBuilderExtensionJVM, IdInstances}
import io.circe.Decoder
import org.mockito.ArgumentMatchers.{any, eq => argEq}
import org.mockito.Mockito._
import org.scalatest.mockito.MockitoSugar.mock
import org.scalatest.{FlatSpec, Matchers}

import scalaj.http.HttpResponse

class PullRequestsSpec
extends FlatSpec
with Matchers
with TestUtils
with DummyGithubUrls
with IdInstances
with HttpRequestBuilderExtensionJVM {

"PullRequests.list" should "call to httpClient.get with the right parameters" in {

val response: GHResponse[List[PullRequest]] =
Right(GHResult(List(pullRequest), okStatusCode, Map.empty))

val httpClientMock = mock[HttpClient[HttpResponse[String], Id]]
when(
httpClientMock.get[List[PullRequest]](
any[Option[String]],
any[String],
any[Map[String, String]],
any[Map[String, String]],
any[Option[Pagination]])(any[Decoder[List[PullRequest]]]))
.thenReturn(response)

val token = Some("token")
val pullRequests = new PullRequests[HttpResponse[String], Id] {
override val httpClient: HttpClient[HttpResponse[String], Id] = httpClientMock
}
pullRequests.list(token, headerUserAgent, validRepoOwner, validRepoName, Nil)

verify(httpClientMock).get[List[PullRequest]](
argEq(token),
argEq(s"repos/$validRepoOwner/$validRepoName/pulls"),
argEq(headerUserAgent),
any[Map[String, String]],
any[Option[Pagination]]
)(any[Decoder[List[PullRequest]]])
}

}

0 comments on commit 8c3d5a2

Please sign in to comment.