graphql-engine/server/src-test/Data/Parser/JSONPathSpec.hs
Brandon Simmons 6e8da71ece server: migrate to aeson-2 in preparation for ghc 9.2 upgrade
(Work here originally done by awjchen, rebased and fixed up for merge by
jberryman)

This is part of a merge train towards GHC 9.2 compatibility. The main
issue is the use of the new abstract `KeyMap` in 2.0. See:
https://hackage.haskell.org/package/aeson-2.0.3.0/changelog

Alex's original work is here:
#4305

BEHAVIOR CHANGE NOTE: This change causes a different arbitrary ordering
of serialized Json, for example during metadata export. CLI users care
about this in particular, and so we need to call it out as a _behavior
change_ as we did in v2.5.0. The good news though is that after this
change ordering should be more stable (alphabetical key order).

See: https://hasurahq.slack.com/archives/C01M20G1YRW/p1654012632634389

PR-URL: https://github.com/hasura/graphql-engine-mono/pull/4611
Co-authored-by: awjchen <13142944+awjchen@users.noreply.github.com>
GitOrigin-RevId: 700265162c782739b2bb88300ee3cda3819b2e87
2022-06-08 15:32:27 +00:00

45 lines
1.5 KiB
Haskell

module Data.Parser.JSONPathSpec (spec) where
import Data.Aeson.Key qualified as K
import Data.Parser.JSONPath
import Data.Text qualified as T
import Hasura.Base.Error (encodeJSONPath)
import Hasura.Prelude
import Test.Hspec
import Test.QuickCheck
spec :: Spec
spec = describe "encode and parse JSONPath" $ do
it "JSONPath encoder" $
forM_ generateTestEncodeJSONPath $ \(jsonPath, result) ->
encodeJSONPath jsonPath `shouldBe` result
describe "JSONPath parser" $ do
it "Single $" $
parseJSONPath "$" `shouldBe` (Right [] :: Either String JSONPath)
it "Random json paths" $
withMaxSuccess 1000 $
forAll (resize 20 generateJSONPath) $ \jsonPath ->
let encPath = encodeJSONPath jsonPath
parsedJSONPathE = parseJSONPath $ T.pack encPath
in case parsedJSONPathE of
Left err -> counterexample (err <> ": " <> encPath) False
Right parsedJSONPath -> property $ parsedJSONPath == jsonPath
generateTestEncodeJSONPath :: [(JSONPath, String)]
generateTestEncodeJSONPath =
[ ([Key "7seven", Index 0, Key "@!^@*#(!("], "$['7seven'][0]['@!^@*#(!(']"),
([Key "ABCD"], "$.ABCD")
]
generateJSONPath :: Gen JSONPath
generateJSONPath = map (either id id) <$> listOf1 genPathElementEither
where
genPathElementEither = do
indexLeft <- Left <$> genIndex
keyRight <- Right <$> genKey
elements [indexLeft, keyRight]
genIndex = Index <$> choose (0, 100)
genKey = Key . K.fromText . T.pack <$> listOf1 (elements $ alphaNumerics ++ ".,!@#$%^&*_-?:;|/\"")