graphql-engine/server/tests-hspec/Test/DataConnector/AggregateQuerySpec.hs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

411 lines
11 KiB
Haskell
Raw Normal View History

{-# 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
|]