{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
module Main where
import Data.Text
import Data.Time
import System.Locale
import Test.Hspec
import Yesod hiding (Key, get)
import Yesod.Form.Jquery (YesodJquery (..))
import Yesod.Test
import Yesod.Transloadit
data Test = Test
mkYesod "Test" [parseRoutes| / HomeR GET |]
instance Yesod Test
instance YesodJquery Test
instance YesodTransloadit Test
instance RenderMessage Test FormMessage where
renderMessage _ _ = defaultFormMessage
getHomeR :: Handler Html
getHomeR = defaultLayout $ do
let now = UTCTime (ModifiedJulianDay 50000) (secondsToDiffTime 10)
-- Create an id for your form
ident <- newIdent
-- Create some Transloadit params, you need: Expiry time; Api key; Template Id; Form id
let expiry = addUTCTime 3600 now
key = Key "my_key"
template = Template "my_template"
secret = Secret "my_secret"
params = mkParams expiry key template ident secret
-- Load the widget, and retrieve the given signature
sig <- either (const $ error "nooo") transloadIt params
-- CSRF considerations
t <- tokenText
-- Create a form
[whamlet|
<form id="#{ident}" action=@{HomeR} method="POST">
<input type="hidden" name="_token" value="#{t}">
<input type="hidden" name="signature" value="#{sig}">
<input type="file" name="my_file">
<input type="submit" value="Upload">
|]
return ()
formGenSpecs :: Spec
formGenSpecs = yesodSpec Test $ do
ydescribe "Form generation" $ do
yit "adds correct Transloadit params" $ do
get HomeR
bodyContains "params : JSON.parse('{\"auth\":{\"expires\":\"1995/10/10 01:00:10+00:00\",\"key\":\"my_key\"},\"template_id\":\"my_template\"}')"
yit "computes the correct signature" $ do
get HomeR
bodyContains "<input type=\"hidden\" name=\"signature\" value=\"ad2784ec20c0f2d486125141409763ea603e1a10\">"
yit "adds JQuery" $ do
get HomeR
bodyContains "<script src=\"//ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js\"></script>"
yit "adds Transloadit" $ do
get HomeR
bodyContains "<script src=\"https://assets.transloadit.com/js/jquery.transloadit2-v2-latest.js\"></script>"
ydescribe "Response parsing" $ do
yit "works" $ do
let sample = Just "{\"results\":{\"foo\":[{\"ssl_url\":\"bar\"}]}}" :: Maybe Text
assertEqual "Basic example" (extractFirstResult "foo" sample) (Just (String "bar"))
main = hspec formGenSpecs