packages feed

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

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

module Glue.BatcherSpec where

import Control.Concurrent.Async
import qualified Data.HashSet as S
import qualified Data.HashMap.Strict as M
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