Move the InsertOnConflictSpec test to regressions

PR-URL: https://github.com/hasura/graphql-engine-mono/pull/5495
GitOrigin-RevId: be6986ca1073b76be21fe52ef217dc84f901fe81
This commit is contained in:
Tom Harding 2022-08-16 13:28:37 +01:00 committed by hasura-bot
parent 7e6c9df291
commit b4639fd10f
3 changed files with 160 additions and 147 deletions

View File

@ -1250,7 +1250,6 @@ test-suite tests-hspec
Test.EventTrigger.EventTriggersExtensionSchemaSpec
Test.HelloWorldSpec
Test.InsertDefaultsSpec
Test.InsertOnConflictSpec
Test.LongIdentifiersSpec
Test.Mutations.MultiplePerRequest.UpdateManySpec
Test.ObjectRelationshipsLimitSpec
@ -1271,6 +1270,7 @@ test-suite tests-hspec
Test.Queries.SortSpec
Test.Quoter.YamlSpec
Test.Regression.DoNotTruncateSessionVariables8158Spec
Test.Regression.InsertOnConflict8260Spec
Test.Regression.NullsOrderParsing8780Spec
Test.RemoteRelationship.FromRemoteSchemaSpec
Test.RemoteRelationship.MetadataAPI.ClearMetadataSpec

View File

@ -1,146 +0,0 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
-- | Tests of the Postgres-specific upsert feature.
module Test.InsertOnConflictSpec (spec) where
import Data.List.NonEmpty qualified as NE
import Data.Text
import Data.Text.Encoding (encodeUtf8)
import Harness.Backend.Citus qualified as Citus
import Harness.Backend.Postgres qualified as Postgres
import Harness.GraphqlEngine qualified as GraphqlEngine
import Harness.Quoter.Graphql
import Harness.Quoter.Yaml
import Harness.Test.BackendType qualified as BackendType
import Harness.Test.Fixture
import Harness.Test.Introspection
import Harness.Test.Permissions (Permission (..))
import Harness.Test.Schema
import Harness.TestEnvironment (TestEnvironment)
import Hasura.Prelude
import Test.Hspec
--------------------------------------------------------------------------------
-- Preamble
spec :: SpecWith TestEnvironment
spec = run (NE.fromList [postgresFixture, citusFixture]) tests
postgresFixture :: Fixture ()
postgresFixture =
(fixture $ Backend BackendType.Postgres)
{ setupTeardown = \(t, _) ->
[ Postgres.setupTablesAction tables t,
Postgres.setupPermissionsAction (permissions "postgres") t
]
}
citusFixture :: Fixture ()
citusFixture =
(fixture $ Backend BackendType.Citus)
{ setupTeardown = \(t, _) ->
[ Citus.setupTablesAction tables t,
Citus.setupPermissionsAction (permissions "citus") t
]
}
tables :: [Table]
tables =
[ (table "foo")
{ tableColumns =
[ column "id" TInt,
column "bar" TStr
],
tablePrimaryKey = ["id"],
tableData =
[ [VInt 0, VStr "initial"]
]
}
]
permissions :: Text -> [Permission]
permissions source =
[ SelectPermission
{ permissionTable = "foo",
permissionSource = source,
permissionRole = "role-select-only",
permissionColumns = ["id", "bar"]
},
InsertPermission
{ permissionTable = "foo",
permissionSource = source,
permissionRole = "role-insert-only",
permissionColumns = ["id", "bar"]
}
]
--------------------------------------------------------------------------------
-- Tests
tests :: Options -> SpecWith TestEnvironment
tests _ =
-- Tests relating to https://github.com/hasura/graphql-engine/issues/8260
describe "The schema for insert mutations with an 'on_conflict' clause" do
describe "When no columns are updateable" do
it "Is still present with an empty enum" testEmptyUpdateColumns
it "Inserts ignoring duplicates" testInsertDoNothing
testEmptyUpdateColumns :: TestEnvironment -> IO ()
testEmptyUpdateColumns env = do
introspectTypes env "role-insert-only"
>>= (`shouldContain` ["hasura_foo_on_conflict"])
introspectEnums env "role-insert-only"
>>= (`shouldContain` [("hasura_foo_update_column", ["_PLACEHOLDER"])])
testInsertDoNothing :: TestEnvironment -> IO ()
testInsertDoNothing env = do
-- We can insert ignoring duplicates
GraphqlEngine.postGraphqlWithHeaders
env
[("X-Hasura-Role", encodeUtf8 "role-insert-only")]
[graphql|
mutation OnConflictDoNothing {
insert_hasura_foo
(
objects: [
{bar: "untouched", id: 0},
{bar: "inserted", id: 1}],
on_conflict: {constraint: foo_pkey, update_columns: []}
)
{
affected_rows
}
}
|]
>>= ( `shouldBe`
[yaml|
data:
insert_hasura_foo:
affected_rows: 1
|]
)
-- The data actually gets stored
GraphqlEngine.postGraphqlWithHeaders
env
[("X-Hasura-Role", encodeUtf8 "role-select-only")]
[graphql|
query ActualData {
hasura_foo {
bar
id
}
}
|]
>>= ( `shouldBe`
[yaml|
data:
hasura_foo:
- bar: "initial"
id: 0
- bar: "inserted"
id: 1
|]
)

