git.iko.soy/typeable/bloodhound
on cdc262f help sign in
59 lines 2.1 kB history raw
1{-# LANGUAGE DeriveGeneric, OverloadedStrings #-}
3module Main where
5import Database.Bloodhound.Client
6import Data.Aeson
7import Data.DeriveTH
8import Data.Either (Either(..))
9import Data.Maybe (fromJust)
10import Data.Time.Calendar (Day(..))
11import Data.Time.Clock (secondsToDiffTime, UTCTime(..))
12import Data.Text (Text)
13import GHC.Generics (Generic)
14import Network.HTTP.Conduit
15import qualified Network.HTTP.Types.Status as NHTS
16import Test.Hspec
19testServer = Server "http://localhost:9200"
20testIndex = "twitter"
21validateStatus resp expected = (NHTS.statusCode $ responseStatus resp) `shouldBe` (expected :: Int)
22createExampleIndex = createIndex testServer defaultIndexSettings testIndex
23deleteExampleIndex = deleteIndex testServer testIndex
25data Tweet = Tweet { user :: Text
26 , postDate :: UTCTime
27 , message :: Text }
28 deriving (Eq, Generic, Show)
30instance ToJSON Tweet
31instance FromJSON Tweet
33exampleTweet = Tweet { user = "bitemyapp"
34 , postDate = UTCTime
35 (ModifiedJulianDay 55000)
36 (secondsToDiffTime 10)
37 , message = "Use haskell!" }
39main :: IO ()
40main = hspec $ do
41 describe "index create/delete API" $ do
42 it "creates and then deletes the requested index" $ do
43 -- priming state.
44 _ <- deleteExampleIndex
45 resp <- createExampleIndex
46 deleteResp <- deleteExampleIndex
47 validateStatus resp 200
48 validateStatus deleteResp 200
49 describe "document API" $ do
50 it "indexes, gets, and then deletes the generated document" $ do
51 let tweet = exampleTweet
52 let encoded = encode tweet
53 _ <- deleteExampleIndex
54 created <- createExampleIndex
55 docCreated <- indexDocument (Server "http://localhost:9200") "twitter" "tweet" tweet "1"
56 docInserted <- getDocument (Server "http://localhost:9200") "twitter" "tweet" "1"
57 let newTweet = eitherDecode (responseBody docInserted) :: Either String (EsResult Tweet)
58 deleted <- deleteExampleIndex
59 Right tweet `shouldBe` fmap _source newTweet