avro-0.4.4.3: test/Avro/DeconflictSpec.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Avro.DeconflictSpec where
import Control.Monad.IO.Class
import Data.Avro as A
import Data.Avro.Deconflict
import Data.Avro.Deriving
import Data.Avro.Schema
import Data.Either
import Data.List.NonEmpty (NonEmpty (..))
import qualified Avro.Deconflict.A.Reader as AR
import qualified Avro.Deconflict.A.Writer as AW
import qualified Avro.Deconflict.B.Reader as BR
import qualified Avro.Deconflict.B.Writer as BW
import qualified Avro.Deconflict.C.Reader as CR
import qualified Avro.Deconflict.C.Writer as CW
import qualified Data.Avro.Decode as A (decodeAvro)
import qualified Data.Avro.Decode.Lazy as AL
import qualified Data.Avro.Decode.Lazy.Deconflict as AL
import qualified Data.Avro.Deconflict as A
import qualified Data.Avro.Types as Ty
import Test.Hspec
{-# ANN module ("HLint: ignore Redundant do" :: String) #-}
spec :: Spec
spec = describe "Avro.DeconflictSpec" $ do
describe "Type A" $ do
it "should deconflict simple message" $ do
let payload = A.encode $ AW.Inner 3
let Right decodedAvro = A.decodeAvro AW.schema'Inner payload
let Right deconflicted = deconflict AW.schema'Inner AR.schema'Inner decodedAvro
fromAvro deconflicted `shouldBe` Success (AR.Inner 3 Nothing)
it "should deconflict nested message" $ do
let payload = A.encode AW.sampleValue
let Right decodedAvro = A.decodeAvro AW.schema'Outer payload
let Right deconflicted = deconflict AW.schema'Outer AR.schema'Outer decodedAvro
fromAvro deconflicted `shouldBe` Success AR.sampleValue
it "should deconflict strict container" $ do
w <- A.encodeContainer [[AW.sampleValue]]
A.decodeContainer w `shouldBe` [[AR.sampleValue]]
it "should deconflict lazy container" $ do
w <- A.encodeContainer [[AW.sampleValue]]
AL.decodeContainer w `shouldBe` [Right AR.sampleValue]
it "should deconflict lazy value" $ do
let payload = A.encode AW.sampleValue
let decodedAvro = AL.decodeAvro AW.schema'Outer payload
let deconflicted = AL.deconflict AW.schema'Outer AR.schema'Outer decodedAvro
AL.fromLazyAvro deconflicted `shouldBe` Success AR.sampleValue
it "should deconflict strict value" $ do
let payload = A.encode AW.sampleValue
let Right decodedAvro = A.decodeAvro AW.schema'Outer payload
let Right deconflicted = A.deconflict AW.schema'Outer AR.schema'Outer decodedAvro
A.fromAvro deconflicted `shouldBe` Success AR.sampleValue
describe "Type B" $ do
it "should deconflict complex type" $ do
let payload = A.encode BW.sampleValue
let decodedAvro = AL.decodeAvro BW.schema'Foo payload
let res = AL.deconflict BW.schema'Foo BR.schema'Foo decodedAvro
AL.fromLazyAvro res `shouldBe` Success BR.sampleValue
it "should deconflict lazy container" $ do
w <- liftIO $ A.encodeContainer [[ BW.sampleValue ]]
AL.decodeContainer w `shouldBe` [ Right BR.sampleValue ]
it "should deconflict lazy value" $ do
let payload = A.encode BW.sampleValue
let decodedAvro = AL.decodeAvro BW.schema'Foo payload
let deconflicted = AL.deconflict BW.schema'Foo BR.schema'Foo decodedAvro
AL.fromLazyAvro deconflicted `shouldBe` Success BR.sampleValue
it "should deconflict strict container" $ do
w <- A.encodeContainer [[BW.sampleValue]]
A.decodeContainer w `shouldBe` [[BR.sampleValue]]
it "should deconflict strict value" $ do
let payload = A.encode BW.sampleValue
let Right decodedAvro = A.decodeAvro BW.schema'Foo payload
let Right deconflicted = A.deconflict BW.schema'Foo BR.schema'Foo decodedAvro
A.fromAvro deconflicted `shouldBe` Success BR.sampleValue
describe "Type C" $ do
it "should deconflict complex type" $ do
let payload = A.encode CW.sampleValue
let decodedAvro = AL.decodeAvro CW.schema'Foo payload
let res = AL.deconflict CW.schema'Foo CR.schema'Foo decodedAvro
AL.fromLazyAvro res `shouldBe` Success CR.sampleValue
it "should deconflict lazy container" $ do
w <- liftIO $ A.encodeContainer [[ CW.sampleValue ]]
AL.decodeContainer w `shouldBe` [ Right CR.sampleValue ]
it "should deconflict lazy value" $ do
let payload = A.encode CW.sampleValue
let decodedAvro = AL.decodeAvro CW.schema'Foo payload
let deconflicted = AL.deconflict CW.schema'Foo CR.schema'Foo decodedAvro
AL.fromLazyAvro deconflicted `shouldBe` Success CR.sampleValue
it "should deconflict strict container" $ do
w <- A.encodeContainer [[CW.sampleValue]]
A.decodeContainer w `shouldBe` [[CR.sampleValue]]
it "should deconflict strict value" $ do
let payload = A.encode CW.sampleValue
let Right decodedAvro = A.decodeAvro CW.schema'Foo payload
let Right deconflicted = A.deconflict CW.schema'Foo CR.schema'Foo decodedAvro
A.fromAvro deconflicted `shouldBe` Success CR.sampleValue