View File

@ -0,0 +1,159 @@
{-# LANGUAGE QuasiQuotes #-}
-- | Tests of the Postgres-specific upsert feature.
-- https://github.com/hasura/graphql-engine/issues/8260
module Test.Regression.InsertOnConflict8260Spec (spec) where
import Data.Aeson (Value)
import Data.List.NonEmpty qualified as NE
import Data.Text.Encoding (encodeUtf8)
import Harness.Backend.Citus qualified as Citus
import Harness.Backend.Postgres qualified as Postgres
import Harness.GraphqlEngine (postGraphqlWithHeaders)
import Harness.Quoter.Graphql (graphql)
import Harness.Quoter.Yaml (yaml)
import Harness.Test.BackendType qualified as BackendType
import Harness.Test.Fixture qualified as Fixture
import Harness.Test.Introspection (introspectEnums, introspectTypes)
import Harness.Test.Permissions (Permission (..))
import Harness.Test.Schema qualified as Schema
import Harness.TestEnvironment (TestEnvironment)
import Harness.Yaml (shouldReturnYaml)
import Hasura.Prelude
import Test.Hspec (SpecWith, describe, it, shouldContain)
spec :: SpecWith TestEnvironment
spec = do
Fixture.run
( NE.fromList
[ (Fixture.fixture $ Fixture.Backend BackendType.Postgres)
{ Fixture.setupTeardown = \(testEnvironment, _) ->
[ Postgres.setupTablesAction schema testEnvironment,
Postgres.setupPermissionsAction (permissions "postgres") testEnvironment
]
},
(Fixture.fixture $ Fixture.Backend BackendType.Citus)
{ Fixture.setupTeardown = \(testEnvironment, _) ->
[ Citus.setupTablesAction schema testEnvironment,
Citus.setupPermissionsAction (permissions "citus") testEnvironment
]
}
]
)
tests
--------------------------------------------------------------------------------
-- Schema
schema :: [Schema.Table]
schema =
[ (Schema.table "foo")
{ Schema.tableColumns =
[ Schema.column "id" Schema.TInt,
Schema.column "bar" Schema.TStr
],
Schema.tablePrimaryKey = ["id"],
Schema.tableData =
[ [ Schema.VInt 0,
Schema.VStr "initial"
]
]
}
]
--------------------------------------------------------------------------------
-- Permissions
permissions :: Text -> [Permission]
permissions source =
[ SelectPermission
{ permissionTable = "foo",
permissionSource = source,
permissionRole = "role-select-only",
permissionColumns = ["id", "bar"]
},
InsertPermission
{ permissionTable = "foo",
permissionSource = source,
permissionRole = "role-insert-only",
permissionColumns = ["id", "bar"]
}
]
--------------------------------------------------------------------------------
-- Tests
tests :: Fixture.Options -> SpecWith TestEnvironment
tests opts = do
let shouldBe :: IO Value -> Value -> IO ()
shouldBe = shouldReturnYaml opts
describe "The schema for insert mutations with an 'on_conflict' clause" do
describe "When no columns are updateable" do
it "Is still present with an empty enum" \testEnvironment -> do
types <- introspectTypes testEnvironment "role-insert-only"
types `shouldContain` ["hasura_foo_on_conflict"]
enums <- introspectEnums testEnvironment "role-insert-only"
enums `shouldContain` [("hasura_foo_update_column", ["_PLACEHOLDER"])]
it "Inserts ignoring duplicates" \testEnvironment -> do
do
let expected :: Value
expected =
[yaml|
data:
insert_hasura_foo:
affected_rows: 1
|]
actual :: IO Value
actual =
postGraphqlWithHeaders
testEnvironment
[ ("X-Hasura-Role", encodeUtf8 "role-insert-only")
]
[graphql|
mutation OnConflictDoNothing {
insert_hasura_foo
(
objects: [
{bar: "untouched", id: 0},
{bar: "inserted", id: 1}],
on_conflict: {constraint: foo_pkey, update_columns: []}
)
{
affected_rows
}
}
|]
actual `shouldBe` expected
do
let expected :: Value
expected =
[yaml|
data:
hasura_foo:
- bar: "initial"
id: 0
- bar: "inserted"
id: 1
|]
actual :: IO Value
actual =
postGraphqlWithHeaders
testEnvironment
[("X-Hasura-Role", encodeUtf8 "role-select-only")]
[graphql|
query ActualData {
hasura_foo {
bar
id
}
}
|]
actual `shouldBe` expected