packages feed

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