packages feed

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

{-# LANGUAGE ScopedTypeVariables #-}

module Glue.BatcherSpec (spec) where

import           Control.Concurrent.Async (mapConcurrently)
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 "Multi-get requests should receive their full results" $
      property $ \(requests :: [[Int]]) -> do
        let requestsAsSets = fmap S.fromList requests
            serviceFunctionality rs = M.fromList $ fmap (\r -> (r, r * 2)) $ S.toList rs
            service = (pure . serviceFunctionality) :: MultiGetService IO Int Int
        (_, multiService) <- batchingService (BatchingOptions 2) service
        let expectedResults = fmap serviceFunctionality requestsAsSets
        mapConcurrently multiService requestsAsSets `shouldReturn` expectedResults

    it "Single-key requests should receive their individual lookup results" $
      property $ \(requests :: [Int]) -> do
        let serviceFunctionality rs = M.fromList $ fmap (\r -> (r, r * 2)) $ S.toList rs
            service = (pure . serviceFunctionality) :: MultiGetService IO Int Int
        (singleService, _) <- batchingService (BatchingOptions 2) service
        let expectedResults = fmap (\r -> Just (r * 2)) requests
        mapConcurrently singleService requests `shouldReturn` expectedResults