@@ -1,20 +1,61 @@
1+{-# LANGUAGE DeriveGeneric, TemplateHaskell #-}
1module Main where
3module Main where
3import Database.Bloodhound.Client
5import Database.Bloodhound.Client
8+import Data.Maybe (fromJust)
9+import Data.Time.Clock (UTCTime)
10+import Data.Text (Text)
11+import GHC.Generics (Generic)
4import Network.HTTP.Conduit
12import Network.HTTP.Conduit
5import qualified Network.HTTP.Types.Status as NHTS
13import qualified Network.HTTP.Types.Status as NHTS
6import Test.Hspec
15import Test.Hspec
16+import Test.QuickCheck
17+import Test.QuickCheck.Gen
18+import Test.QuickCheck.Instances
9testServer = Server "http://localhost:9200"
21testServer = Server "http://localhost:9200"
10testIndex = "twitter"
22testIndex = "twitter"
11validateStatus resp expected = (NHTS.statusCode $ responseStatus resp) `shouldBe` (expected :: Int)
23validateStatus resp expected = (NHTS.statusCode $ responseStatus resp) `shouldBe` (expected :: Int)
24+createExampleIndex = createIndex testServer defaultIndexSettings testIndex
25+deleteExampleIndex = deleteIndex testServer testIndex
27+data Tweet = Tweet { user :: Text
28+ , postDate :: UTCTime
30+ deriving (Eq, Generic, Show)
33+instance FromJSON Tweet
34+$(derive makeArbitrary ''Tweet)
39+ let seed = head (take 1 $ randoms g)
40+ return (unGen arbitrary (mkStdGen seed) 100)
13main :: IO ()
42main :: IO ()
14main = hspec $ do
43main = hspec $ do
15− describe "index API" $ do
44+ describe "index create/delete API" $ do
16 it "creates and then deletes the requested index" $ do
45 it "creates and then deletes the requested index" $ do
17− resp <- createIndex testServer defaultIndexSettings testIndex
46+ -- priming state.
18− deleteResp <- deleteIndex testServer testIndex
47+ _ <- deleteExampleIndex
48+ resp <- createExampleIndex
49+ deleteResp <- deleteExampleIndex
19 validateStatus resp 200
50 validateStatus resp 200
20 validateStatus deleteResp 200
51 validateStatus deleteResp 200
52+ describe "document API" $ do
53+ it "indexes, gets, and then deletes the generated document" $ do
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