2014-04-10 09:25:17 +04:00
|
|
|
{-# LANGUAGE DeriveGeneric #-}
|
2014-04-07 03:29:46 +04:00
|
|
|
|
2014-04-05 07:55:53 +04:00
|
|
|
module Main where
|
|
|
|
|
|
|
|
import Database.Bloodhound.Client
|
2014-04-07 03:29:46 +04:00
|
|
|
import Data.Aeson
|
|
|
|
import Data.DeriveTH
|
2014-04-10 07:24:46 +04:00
|
|
|
import Data.Either (Either(..))
|
2014-04-07 03:29:46 +04:00
|
|
|
import Data.Maybe (fromJust)
|
2014-04-07 04:53:53 +04:00
|
|
|
import Data.Time.Calendar (Day(..))
|
|
|
|
import Data.Time.Clock (secondsToDiffTime, UTCTime(..))
|
2014-04-07 03:29:46 +04:00
|
|
|
import Data.Text (Text)
|
|
|
|
import GHC.Generics (Generic)
|
2014-04-05 07:55:53 +04:00
|
|
|
import Network.HTTP.Conduit
|
|
|
|
import qualified Network.HTTP.Types.Status as NHTS
|
|
|
|
import Test.Hspec
|
|
|
|
|
|
|
|
|
|
|
|
testServer = Server "http://localhost:9200"
|
|
|
|
testIndex = "twitter"
|
|
|
|
validateStatus resp expected = (NHTS.statusCode $ responseStatus resp) `shouldBe` (expected :: Int)
|
2014-04-07 03:29:46 +04:00
|
|
|
createExampleIndex = createIndex testServer defaultIndexSettings testIndex
|
|
|
|
deleteExampleIndex = deleteIndex testServer testIndex
|
|
|
|
|
2014-04-10 09:25:17 +04:00
|
|
|
data Tweet = Tweet { user :: Text
|
2014-04-07 03:29:46 +04:00
|
|
|
, postDate :: UTCTime
|
2014-04-10 09:25:17 +04:00
|
|
|
, message :: Text }
|
2014-04-07 03:29:46 +04:00
|
|
|
deriving (Eq, Generic, Show)
|
|
|
|
|
|
|
|
instance ToJSON Tweet
|
|
|
|
instance FromJSON Tweet
|
|
|
|
|
2014-04-07 04:53:53 +04:00
|
|
|
exampleTweet = Tweet { user = "bitemyapp"
|
2014-04-07 07:51:30 +04:00
|
|
|
, postDate = UTCTime
|
|
|
|
(ModifiedJulianDay 55000)
|
2014-04-07 04:53:53 +04:00
|
|
|
(secondsToDiffTime 10)
|
|
|
|
, message = "Use haskell!" }
|
2014-04-05 07:55:53 +04:00
|
|
|
|
2014-04-10 09:25:17 +04:00
|
|
|
insertData :: IO ()
|
|
|
|
insertData = do
|
|
|
|
let encoded = encode exampleTweet
|
|
|
|
_ <- deleteExampleIndex
|
|
|
|
created <- createExampleIndex
|
|
|
|
docCreated <- indexDocument (Server "http://localhost:9200") "twitter" "tweet" exampleTweet "1"
|
2014-04-10 10:41:21 +04:00
|
|
|
_ <- refreshIndex testServer "twitter"
|
2014-04-10 09:25:17 +04:00
|
|
|
return ()
|
|
|
|
|
|
|
|
queryTweet :: IO (Either String Tweet)
|
|
|
|
queryTweet = do
|
|
|
|
let queryFilter = BoolFilter (MustMatch (Term "user" "bitemyapp") False)
|
|
|
|
<||> IdentityFilter
|
|
|
|
let search = Search Nothing (Just queryFilter)
|
|
|
|
reply <- searchByIndex testServer "twitter" search
|
|
|
|
let result = eitherDecode (responseBody reply) :: Either String (SearchResult Tweet)
|
|
|
|
let myTweet = fmap (hitSource . head . hits . searchHits) result
|
|
|
|
return myTweet
|
|
|
|
|
2014-04-05 07:55:53 +04:00
|
|
|
main :: IO ()
|
|
|
|
main = hspec $ do
|
2014-04-10 10:41:21 +04:00
|
|
|
describe "index create/delete API" $ do
|
|
|
|
it "creates and then deletes the requested index" $ do
|
|
|
|
-- priming state.
|
|
|
|
_ <- deleteExampleIndex
|
|
|
|
resp <- createExampleIndex
|
|
|
|
deleteResp <- deleteExampleIndex
|
|
|
|
validateStatus resp 200
|
|
|
|
validateStatus deleteResp 200
|
2014-04-10 09:25:17 +04:00
|
|
|
|
2014-04-07 03:29:46 +04:00
|
|
|
describe "document API" $ do
|
|
|
|
it "indexes, gets, and then deletes the generated document" $ do
|
2014-04-10 10:41:21 +04:00
|
|
|
_ <- insertData
|
2014-04-10 07:24:46 +04:00
|
|
|
docInserted <- getDocument (Server "http://localhost:9200") "twitter" "tweet" "1"
|
|
|
|
let newTweet = eitherDecode (responseBody docInserted) :: Either String (EsResult Tweet)
|
2014-04-10 09:25:17 +04:00
|
|
|
fmap _source newTweet `shouldBe` Right exampleTweet
|
|
|
|
|
|
|
|
describe "document filtering" $ do
|
|
|
|
it "returns documents expected from composed filters" $ do
|
|
|
|
_ <- insertData
|
|
|
|
myTweet <- queryTweet
|
|
|
|
myTweet `shouldBe` Right exampleTweet
|