git.iko.soy/typeable/bloodhound
on d4fe69c help sign in
61 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.Maybe (fromJust)
9import Data.Time.Calendar (Day(..))
10import Data.Time.Clock (secondsToDiffTime, UTCTime(..))
11import Data.Text (Text)
12import GHC.Generics (Generic)
13import Network.HTTP.Conduit
14import qualified Network.HTTP.Types.Status as NHTS
15import Test.Hspec
18testServer = Server "http://localhost:9200"
19testIndex = "twitter"
20validateStatus resp expected = (NHTS.statusCode $ responseStatus resp) `shouldBe` (expected :: Int)
21createExampleIndex = createIndex testServer defaultIndexSettings testIndex
22deleteExampleIndex = deleteIndex testServer testIndex
24data Tweet = Tweet { user :: Text
25 , postDate :: UTCTime
26 , message :: Text }
27 deriving (Eq, Generic, Show)
29instance ToJSON Tweet
30instance FromJSON Tweet
32exampleTweet = Tweet { user = "bitemyapp"
33 , postDate = UTCTime
34 (ModifiedJulianDay 55000)
35 (secondsToDiffTime 10)
36 , message = "Use haskell!" }
38main :: IO ()
39main = hspec $ do
40 describe "index create/delete API" $ do
41 it "creates and then deletes the requested index" $ do
42 -- priming state.
43 _ <- deleteExampleIndex
44 resp <- createExampleIndex
45 deleteResp <- deleteExampleIndex
46 validateStatus resp 200
47 validateStatus deleteResp 200
48 describe "document API" $ do
49 it "indexes, gets, and then deletes the generated document" $ do
50 let tweet = exampleTweet
51 let encoded = encode tweet
52 _ <- deleteExampleIndex
53 created <- createExampleIndex
54 docCreated <- indexDocument (Server "http://localhost:9200")
55 "twitter" "tweet" tweet "1"
56 docInserted <- getDocument (Server "http://localhost:9200")
57 "twitter" "tweet" "1"
58 let newTweet = decode
59 (responseBody docInserted) :: Maybe (EsResult Tweet)
60 deleted <- deleteExampleIndex
61 Just tweet `shouldBe` fmap _source newTweet