packages feed

oauth10a-0.1.0.0: test/Spec.hs

{-# LANGUAGE OverloadedStrings #-}

import Data.ByteString (ByteString)
import Data.ByteString (ByteString, append, empty)
import Data.ByteString.Char8 (pack, unpack)
import Control.Monad (mapM_)

import Net.OAuth.OAuth10a

{- Test data -}

ts :: ByteString
ts = "1318622958"

nonce :: ByteString
nonce = "kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg"

method :: ByteString
method = "POST"

url :: ByteString
url = "https://api.twitter.com/1/statuses/update.json"

creds :: Credentials
creds = Credentials {
    consumerKey = "xvz1evFS4wEEPTGEFPHBog",
    consumerSecret = "kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw",
    token = Just "370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
    tokenSecret = Just "LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE"
    }

{- Tests

For the most part the tests consist of `actual_*` functions with the correct
values and `gen_*` functions which attempt to create them.

-}

gen_param_string :: ByteString
gen_param_string =
    let params = [ Param "oauth_consumer_key" (consumerKey creds)
                 , Param "oauth_nonce" nonce
                 , Param "oauth_signature_method" "HMAC-SHA1"
                 , Param "oauth_timestamp" ts
                 , Param "oauth_version" "1.0"
                 , Param "oauth_token" (maybe "" id (token creds))
                 , Param "status"
                     "Hello Ladies + Gentlemen, a signed OAuth request!"
                 , Param "include_entities" "true"
                 ]
    in  param_string params

actual_param_string :: ByteString
actual_param_string = "include_entities=true&oauth_consumer_key=xvz1evFS4wEEPTGEFPHBog&oauth_nonce=kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1318622958&oauth_token=370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb&oauth_version=1.0&status=Hello%20Ladies%20%2B%20Gentlemen%2C%20a%20signed%20OAuth%20request%21"

actual_base_string :: ByteString
actual_base_string = "POST&https%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fupdate.json&include_entities%3Dtrue%26oauth_consumer_key%3Dxvz1evFS4wEEPTGEFPHBog%26oauth_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1318622958%26oauth_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb%26oauth_version%3D1.0%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521"

gen_base_string :: ByteString
gen_base_string =
    let params = [ Param "oauth_consumer_key" (consumerKey creds)
                 , Param "oauth_nonce" nonce
                 , Param "oauth_signature_method" "HMAC-SHA1"
                 , Param "oauth_timestamp" ts
                 , Param "oauth_version" "1.0"
                 , Param "oauth_token" (maybe "" id (token creds))
                 , Param "status"
                     "Hello Ladies + Gentlemen, a signed OAuth request!"
                 , Param "include_entities" "true"
                 ]
    in  sig_base_string (param_string params) method url

actual_signing_key :: ByteString
actual_signing_key = "kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE"

gen_signing_key :: ByteString
gen_signing_key = signing_key (consumerSecret creds) (tokenSecret creds)

actual_signature :: ByteString
actual_signature = "tnnArxj06cWHq44gCs1OSKk/jLY="

gen_signature :: ByteString
gen_signature =
    let params = [ Param "oauth_consumer_key" (consumerKey creds)
                 , Param "oauth_nonce" nonce
                 , Param "oauth_timestamp" ts
                 , Param "oauth_signature_method" "HMAC-SHA1"
                 , Param "oauth_version" "1.0"
                 , Param "include_entities" "true"
                 , Param "oauth_token" (maybe "" id (token creds))
                 , Param "status"
                     "Hello Ladies + Gentlemen, a signed OAuth request!"
                 ]
        sk = signing_key (consumerSecret creds) (tokenSecret creds)
        base_string = sig_base_string (param_string params) method url
    in  sign sk base_string

test_percent_encoding :: Bool
test_percent_encoding =
    "%2Fuser%2F123456%2Fcourses" ==
    percent_encode( "/user/123456/courses" :: ByteString)

main :: IO ()
main = do
    mapM_ putStrLn [
        "",
        "Tests",
        "[test_percent_encoding] " ++ (show test_percent_encoding),
        "[test_param_string] " ++
            (show $ actual_param_string == gen_param_string),
        "[test_base_string] " ++ (show $
                                  actual_base_string == gen_base_string),
        "[test_signing_key] " ++
            (show $ actual_signing_key == gen_signing_key),
        "[test_signature] " ++
            (show $ actual_signature == gen_signature)
        ]