forked from OSS/graphql
Remove encoder test based on old external files
This commit is contained in:
parent
1a788a6261
commit
54dbf1df16
@ -7,6 +7,8 @@ and this project adheres to
|
|||||||
[Haskell Package Versioning Policy](https://pvp.haskell.org/).
|
[Haskell Package Versioning Policy](https://pvp.haskell.org/).
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
## Changed
|
||||||
|
- `Test.Hspec.GraphQL.*`: replace `IO` in the resolver with any `MonadCatch`.
|
||||||
|
|
||||||
## [0.9.0.0] - 2020-07-24
|
## [0.9.0.0] - 2020-07-24
|
||||||
## Fixed
|
## Fixed
|
||||||
|
20
README.md
20
README.md
@ -1,10 +1,9 @@
|
|||||||
# Haskell GraphQL
|
# GraphQL implementation in Haskell.
|
||||||
|
|
||||||
[![Hackage Version](https://img.shields.io/hackage/v/graphql.svg)](https://hackage.haskell.org/package/graphql)
|
[![Hackage Version](https://img.shields.io/hackage/v/graphql.svg)](https://hackage.haskell.org/package/graphql)
|
||||||
[![Build Status](https://github.com/caraus-ecms/graphql/workflows/Haskell%20CI/badge.svg)](https://github.com/caraus-ecms/graphql/actions?query=workflow%3A%22Haskell+CI%22)
|
[![Build Status](https://github.com/caraus-ecms/graphql/workflows/Haskell%20CI/badge.svg)](https://github.com/caraus-ecms/graphql/actions?query=workflow%3A%22Haskell+CI%22)
|
||||||
[![License](https://img.shields.io/badge/license-BSD--3--Clause-blue.svg)](https://raw.githubusercontent.com/caraus-ecms/graphql/master/LICENSE)
|
[![License](https://img.shields.io/badge/license-BSD--3--Clause-blue.svg)](https://raw.githubusercontent.com/caraus-ecms/graphql/master/LICENSE)
|
||||||
|
[![Simple Haskell](https://www.simplehaskell.org/badges/badge.svg)](https://www.simplehaskell.org)
|
||||||
GraphQL implementation in Haskell.
|
|
||||||
|
|
||||||
This implementation is relatively low-level by design, it doesn't provide any
|
This implementation is relatively low-level by design, it doesn't provide any
|
||||||
mappings between the GraphQL types and Haskell's type system and avoids
|
mappings between the GraphQL types and Haskell's type system and avoids
|
||||||
@ -13,12 +12,19 @@ be built on top of it.
|
|||||||
|
|
||||||
## State of the work
|
## State of the work
|
||||||
|
|
||||||
For now this only provides a parser and a printer for the GraphQL query language
|
For now this library provides:
|
||||||
and allows to execute queries and mutations using the given schema, but without
|
|
||||||
the validation step. But the idea is to be a Haskell port of
|
- Parser for the query and schema languages, as well as a printer for the query
|
||||||
|
language (minimizer and pretty-printer).
|
||||||
|
- Data structures to define a type system.
|
||||||
|
- Executor (queries, mutations and subscriptions are supported).
|
||||||
|
- Validation is work in progress.
|
||||||
|
- Introspection isn't available yet.
|
||||||
|
|
||||||
|
But the idea is to be a Haskell port of
|
||||||
[`graphql-js`](https://github.com/graphql/graphql-js).
|
[`graphql-js`](https://github.com/graphql/graphql-js).
|
||||||
|
|
||||||
For the list of currently missing features see issues marked as
|
For a more precise list of currently missing features see issues marked as
|
||||||
"[not implemented](https://github.com/caraus-ecms/graphql/labels/not%20implemented)".
|
"[not implemented](https://github.com/caraus-ecms/graphql/labels/not%20implemented)".
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
@ -4,7 +4,7 @@ cabal-version: 1.12
|
|||||||
--
|
--
|
||||||
-- see: https://github.com/sol/hpack
|
-- see: https://github.com/sol/hpack
|
||||||
--
|
--
|
||||||
-- hash: 5fa34f11ab1242b72c75c3c19b31ba310c24716a0eb2d134d2b17dd558280732
|
-- hash: 1d8c32c00a882ccd1fefc4c083d5fe4e83a1825fbf8e0dcfd551ff2c8cd2dda0
|
||||||
|
|
||||||
name: graphql
|
name: graphql
|
||||||
version: 0.9.0.0
|
version: 0.9.0.0
|
||||||
@ -24,12 +24,10 @@ license-file: LICENSE
|
|||||||
build-type: Simple
|
build-type: Simple
|
||||||
extra-source-files:
|
extra-source-files:
|
||||||
CHANGELOG.md
|
CHANGELOG.md
|
||||||
README.md
|
CONTRIBUTING.md
|
||||||
LICENSE
|
LICENSE
|
||||||
|
README.md
|
||||||
docs/tutorial/tutorial.lhs
|
docs/tutorial/tutorial.lhs
|
||||||
data-files:
|
|
||||||
tests/data/kitchen-sink.graphql
|
|
||||||
tests/data/kitchen-sink.min.graphql
|
|
||||||
|
|
||||||
source-repository head
|
source-repository head
|
||||||
type: git
|
type: git
|
||||||
@ -91,7 +89,6 @@ test-suite tasty
|
|||||||
Language.GraphQL.ValidateSpec
|
Language.GraphQL.ValidateSpec
|
||||||
Test.DirectiveSpec
|
Test.DirectiveSpec
|
||||||
Test.FragmentSpec
|
Test.FragmentSpec
|
||||||
Test.KitchenSinkSpec
|
|
||||||
Test.RootOperationSpec
|
Test.RootOperationSpec
|
||||||
Test.StarWars.Data
|
Test.StarWars.Data
|
||||||
Test.StarWars.QuerySpec
|
Test.StarWars.QuerySpec
|
||||||
|
@ -17,14 +17,11 @@ author:
|
|||||||
|
|
||||||
extra-source-files:
|
extra-source-files:
|
||||||
- CHANGELOG.md
|
- CHANGELOG.md
|
||||||
- README.md
|
- CONTRIBUTING.md
|
||||||
- LICENSE
|
- LICENSE
|
||||||
|
- README.md
|
||||||
- docs/tutorial/tutorial.lhs
|
- docs/tutorial/tutorial.lhs
|
||||||
|
|
||||||
data-files:
|
|
||||||
- tests/data/*.graphql
|
|
||||||
- tests/data/*.min.graphql
|
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- aeson
|
- aeson
|
||||||
- base >= 4.7 && < 5
|
- base >= 4.7 && < 5
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
{- This Source Code Form is subject to the terms of the Mozilla Public License,
|
||||||
|
v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
||||||
|
obtain one at https://mozilla.org/MPL/2.0/. -}
|
||||||
|
|
||||||
-- | Target AST for parser.
|
-- | Target AST for parser.
|
||||||
module Language.GraphQL.AST
|
module Language.GraphQL.AST
|
||||||
( module Language.GraphQL.AST.Document
|
( module Language.GraphQL.AST.Document
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
|
{- This Source Code Form is subject to the terms of the Mozilla Public License,
|
||||||
|
v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
||||||
|
obtain one at https://mozilla.org/MPL/2.0/. -}
|
||||||
|
|
||||||
-- | Various parts of a GraphQL document can be annotated with directives.
|
-- | Various parts of a GraphQL document can be annotated with directives.
|
||||||
-- This module describes locations in a document where directives can appear.
|
-- This module describes locations in a document where directives can appear.
|
||||||
module Language.GraphQL.AST.DirectiveLocation
|
module Language.GraphQL.AST.DirectiveLocation
|
||||||
( DirectiveLocation(..)
|
( DirectiveLocation(..)
|
||||||
, ExecutableDirectiveLocation(..)
|
, ExecutableDirectiveLocation(..)
|
||||||
@ -7,8 +11,8 @@ module Language.GraphQL.AST.DirectiveLocation
|
|||||||
) where
|
) where
|
||||||
|
|
||||||
-- | All directives can be splitted in two groups: directives used to annotate
|
-- | All directives can be splitted in two groups: directives used to annotate
|
||||||
-- various parts of executable definitions and the ones used in the schema
|
-- various parts of executable definitions and the ones used in the schema
|
||||||
-- definition.
|
-- definition.
|
||||||
data DirectiveLocation
|
data DirectiveLocation
|
||||||
= ExecutableDirectiveLocation ExecutableDirectiveLocation
|
= ExecutableDirectiveLocation ExecutableDirectiveLocation
|
||||||
| TypeSystemDirectiveLocation TypeSystemDirectiveLocation
|
| TypeSystemDirectiveLocation TypeSystemDirectiveLocation
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
{- This Source Code Form is subject to the terms of the Mozilla Public License,
|
||||||
|
v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
||||||
|
obtain one at https://mozilla.org/MPL/2.0/. -}
|
||||||
|
|
||||||
{-# LANGUAGE ExplicitForAll #-}
|
{-# LANGUAGE ExplicitForAll #-}
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-# LANGUAGE ViewPatterns #-}
|
{-# LANGUAGE ViewPatterns #-}
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
{- This Source Code Form is subject to the terms of the Mozilla Public License,
|
||||||
|
v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
||||||
|
obtain one at https://mozilla.org/MPL/2.0/. -}
|
||||||
|
|
||||||
{-# LANGUAGE PatternSynonyms #-}
|
{-# LANGUAGE PatternSynonyms #-}
|
||||||
{-# LANGUAGE ViewPatterns #-}
|
{-# LANGUAGE ViewPatterns #-}
|
||||||
|
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
{- This Source Code Form is subject to the terms of the Mozilla Public License,
|
||||||
|
v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
||||||
|
obtain one at https://mozilla.org/MPL/2.0/. -}
|
||||||
|
|
||||||
-- | This module provides a representation of a @GraphQL@ Schema in addition to
|
-- | This module provides a representation of a @GraphQL@ Schema in addition to
|
||||||
-- functions for defining and manipulating schemas.
|
-- functions for defining and manipulating schemas.
|
||||||
module Language.GraphQL.Type.Schema
|
module Language.GraphQL.Type.Schema
|
||||||
|
@ -17,7 +17,7 @@ import Language.GraphQL.AST.Document
|
|||||||
newtype Rule
|
newtype Rule
|
||||||
= DefinitionRule (Definition -> Maybe String)
|
= DefinitionRule (Definition -> Maybe String)
|
||||||
|
|
||||||
-- | Default reules given in the specification.
|
-- | Default rules given in the specification.
|
||||||
specifiedRules :: [Rule]
|
specifiedRules :: [Rule]
|
||||||
specifiedRules =
|
specifiedRules =
|
||||||
[ executableDefinitionsRule
|
[ executableDefinitionsRule
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
{- This Source Code Form is subject to the terms of the Mozilla Public License,
|
||||||
|
v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
||||||
|
obtain one at https://mozilla.org/MPL/2.0/. -}
|
||||||
|
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
module Language.GraphQL.ErrorSpec
|
module Language.GraphQL.ErrorSpec
|
||||||
( spec
|
( spec
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
{- This Source Code Form is subject to the terms of the Mozilla Public License,
|
||||||
|
v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
||||||
|
obtain one at https://mozilla.org/MPL/2.0/. -}
|
||||||
|
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
module Language.GraphQL.Execute.CoerceSpec
|
module Language.GraphQL.Execute.CoerceSpec
|
||||||
( spec
|
( spec
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
{- This Source Code Form is subject to the terms of the Mozilla Public License,
|
||||||
|
v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
||||||
|
obtain one at https://mozilla.org/MPL/2.0/. -}
|
||||||
|
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
module Language.GraphQL.Type.OutSpec
|
module Language.GraphQL.Type.OutSpec
|
||||||
( spec
|
( spec
|
||||||
|
@ -1,69 +0,0 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
|
||||||
{-# LANGUAGE QuasiQuotes #-}
|
|
||||||
module Test.KitchenSinkSpec
|
|
||||||
( spec
|
|
||||||
) where
|
|
||||||
|
|
||||||
import qualified Data.Text.IO as Text.IO
|
|
||||||
import qualified Data.Text.Lazy.IO as Text.Lazy.IO
|
|
||||||
import qualified Data.Text.Lazy as Lazy (Text)
|
|
||||||
import qualified Language.GraphQL.AST.Encoder as Encoder
|
|
||||||
import qualified Language.GraphQL.AST.Parser as Parser
|
|
||||||
import Paths_graphql (getDataFileName)
|
|
||||||
import Test.Hspec (Spec, describe, it)
|
|
||||||
import Test.Hspec.Megaparsec (parseSatisfies)
|
|
||||||
import Text.Megaparsec (parse)
|
|
||||||
import Text.RawString.QQ (r)
|
|
||||||
|
|
||||||
spec :: Spec
|
|
||||||
spec = describe "Kitchen Sink" $ do
|
|
||||||
it "minifies the query" $ do
|
|
||||||
dataFileName <- getDataFileName "tests/data/kitchen-sink.graphql"
|
|
||||||
minFileName <- getDataFileName "tests/data/kitchen-sink.min.graphql"
|
|
||||||
expected <- Text.Lazy.IO.readFile minFileName
|
|
||||||
|
|
||||||
shouldNormalize Encoder.minified dataFileName expected
|
|
||||||
|
|
||||||
it "pretty prints the query" $ do
|
|
||||||
dataFileName <- getDataFileName "tests/data/kitchen-sink.graphql"
|
|
||||||
let expected = [r|query queryName($foo: ComplexType, $site: Site = MOBILE) {
|
|
||||||
whoever123is: node(id: [123, 456]) {
|
|
||||||
id
|
|
||||||
... on User @defer {
|
|
||||||
field2 {
|
|
||||||
id
|
|
||||||
alias: field1(first: 10, after: $foo) @include(if: $foo) {
|
|
||||||
id
|
|
||||||
...frag
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mutation likeStory {
|
|
||||||
like(story: 123) @defer {
|
|
||||||
story {
|
|
||||||
id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fragment frag on Friend {
|
|
||||||
foo(size: $size, bar: $b, obj: {key: "value"})
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
unnamed(truthy: true, falsey: false)
|
|
||||||
query
|
|
||||||
}
|
|
||||||
|]
|
|
||||||
|
|
||||||
shouldNormalize Encoder.pretty dataFileName expected
|
|
||||||
|
|
||||||
shouldNormalize :: Encoder.Formatter -> FilePath -> Lazy.Text -> IO ()
|
|
||||||
shouldNormalize formatter dataFileName expected = do
|
|
||||||
actual <- Text.IO.readFile dataFileName
|
|
||||||
parse Parser.document dataFileName actual `parseSatisfies` condition
|
|
||||||
where
|
|
||||||
condition = (expected ==) . Encoder.document formatter
|
|
@ -1,38 +0,0 @@
|
|||||||
# Copyright (c) 2015, Facebook, Inc.
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# This source code is licensed under the BSD-style license found in the
|
|
||||||
# LICENSE file in the root directory of this source tree. An additional grant
|
|
||||||
# of patent rights can be found in the PATENTS file in the same directory.
|
|
||||||
|
|
||||||
query queryName($foo: ComplexType, $site: Site = MOBILE) {
|
|
||||||
whoever123is: node(id: [123, 456]) {
|
|
||||||
id, # Inline test comment
|
|
||||||
... on User @defer {
|
|
||||||
field2 {
|
|
||||||
id,
|
|
||||||
alias: field1(first: 10, after: $foo) @include(if: $foo) {
|
|
||||||
id,
|
|
||||||
...frag
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mutation likeStory {
|
|
||||||
like(story: 123) @defer {
|
|
||||||
story {
|
|
||||||
id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fragment frag on Friend {
|
|
||||||
foo(size: $size, bar: $b, obj: {key: "value"})
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
unnamed(truthy: true, falsey: false),
|
|
||||||
query
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
query queryName($foo:ComplexType,$site:Site=MOBILE){whoever123is:node(id:[123,456]){id,... on User@defer{field2{id,alias:field1(first:10,after:$foo)@include(if:$foo){id,...frag}}}}}mutation likeStory{like(story:123)@defer{story{id}}}fragment frag on Friend{foo(size:$size,bar:$b,obj:{key:"value"})}{unnamed(truthy:true,falsey:false),query}
|
|
Loading…
Reference in New Issue
Block a user