@@ -1,20 +1,61 @@
1+{-# LANGUAGE DeriveGeneric, TemplateHaskell #-}
2+
13module Main where
24
35import Database.Bloodhound.Client
6+import Data.Aeson
7+import Data.DeriveTH
8+import Data.Maybe (fromJust)
9+import Data.Time.Clock (UTCTime)
10+import Data.Text (Text)
11+import GHC.Generics (Generic)
412import Network.HTTP.Conduit
513import qualified Network.HTTP.Types.Status as NHTS
14+import System.Random
615import Test.Hspec
16+import Test.QuickCheck
17+import Test.QuickCheck.Gen
18+import Test.QuickCheck.Instances
719
820
921testServer = Server "http://localhost:9200"
1022testIndex = "twitter"
1123validateStatus resp expected = (NHTS.statusCode $ responseStatus resp) `shouldBe` (expected :: Int)
24+createExampleIndex = createIndex testServer defaultIndexSettings testIndex
25+deleteExampleIndex = deleteIndex testServer testIndex
26+
27+data Tweet = Tweet { user :: Text
28+ , postDate :: UTCTime
29+ , message :: Text }
30+ deriving (Eq, Generic, Show)
31+
32+instance ToJSON Tweet
33+instance FromJSON Tweet
34+$(derive makeArbitrary ''Tweet)
35+
36+newTweet :: IO Tweet
37+newTweet = do
38+ g <- newStdGen
39+ let seed = head (take 1 $ randoms g)
40+ return (unGen arbitrary (mkStdGen seed) 100)
1241
1342main :: IO ()
1443main = hspec $ do
15− describe "index API" $ do
44+ describe "index create/delete API" $ do
1645 it "creates and then deletes the requested index" $ do
17− resp <- createIndex testServer defaultIndexSettings testIndex
18− deleteResp <- deleteIndex testServer testIndex
46+ -- priming state.
47+ _ <- deleteExampleIndex
48+ resp <- createExampleIndex
49+ deleteResp <- deleteExampleIndex
1950 validateStatus resp 200
2051 validateStatus deleteResp 200
52+ describe "document API" $ do
53+ it "indexes, gets, and then deletes the generated document" $ do
54+ tweet <- newTweet
55+ let encoded = encode tweet
56+ created <- createExampleIndex
57+ docCreated <- indexDocument (Server "http://localhost:9200") "twitter" "tweet" tweet "1"
58+ docInserted <- getDocument (Server "http://localhost:9200") "twitter" "tweet" "1"
59+ let newTweet = decode (responseBody docInserted) :: Maybe Tweet
60+ deleted <- deleteExampleIndex
61+ (Just tweet) `shouldBe` newTweet