mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-17 12:31:52 +03:00
731dff7558
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/5264 GitOrigin-RevId: 6937e4936a2bb5c6cb8814da9ed4529fdfb6072a
411 lines
11 KiB
Haskell
411 lines
11 KiB
Haskell
{-# LANGUAGE QuasiQuotes #-}
|
|
|
|
module Test.DataConnector.AggregateQuerySpec
|
|
( spec,
|
|
)
|
|
where
|
|
|
|
import Data.Aeson qualified as Aeson
|
|
import Harness.Backend.DataConnector qualified as DataConnector
|
|
import Harness.GraphqlEngine qualified as GraphqlEngine
|
|
import Harness.Quoter.Graphql (graphql)
|
|
import Harness.Quoter.Yaml (shouldReturnYaml, yaml)
|
|
import Harness.Test.BackendType (BackendType (..), defaultBackendTypeString, defaultSource)
|
|
import Harness.Test.Context qualified as Context
|
|
import Harness.TestEnvironment (TestEnvironment)
|
|
import Test.Hspec (SpecWith, describe, it)
|
|
import Prelude
|
|
|
|
spec :: SpecWith TestEnvironment
|
|
spec =
|
|
Context.runWithLocalTestEnvironment
|
|
[ Context.Context
|
|
{ name = Context.Backend Context.DataConnector,
|
|
mkLocalTestEnvironment = Context.noLocalTestEnvironment,
|
|
setup = DataConnector.setupFixture sourceMetadata DataConnector.defaultBackendConfig,
|
|
teardown = DataConnector.teardown,
|
|
customOptions = Nothing
|
|
}
|
|
]
|
|
tests
|
|
|
|
sourceMetadata :: Aeson.Value
|
|
sourceMetadata =
|
|
let source = defaultSource DataConnector
|
|
backendType = defaultBackendTypeString DataConnector
|
|
in [yaml|
|
|
name : *source
|
|
kind: *backendType
|
|
tables:
|
|
- table: Album
|
|
object_relationships:
|
|
- name: Artist
|
|
using:
|
|
manual_configuration:
|
|
remote_table: Artist
|
|
column_mapping:
|
|
ArtistId: ArtistId
|
|
- table: Artist
|
|
array_relationships:
|
|
- name: Albums
|
|
using:
|
|
manual_configuration:
|
|
remote_table: Album
|
|
column_mapping:
|
|
ArtistId: ArtistId
|
|
- table: Invoice
|
|
array_relationships:
|
|
- name: InvoiceLines
|
|
using:
|
|
manual_configuration:
|
|
remote_table: InvoiceLine
|
|
column_mapping:
|
|
InvoiceId: InvoiceId
|
|
- table: InvoiceLine
|
|
object_relationships:
|
|
- name: Invoice
|
|
using:
|
|
manual_configuration:
|
|
remote_table: Invoice
|
|
column_mapping:
|
|
InvoiceId: InvoiceId
|
|
configuration: {}
|
|
|]
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
tests :: Context.Options -> SpecWith (TestEnvironment, a)
|
|
tests opts = describe "Aggregate Query Tests" $ do
|
|
describe "Nodes Tests" $ do
|
|
it "works with simple query" $ \(testEnvironment, _) ->
|
|
shouldReturnYaml
|
|
opts
|
|
( GraphqlEngine.postGraphql
|
|
testEnvironment
|
|
[graphql|
|
|
query getAlbum {
|
|
Album_aggregate(limit: 2) {
|
|
nodes {
|
|
AlbumId
|
|
Title
|
|
}
|
|
}
|
|
}
|
|
|]
|
|
)
|
|
[yaml|
|
|
data:
|
|
Album_aggregate:
|
|
nodes:
|
|
- AlbumId: 1
|
|
Title: For Those About To Rock We Salute You
|
|
- AlbumId: 2
|
|
Title: Balls to the Wall
|
|
|]
|
|
|
|
it "works with multiple nodes fields" $ \(testEnvironment, _) ->
|
|
shouldReturnYaml
|
|
opts
|
|
( GraphqlEngine.postGraphql
|
|
testEnvironment
|
|
[graphql|
|
|
query getAlbum {
|
|
Album_aggregate(limit: 2) {
|
|
AlbumIds: nodes {
|
|
AlbumId
|
|
}
|
|
Titles: nodes {
|
|
Title
|
|
}
|
|
}
|
|
}
|
|
|]
|
|
)
|
|
[yaml|
|
|
data:
|
|
Album_aggregate:
|
|
AlbumIds:
|
|
- AlbumId: 1
|
|
- AlbumId: 2
|
|
Titles:
|
|
- Title: For Those About To Rock We Salute You
|
|
- Title: Balls to the Wall
|
|
|]
|
|
|
|
it "works with object relations" $ \(testEnvironment, _) ->
|
|
shouldReturnYaml
|
|
opts
|
|
( GraphqlEngine.postGraphql
|
|
testEnvironment
|
|
[graphql|
|
|
query getAlbum {
|
|
Album_aggregate(limit: 2) {
|
|
nodes {
|
|
AlbumId
|
|
Artist {
|
|
Name
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|]
|
|
)
|
|
[yaml|
|
|
data:
|
|
Album_aggregate:
|
|
nodes:
|
|
- AlbumId: 1
|
|
Artist:
|
|
Name: AC/DC
|
|
- AlbumId: 2
|
|
Artist:
|
|
Name: Accept
|
|
|]
|
|
|
|
it "works with array relations" $ \(testEnvironment, _) ->
|
|
shouldReturnYaml
|
|
opts
|
|
( GraphqlEngine.postGraphql
|
|
testEnvironment
|
|
[graphql|
|
|
query getArtist {
|
|
Artist_aggregate(limit: 2) {
|
|
nodes {
|
|
ArtistId
|
|
Albums: Albums_aggregate {
|
|
nodes {
|
|
Title
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|]
|
|
)
|
|
[yaml|
|
|
data:
|
|
Artist_aggregate:
|
|
nodes:
|
|
- ArtistId: 1
|
|
Albums:
|
|
nodes:
|
|
- Title: For Those About To Rock We Salute You
|
|
- Title: Let There Be Rock
|
|
- ArtistId: 2
|
|
Albums:
|
|
nodes:
|
|
- Title: Balls to the Wall
|
|
- Title: Restless and Wild
|
|
|]
|
|
|
|
describe "Aggregate Tests" $ do
|
|
it "works with count queries" $ \(testEnvironment, _) ->
|
|
shouldReturnYaml
|
|
opts
|
|
( GraphqlEngine.postGraphql
|
|
testEnvironment
|
|
[graphql|
|
|
query getInvoices {
|
|
Invoice_aggregate {
|
|
aggregate {
|
|
count
|
|
countColumn: count(column: BillingState)
|
|
countColumnDistinct: count(column: BillingState, distinct: true)
|
|
}
|
|
}
|
|
}
|
|
|]
|
|
)
|
|
[yaml|
|
|
data:
|
|
Invoice_aggregate:
|
|
aggregate:
|
|
count: 412
|
|
countColumn: 210
|
|
countColumnDistinct: 25
|
|
|]
|
|
|
|
it "works with single column queries" $ \(testEnvironment, _) ->
|
|
shouldReturnYaml
|
|
opts
|
|
( GraphqlEngine.postGraphql
|
|
testEnvironment
|
|
[graphql|
|
|
query getInvoices {
|
|
Invoice_aggregate {
|
|
aggregate {
|
|
max {
|
|
Total
|
|
}
|
|
min {
|
|
Total
|
|
}
|
|
stddev {
|
|
Total
|
|
}
|
|
stddev_pop {
|
|
Total
|
|
}
|
|
stddev_samp {
|
|
Total
|
|
}
|
|
sum {
|
|
Total
|
|
}
|
|
var_pop {
|
|
Total
|
|
}
|
|
var_samp {
|
|
Total
|
|
}
|
|
variance {
|
|
Total
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|]
|
|
)
|
|
[yaml|
|
|
data:
|
|
Invoice_aggregate:
|
|
aggregate:
|
|
max:
|
|
Total: 25.86
|
|
min:
|
|
Total: 0.99
|
|
stddev:
|
|
Total: 4.745319693568103
|
|
stddev_pop:
|
|
Total: 4.739557311729622
|
|
stddev_samp:
|
|
Total: 4.745319693568103
|
|
sum:
|
|
Total: 2328.600000000004
|
|
var_pop:
|
|
Total: 22.463403511169727
|
|
var_samp:
|
|
Total: 22.518058994165273
|
|
variance:
|
|
Total: 22.518058994165273
|
|
|]
|
|
|
|
it "min and max works on string fields" $ \(testEnvironment, _) ->
|
|
shouldReturnYaml
|
|
opts
|
|
( GraphqlEngine.postGraphql
|
|
testEnvironment
|
|
[graphql|
|
|
query getArtists {
|
|
Artist_aggregate {
|
|
aggregate {
|
|
max {
|
|
Name
|
|
}
|
|
min {
|
|
Name
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|]
|
|
)
|
|
[yaml|
|
|
data:
|
|
Artist_aggregate:
|
|
aggregate:
|
|
max:
|
|
Name: Zeca Pagodinho
|
|
min:
|
|
Name: A Cor Do Som
|
|
|]
|
|
|
|
it "works across array relationships from regular queries" $ \(testEnvironment, _) ->
|
|
shouldReturnYaml
|
|
opts
|
|
( GraphqlEngine.postGraphql
|
|
testEnvironment
|
|
[graphql|
|
|
query getInvoices {
|
|
Invoice(limit: 5) {
|
|
InvoiceId
|
|
InvoiceLines_aggregate {
|
|
aggregate {
|
|
count
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|]
|
|
)
|
|
[yaml|
|
|
data:
|
|
Invoice:
|
|
- InvoiceId: 1
|
|
InvoiceLines_aggregate:
|
|
aggregate:
|
|
count: 2
|
|
- InvoiceId: 2
|
|
InvoiceLines_aggregate:
|
|
aggregate:
|
|
count: 4
|
|
- InvoiceId: 3
|
|
InvoiceLines_aggregate:
|
|
aggregate:
|
|
count: 6
|
|
- InvoiceId: 4
|
|
InvoiceLines_aggregate:
|
|
aggregate:
|
|
count: 9
|
|
- InvoiceId: 5
|
|
InvoiceLines_aggregate:
|
|
aggregate:
|
|
count: 14
|
|
|]
|
|
|
|
it "works across array relationships from aggregate queries via nodes" $ \(testEnvironment, _) ->
|
|
shouldReturnYaml
|
|
opts
|
|
( GraphqlEngine.postGraphql
|
|
testEnvironment
|
|
[graphql|
|
|
query getInvoices {
|
|
Invoice_aggregate(limit: 5) {
|
|
nodes {
|
|
InvoiceId
|
|
InvoiceLines_aggregate {
|
|
aggregate {
|
|
count
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|]
|
|
)
|
|
[yaml|
|
|
data:
|
|
Invoice_aggregate:
|
|
nodes:
|
|
- InvoiceId: 1
|
|
InvoiceLines_aggregate:
|
|
aggregate:
|
|
count: 2
|
|
- InvoiceId: 2
|
|
InvoiceLines_aggregate:
|
|
aggregate:
|
|
count: 4
|
|
- InvoiceId: 3
|
|
InvoiceLines_aggregate:
|
|
aggregate:
|
|
count: 6
|
|
- InvoiceId: 4
|
|
InvoiceLines_aggregate:
|
|
aggregate:
|
|
count: 9
|
|
- InvoiceId: 5
|
|
InvoiceLines_aggregate:
|
|
aggregate:
|
|
count: 14
|
|
|]
|