{-# LANGUAGE DeriveGeneric       #-}
{-# LANGUAGE OverloadedLists     #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell     #-}
module Avro.SchemaSpec
where

import qualified Data.HashMap.Lazy  as HashMap
import qualified Data.HashSet       as HashSet

import           Data.Avro
import           Data.Avro.Deriving (makeSchema)
import           Data.Avro.Schema   (extractBindings, matches, overlay)

import           Test.Hspec

{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}

spec :: Spec
spec = describe "Avro.SchemaSpec" $ do
  describe "extractBindings" $
    it "should extract bindings for all internal types" $ do
    let schema = $(makeSchema "test/data/internal-bindings.avsc")
        bindings = extractBindings schema
        expected =
          [ "InternalBindings"
          , "InField"
          , "NestedInField"
          , "AliasNestedInField"
          , "NestedEnum"
          , "NestedFixed"
          , "InArray"
          , "NestedInArray"
          , "InMap"
          , "NestedInMap"
          , "InUnionA"
          , "InUnionB"
          ]
    HashSet.fromMap (() <$ bindings) == expected
  describe "overlay" $
    it "should support merging multiple schemas" $ do
      let expected   = $(makeSchema "test/data/overlay/expectation.avsc")
          consumer   = $(makeSchema "test/data/overlay/composite.avsc")
          primitives = $(makeSchema "test/data/overlay/primitives.avsc")

      consumer `overlay` primitives `shouldSatisfy` matches expected