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)
]