Skip to content

Commit

Permalink
Implement a basic foursquare client.
Browse files Browse the repository at this point in the history
  • Loading branch information
adamdecaf committed Aug 2, 2012
1 parent 904c77d commit 5d2dafb
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 25 deletions.
32 changes: 27 additions & 5 deletions third-party/src/main/scala/foursquare.scala
Original file line number Diff line number Diff line change
@@ -1,15 +1,37 @@
package dispatch.clients

import dispatch._
import com.ning.http.client.RequestBuilder

class Foursquare(params: (String, String)*) extends FoursquareHelper {
protected val svc = "https://api.foursquare.com"
protected var urlParams = Map[String, String]()
protected var version = ""

urlParams ++= params.toList
}

object Foursquare {
private val svc: Request = :/ ("api.foursquare.com") secure
def apply(creds: OAuth2Creds) =
new Foursquare("client_id" -> creds.client_key, "client_secret" -> creds.client_secret)
}

def apply(key: String, secret: String)(request: Request): Request =
apply((key, secret))(request)
trait FoursquareHelper {
this: Foursquare =>

def apply(creds: Pair[String, String])(request: Request): Request = {
svc <& request <<? Map("client_id" -> creds._1, "client_secret" -> creds._2)
def setVersion(newVersion: String) = {
version = "/" + newVersion
}

def call(path: String, params: Traversable[(String, String)] = List()) = {
executeHttp(buildUri(path, params))
}

def buildUri(fullPath: String, params: Traversable[(String, String)]) = {
url(svc + version + fullPath) <<? (urlParams ++ params)
}

def executeHttp(uri: RequestBuilder) = {
Http(uri OK as.String)
}
}
6 changes: 6 additions & 0 deletions third-party/src/main/scala/models.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package dispatch.clients

import dispatch._

sealed trait OAuth
case class OAuth2Creds(client_key: String, client_secret: String) extends OAuth
48 changes: 28 additions & 20 deletions third-party/src/test/scala/foursquare.scala
Original file line number Diff line number Diff line change
@@ -1,34 +1,42 @@
package dispatch.clients

import dispatch._
import org.specs._
import org.specs2.mutable.Specification
import org.specs2.specification.Scope

object FoursquareSpec extends Specification {

"A basic foursquare request that requires auth" should {
"be able to be formed normally" in new context {
val builtReq = Auth(("key", "secret"))(req).to_uri.toString

builtReq.contains("api.foursquare.com/v2/venues/search") must_== true
builtReq.contains("client_id=key") must_== true
builtReq.contains("client_secret=secret") must_== true
builtReq.contains("ll=123.123%2C456.456") must_== true
builtReq.contains("v=19700101") must_== true
builtReq.contains("https://") must_== true
"be able to be formed normally" in new foursquareContext {
val request = fsq.buildUri("/venues/search", Map("q" -> "drinks"))
val builtReq = request.build().getUrl()
println(builtReq)

builtReq.contains("https://") must beTrue
builtReq.contains("api.foursquare.com/v2") must beTrue
builtReq.contains("/venues/search") must beTrue
builtReq.contains("client_id=aa") must beTrue
builtReq.contains("client_secret=bb") must beTrue
builtReq.contains("q=drinks") must beTrue
}

"be able to be formed normally through other apply" in new context {
val builtReq = Auth("key", "secret")(req).to_uri.toString
"executing a request should give us back a standard http code" in new foursquareContext {
val request = for {
req <- fsq.call("/venues/search", Map("q" -> "drinks"))
} yield (req)

builtReq.contains("api.foursquare.com/v2/venues/search") must_== true
builtReq.contains("client_id=key") must_== true
builtReq.contains("client_secret=secret") must_== true
builtReq.contains("ll=123.123%2C456.456") must_== true
builtReq.contains("v=19700101") must_== true
builtReq.contains("https://") must_== true
request onComplete {
case ret =>
isInstanceOf[Some[_]] must beTrue.eventually
}
}
}

}

trait context {
val req = /\ / "v2" / "venues" / "search" <<? Map("ll" -> "123.123,456.456", "v" -> "19700101")
trait foursquareContext extends Scope {
val creds = OAuth2Creds("aa", "bb")
val fsq = Foursquare(creds)
fsq.setVersion("v2")
}

0 comments on commit 5d2dafb

Please sign in to comment.