Server/tests: Scalar Computed Fields > Postgres

PR-URL: https://github.com/hasura/graphql-engine-mono/pull/7094
GitOrigin-RevId: f5e632adc99ffa628a09d6703d2fdba9d2ade53e
This commit is contained in:
Abby Sassel 2022-11-30 11:01:33 +00:00 committed by hasura-bot
parent 07682d4afb
commit 74e30b8b0b
5 changed files with 158 additions and 3 deletions

View File

@ -58,7 +58,7 @@ Each ✅ below links **directly** to the feature within a particular type of dat
| Views | [✅](/schema/postgres/views.mdx) | [✅](/schema/postgres/views.mdx) | [✅](/schema/ms-sql-server/views.mdx) | ✅ | [✅](/schema/postgres/views.mdx) | [✅](/schema/postgres/views.mdx) |
| Custom Functions | [✅](/schema/postgres/custom-functions.mdx) | [✅](/schema/postgres/custom-functions.mdx) | ❌ | ❌ | [❌](/databases/postgres/cockroachdb/hasura-cockroachdb-compatibility.mdx/#functions) | [✅](/schema/postgres/custom-functions.mdx) |
| Enums | [✅](/schema/postgres/enums.mdx) | [✅](/schema/postgres/enums.mdx) | ❌ | ❌ | [✅](/schema/postgres/enums.mdx) | ❌ |
| Computed Fields | [✅](/schema/postgres/computed-fields.mdx) | [✅](/schema/postgres/computed-fields.mdx) | ❌ | [✅](/schema/bigquery/computed-fields.mdx) | [❌](/databases/postgres/cockroachdb/hasura-cockroachdb-compatibility.mdx/#functions) | [✅](/schema/postgres/computed-fields.mdx) |
| Computed Fields | [✅](/schema/postgres/computed-fields.mdx) | [❌](/databases/postgres/citus-hyperscale-postgres/hasura-citus-compatibility.mdx/#computed-fields) | ❌ | [✅](/schema/bigquery/computed-fields.mdx) | [❌](/databases/postgres/cockroachdb/hasura-cockroachdb-compatibility.mdx/#functions) | |
| Data Validations | [✅](/schema/postgres/data-validations.mdx) | [✅](/schema/postgres/data-validations.mdx) | ✅ | [✅](/schema/bigquery/data-validations.mdx) | [✅](/schema/postgres/data-validations.mdx) | [✅](/schema/postgres/data-validations.mdx) |
| Relay Schema | [✅](/schema/postgres/relay-schema.mdx) | [✅](/schema/postgres/relay-schema.mdx) | ❌ | ❌ | ❌ | [✅](/schema/postgres/relay-schema.mdx) |
| Naming Conventions | [✅](/schema/postgres/naming-convention.mdx) | [❌](/databases/postgres/citus-hyperscale-postgres/hasura-citus-compatibility.mdx/#naming-conventions) | ❌ | ❌ | [❌](/databases/postgres/cockroachdb/hasura-cockroachdb-compatibility.mdx/#naming-conventions) | ❌ |

View File

@ -62,6 +62,9 @@ restrictions:
Citus does not yet support creating triggers ([See issue](https://github.com/citusdata/citus/issues/4425)) on reference
tables. Hence this is currently not supported.
## Computed fields
Computed fields are currently supported on Postgres and BigQuery only. [Raise a GitHub issue](https://github.com/hasura/graphql-engine/issues/new?assignees=&labels=k%2Fenhancement&template=02_feature_request.md) to request support for computed fields on Citus sources.
## Naming conventions
Naming conventions are currently only implemented as an experimental feature on Postgres sources.

View File

@ -48,6 +48,7 @@ library
, postgres-options
, safe-exceptions
, split
, string-interpolate
, sop-core
, test-harness
, text
@ -143,7 +144,8 @@ library
Test.Regression.ObjectRelationshipsLimit7936Spec
Test.Regression.StreamConflictSpec
Test.Regression.UsingTheSameFunctionForRootFieldAndComputedField8643Spec
Test.Schema.ComputedFieldsSpec
Test.Schema.ComputedFields.TableSpec
Test.Schema.ComputedFields.ScalarSpec
Test.Schema.ConflictsSpec
Test.Schema.CustomFieldNames.MutationSpec
Test.Schema.CustomFieldNames.QuerySpec

View File

@ -0,0 +1,150 @@
{-# LANGUAGE QuasiQuotes #-}
-- | Tests scalar computed fields whose associated SQL function
-- returns a base type like Integer, Boolean, Geography etc.
--
-- https://hasura.io/docs/latest/schema/postgres/computed-fields/#1-scalar-computed-fields
module Test.Schema.ComputedFields.ScalarSpec (spec) where
import Data.List.NonEmpty qualified as NE
import Data.String.Interpolate (i)
import Data.Text qualified as T
import Harness.Backend.Postgres qualified as Postgres
import Harness.GraphqlEngine qualified as GraphqlEngine
import Harness.Quoter.Graphql (graphql)
import Harness.Quoter.Yaml (interpolateYaml, yaml)
import Harness.Test.BackendType (BackendType (..))
import Harness.Test.BackendType qualified as BackendType
import Harness.Test.Fixture qualified as Fixture
import Harness.Test.Schema (SchemaName (..), Table (..), table)
import Harness.Test.Schema qualified as Schema
import Harness.Test.SchemaName (SchemaName (..))
import Harness.TestEnvironment (TestEnvironment)
import Harness.Yaml (shouldReturnYaml)
import Hasura.Prelude
import Test.Hspec (SpecWith, it)
-- ** Preamble
spec :: SpecWith TestEnvironment
spec =
Fixture.run
( NE.fromList
[ (Fixture.fixture $ Fixture.Backend Fixture.Postgres)
{ Fixture.setupTeardown = \(testEnv, _) ->
[ Postgres.setupTablesAction schema testEnv
]
<> setupFunction testEnv
<> setupMetadata testEnv BackendType.Postgres
}
]
)
tests
-- ** Schema
schema :: [Table]
schema = [authorTable]
authorTable :: Table
authorTable =
(table "author")
{ tableColumns =
[ Schema.column "id" Schema.TInt,
Schema.column "first_name" Schema.TStr,
Schema.column "last_name" Schema.TStr
],
tablePrimaryKey = ["id"],
tableData =
[ [ Schema.VInt 1,
Schema.VStr "Author",
Schema.VStr "1"
],
[ Schema.VInt 2,
Schema.VStr "Author",
Schema.VStr "2"
]
]
}
-- ** Setup and teardown
-- | SQL
authorFullNameSQL :: SchemaName -> String
authorFullNameSQL schemaName =
[i|
CREATE FUNCTION #{ unSchemaName schemaName }.author_full_name(author_row author)
RETURNS TEXT AS $$
SELECT author_row.first_name || ' ' || author_row.last_name
$$ LANGUAGE sql STABLE;
|]
setupFunction :: TestEnvironment -> [Fixture.SetupAction]
setupFunction testEnv =
let schemaName = Schema.getSchemaName testEnv
in [ Fixture.SetupAction
{ Fixture.setupAction =
Postgres.run_ testEnv (authorFullNameSQL schemaName),
Fixture.teardownAction = \_ -> pure ()
}
]
setupMetadata :: TestEnvironment -> BackendType -> [Fixture.SetupAction]
setupMetadata testEnv backend =
let schemaName :: Schema.SchemaName
schemaName = Schema.getSchemaName testEnv
source :: String
source = Fixture.defaultSource backend
backendPrefix :: String
backendPrefix = BackendType.defaultBackendTypeString backend
in [ Fixture.SetupAction
{ Fixture.setupAction =
GraphqlEngine.postMetadata_
testEnv
[interpolateYaml|
type: #{ backendPrefix }_add_computed_field
args:
source: #{ source }
name: full_name
table:
schema: #{ schemaName }
name: author
definition:
function:
schema: #{ schemaName }
name: author_full_name
|],
Fixture.teardownAction = \_ -> pure ()
}
]
-- * Tests
tests :: Fixture.Options -> SpecWith TestEnvironment
tests opts = do
it "Query data from the authors table" $ \testEnv -> do
let schemaName = Schema.getSchemaName testEnv
shouldReturnYaml
opts
( GraphqlEngine.postGraphql
testEnv
[graphql|
query {
#{schemaName}_author {
id
full_name
}
}
|]
)
[interpolateYaml|
data:
#{schemaName}_author:
- id: 1
full_name: Author 1
- id: 2
full_name: Author 2
|]

View File

@ -1,7 +1,7 @@
{-# LANGUAGE QuasiQuotes #-}
-- | All tests related to computed fields
module Test.Schema.ComputedFieldsSpec (spec) where
module Test.Schema.ComputedFields.TableSpec (spec) where
import Data.List.NonEmpty qualified as NE
import Data.Text qualified as T