@@ -6,6 +6,7 @@ module Main where
66
77import Control.Applicative
88import Control.Monad
9+import Control.Monad.Reader
910import Data.Aeson
1011import qualified Data.HashMap.Strict as HM
1112import Data.List (nub)
@@ -34,15 +35,23 @@ testIndex = IndexName "bloodhound-tests-twitter-1"
3435testMapping :: MappingName
3536testMapping = MappingName "tweet"
3637
38+
39+--TODO: similar convenience function in Client
40+-- withTestEnv :: MonadIO m => Reader m a -> IO a
41+withTestEnv f = withManager defaultManagerSettings $ \mgr -> do
42+ let env = BHEnv { bhServer = testServer
43+ , bhManager = mgr }
44+ runReaderT f env
45+
3746validateStatus :: Response body -> Int -> Expectation
3847validateStatus resp expected =
3948 (NHTS.statusCode $ responseStatus resp)
4049 `shouldBe` (expected :: Int)
4150
42−createExampleIndex :: IO Reply
43−createExampleIndex = createIndex testServer defaultIndexSettings testIndex
44−deleteExampleIndex :: IO Reply
45−deleteExampleIndex = deleteIndex testServer testIndex
51+-- createExampleIndex :: IO Reply
52+createExampleIndex = createIndex defaultIndexSettings testIndex
53+-- deleteExampleIndex :: IO Reply
54+deleteExampleIndex = deleteIndex testIndex
4655
4756data ServerVersion = ServerVersion Int Int Int deriving (Show, Eq, Ord)
4857
@@ -70,18 +79,16 @@ mkServerVersion [majorVer, minorVer, patchVer] =
7079 Just (ServerVersion majorVer minorVer patchVer)
7180mkServerVersion _ = Nothing
7281
73−getServerVersion :: Server -> IO (Maybe ServerVersion)
74−getServerVersion s = liftM extractVersion (getStatus s)
82+-- getServerVersion :: IO (Maybe ServerVersion)
83+getServerVersion = liftM extractVersion (withTestEnv getStatus)
7584 where
7685 version' = T.splitOn "." . number . version
7786 toInt = read . T.unpack
7887 parseVersion v = map toInt (version' v)
7988 extractVersion = join . liftM (mkServerVersion . parseVersion)
8089
81−
82−
8390testServerBranch :: IO (Maybe ServerVersion)
84−testServerBranch = getServerVersion testServer >>= \v -> return $ liftM serverBranch v
91+testServerBranch = getServerVersion >>= \v -> return $ liftM serverBranch v
8592
8693atleast :: ServerVersion -> IO Bool
8794atleast v = testServerBranch >>= \x -> return $ x >= Just (serverBranch v)
@@ -136,60 +143,63 @@ otherTweet = Tweet { user = "notmyapp"
136143 , age = 1000
137144 , location = Location 40.12 (-71.34) }
138145
139−insertData :: IO ()
146+insertData :: ReaderT BHEnv IO ()
140147insertData = do
141148 _ <- deleteExampleIndex
142149 _ <- createExampleIndex
143− _ <- putMapping testServer testIndex testMapping TweetMapping
144− _ <- indexDocument testServer testIndex testMapping exampleTweet (DocId "1")
145− _ <- refreshIndex testServer testIndex
150+ _ <- putMapping testIndex testMapping TweetMapping
151+ _ <- indexDocument testIndex testMapping exampleTweet (DocId "1")
152+ _ <- refreshIndex testIndex
146153 return ()
147154
148−insertOther :: IO ()
155+-- insertOther :: IO ()
149156insertOther = do
150− _ <- indexDocument testServer testIndex testMapping otherTweet (DocId "2")
151− _ <- refreshIndex testServer testIndex
157+ _ <- indexDocument testIndex testMapping otherTweet (DocId "2")
158+ _ <- refreshIndex testIndex
152159 return ()
153160
154−searchTweet :: Search -> IO (Either String Tweet)
161+-- searchTweet :: Search -> IO (Either String Tweet)
155162searchTweet search = do
156− reply <- searchByIndex testServer testIndex search
163+ reply <- searchByIndex testIndex search
157164 let result = eitherDecode (responseBody reply) :: Either String (SearchResult Tweet)
158165 let myTweet = fmap (hitSource . head . hits . searchHits) result
159166 return myTweet
160167
161−searchExpectNoResults :: Search -> IO ()
168+-- searchExpectNoResults :: Search -> IO ()
162169searchExpectNoResults search = do
163− reply <- searchByIndex testServer testIndex search
170+ reply <- searchByIndex testIndex search
164171 let result = eitherDecode (responseBody reply) :: Either String (SearchResult Tweet)
165172 let emptyHits = fmap (hits . searchHits) result
166− emptyHits `shouldBe` Right []
173+ liftIO $
174+ emptyHits `shouldBe` Right []
167175
168−searchExpectAggs :: Search -> IO ()
176+-- searchExpectAggs :: Search -> IO ()
169177searchExpectAggs search = do
170− reply <- searchAll testServer search
178+ reply <- searchAll search
171179 let isEmpty x = return (M.null x)
172180 let result = decode (responseBody reply) :: Maybe (SearchResult Tweet)
173− (result >>= aggregations >>= isEmpty) `shouldBe` Just False
181+ liftIO $
182+ (result >>= aggregations >>= isEmpty) `shouldBe` Just False
174183
175−searchValidBucketAgg :: (BucketAggregation a, FromJSON a, Show a) => Search -> Text -> (Text -> AggregationResults -> Maybe (Bucket a)) -> IO ()
184+-- searchValidBucketAgg :: (BucketAggregation a, FromJSON a, Show a) => Search -> Text -> (Text -> AggregationResults -> Maybe (Bucket a)) -> IO ()
176185searchValidBucketAgg search aggKey extractor = do
177− reply <- searchAll testServer search
186+ reply <- searchAll search
178187 let bucketDocs = docCount . head . buckets
179188 let result = decode (responseBody reply) :: Maybe (SearchResult Tweet)
180189 let count = result >>= aggregations >>= extractor aggKey >>= \x -> return (bucketDocs x)
181− count `shouldBe` Just 1
190+ liftIO $
191+ count `shouldBe` Just 1
182192
183−searchTermsAggHint :: [ExecutionHint] -> IO ()
193+-- searchTermsAggHint :: [ExecutionHint] -> IO ()
184194searchTermsAggHint hints = do
185195 let terms hint = TermsAgg $ (mkTermsAggregation "user") { termExecutionHint = Just hint }
186196 let search hint = mkAggregateSearch Nothing $ mkAggregations "users" $ terms hint
187197 forM_ hints $ searchExpectAggs . search
188198 forM_ hints (\x -> searchValidBucketAgg (search x) "users" toTerms)
189199
190−searchTweetHighlight :: Search -> IO (Either String (Maybe HitHighlight))
200+-- searchTweetHighlight :: Search -> IO (Either String (Maybe HitHighlight))
191201searchTweetHighlight search = do
192− reply <- searchByIndex testServer testIndex search
202+ reply <- searchByIndex testIndex search
193203 let result = eitherDecode (responseBody reply) :: Either String (SearchResult Tweet)
194204 let myHighlight = fmap (hitHighlight . head . hits . searchHits) result
195205 return myHighlight
@@ -223,26 +233,27 @@ main :: IO ()
223233main = hspec $ do
224234
225235 describe "index create/delete API" $ do
226− it "creates and then deletes the requested index" $ do
236+ it "creates and then deletes the requested index" $ withTestEnv $ do
227237 -- priming state.
228238 _ <- deleteExampleIndex
229239 resp <- createExampleIndex
230240 deleteResp <- deleteExampleIndex
231− validateStatus resp 200
232− validateStatus deleteResp 200
241+ liftIO $ do
242+ validateStatus resp 200
243+ validateStatus deleteResp 200
233244
234245
235246 describe "document API" $ do
236− it "indexes, gets, and then deletes the generated document" $ do
247+ it "indexes, gets, and then deletes the generated document" $ withTestEnv $ do
237248 _ <- insertData
238− docInserted <- getDocument testServer testIndex testMapping (DocId "1")
249+ docInserted <- getDocument testIndex testMapping (DocId "1")
239250 let newTweet = eitherDecode
240251 (responseBody docInserted) :: Either String (EsResult Tweet)
241− fmap _source newTweet `shouldBe` Right exampleTweet
252+ liftIO $ (fmap _source newTweet `shouldBe` Right exampleTweet)
242253
243254
244255 describe "bulk API" $ do
245− it "inserts all documents we request" $ do
256+ it "inserts all documents we request" $ withTestEnv $ do
246257 _ <- insertData
247258 let firstTest = BulkTest "blah"
248259 let secondTest = BulkTest "bloo"
@@ -251,49 +262,54 @@ main = hspec $ do
251262 let secondDoc = BulkCreate testIndex
252263 testMapping (DocId "3") (toJSON secondTest)
253264 let stream = V.fromList [firstDoc, secondDoc]
254− _ <- bulk testServer stream
255− _ <- refreshIndex testServer testIndex
256− fDoc <- getDocument testServer testIndex testMapping (DocId "2")
257− sDoc <- getDocument testServer testIndex testMapping (DocId "3")
265+ _ <- bulk stream
266+ _ <- refreshIndex testIndex
267+ fDoc <- getDocument testIndex testMapping (DocId "2")
268+ sDoc <- getDocument testIndex testMapping (DocId "3")
258269 let maybeFirst = eitherDecode $ responseBody fDoc :: Either String (EsResult BulkTest)
259270 let maybeSecond = eitherDecode $ responseBody sDoc :: Either String (EsResult BulkTest)
260− fmap _source maybeFirst `shouldBe` Right firstTest
261− fmap _source maybeSecond `shouldBe` Right secondTest
271+ liftIO $ do
272+ fmap _source maybeFirst `shouldBe` Right firstTest
273+ fmap _source maybeSecond `shouldBe` Right secondTest
262274
263275
264276 describe "query API" $ do
265− it "returns document for term query and identity filter" $ do
277+ it "returns document for term query and identity filter" $ withTestEnv $ do
266278 _ <- insertData
267279 let query = TermQuery (Term "user" "bitemyapp") Nothing
268280 let filter = IdentityFilter <&&> IdentityFilter
269281 let search = mkSearch (Just query) (Just filter)
270282 myTweet <- searchTweet search
271− myTweet `shouldBe` Right exampleTweet
283+ liftIO $
284+ myTweet `shouldBe` Right exampleTweet
272285
273− it "returns document for terms query and identity filter" $ do
286+ it "returns document for terms query and identity filter" $ withTestEnv $ do
274287 _ <- insertData
275288 let query = TermsQuery (NE.fromList [(Term "user" "bitemyapp")])
276289 let filter = IdentityFilter <&&> IdentityFilter
277290 let search = mkSearch (Just query) (Just filter)
278291 myTweet <- searchTweet search
279− myTweet `shouldBe` Right exampleTweet
292+ liftIO $
293+ myTweet `shouldBe` Right exampleTweet
280294
281− it "returns document for match query" $ do
295+ it "returns document for match query" $ withTestEnv $ do
282296 _ <- insertData
283297 let query = QueryMatchQuery $ mkMatchQuery (FieldName "user") (QueryString "bitemyapp")
284298 let search = mkSearch (Just query) Nothing
285299 myTweet <- searchTweet search
286− myTweet `shouldBe` Right exampleTweet
300+ liftIO $
301+ myTweet `shouldBe` Right exampleTweet
287302
288− it "returns document for multi-match query" $ do
303+ it "returns document for multi-match query" $ withTestEnv $ do
289304 _ <- insertData
290305 let fields = [FieldName "user", FieldName "message"]
291306 let query = QueryMultiMatchQuery $ mkMultiMatchQuery fields (QueryString "bitemyapp")
292307 let search = mkSearch (Just query) Nothing
293308 myTweet <- searchTweet search
294− myTweet `shouldBe` Right exampleTweet
309+ liftIO $
310+ myTweet `shouldBe` Right exampleTweet
295311
296− it "returns document for bool query" $ do
312+ it "returns document for bool query" $ withTestEnv $ do
297313 _ <- insertData
298314 let innerQuery = QueryMatchQuery $
299315 mkMatchQuery (FieldName "user") (QueryString "bitemyapp")
@@ -301,18 +317,20 @@ main = hspec $ do
301317 mkBoolQuery [innerQuery] [] []
302318 let search = mkSearch (Just query) Nothing
303319 myTweet <- searchTweet search
304− myTweet `shouldBe` Right exampleTweet
320+ liftIO $
321+ myTweet `shouldBe` Right exampleTweet
305322
306− it "returns document for boosting query" $ do
323+ it "returns document for boosting query" $ withTestEnv $ do
307324 _ <- insertData
308325 let posQuery = QueryMatchQuery $ mkMatchQuery (FieldName "user") (QueryString "bitemyapp")
309326 let negQuery = QueryMatchQuery $ mkMatchQuery (FieldName "user") (QueryString "notmyapp")
310327 let query = QueryBoostingQuery $ BoostingQuery posQuery negQuery (Boost 0.2)
311328 let search = mkSearch (Just query) Nothing
312329 myTweet <- searchTweet search
313− myTweet `shouldBe` Right exampleTweet
330+ liftIO $
331+ myTweet `shouldBe` Right exampleTweet
314332
315− it "returns document for common terms query" $ do
333+ it "returns document for common terms query" $ withTestEnv $ do
316334 _ <- insertData
317335 let query = QueryCommonTermsQuery $
318336 CommonTermsQuery (FieldName "user")
@@ -321,55 +339,61 @@ main = hspec $ do
321339 Or Or Nothing Nothing Nothing Nothing
322340 let search = mkSearch (Just query) Nothing
323341 myTweet <- searchTweet search
324− myTweet `shouldBe` Right exampleTweet
342+ liftIO $
343+ myTweet `shouldBe` Right exampleTweet
325344
326345
327346 describe "sorting" $ do
328− it "returns documents in the right order" $ do
347+ it "returns documents in the right order" $ withTestEnv $ do
329348 _ <- insertData
330349 _ <- insertOther
331350 let sortSpec = DefaultSortSpec $ mkSort (FieldName "age") Ascending
332351 let search = Search Nothing
333352 (Just IdentityFilter) (Just [sortSpec]) Nothing Nothing
334353 False 0 10
335− reply <- searchByIndex testServer testIndex search
354+ reply <- searchByIndex testIndex search
336355 let result = eitherDecode (responseBody reply) :: Either String (SearchResult Tweet)
337356 let myTweet = fmap (hitSource . head . hits . searchHits) result
338− myTweet `shouldBe` Right otherTweet
357+ liftIO $
358+ myTweet `shouldBe` Right otherTweet
339359
340360
341361 describe "filtering API" $ do
342− it "returns document for composed boolmatch and identity" $ do
362+ it "returns document for composed boolmatch and identity" $ withTestEnv $ do
343363 _ <- insertData
344364 let queryFilter = BoolFilter (MustMatch (Term "user" "bitemyapp") False)
345365 <&&> IdentityFilter
346366 let search = mkSearch Nothing (Just queryFilter)
347367 myTweet <- searchTweet search
348− myTweet `shouldBe` Right exampleTweet
368+ liftIO $
369+ myTweet `shouldBe` Right exampleTweet
349370
350− it "returns document for term filter" $ do
371+ it "returns document for term filter" $ withTestEnv $ do
351372 _ <- insertData
352373 let termFilter = TermFilter (Term "user" "bitemyapp") False
353374 let search = mkSearch Nothing (Just termFilter)
354375 myTweet <- searchTweet search
355− myTweet `shouldBe` Right exampleTweet
376+ liftIO $
377+ myTweet `shouldBe` Right exampleTweet
356378
357− it "returns document for existential filter" $ do
379+ it "returns document for existential filter" $ withTestEnv $ do
358380 _ <- insertData
359381 let search = mkSearch Nothing (Just (ExistsFilter (FieldName "user")))
360382 myTweet <- searchTweet search
361− myTweet `shouldBe` Right exampleTweet
383+ liftIO $
384+ myTweet `shouldBe` Right exampleTweet
362385
363− it "returns document for geo boundingbox filter" $ do
386+ it "returns document for geo boundingbox filter" $ withTestEnv $ do
364387 _ <- insertData
365388 let box = GeoBoundingBox (LatLon 40.73 (-74.1)) (LatLon 40.10 (-71.12))
366389 let bbConstraint = GeoBoundingBoxConstraint (FieldName "tweet.location") box False GeoFilterMemory
367390 let geoFilter = GeoBoundingBoxFilter bbConstraint
368391 let search = mkSearch Nothing (Just geoFilter)
369392 myTweet <- searchTweet search
370− myTweet `shouldBe` Right exampleTweet
393+ liftIO $
394+ myTweet `shouldBe` Right exampleTweet
371395
372− it "doesn't return document for nonsensical boundingbox filter" $ do
396+ it "doesn't return document for nonsensical boundingbox filter" $ withTestEnv $ do
373397 _ <- insertData
374398 let box = GeoBoundingBox (LatLon 0.73 (-4.1)) (LatLon 0.10 (-1.12))
375399 let bbConstraint = GeoBoundingBoxConstraint (FieldName "tweet.location") box False GeoFilterMemory
@@ -377,7 +401,7 @@ main = hspec $ do
377401 let search = mkSearch Nothing (Just geoFilter)
378402 searchExpectNoResults search
379403
380− it "returns document for geo distance filter" $ do
404+ it "returns document for geo distance filter" $ withTestEnv $ do
381405 _ <- insertData
382406 let geoPoint = GeoPoint (FieldName "tweet.location") (LatLon 40.12 (-71.34))
383407 let distance = Distance 10.0 Miles
@@ -385,18 +409,20 @@ main = hspec $ do
385409 let geoFilter = GeoDistanceFilter geoPoint distance SloppyArc optimizeBbox False
386410 let search = mkSearch Nothing (Just geoFilter)
387411 myTweet <- searchTweet search
388− myTweet `shouldBe` Right exampleTweet
412+ liftIO $
413+ myTweet `shouldBe` Right exampleTweet
389414
390− it "returns document for geo distance range filter" $ do
415+ it "returns document for geo distance range filter" $ withTestEnv $ do
391416 _ <- insertData
392417 let geoPoint = GeoPoint (FieldName "tweet.location") (LatLon 40.12 (-71.34))
393418 let distanceRange = DistanceRange (Distance 0.0 Miles) (Distance 10.0 Miles)
394419 let geoFilter = GeoDistanceRangeFilter geoPoint distanceRange
395420 let search = mkSearch Nothing (Just geoFilter)
396421 myTweet <- searchTweet search
397− myTweet `shouldBe` Right exampleTweet
422+ liftIO $
423+ myTweet `shouldBe` Right exampleTweet
398424
399− it "doesn't return document for wild geo distance range filter" $ do
425+ it "doesn't return document for wild geo distance range filter" $ withTestEnv $ do
400426 _ <- insertData
401427 let geoPoint = GeoPoint (FieldName "tweet.location") (LatLon 40.12 (-71.34))
402428 let distanceRange = DistanceRange (Distance 100.0 Miles) (Distance 1000.0 Miles)
@@ -404,7 +430,7 @@ main = hspec $ do
404430 let search = mkSearch Nothing (Just geoFilter)
405431 searchExpectNoResults search
406432
407− it "returns document for geo polygon filter" $ do
433+ it "returns document for geo polygon filter" $ withTestEnv $ do
408434 _ <- insertData
409435 let points = [LatLon 40.0 (-70.00),
410436 LatLon 40.0 (-72.00),
@@ -413,9 +439,10 @@ main = hspec $ do
413439 let geoFilter = GeoPolygonFilter (FieldName "tweet.location") points
414440 let search = mkSearch Nothing (Just geoFilter)
415441 myTweet <- searchTweet search
416− myTweet `shouldBe` Right exampleTweet
442+ liftIO $
443+ myTweet `shouldBe` Right exampleTweet
417444
418− it "doesn't return document for bad geo polygon filter" $ do
445+ it "doesn't return document for bad geo polygon filter" $ withTestEnv $ do
419446 _ <- insertData
420447 let points = [LatLon 40.0 (-70.00),
421448 LatLon 40.0 (-71.00),
@@ -425,23 +452,25 @@ main = hspec $ do
425452 let search = mkSearch Nothing (Just geoFilter)
426453 searchExpectNoResults search
427454
428− it "returns document for ids filter" $ do
455+ it "returns document for ids filter" $ withTestEnv $ do
429456 _ <- insertData
430457 let filter = IdsFilter (MappingName "tweet") [DocId "1"]
431458 let search = mkSearch Nothing (Just filter)
432459 myTweet <- searchTweet search
433− myTweet `shouldBe` Right exampleTweet
460+ liftIO $
461+ myTweet `shouldBe` Right exampleTweet
434462
435− it "returns document for Double range filter" $ do
463+ it "returns document for Double range filter" $ withTestEnv $ do
436464 _ <- insertData
437465 let filter = RangeFilter (FieldName "age")
438466 (RangeDoubleGtLt (GreaterThan 1000.0) (LessThan 100000.0))
439467 RangeExecutionIndex False
440468 let search = mkSearch Nothing (Just filter)
441469 myTweet <- searchTweet search
442− myTweet `shouldBe` Right exampleTweet
470+ liftIO $
471+ myTweet `shouldBe` Right exampleTweet
443472
444− it "returns document for UTCTime date filter" $ do
473+ it "returns document for UTCTime date filter" $ withTestEnv $ do
445474 _ <- insertData
446475 let filter = RangeFilter (FieldName "postDate")
447476 (RangeDateGtLt
@@ -454,18 +483,20 @@ main = hspec $ do
454483 RangeExecutionIndex False
455484 let search = mkSearch Nothing (Just filter)
456485 myTweet <- searchTweet search
457− myTweet `shouldBe` Right exampleTweet
486+ liftIO $
487+ myTweet `shouldBe` Right exampleTweet
458488
459489
460− it "returns document for regexp filter" $ do
490+ it "returns document for regexp filter" $ withTestEnv $ do
461491 _ <- insertData
462492 let filter = RegexpFilter (FieldName "user") (Regexp "bite.*app")
463493 AllRegexpFlags (CacheName "test") False (CacheKey "key")
464494 let search = mkSearch Nothing (Just filter)
465495 myTweet <- searchTweet search
466− myTweet `shouldBe` Right exampleTweet
496+ liftIO $
497+ myTweet `shouldBe` Right exampleTweet
467498
468− it "doesn't return document for non-matching regexp filter" $ do
499+ it "doesn't return document for non-matching regexp filter" $ withTestEnv $ do
469500 _ <- insertData
470501 let filter = RegexpFilter (FieldName "user")
471502 (Regexp "boy") AllRegexpFlags
@@ -474,40 +505,40 @@ main = hspec $ do
474505 searchExpectNoResults search
475506
476507 describe "Aggregation API" $ do
477− it "returns term aggregation results" $ do
508+ it "returns term aggregation results" $ withTestEnv $ do
478509 _ <- insertData
479510 let terms = TermsAgg $ mkTermsAggregation "user"
480511 let search = mkAggregateSearch Nothing $ mkAggregations "users" terms
481512 searchExpectAggs search
482513 searchValidBucketAgg search "users" toTerms
483514
484− it "can give collection hint parameters to term aggregations" $ when' (atleast es13) $ do
515+ it "can give collection hint parameters to term aggregations" $ when' (atleast es13) $ withTestEnv $ do
485516 _ <- insertData
486517 let terms = TermsAgg $ (mkTermsAggregation "user") { termCollectMode = Just BreadthFirst }
487518 let search = mkAggregateSearch Nothing $ mkAggregations "users" terms
488519 searchExpectAggs search
489520 searchValidBucketAgg search "users" toTerms
490521
491− it "can give execution hint paramters to term aggregations" $ when' (atmost es11) $ do
522+ it "can give execution hint paramters to term aggregations" $ when' (atmost es11) $ withTestEnv $ do
492523 _ <- insertData
493524 searchTermsAggHint [Map, Ordinals]
494525
495− it "can give execution hint paramters to term aggregations" $ when' (is es12) $ do
526+ it "can give execution hint paramters to term aggregations" $ when' (is es12) $ withTestEnv $ do
496527 _ <- insertData
497528 searchTermsAggHint [GlobalOrdinals, GlobalOrdinalsHash, GlobalOrdinalsLowCardinality, Map, Ordinals]
498529
499− it "can give execution hint paramters to term aggregations" $ when' (atleast es12) $ do
530+ it "can give execution hint paramters to term aggregations" $ when' (atleast es12) $ withTestEnv $ do
500531 _ <- insertData
501532 searchTermsAggHint [GlobalOrdinals, GlobalOrdinalsHash, GlobalOrdinalsLowCardinality, Map]
502533
503− it "returns date histogram aggregation results" $ do
534+ it "returns date histogram aggregation results" $ withTestEnv $ do
504535 _ <- insertData
505536 let histogram = DateHistogramAgg $ mkDateHistogram (FieldName "postDate") Minute
506537 let search = mkAggregateSearch Nothing (mkAggregations "byDate" histogram)
507538 searchExpectAggs search
508539 searchValidBucketAgg search "byDate" toDateHistogram
509540
510− it "returns date histogram using fractional date" $ do
541+ it "returns date histogram using fractional date" $ withTestEnv $ do
511542 _ <- insertData
512543 let periods = [Year, Quarter, Month, Week, Day, Hour, Minute, Second]
513544 let fractionals = map (FractionalInterval 1.5) [Weeks, Days, Hours, Minutes, Seconds]
@@ -521,7 +552,7 @@ main = hspec $ do
521552
522553 describe "Highlights API" $ do
523554
524− it "returns highlight from query when there should be one" $ do
555+ it "returns highlight from query when there should be one" $ withTestEnv $ do
525556 _ <- insertData
526557 _ <- insertOther
527558 let query = QueryMatchQuery $ mkMatchQuery (FieldName "_all") (QueryString "haskell")
@@ -529,9 +560,10 @@ main = hspec $ do
529560
530561 let search = mkHighlightSearch (Just query) testHighlight
531562 myHighlight <- searchTweetHighlight search
532− myHighlight `shouldBe` Right (Just (M.fromList [("message",["Use <em>haskell</em>!"])]))
563+ liftIO $
564+ myHighlight `shouldBe` Right (Just (M.fromList [("message",["Use <em>haskell</em>!"])]))
533565
534− it "doesn't return highlight from a query when it shouldn't" $ do
566+ it "doesn't return highlight from a query when it shouldn't" $ withTestEnv $ do
535567 _ <- insertData
536568 _ <- insertOther
537569 let query = QueryMatchQuery $ mkMatchQuery (FieldName "_all") (QueryString "haskell")
@@ -539,7 +571,8 @@ main = hspec $ do
539571
540572 let search = mkHighlightSearch (Just query) testHighlight
541573 myHighlight <- searchTweetHighlight search
542− myHighlight `shouldBe` Right Nothing
574+ liftIO $
575+ myHighlight `shouldBe` Right Nothing
543576
544577
545578