git.iko.soy/typeable/bloodhound
on master help sign in
welp.
886ef3fChris Allen
Database/Bloodhound/Client.hs+3
@@ -8,6 +8,9 @@ module Database.Bloodhound.Client
8 , Server(..)
8 , Server(..)
9 , defaultIndexSettings
9 , defaultIndexSettings
10 , indexDocument
10 , indexDocument
11+ , getDocument
12+ , documentExists
13+ , deleteDocument
11 )
14 )
12 where
15 where
13
16
Makefilenew file+12
@@ -0,0 +1,12 @@
1+
2+test:
3+ cabal install --enable-tests
4+
5+build:
6+ cabal build
7+
8+test-repl:
9+ cabal repl tests
10+
11+repl:
12+ cabal repl
bloodhound.cabal+9−2
@@ -43,7 +43,14 @@ test-suite tests
43 hs-source-dirs: tests
43 hs-source-dirs: tests
44 build-depends: base,
44 build-depends: base,
45 bloodhound,
45 bloodhound,
46− hspec >= 1.9,
47 http-conduit,
46 http-conduit,
48− http-types
47+ http-types,
48+ hspec >= 1.9,
49+ QuickCheck >= 2.5,
50+ derive >= 2.5,
51+ text >= 0.11,
52+ time >= 1.4,
53+ aeson >= 0.7,
54+ random >= 1.0,
55+ quickcheck-instances >= 0.3
49 default-language: Haskell2010
56 default-language: Haskell2010
tests/tests.hs+44−3
@@ -1,20 +1,61 @@
1+{-# LANGUAGE DeriveGeneric, TemplateHaskell #-}
2+
1module Main where
3module Main where
2
4
3import Database.Bloodhound.Client
5import 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)
4import Network.HTTP.Conduit
12import Network.HTTP.Conduit
5import qualified Network.HTTP.Types.Status as NHTS
13import qualified Network.HTTP.Types.Status as NHTS
14+import System.Random
6import Test.Hspec
15import Test.Hspec
16+import Test.QuickCheck
17+import Test.QuickCheck.Gen
18+import Test.QuickCheck.Instances
7
19
8
20
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
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)
12
41
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
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