import groovyx.net.http.HTTPBuilder; import org.junit.runner.RunWith; import org.scribe.oauth.Scribe; import org.scribe.oauth.Token import spock.lang.Specification; import spock.lang.Sputnik; @RunWith(Sputnik) public class OAuthHttpBuilderTest extends Specification { HTTPBuilder delegate = Mock() Scribe signer Token tok OAuthHttpBuilder underTest def uri def setup() { Properties props = new Properties([ "consumer.key" : "myClientKey", "consumer.secret" : "myClientSecret" ]) signer = new Scribe(props); tok = new Token("token_key", "token_secret") underTest = new OAuthHttpBuilder(delegate, signer) } def "Null token passes Scribe a token with empty token/secret"() { given: signer = Mock(Scribe) delegate.getUri() >> (uri = "http://localhost:8080/users/1") when: underTest = new OAuthHttpBuilder(delegate, signer) underTest.get(query: null) then: 1 * signer.signRequest(_,_) >> { scribeReq, token -> assert token.token == "" assert token.secret == "" } } def "Signs and passes authorization header in GET method"() { given: delegate.getUri() >> (uri = "http://localhost:8080/users/1") when: underTest.get(query: null, accessToken: tok) then: 1 * delegate.get(_) >> { args -> argsHaveAuthorizationString(args) } } def "Passes authorization header in GET method with default access token"() { given: delegate.getUri() >> (uri = "http://localhost:8080/users/1") underTest.setAccessToken(tok) when: underTest.get(query: null) then: 1 * delegate.get(_) >> { args -> argsHaveAuthorizationString(args) } } def "Passes authorization header in POST method"() { given: delegate.getUri() >> (uri = "http://localhost:8080/users/1") when: underTest.post(body: null, accessToken: tok) then: 1 * delegate.post(_) >> { args -> argsHaveAuthorizationString(args) } } def "Provides query params for GET requests"() { given: signer = Mock(Scribe) delegate.getUri() >> (uri = "http://localhost:8080/users/1") def queryParams = [a: "b", c: "d"] when: underTest = new OAuthHttpBuilder(delegate, signer) underTest.get(query: queryParams, accessToken: tok) then: 1 * signer.signRequest(_,tok) >> { scribeReq, token -> def bodyParams = scribeReq.getBodyParams() assert bodyParams.size() == 2 bodyParams.each { entry -> assert queryParams[entry.key] == entry.value } scribeReq.addHeader("Authorization", "sure you're authorized why not") } } def "Provides query params and body params for POST requests"() { given: signer = Mock(Scribe) delegate.getUri() >> (uri = "http://localhost:8080/users/1") def queryParams = [a: "b", c: "d"] def bodyParams = [e: "f", g: "h"] when: underTest = new OAuthHttpBuilder(delegate, signer) underTest.post(query: queryParams, body: bodyParams, accessToken: tok) then: 1 * signer.signRequest(_,tok) >> { scribeReq, token -> def passedBodyParams = scribeReq.getBodyParams() assert passedBodyParams.size() == 4 bodyParams.each { entry -> assert (queryParams[entry.key] == entry.value) || (bodyParams[entry.key] == entry.value) } scribeReq.addHeader("Authorization", "sure you're authorized why not") } } def "Handles integer inputs fine"() { given: signer = Mock(Scribe) delegate.getUri() >> (uri = "http://localhost:8080/users/1") def queryParams = [aNumber: 1] underTest = new OAuthHttpBuilder(delegate, signer) when: underTest.get(query: queryParams, accessToken: tok) then: 1 * signer.signRequest(_, tok) >> { scribeReq, token -> def passedBodyParams = scribeReq.getBodyParams() assert passedBodyParams.size() == 1 passedBodyParams.each { entry -> assert entry.value == "1" } } } /* * Private Methods */ def argsHaveAuthorizationString(args) { assert args.headers.size() != 0 assert args.headers.Authorization.size() == 1 assert args.headers.Authorization[0] != null } }