packages feed

aeson-via-0.2.2: test/Main.hs

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE OverloadedStrings #-}

module Main
  ( main
  )
where

import AesonVia (AesonNewtype (..), AesonRecord (..), AesonTag (..), HasTagPrefix (..))
import Control.Newtype.Generics (Newtype)
import Data.Aeson (FromJSON, ToJSON, encode)
import qualified Data.Text.Lazy.Encoding as TLE
import GHC.Generics (Generic)
import Test.Tasty (TestTree, defaultMain, testGroup)
import Test.Tasty.HUnit (testCase, (@?=))

newtype Author = Author
  { _authorWrapped :: String
  }
  deriving (Eq, Show, Generic)
  deriving (ToJSON, FromJSON) via (AesonNewtype Author String)

instance Newtype Author

data Category
  = CategoryNews
  | CategoryOpinion
  | CategoryLies
  deriving (Eq, Show, Generic)
  deriving (ToJSON, FromJSON) via (AesonTag Category)

instance HasTagPrefix Category where
  getTagPrefix _ = "Category"

data Article = Article
  { _articleTitle :: String
  , _articleAuthor :: Author
  , _articleCategory :: Category
  }
  deriving (Eq, Show, Generic)
  deriving (ToJSON, FromJSON) via (AesonRecord Article)

testSomething :: TestTree
testSomething = testCase "something" $ do
  let article = Article "Throw the ball!" (Author "Dog") CategoryOpinion
      expected = "{\"title\":\"Throw the ball!\",\"author\":\"Dog\",\"category\":\"opinion\"}"
      actual = TLE.decodeUtf8 (encode article)
  actual @?= expected

main :: IO ()
main =
  defaultMain $
    testGroup
      "AesonVia"
      [ testSomething
      ]