diff --git a/src/PostgREST/Types.hs b/src/PostgREST/Types.hs index 132538215..d5ca4ea7e 100644 --- a/src/PostgREST/Types.hs +++ b/src/PostgREST/Types.hs @@ -374,6 +374,9 @@ pgVersion96 = PgVersion 90600 "9.6" pgVersion100 :: PgVersion pgVersion100 = PgVersion 100000 "10" +pgVersion112 :: PgVersion +pgVersion112 = PgVersion 110002 "11.2" + sourceCTEName :: SqlFragment sourceCTEName = "pg_source" diff --git a/test/Feature/AuthSpec.hs b/test/Feature/AuthSpec.hs index 4ba1142ae..50d3f9ca3 100644 --- a/test/Feature/AuthSpec.hs +++ b/test/Feature/AuthSpec.hs @@ -11,16 +11,27 @@ import Network.Wai (Application) import Protolude hiding (get) -spec :: SpecWith Application -spec = describe "authorization" $ do +import PostgREST.Types (PgVersion, pgVersion112) + +spec :: PgVersion -> SpecWith Application +spec actualPgVersion = describe "authorization" $ do let single = ("Accept","application/vnd.pgrst.object+json") it "denies access to tables that anonymous does not own" $ - get "/authors_only" `shouldRespondWith` [json| { + get "/authors_only" `shouldRespondWith` ( + if actualPgVersion >= pgVersion112 then + [json| { + "hint":null, + "details":null, + "code":"42501", + "message":"permission denied for table authors_only"} |] + else + [json| { "hint":null, "details":null, "code":"42501", "message":"permission denied for relation authors_only"} |] + ) { matchStatus = 401 , matchHeaders = ["WWW-Authenticate" <:> "Bearer"] } @@ -28,11 +39,20 @@ spec = describe "authorization" $ do it "denies access to tables that postgrest_test_author does not own" $ let auth = authHeaderJWT "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoicG9zdGdyZXN0X3Rlc3RfYXV0aG9yIn0.Xod-F15qsGL0WhdOCr2j3DdKuTw9QJERVgoFD3vGaWA" in request methodGet "/private_table" [auth] "" - `shouldRespondWith` [json| { + `shouldRespondWith` ( + if actualPgVersion >= pgVersion112 then + [json| { + "hint":null, + "details":null, + "code":"42501", + "message":"permission denied for table private_table"} |] + else + [json| { "hint":null, "details":null, "code":"42501", "message":"permission denied for relation private_table"} |] + ) { matchStatus = 403 , matchHeaders = [] } diff --git a/test/Feature/InsertSpec.hs b/test/Feature/InsertSpec.hs index 2ee6e9e22..639c7894d 100644 --- a/test/Feature/InsertSpec.hs +++ b/test/Feature/InsertSpec.hs @@ -21,8 +21,10 @@ import Network.Wai (Application) import Protolude hiding (get) -spec :: SpecWith Application -spec = do +import PostgREST.Types (PgVersion, pgVersion112) + +spec :: PgVersion -> SpecWith Application +spec actualPgVersion = do describe "Posting new record" $ do context "disparate json types" $ do it "accepts disparate json types" $ do @@ -248,14 +250,23 @@ spec = do } it "fails if more columns are selected" $ request methodPost "/limited_article_stars?select=article_id,user_id,created_at" [("Prefer", "return=representation")] - [json| {"article_id": 2, "user_id": 2} |] `shouldRespondWith` - [str|{"hint":null,"details":null,"code":"42501","message":"permission denied for relation limited_article_stars"}|] + [json| {"article_id": 2, "user_id": 2} |] `shouldRespondWith` ( + if actualPgVersion >= pgVersion112 then + [str|{"hint":null,"details":null,"code":"42501","message":"permission denied for view limited_article_stars"}|] + else + [str|{"hint":null,"details":null,"code":"42501","message":"permission denied for relation limited_article_stars"}|] + ) { matchStatus = 401 , matchHeaders = [] } it "fails if select is not specified" $ request methodPost "/limited_article_stars" [("Prefer", "return=representation")] - [json| {"article_id": 3, "user_id": 1} |] `shouldRespondWith` [str|{"hint":null,"details":null,"code":"42501","message":"permission denied for relation limited_article_stars"}|] + [json| {"article_id": 3, "user_id": 1} |] `shouldRespondWith` ( + if actualPgVersion >= pgVersion112 then + [str|{"hint":null,"details":null,"code":"42501","message":"permission denied for view limited_article_stars"}|] + else + [str|{"hint":null,"details":null,"code":"42501","message":"permission denied for relation limited_article_stars"}|] + ) { matchStatus = 401 , matchHeaders = [] } diff --git a/test/Feature/JsonOperatorSpec.hs b/test/Feature/JsonOperatorSpec.hs index 2b0495c9e..58c35aafd 100644 --- a/test/Feature/JsonOperatorSpec.hs +++ b/test/Feature/JsonOperatorSpec.hs @@ -10,8 +10,10 @@ import Network.Wai (Application) import Protolude hiding (get) -spec :: SpecWith Application -spec = describe "json and jsonb operators" $ do +import PostgREST.Types (PgVersion, pgVersion112) + +spec :: PgVersion -> SpecWith Application +spec actualPgVersion = describe "json and jsonb operators" $ do context "Shaping response with select parameter" $ do it "obtains a json subfield one level with casting" $ get "/complex_items?id=eq.1&select=settings->>foo::json" `shouldRespondWith` @@ -52,14 +54,28 @@ spec = describe "json and jsonb operators" $ do -- this works fine for /rpc/unexistent requests, but for this case a 500 seems more appropriate it "fails when a double arrow ->> is followed with a single arrow ->" $ do get "/json_arr?select=data->>c->1" - `shouldRespondWith` [json| + `shouldRespondWith` ( + if actualPgVersion >= pgVersion112 then + [json| + {"hint":"No operator matches the given name and argument types. You might need to add explicit type casts.", + "details":null,"code":"42883","message":"operator does not exist: text -> integer"} |] + else + [json| {"hint":"No operator matches the given name and argument type(s). You might need to add explicit type casts.", "details":null,"code":"42883","message":"operator does not exist: text -> integer"} |] + ) { matchStatus = 404 , matchHeaders = [] } get "/json_arr?select=data->>c->b" - `shouldRespondWith` [json| + `shouldRespondWith` ( + if actualPgVersion >= pgVersion112 then + [json| + {"hint":"No operator matches the given name and argument types. You might need to add explicit type casts.", + "details":null,"code":"42883","message":"operator does not exist: text -> unknown"} |] + else + [json| {"hint":"No operator matches the given name and argument type(s). You might need to add explicit type casts.", "details":null,"code":"42883","message":"operator does not exist: text -> unknown"} |] + ) { matchStatus = 404 , matchHeaders = [] } context "with array index" $ do diff --git a/test/Main.hs b/test/Main.hs index 62798439b..8f9a6797b 100644 --- a/test/Main.hs +++ b/test/Main.hs @@ -80,12 +80,12 @@ main = do [("Feature.PgVersion96Spec", Feature.PgVersion96Spec.spec) | actualPgVersion >= pgVersion96] specs = uncurry describe <$> [ - ("Feature.AuthSpec" , Feature.AuthSpec.spec) + ("Feature.AuthSpec" , Feature.AuthSpec.spec actualPgVersion) , ("Feature.ConcurrentSpec" , Feature.ConcurrentSpec.spec) , ("Feature.CorsSpec" , Feature.CorsSpec.spec) , ("Feature.DeleteSpec" , Feature.DeleteSpec.spec) - , ("Feature.InsertSpec" , Feature.InsertSpec.spec) - , ("Feature.JsonOperatorSpec" , Feature.JsonOperatorSpec.spec) + , ("Feature.InsertSpec" , Feature.InsertSpec.spec actualPgVersion) + , ("Feature.JsonOperatorSpec" , Feature.JsonOperatorSpec.spec actualPgVersion) , ("Feature.QuerySpec" , Feature.QuerySpec.spec) , ("Feature.RpcSpec" , Feature.RpcSpec.spec) , ("Feature.RangeSpec" , Feature.RangeSpec.spec)