packages feed

glue-core-0.6.2: test/Glue/BatcherSpec.hs

{-# LANGUAGE DeriveDataTypeable  #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Glue.BatcherSpec where

import           Control.Concurrent.Async
import qualified Data.HashMap.Strict      as M
import qualified Data.HashSet             as S
import           Glue.Batcher
import           Glue.Types
import           Test.Hspec
import           Test.QuickCheck

spec :: Spec
spec = do
  describe "batchingService" $ do
    it "Requests should receive their full results" $ do
      property $ \(requests :: [[Int]]) -> do
        let requestsAsSets = fmap (S.fromList) requests
        let serviceFunctionality rs = M.fromList $ fmap (\r -> (r, r * 2)) $ S.toList rs
        let service = (return . serviceFunctionality) :: MultiGetService IO Int Int
        (_, multiService) <- batchingService defaultBatchingOptions service
        let expectedResults = fmap serviceFunctionality requestsAsSets
        (mapConcurrently multiService requestsAsSets) `shouldReturn` expectedResults