git.iko.soy/servant-quickcheck
on 35bd148 help sign in
16 files changed+290−514
since splitsnapshots
unifiedsplit
.travis.yml+70−133 CHANGELOG.yaml+2−84 cabal.haskell-ci−7 cabal.project−4 example/Main.hs−31 servant-quickcheck.cabal+101−123 src/Servant/QuickCheck/Internal/Equality.hs+2−6 src/Servant/QuickCheck/Internal/ErrorTypes.hs+1−3 src/Servant/QuickCheck/Internal/HasGenRequest.hs+14−16 src/Servant/QuickCheck/Internal/Predicates.hs+20−29 src/Servant/QuickCheck/Internal/QuickCheck.hs+19−58 stack-lts-6.yaml+6 stack-lts-7.yaml+6 stack-lts-9.yaml+6 stack.yaml+5−5 test/Servant/QuickCheck/InternalSpec.hs+38−15
.travis.yml+70−133
@@ -1,158 +1,95 @@
11# This Travis job script has been generated by a script via
22#
3−# haskell-ci '--config=cabal.haskell-ci' 'servant-quickcheck.cabal'
3+# make_travis_yml_2.hs '--branch' 'master' '-o' '.travis.yml' 'servant-quickcheck.cabal'
44#
5−# To regenerate the script (for example after adjusting tested-with) run
5+# For more information, see https://github.com/hvr/multi-ghc-travis
66#
7−# haskell-ci regenerate
8−#
9−# For more information, see https://github.com/haskell-CI/haskell-ci
10−#
11−# version: 0.10.1
12−#
13−version: ~> 1.0
147language: c
15−os: linux
16−dist: xenial
8+sudo: false
9+
1710git:
18− # whether to recursively clone submodules
19− submodules: false
11+ submodules: false # whether to recursively clone submodules
12+
2013branches:
2114 only:
2215 - master
16+
2317cache:
2418 directories:
2519 - $HOME/.cabal/packages
2620 - $HOME/.cabal/store
27− - $HOME/.hlint
21+
2822before_cache:
29− - rm -fv $CABALHOME/packages/hackage.haskell.org/build-reports.log
23+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/build-reports.log
3024 # remove files that are regenerated by 'cabal update'
31− - rm -fv $CABALHOME/packages/hackage.haskell.org/00-index.*
32− - rm -fv $CABALHOME/packages/hackage.haskell.org/*.json
33− - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.cache
34− - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar
35− - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar.idx
36− - rm -rfv $CABALHOME/packages/head.hackage
37−jobs:
25+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/00-index.*
26+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/*.json
27+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.cache
28+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar
29+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar.idx
30+
31+matrix:
3832 include:
39− - compiler: ghc-8.8.3
40− addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.8.3","cabal-install-3.2"]}}
41− os: linux
42− - compiler: ghc-8.6.5
43− addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.6.5","cabal-install-3.2"]}}
44− os: linux
45− - compiler: ghc-8.4.4
46− addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.4.4","cabal-install-3.2"]}}
47− os: linux
48− - compiler: ghc-8.2.2
49− addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.2.2","cabal-install-3.2"]}}
50− os: linux
51− - compiler: ghc-8.0.2
52− addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.0.2","cabal-install-3.2"]}}
53− os: linux
33+ - compiler: "ghc-7.10.3"
34+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
35+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-7.10.3], sources: [hvr-ghc]}}
36+ - compiler: "ghc-8.0.2"
37+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
38+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.0.2], sources: [hvr-ghc]}}
39+ - compiler: "ghc-8.2.1"
40+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
41+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.2.1], sources: [hvr-ghc]}}
42+
5443before_install:
55− - HC=$(echo "/opt/$CC/bin/ghc" | sed 's/-/\//')
56− - WITHCOMPILER="-w $HC"
57− - HADDOCK=$(echo "/opt/$CC/bin/haddock" | sed 's/-/\//')
58− - HCPKG="$HC-pkg"
44+ - HC=${CC}
45+ - HCPKG=${HC/ghc/ghc-pkg}
5946 - unset CC
60− - CABAL=/opt/ghc/bin/cabal
61− - CABALHOME=$HOME/.cabal
62− - export PATH="$CABALHOME/bin:$PATH"
63− - TOP=$(pwd)
64− - "HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\\d+)\\.(\\d+)\\.(\\d+)(\\.(\\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')"
65− - echo $HCNUMVER
66− - CABAL="$CABAL -vnormal+nowrap"
67− - set -o pipefail
68− - TEST=--enable-tests
69− - BENCH=--enable-benchmarks
70− - HEADHACKAGE=false
71− - rm -f $CABALHOME/config
72− - |
73− echo "verbose: normal +nowrap +markoutput" >> $CABALHOME/config
74− echo "remote-build-reporting: anonymous" >> $CABALHOME/config
75− echo "write-ghc-environment-files: always" >> $CABALHOME/config
76− echo "remote-repo-cache: $CABALHOME/packages" >> $CABALHOME/config
77− echo "logs-dir: $CABALHOME/logs" >> $CABALHOME/config
78− echo "world-file: $CABALHOME/world" >> $CABALHOME/config
79− echo "extra-prog-path: $CABALHOME/bin" >> $CABALHOME/config
80− echo "symlink-bindir: $CABALHOME/bin" >> $CABALHOME/config
81− echo "installdir: $CABALHOME/bin" >> $CABALHOME/config
82− echo "build-summary: $CABALHOME/logs/build.log" >> $CABALHOME/config
83− echo "store-dir: $CABALHOME/store" >> $CABALHOME/config
84− echo "install-dirs user" >> $CABALHOME/config
85− echo " prefix: $CABALHOME" >> $CABALHOME/config
86− echo "repository hackage.haskell.org" >> $CABALHOME/config
87− echo " url: http://hackage.haskell.org/" >> $CABALHOME/config
47+ - PATH=/opt/ghc/bin:/opt/ghc-ppa-tools/bin:$PATH
48+
8849install:
89− - ${CABAL} --version
50+ - cabal --version
9051 - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
91− - |
92− echo "program-default-options" >> $CABALHOME/config
93− echo " ghc-options: $GHCJOBS +RTS -M6G -RTS" >> $CABALHOME/config
94− - cat $CABALHOME/config
95− - rm -fv cabal.project cabal.project.local cabal.project.freeze
96− - travis_retry ${CABAL} v2-update -v
97− # Generate cabal.project
98− - rm -rf cabal.project cabal.project.local cabal.project.freeze
99− - touch cabal.project
100− - |
101− echo "packages: ." >> cabal.project
102− - if [ $HCNUMVER -ge 80200 ] ; then echo 'package servant-quickcheck' >> cabal.project ; fi
103− - "if [ $HCNUMVER -ge 80200 ] ; then echo ' ghc-options: -Werror=missing-methods' >> cabal.project ; fi"
104− - |
105− - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(servant-quickcheck)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"
106− - cat cabal.project || true
107− - cat cabal.project.local || true
108− - if [ -f "./configure.ac" ]; then (cd "." && autoreconf -i); fi
109− - ${CABAL} v2-freeze $WITHCOMPILER ${TEST} ${BENCH}
110− - "cat cabal.project.freeze | sed -E 's/^(constraints: *| *)//' | sed 's/any.//'"
111− - rm cabal.project.freeze
112− - travis_wait 40 ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} --dep -j2 all
113− - travis_wait 40 ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --dep -j2 all
114−script:
52+ - BENCH=${BENCH---enable-benchmarks}
53+ - TEST=${TEST---enable-tests}
54+ - HADDOCK=${HADDOCK-true}
55+ - INSTALLED=${INSTALLED-true}
56+ - travis_retry cabal update -v
57+ - sed -i.bak 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config
58+ - rm -fv cabal.project.local
59+ - "echo 'packages: .' > cabal.project"
60+ - if [ -f "./configure.ac" ]; then
61+ (cd "."; autoreconf -i);
62+ fi
63+ - rm -f cabal.project.freeze
64+ - cabal new-build -w ${HC} ${TEST} ${BENCH} --project-file="cabal.project" --dep -j2 all
65+ - cabal new-build -w ${HC} --disable-tests --disable-benchmarks --project-file="cabal.project" --dep -j2 all
66+ - rm -rf "."/.ghc.environment.* "."/dist
11567 - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX)
116− # Packaging...
117− - ${CABAL} v2-sdist all
118− # Unpacking...
119− - mv dist-newstyle/sdist/*.tar.gz ${DISTDIR}/
120− - cd ${DISTDIR} || false
121− - find . -maxdepth 1 -type f -name '*.tar.gz' -exec tar -xvf '{}' \;
122− - find . -maxdepth 1 -type f -name '*.tar.gz' -exec rm '{}' \;
123− - PKGDIR_servant_quickcheck="$(find . -maxdepth 1 -type d -regex '.*/servant-quickcheck-[0-9.]*')"
124− # Generate cabal.project
125− - rm -rf cabal.project cabal.project.local cabal.project.freeze
126− - touch cabal.project
127− - |
128− echo "packages: ${PKGDIR_servant_quickcheck}" >> cabal.project
129− - if [ $HCNUMVER -ge 80200 ] ; then echo 'package servant-quickcheck' >> cabal.project ; fi
130− - "if [ $HCNUMVER -ge 80200 ] ; then echo ' ghc-options: -Werror=missing-methods' >> cabal.project ; fi"
131− - |
132− - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(servant-quickcheck)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"
133− - cat cabal.project || true
134− - cat cabal.project.local || true
135− # Building...
68+
69+# Here starts the actual work to be performed for the package under test;
70+# any command which exits with a non-zero exit code causes the build to fail.
71+script:
72+ # test that source-distributions can be generated
73+ - (cd "."; cabal sdist)
74+ - mv "."/dist/servant-quickcheck-*.tar.gz ${DISTDIR}/
75+ - cd ${DISTDIR}
76+ - find . -maxdepth 1 -name '*.tar.gz' -exec tar -xvf '{}' \;
77+ - "printf 'packages: servant-quickcheck-*/*.cabal\n' > cabal.project"
13678 # this builds all libraries and executables (without tests/benchmarks)
137− - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all
138− # Building with tests and benchmarks...
79+ - cabal new-build -w ${HC} --disable-tests --disable-benchmarks all
80+
81+ # Build with installed constraints for packages in global-db
82+ - if $INSTALLED; then
83+ echo cabal new-build -w ${HC} --disable-tests --disable-benchmarks $(${HCPKG} list --global --simple-output --names-only | sed 's/\([a-zA-Z0-9-]\{1,\}\) */--constraint="\1 installed" /g') all | sh;
84+ else echo "Not building with installed constraints"; fi
85+
13986 # build & run tests, build benchmarks
140− - ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} all
141− # Testing...
142− - ${CABAL} v2-test $WITHCOMPILER ${TEST} ${BENCH} all
143− # cabal check...
144− - (cd ${PKGDIR_servant_quickcheck} && ${CABAL} -vnormal check)
145− # haddock...
146− - ${CABAL} v2-haddock $WITHCOMPILER --with-haddock $HADDOCK ${TEST} ${BENCH} all
147− # Building without installed constraints for packages in global-db...
148− - rm -f cabal.project.local
149− - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all
150− # Constraint sets
151− - rm -rf cabal.project.local
152− # Constraint set base-compat-0.10
153− - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --constraint='base-compat ==0.10.*' all
154− # Constraint set base-compat-0.11
155− - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --constraint='base-compat ==0.11.*' all
87+ - cabal new-build -w ${HC} ${TEST} ${BENCH} all
88+ - if [ "x$TEST" = "x--enable-tests" ]; then cabal new-test -w ${HC} ${TEST} all; fi
89+
90+ # haddock
91+ - rm -rf ./dist-newstyle
92+ - if $HADDOCK; then cabal new-haddock -w ${HC} --disable-tests --disable-benchmarks all; else echo "Skipping haddock generation";fi
15693
157−# REGENDATA ("0.10.1",["--config=cabal.haskell-ci","servant-quickcheck.cabal"])
94+# REGENDATA ["--branch","master","-o",".travis.yml","servant-quickcheck.cabal"]
15895# EOF
CHANGELOG.yaml+2−84
@@ -1,88 +1,6 @@
1−releases:
2− - version: "0.0.9.0"
3− changes:
4− - description: "Support servant-0.15 (#65)"
5− authors: fizruk
6− date: 2020-06-25
7−
8− - description: "Relax constraints for GHC 8.10 (#70)"
9− authors: felixmulder
10− date: 2020-06-20
11−
12− - version: "0.0.8.0"
13− changes:
14− - description: Support for servant-0.17
15− authors: phadej
16− date: 2019-01-23
17−
18− - version: "0.0.7.3"
19− changes:
20− - description: Support for servant-0.14
21− issue: 53
22− authors: phadej
23− date: 2018-06-12
24−
25− - description: Fix a failure from OnlyJsonObjects when there is no content-type.
26− issue: 55
27− authors: Phenitei
28− date: 2018-08-27
29−
30− - description: A bug fix where notAllowedContainsAllowHeader would print the initial request alongside the failure instead of the request causing the failure when it failed.
31− issue: 57
32− authors: Phenitei
33− date: 2018-08-29
34−
35− - description: QuickCheck 2.12 compatibility
36− issue: 58
37− authors: parsonsmatt
38− date: 2018-10-12
39−
40− - description: GHC 8.6 compatibility
41− issue: 59
42− authors: phadej
43− date: 2018-10-15
44−
45− - version: "0.0.7.2"
46− changes:
47−
48− - description: Allow client to pass an HTTP Manager in to functions
49− issue: 47
50− authors: parsonsmatt
51− date: 2018-05-10
1+upcoming:
522
53− - description: Fix "should not happen" error when exceptions are thrown
54− issue: 48
55− authors: parsonsmatt
56− date: 2018-05-10
57−
58− - version: "0.0.7.0"
59− changes:
60−
61− - description: Support for base-compat-0.10
62− issue: none
63− authors: phadej
64− date: 2018-04-12
65−
66− - version: "0.0.7.0"
67− changes:
68−
69− - description: Support for GHC-8.4.1
70− issue: none
71− authors: phadej
72− date: 2018-03-23
73−
74− - description: Requires hspec-2.5
75− issue: none
76− authors: phadej
77− date: 2018-03-23
78−
79− - version: "0.0.6.0"
80− changes:
81−
82− - description: Support for servant-0.12
83− issue: none
84− authors: phadej
85− date: 2018-02-09
3+releases:
864
875 - version: "0.0.5.0"
886 changes:
cabal.haskell-cideleted−7
@@ -1,7 +0,0 @@
1−branches: master
2−
3−constraint-set base-compat-0.10
4− constraints: base-compat ==0.10.*
5−
6−constraint-set base-compat-0.11
7− constraints: base-compat ==0.11.*
cabal.projectdeleted−4
@@ -1,4 +0,0 @@
1−packages: .
2−tests: true
3−
4−allow-newer: servant-blaze:servant
example/Main.hsdeleted−31
@@ -1,31 +0,0 @@
1−{-# LANGUAGE OverloadedStrings, DataKinds #-}
2−module Main (main) where
3−
4−import Servant
5−import Servant.QuickCheck
6−import Test.Hspec
7−import Data.Text (Text)
8−import System.Environment (getArgs)
9−
10−main :: IO ()
11−main = do
12− args <- getArgs
13− case args of
14− [] -> putStrLn "Not running without arguments. Try --help or --fail-fast."
15− _ -> hspec spec
16−
17−-- Change to String to reproduce
18−-- https://github.com/haskell-servant/servant-quickcheck/issues/41
19−type API = Get '[PlainText] Text
20−
21−api :: Proxy API
22−api = Proxy
23−
24−server :: Server API
25−server = return "Sigurð Fáfnirslayer"
26−
27−spec :: Spec
28−spec = describe "example server" $
29− it "mangles UTF-8 in error messages" $
30− withServantServer api (return server) $ \burl ->
31− serverSatisfies api burl defaultArgs (getsHaveCacheControlHeader <%> mempty)
servant-quickcheck.cabal+101−123
@@ -1,22 +1,26 @@
1−name: servant-quickcheck
2−version: 0.0.9.1
3−synopsis: QuickCheck entire APIs
1+name: servant-quickcheck
2+version: 0.0.5.0
3+synopsis: QuickCheck entire APIs
44description:
5− This packages provides QuickCheck properties that are tested across an entire
6− API.
5+ This packages provides QuickCheck properties that are tested across an entire
6+ API.
77
8−license: BSD3
9−license-file: LICENSE
10−author: Julian K. Arni
11−maintainer: jkarni@gmail.com
12−category: Web
13−build-type: Simple
14−cabal-version: >=1.10
15−extra-source-files: CHANGELOG.yaml
16−tested-with: GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || == 8.8.3
8+license: BSD3
9+license-file: LICENSE
10+author: Julian K. Arni
11+maintainer: jkarni@gmail.com
12+category: Web
13+build-type: Simple
14+cabal-version: >=1.10
15+extra-source-files:
16+ CHANGELOG.yaml
17+tested-with:
18+ GHC==7.10.3,
19+ GHC==8.0.2,
20+ GHC==8.2.1
1721
1822source-repository head
19− type: git
23+ type: git
2024 location: https://github.com/haskell-servant/servant-quickcheck
2125
2226flag long-tests
@@ -24,115 +28,89 @@ flag long-tests
2428 default: False
2529
2630library
27− exposed-modules:
28− Servant.QuickCheck
29− Servant.QuickCheck.Internal
30− Servant.QuickCheck.Internal.Equality
31− Servant.QuickCheck.Internal.ErrorTypes
32− Servant.QuickCheck.Internal.HasGenRequest
33− Servant.QuickCheck.Internal.Predicates
34− Servant.QuickCheck.Internal.QuickCheck
31+ exposed-modules: Servant.QuickCheck
32+ , Servant.QuickCheck.Internal
33+ , Servant.QuickCheck.Internal.Predicates
34+ , Servant.QuickCheck.Internal.HasGenRequest
35+ , Servant.QuickCheck.Internal.QuickCheck
36+ , Servant.QuickCheck.Internal.Equality
37+ , Servant.QuickCheck.Internal.ErrorTypes
38+ build-depends: base >=4.8 && <4.11
39+ , base-compat == 0.9.*
40+ , aeson > 0.8 && < 2
41+ , bytestring == 0.10.*
42+ , case-insensitive == 1.2.*
43+ , clock >= 0.7 && < 0.8
44+ , data-default-class >= 0.0 && < 0.2
45+ , hspec >= 2.2 && < 2.5
46+ , http-client >= 0.4.30 && < 0.6
47+ , http-media >= 0.6 && <0.8
48+ , http-types > 0.8 && < 0.11
49+ , mtl > 2.1 && < 2.3
50+ , pretty == 1.1.*
51+ , process >= 1.2 && < 1.7
52+ , QuickCheck > 2.7 && < 2.11
53+ , servant > 0.6 && < 0.13
54+ , servant-client > 0.6 && < 0.13
55+ , servant-server > 0.6 && < 0.13
56+ , split == 0.2.*
57+ , string-conversions > 0.3 && < 0.5
58+ , temporary == 1.2.*
59+ , text == 1.*
60+ , time >= 1.5 && < 1.9
61+ , warp >= 3.2.4 && < 3.3
3562
36− build-depends:
37− aeson >=0.8 && <2
38− , base >=4.9 && <4.15
39− , base-compat-batteries >=0.10.1 && <0.12
40− , bytestring >=0.10 && <0.11
41− , case-insensitive >=1.2 && <1.3
42− , clock >=0.7 && <0.9
43− , data-default-class >=0.0 && <0.2
44− , hspec >=2.5.6 && <2.8
45− , http-client >=0.4.30 && <0.8
46− , http-media >=0.6 && <0.9
47− , http-types >=0.8 && <0.13
48− , mtl >=2.1 && <2.3
49− , pretty >=1.1 && <1.2
50− , process >=1.2 && <1.7
51− , QuickCheck >=2.7 && <2.15
52− , servant >=0.17 && <0.19
53− , servant-client >=0.17 && <0.19
54− , servant-server >=0.17 && <0.19
55− , split >=0.2 && <0.3
56− , string-conversions >=0.3 && <0.5
57− , temporary >=1.2 && <1.4
58− , text >=1 && <2
59− , time >=1.5 && <1.11
60− , warp >=3.2.4 && <3.4
61−
62− if !impl(ghc >=8.0)
63− build-depends: semigroups >=0.18.3 && <0.20
64−
65− hs-source-dirs: src
66− default-extensions:
67− NoImplicitPrelude
68− ConstraintKinds
69− DataKinds
70− DeriveDataTypeable
71− DeriveFunctor
72− DeriveGeneric
73− FlexibleContexts
74− FlexibleInstances
75− FunctionalDependencies
76− GADTs
77− KindSignatures
78− MultiParamTypeClasses
79− OverloadedStrings
80− RankNTypes
81− ScopedTypeVariables
82− TypeOperators
83−
84− default-language: Haskell2010
63+ hs-source-dirs: src
64+ default-extensions: TypeOperators
65+ , FlexibleInstances
66+ , FlexibleContexts
67+ , DataKinds
68+ , GADTs
69+ , MultiParamTypeClasses
70+ , DeriveFunctor
71+ , KindSignatures
72+ , RankNTypes
73+ , ConstraintKinds
74+ , DeriveGeneric
75+ , ScopedTypeVariables
76+ , OverloadedStrings
77+ , FunctionalDependencies
78+ , NoImplicitPrelude
79+ , DeriveDataTypeable
80+ default-language: Haskell2010
8581
8682test-suite spec
87− type: exitcode-stdio-1.0
88− ghc-options: -Wall -threaded
89− default-language: Haskell2010
90− hs-source-dirs: test
91− main-is: Spec.hs
92− other-modules: Servant.QuickCheck.InternalSpec
93− build-tool-depends: hspec-discover:hspec-discover -any
94− build-depends:
95− aeson
96− , base
97− , base-compat-batteries
98− , blaze-html
99− , bytestring
100− , hspec
101− , hspec-core >=2.5.5 && <2.8
102− , http-client
103− , QuickCheck
104− , quickcheck-io
105− , servant
106− , servant-blaze
107− , servant-client
108− , servant-quickcheck
109− , servant-server
110− , transformers
111− , warp
112−
113− default-extensions:
114− NoImplicitPrelude
115− DataKinds
116− FlexibleContexts
117− FlexibleInstances
118− GADTs
119− OverloadedStrings
120− ScopedTypeVariables
121− TypeOperators
122−
83+ type: exitcode-stdio-1.0
84+ ghc-options: -Wall -threaded
85+ default-language: Haskell2010
86+ hs-source-dirs: test
87+ main-is: Spec.hs
88+ other-modules: Servant.QuickCheck.InternalSpec
89+ build-tool-depends: hspec-discover:hspec-discover
90+ build-depends: base == 4.*
91+ , base-compat
92+ , aeson
93+ , servant-quickcheck
94+ , bytestring
95+ , hspec
96+ , hspec-core
97+ , http-client
98+ , blaze-html
99+ , warp
100+ , servant-server
101+ , servant-client
102+ , servant
103+ , servant-blaze
104+ , transformers
105+ , QuickCheck
106+ , quickcheck-io
107+ default-extensions: TypeOperators
108+ , FlexibleInstances
109+ , FlexibleContexts
110+ , GADTs
111+ , DataKinds
112+ , NoImplicitPrelude
113+ , OverloadedStrings
114+ , ScopedTypeVariables
123115 if flag(long-tests)
124− cpp-options: -DLONG_TESTS
125−
126−test-suite example
127− type: exitcode-stdio-1.0
128− main-is: Main.hs
129− hs-source-dirs: example
130− ghc-options: -Wall
131− build-depends:
132− base
133− , hspec
134− , servant-quickcheck
135− , servant-server
136− , text
137−
138− default-language: Haskell2010
116+ cpp-options: -DLONG_TESTS
src/Servant/QuickCheck/Internal/Equality.hs+2−6
@@ -5,19 +5,15 @@ import Data.ByteString (ByteString)
55import qualified Data.ByteString.Lazy as LB
66import Data.Function (on)
77import Network.HTTP.Client (Response, responseBody)
8−import Data.Semigroup (Semigroup (..))
98import Prelude.Compat
109
1110newtype ResponseEquality b
1211 = ResponseEquality { getResponseEquality :: Response b -> Response b -> Bool }
1312
14−instance Semigroup (ResponseEquality b) where
15− ResponseEquality a <> ResponseEquality b = ResponseEquality $ \x y ->
16− a x y && b x y
17−
1813instance Monoid (ResponseEquality b) where
1914 mempty = ResponseEquality $ \_ _ -> True
20− mappend = (<>)
15+ ResponseEquality a `mappend` ResponseEquality b = ResponseEquality $ \x y ->
16+ a x y && b x y
2117
2218-- | Use `Eq` instance for `Response`
2319--
src/Servant/QuickCheck/Internal/ErrorTypes.hs+1−3
@@ -1,4 +1,3 @@
1−{-# LANGUAGE CPP #-}
21module Servant.QuickCheck.Internal.ErrorTypes where
32
43import Control.Exception (Exception (..))
@@ -9,10 +8,9 @@ import Data.Typeable (Typeable)
98import GHC.Generics (Generic)
109import qualified Network.HTTP.Client as C
1110import Network.HTTP.Types (Header, statusCode)
11+import Prelude.Compat
1212import Text.PrettyPrint
1313
14−import Prelude.Compat hiding ((<>))
15−
1614data PredicateFailure
1715 = PredicateFailure T.Text (Maybe C.Request) (C.Response LBS.ByteString)
1816 deriving (Typeable, Generic)
src/Servant/QuickCheck/Internal/HasGenRequest.hs+14−16
@@ -2,6 +2,7 @@
22{-# LANGUAGE PolyKinds #-}
33module Servant.QuickCheck.Internal.HasGenRequest where
44
5+import Data.Monoid ((<>))
56import Data.String (fromString)
67import Data.String.Conversions (cs)
78import GHC.TypeLits (KnownSymbol, Nat, symbolVal)
@@ -63,17 +64,21 @@ instance (KnownSymbol path, HasGenRequest b) => HasGenRequest (path :> b) where
6364 (oldf, old) = genRequest (Proxy :: Proxy b)
6465 new = cs $ symbolVal (Proxy :: Proxy path)
6566
67+#if MIN_VERSION_servant(0,11,0)
6668instance HasGenRequest EmptyAPI where
6769 genRequest _ = (0, error "EmptyAPIs cannot be queried.")
70+#endif
6871
72+#if MIN_VERSION_servant(0,12,0)
6973instance HasGenRequest api => HasGenRequest (Summary d :> api) where
7074 genRequest _ = genRequest (Proxy :: Proxy api)
7175
7276instance HasGenRequest api => HasGenRequest (Description d :> api) where
7377 genRequest _ = genRequest (Proxy :: Proxy api)
78+#endif
7479
7580instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
76− => HasGenRequest (Capture' mods x c :> b) where
81+ => HasGenRequest (Capture x c :> b) where
7782 genRequest _ = (oldf, do
7883 old' <- old
7984 new' <- toUrlPiece <$> new
@@ -82,6 +87,7 @@ instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
8287 (oldf, old) = genRequest (Proxy :: Proxy b)
8388 new = arbitrary :: Gen c
8489
90+#if MIN_VERSION_servant(0,8,0)
8591instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
8692 => HasGenRequest (CaptureAll x c :> b) where
8793 genRequest _ = (oldf, do
@@ -92,12 +98,13 @@ instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
9298 where
9399 (oldf, old) = genRequest (Proxy :: Proxy b)
94100 new = arbitrary :: Gen [c]
101+#endif
95102
96103instance (Arbitrary c, KnownSymbol h, HasGenRequest b, ToHttpApiData c)
97− => HasGenRequest (Header' mods h c :> b) where
104+ => HasGenRequest (Header h c :> b) where
98105 genRequest _ = (oldf, do
99106 old' <- old
100− new' <- toUrlPiece <$> new -- TODO: generate lenient or/and optional
107+ new' <- toUrlPiece <$> new
101108 return $ \burl -> let r = old' burl in r {
102109 requestHeaders = (hdr, cs new') : requestHeaders r })
103110 where
@@ -106,9 +113,9 @@ instance (Arbitrary c, KnownSymbol h, HasGenRequest b, ToHttpApiData c)
106113 new = arbitrary :: Gen c
107114
108115instance (AllMimeRender x c, Arbitrary c, HasGenRequest b)
109− => HasGenRequest (ReqBody' mods x c :> b) where
116+ => HasGenRequest (ReqBody x c :> b) where
110117 genRequest _ = (oldf, do
111− old' <- old -- TODO: generate lenient
118+ old' <- old
112119 new' <- new
113120 (ct, bd) <- elements $ allMimeRender (Proxy :: Proxy x) new'
114121 return $ \burl -> let r = old' burl in r {
@@ -120,9 +127,9 @@ instance (AllMimeRender x c, Arbitrary c, HasGenRequest b)
120127 new = arbitrary :: Gen c
121128
122129instance (KnownSymbol x, Arbitrary c, ToHttpApiData c, HasGenRequest b)
123− => HasGenRequest (QueryParam' mods x c :> b) where
130+ => HasGenRequest (QueryParam x c :> b) where
124131 genRequest _ = (oldf, do
125− new' <- new -- TODO: generate lenient or/and optional
132+ new' <- new
126133 old' <- old
127134 return $ \burl -> let r = old' burl
128135 newExpr = param <> "=" <> cs (toQueryParam new')
@@ -168,15 +175,6 @@ instance (ReflectMethod method)
168175 , method = reflectMethod (Proxy :: Proxy method)
169176 })
170177
171−instance (ReflectMethod method)
172− => HasGenRequest (NoContentVerb (method :: k)) where
173− genRequest _ = (1, return $ \burl -> defaultRequest
174− { host = cs $ baseUrlHost burl
175− , port = baseUrlPort burl
176− , secure = baseUrlScheme burl == Https
177− , method = reflectMethod (Proxy :: Proxy method)
178− })
179−
180178instance (HasGenRequest a) => HasGenRequest (RemoteHost :> a) where
181179 genRequest _ = genRequest (Proxy :: Proxy a)
182180
src/Servant/QuickCheck/Internal/Predicates.hs+20−29
@@ -11,7 +11,7 @@ import Data.CaseInsensitive (foldCase, foldedCase, mk)
1111import Data.Either (isRight)
1212import Data.List.Split (wordsBy)
1313import Data.Maybe (fromMaybe, isJust)
14−import Data.Semigroup (Semigroup (..))
14+import Data.Monoid ((<>))
1515import qualified Data.Text as T
1616import Data.Time (UTCTime, defaultTimeLocale, parseTimeM,
1717 rfc822DateFormat)
@@ -84,13 +84,15 @@ notLongerThan maxAllowed
8484-- /Since 0.0.0.0/
8585onlyJsonObjects :: ResponsePredicate
8686onlyJsonObjects
87− = ResponsePredicate (\resp -> do
88− case lookup "content-type" (first foldedCase <$> responseHeaders resp) of
89− Nothing -> return ()
90− Just ctype -> when ("application/json" `SBS.isPrefixOf` ctype) $ do
91− case (decode (responseBody resp) :: Maybe Object) of
92− Nothing -> throw $ PredicateFailure "onlyJsonObjects" Nothing resp
93− Just _ -> return ())
87+ = ResponsePredicate (\resp -> case go resp of
88+ Nothing -> throw $ PredicateFailure "onlyJsonObjects" Nothing resp
89+ Just () -> return ())
90+ where
91+ go r = do
92+ ctyp <- lookup "content-type" (first foldedCase <$> responseHeaders r)
93+ when ("application/json" `SBS.isPrefixOf` ctyp) $ do
94+ (_ :: Object) <- decode (responseBody r)
95+ return ()
9496
9597-- | __Optional__
9698--
@@ -187,15 +189,14 @@ getsHaveLastModifiedHeader
187189notAllowedContainsAllowHeader :: RequestPredicate
188190notAllowedContainsAllowHeader
189191 = RequestPredicate $ \req mgr -> do
190− let reqs = [ req { method = renderStdMethod m } | m <- [minBound .. maxBound]
191− , renderStdMethod m /= method req ]
192− resp <- mapM (flip httpLbs mgr) reqs
193−
194− case filter pred' (zip reqs resp) of
195− (x:_) -> throw $ PredicateFailure "notAllowedContainsAllowHeader" (Just $ fst x) (snd x)
192+ resp <- mapM (flip httpLbs mgr) $ [ req { method = renderStdMethod m }
193+ | m <- [minBound .. maxBound ]
194+ , renderStdMethod m /= method req ]
195+ case filter pred' resp of
196+ (x:_) -> throw $ PredicateFailure "notAllowedContainsAllowHeader" (Just req) x
196197 [] -> return resp
197198 where
198− pred' (_, resp) = responseStatus resp == status405 && not (hasValidHeader "Allow" go resp)
199+ pred' resp = responseStatus resp == status405 && not (hasValidHeader "Allow" go resp)
199200 where
200201 go x = all (\y -> isRight $ parseMethod $ SBSC.pack y)
201202 $ wordsBy (`elem` (", " :: [Char])) (SBSC.unpack x)
@@ -376,12 +377,9 @@ newtype ResponsePredicate = ResponsePredicate
376377 { getResponsePredicate :: Response LBS.ByteString -> IO ()
377378 } deriving (Generic)
378379
379−instance Semigroup ResponsePredicate where
380− ResponsePredicate a <> ResponsePredicate b = ResponsePredicate $ \x -> a x >> b x
381−
382380instance Monoid ResponsePredicate where
383381 mempty = ResponsePredicate $ const $ return ()
384− mappend = (<>)
382+ ResponsePredicate a `mappend` ResponsePredicate b = ResponsePredicate $ \x -> a x >> b x
385383
386384-- | A predicate that depends on both the request and the response.
387385--
@@ -393,11 +391,7 @@ newtype RequestPredicate = RequestPredicate
393391-- TODO: This isn't actually a monoid
394392instance Monoid RequestPredicate where
395393 mempty = RequestPredicate (\r m -> httpLbs r m >>= \x -> return ([x]))
396− mappend = (<>)
397−
398−-- TODO: This isn't actually a monoid
399−instance Semigroup RequestPredicate where
400− RequestPredicate a <> RequestPredicate b = RequestPredicate $ \r mgr ->
394+ RequestPredicate a `mappend` RequestPredicate b = RequestPredicate $ \r mgr ->
401395 liftM2 (<>) (a r mgr) (b r mgr)
402396
403397-- | A set of predicates. Construct one with 'mempty' and '<%>'.
@@ -406,13 +400,10 @@ data Predicates = Predicates
406400 , responsePredicates :: ResponsePredicate
407401 } deriving (Generic)
408402
409−instance Semigroup Predicates where
410− a <> b = Predicates (requestPredicates a <> requestPredicates b)
411− (responsePredicates a <> responsePredicates b)
412−
413403instance Monoid Predicates where
414404 mempty = Predicates mempty mempty
415− mappend = (<>)
405+ a `mappend` b = Predicates (requestPredicates a <> requestPredicates b)
406+ (responsePredicates a <> responsePredicates b)
416407
417408class JoinPreds a where
418409 joinPreds :: a -> Predicates -> Predicates
src/Servant/QuickCheck/Internal/QuickCheck.hs+19−58
@@ -2,7 +2,7 @@
22{-# LANGUAGE CPP #-}
33module Servant.QuickCheck.Internal.QuickCheck where
44
5−import Control.Concurrent (tryReadMVar, newEmptyMVar, tryPutMVar)
5+import Control.Concurrent (modifyMVar_, newMVar, readMVar)
66import Control.Monad (unless)
77import qualified Data.ByteString.Lazy as LBS
88import Data.Proxy (Proxy)
@@ -11,9 +11,6 @@ import Network.Wai.Handler.Warp (withApplication)
1111import Prelude.Compat
1212import Servant (Context (EmptyContext), HasServer,
1313 Server, serveWithContext)
14−#if MIN_VERSION_servant_server(0,18,0)
15−import Servant (DefaultErrorFormatters, ErrorFormatters, HasContextEntry, type (.++))
16−#endif
1714import Servant.Client (BaseUrl (..), Scheme (..))
1815import System.IO.Unsafe (unsafePerformIO)
1916import Test.Hspec (Expectation, expectationFailure)
@@ -40,11 +37,7 @@ withServantServer api = withServantServerAndContext api EmptyContext
4037-- application.
4138--
4239-- /Since 0.0.0.0/
43−#if MIN_VERSION_servant_server(0,18,0)
44−withServantServerAndContext :: (HasServer a ctx, HasContextEntry (ctx .++ DefaultErrorFormatters) ErrorFormatters)
45−#else
4640withServantServerAndContext :: HasServer a ctx
47−#endif
4841 => Proxy a -> Context ctx -> IO (Server a) -> (BaseUrl -> IO r) -> IO r
4942withServantServerAndContext api ctx server t
5043 = withApplication (return . serveWithContext api ctx =<< server) $ \port ->
@@ -80,29 +73,21 @@ serversEqual api burl1 burl2 args req = do
8073 let reqs = (\f -> (f burl1, f burl2)) <$> runGenRequest api
8174 -- This MVar stuff is clunky! But there doesn't seem to be an easy way to
8275 -- return results when a test fails, since an exception is throw.
83− deetsMVar <- newEmptyMVar
76+ deetsMVar <- newMVar $ error "should not be called"
8477 r <- quickCheckWithResult args { chatty = False } $ monadicIO $ forAllM reqs $ \(req1, req2) -> do
8578 resp1 <- run $ C.httpLbs (noCheckStatus req1) defManager
8679 resp2 <- run $ C.httpLbs (noCheckStatus req2) defManager
8780 unless (getResponseEquality req resp1 resp2) $ do
8881 monitor (counterexample "hi" )
89− _ <- run $ tryPutMVar deetsMVar $ ServerEqualityFailure req1 resp1 resp2
82+ run $ modifyMVar_ deetsMVar $ const $ return $
83+ ServerEqualityFailure req1 resp1 resp2
9084 assert False
9185 case r of
9286 Success {} -> return ()
93− Failure{..} -> do
94− mx <- tryReadMVar deetsMVar
95− case mx of
96− Just x ->
97− expectationFailure $ "Failed:\n" ++ show x
98− Nothing ->
99− expectationFailure $ "We failed to record a reason for failure: " <> show r
87+ Failure{..} -> readMVar deetsMVar >>= \x -> expectationFailure $ "Failed:\n" ++ show x
10088 GaveUp { numTests = n } -> expectationFailure $ "Gave up after " ++ show n ++ " tests"
10189 NoExpectedFailure {} -> expectationFailure "No expected failure"
102−#if MIN_VERSION_QuickCheck(2,12,0)
103−#else
10490 InsufficientCoverage {} -> expectationFailure "Insufficient coverage"
105−#endif
10691
10792-- | Check that a server satisfies the set of properties specified.
10893--
@@ -125,61 +110,37 @@ serversEqual api burl1 burl2 args req = do
125110-- /Since 0.0.0.0/
126111serverSatisfies :: (HasGenRequest a) =>
127112 Proxy a -> BaseUrl -> Args -> Predicates -> Expectation
128−serverSatisfies api = serverSatisfiesMgr api defManager
129−
130−-- | Check that a server satisfies the set of properties specified, and
131−-- accept a 'Manager' for running the HTTP requests through.
132−--
133−-- See 'serverSatisfies' for more details.
134−--
135−-- @since 0.0.7.2
136−serverSatisfiesMgr :: (HasGenRequest a) =>
137− Proxy a -> C.Manager -> BaseUrl -> Args -> Predicates -> Expectation
138−serverSatisfiesMgr api manager burl args preds = do
113+serverSatisfies api burl args preds = do
139114 let reqs = ($ burl) <$> runGenRequest api
140− deetsMVar <- newEmptyMVar
115+ deetsMVar <- newMVar $ error "should not be called"
141116 r <- quickCheckWithResult args { chatty = False } $ monadicIO $ forAllM reqs $ \req -> do
142− v <- run $ finishPredicates preds (noCheckStatus req) manager
143− _ <- run $ tryPutMVar deetsMVar v
144− case v of
145− Just _ -> assert False
146− _ -> return ()
117+ v <- run $ finishPredicates preds (noCheckStatus req) defManager
118+ run $ modifyMVar_ deetsMVar $ const $ return v
119+ case v of
120+ Just _ -> assert False
121+ _ -> return ()
147122 case r of
148123 Success {} -> return ()
149− Failure {..} -> do
150− mx <- tryReadMVar deetsMVar
151− case mx of
152− Just x ->
153− expectationFailure $ "Failed:\n" ++ show x
154− Nothing ->
155− expectationFailure $ "We failed to record a reason for failure: " <> show r
124+ Failure{..} -> readMVar deetsMVar >>= \x -> expectationFailure $
125+ "Failed:\n" ++ show x
156126 GaveUp { numTests = n } -> expectationFailure $ "Gave up after " ++ show n ++ " tests"
157127 NoExpectedFailure {} -> expectationFailure $ "No expected failure"
158−#if MIN_VERSION_QuickCheck(2,12,0)
159−#else
160− InsufficientCoverage {} -> expectationFailure "Insufficient coverage"
161−#endif
128+ InsufficientCoverage {} -> expectationFailure $ "Insufficient coverage"
129+
162130
163131serverDoesntSatisfy :: (HasGenRequest a) =>
164132 Proxy a -> BaseUrl -> Args -> Predicates -> Expectation
165−serverDoesntSatisfy api = serverDoesntSatisfyMgr api defManager
166−
167−serverDoesntSatisfyMgr :: (HasGenRequest a) =>
168− Proxy a -> C.Manager -> BaseUrl -> Args -> Predicates -> Expectation
169−serverDoesntSatisfyMgr api manager burl args preds = do
133+serverDoesntSatisfy api burl args preds = do
170134 let reqs = ($ burl) <$> runGenRequest api
171135 r <- quickCheckWithResult args $ monadicIO $ forAllM reqs $ \req -> do
172− v <- run $ finishPredicates preds (noCheckStatus req) manager
136+ v <- run $ finishPredicates preds (noCheckStatus req) defManager
173137 assert $ not $ null v
174138 case r of
175139 Success {} -> return ()
176140 GaveUp { numTests = n } -> expectationFailure $ "Gave up after " ++ show n ++ " tests"
177141 Failure { output = m } -> expectationFailure $ "Failed:\n" ++ show m
178142 NoExpectedFailure {} -> expectationFailure $ "No expected failure"
179−#if MIN_VERSION_QuickCheck(2,12,0)
180−#else
181− InsufficientCoverage {} -> expectationFailure "Insufficient coverage"
182−#endif
143+ InsufficientCoverage {} -> expectationFailure $ "Insufficient coverage"
183144
184145noCheckStatus :: C.Request -> C.Request
185146#if MIN_VERSION_http_client(0,5,0)
stack-lts-6.yamlnew file+6
@@ -0,0 +1,6 @@
1+resolver: lts-6.30
2+packages:
3+- '.'
4+extra-deps: []
5+flags: {}
6+extra-package-dbs: []
stack-lts-7.yamlnew file+6
@@ -0,0 +1,6 @@
1+resolver: lts-7.19
2+packages:
3+- '.'
4+extra-deps: []
5+flags: {}
6+extra-package-dbs: []
stack-lts-9.yamlnew file+6
@@ -0,0 +1,6 @@
1+resolver: lts-9.1
2+packages:
3+- '.'
4+extra-deps: []
5+flags: {}
6+extra-package-dbs: []
stack.yaml+5−5
@@ -1,10 +1,10 @@
1−resolver: nightly-2018-09-03
1+resolver: lts-8.4
22packages:
33- '.'
44extra-deps:
5−- hspec-discover-2.5.6
6−- hspec-core-2.5.6
7−- hspec-2.5.6
8−- QuickCheck-2.12
5+- hspec-2.4.4
6+- hspec-core-2.4.4
7+- hspec-discover-2.4.4
8+- quickcheck-io-0.2.0
99flags: {}
1010extra-package-dbs: []
test/Servant/QuickCheck/InternalSpec.hs+38−15
@@ -17,13 +17,25 @@ import qualified Text.Blaze.Html as Blaze
1717import qualified Text.Blaze.Html5 as Blaze5
1818import Test.Hspec (Spec, context, describe, it, shouldBe,
1919 shouldContain)
20−import Test.Hspec.Core.Spec (Arg, Example, Result (..), ResultStatus (..),
21− defaultParams, safeEvaluateExample)
20+import Test.Hspec.Core.Spec (Arg, Example, Result (..),
21+ defaultParams)
2222import Test.QuickCheck.Gen (generate, unGen)
2323import Test.QuickCheck.Random (mkQCGen)
2424
2525
26−import Servant.Test.ComprehensiveAPI (comprehensiveAPIWithoutStreamingOrRaw)
26+#if MIN_VERSION_servant(0,8,0)
27+import Servant.API.Internal.Test.ComprehensiveAPI (comprehensiveAPIWithoutRaw)
28+#else
29+import Servant.API.Internal.Test.ComprehensiveAPI (ComprehensiveAPI,
30+ comprehensiveAPI)
31+#endif
32+
33+#if MIN_VERSION_hspec(2,4,0)
34+import Test.Hspec.Core.Spec (safeEvaluateExample)
35+#else
36+import Control.Exception (try)
37+import Test.Hspec.Core.Spec (evaluateExample)
38+#endif
2739
2840import Servant.QuickCheck
2941import Servant.QuickCheck.Internal (genRequest, runGenRequest,
@@ -128,10 +140,6 @@ onlyJsonObjectSpec = describe "onlyJsonObjects" $ do
128140 withServantServerAndContext octetAPI ctx serverOctetAPI $ \burl ->
129141 serverSatisfies octetAPI burl args (onlyJsonObjects <%> mempty)
130142
131− it "does not fail when there is no content-type" $ do
132− withServantServerAndContext api2 ctx serverFailing $ \burl ->
133− serverSatisfies api2 burl args (onlyJsonObjects <%> mempty)
134−
135143notLongerThanSpec :: Spec
136144notLongerThanSpec = describe "notLongerThan" $ do
137145
@@ -149,7 +157,7 @@ isComprehensiveSpec :: Spec
149157isComprehensiveSpec = describe "HasGenRequest" $ do
150158
151159 it "has instances for all 'servant' combinators" $ do
152− let _g = genRequest comprehensiveAPIWithoutStreamingOrRaw
160+ let _g = genRequest comprehensiveAPIWithoutRaw
153161 True `shouldBe` True -- This is a type-level check
154162
155163deepPathSpec :: Spec
@@ -273,9 +281,6 @@ server2 = return $ return 1
273281server3 :: IO (Server API2)
274282server3 = return $ return 2
275283
276−serverFailing :: IO (Server API2)
277−serverFailing = return . throwError $ err405
278−
279284-- With Doctypes
280285type HtmlDoctype = Get '[HTML] Blaze.Html
281286
@@ -344,14 +349,27 @@ ctx = BasicAuthCheck (const . return $ NoSuchUser) :. EmptyContext
344349-- Utils
345350------------------------------------------------------------------------------
346351evalExample :: (Example e, Arg e ~ ()) => e -> IO EvalResult
352+#if MIN_VERSION_hspec(2,4,0)
347353evalExample e = do
348354 r <- safeEvaluateExample e defaultParams ($ ()) progCallback
349− case resultStatus r of
350− Success -> return $ AllGood
351− Failure _ reason -> return $ FailedWith $ show reason
352− Pending {} -> error "should not happen"
355+ case r of
356+ Left err -> return $ AnException err
357+ Right Success -> return $ AllGood
358+ Right (Failure _ reason) -> return $ FailedWith $ show reason
359+ Right (Pending _) -> error "should not happen"
353360 where
354361 progCallback _ = return ()
362+#else
363+evalExample e = do
364+ r <- try $ evaluateExample e defaultParams ($ ()) progCallback
365+ case r of
366+ Left err -> return $ AnException err
367+ Right Success -> return $ AllGood
368+ Right (Fail _ reason) -> return $ FailedWith reason
369+ Right (Pending _) -> error "should not happen"
370+ where
371+ progCallback _ = return ()
372+#endif
355373
356374data EvalResult
357375 = AnException SomeException
@@ -369,3 +387,8 @@ noOfTestCases = 20000
369387#else
370388noOfTestCases = 1000
371389#endif
390+
391+#if !MIN_VERSION_servant(0,8,0)
392+comprehensiveAPIWithoutRaw :: Proxy ComprehensiveAPI
393+comprehensiveAPIWithoutRaw = comprehensiveAPI
394+#endif