git.iko.soy/servant-quickcheck
on d46b718 help sign in
.travis.yml+79−131
since splitsnapshots
unifiedsplit
@@ -1,158 +1,106 @@
1# This Travis job script has been generated by a script via
1# This Travis job script has been generated by a script via
2#
2#
3−# haskell-ci '--config=cabal.haskell-ci' 'servant-quickcheck.cabal'
3+# runghc make_travis_yml_2.hs '--branch' 'master' '-o' '.travis.yml' 'servant-quickcheck.cabal'
4#
4#
5−# To regenerate the script (for example after adjusting tested-with) run
5+# For more information, see https://github.com/hvr/multi-ghc-travis
6#
6#
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
14language: c
7language: c
15−os: linux
8+sudo: false
16−dist: xenial
9+
17git:
10git:
18− # whether to recursively clone submodules
11+ submodules: false # whether to recursively clone submodules
19− submodules: false
12+
20branches:
13branches:
21 only:
14 only:
22 - master
15 - master
16+
23cache:
17cache:
24 directories:
18 directories:
25 - $HOME/.cabal/packages
19 - $HOME/.cabal/packages
26 - $HOME/.cabal/store
20 - $HOME/.cabal/store
27− - $HOME/.hlint
21+
28before_cache:
22before_cache:
29− - rm -fv $CABALHOME/packages/hackage.haskell.org/build-reports.log
23+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/build-reports.log
30 # remove files that are regenerated by 'cabal update'
24 # remove files that are regenerated by 'cabal update'
31− - rm -fv $CABALHOME/packages/hackage.haskell.org/00-index.*
25+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/00-index.*
32− - rm -fv $CABALHOME/packages/hackage.haskell.org/*.json
26+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/*.json
33− - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.cache
27+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.cache
34− - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar
28+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar
35− - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar.idx
29+ - rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar.idx
30+
36− - rm -rfv $CABALHOME/packages/head.hackage
31+ - rm -rfv $HOME/.cabal/packages/head.hackage
37−jobs:
32+
33+matrix:
38 include:
34 include:
39− - compiler: ghc-8.8.3
35+ - compiler: "ghc-7.10.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"]}}
36+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
41− os: linux
37+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-7.10.3], sources: [hvr-ghc]}}
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
38+ - compiler: "ghc-8.0.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"]}}
39+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
50− os: linux
40+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.0.2], sources: [hvr-ghc]}}
51− - compiler: ghc-8.0.2
41+ - compiler: "ghc-8.2.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"]}}
42+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
53− os: linux
43+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.2.2], sources: [hvr-ghc]}}
44+
54before_install:
45before_install:
55− - HC=$(echo "/opt/$CC/bin/ghc" | sed 's/-/\//')
46+ - HC=${CC}
56− - WITHCOMPILER="-w $HC"
57− - HADDOCK=$(echo "/opt/$CC/bin/haddock" | sed 's/-/\//')
58− - HCPKG="$HC-pkg"
47+ - HCPKG=${HC/ghc/ghc-pkg}
59 - unset CC
48 - unset CC
60− - CABAL=/opt/ghc/bin/cabal
49+ - ROOTDIR=$(pwd)
61− - CABALHOME=$HOME/.cabal
50+ - mkdir -p $HOME/.local/bin
62− - export PATH="$CABALHOME/bin:$PATH"
51+ - "PATH=/opt/ghc/bin:/opt/ghc-ppa-tools/bin:$HOME/local/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))')"
52+ - HCNUMVER=$(( $(${HC} --numeric-version|sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]+).*/\1 * 10000 + \2 * 100 + \3/') ))
65 - echo $HCNUMVER
53 - echo $HCNUMVER
66− - CABAL="$CABAL -vnormal+nowrap"
54+
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
88install:
55install:
89− - ${CABAL} --version
56+ - cabal --version
90 - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
57 - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
91− - |
58+ - BENCH=${BENCH---enable-benchmarks}
92− echo "program-default-options" >> $CABALHOME/config
59+ - TEST=${TEST---enable-tests}
93− echo " ghc-options: $GHCJOBS +RTS -M6G -RTS" >> $CABALHOME/config
60+ - HADDOCK=${HADDOCK-true}
94− - cat $CABALHOME/config
61+ - INSTALLED=${INSTALLED-true}
95− - rm -fv cabal.project cabal.project.local cabal.project.freeze
62+ - GHCHEAD=${GHCHEAD-false}
96− - travis_retry ${CABAL} v2-update -v
63+ - travis_retry cabal update -v
97− # Generate cabal.project
64+ - "sed -i.bak 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config"
98− - rm -rf cabal.project cabal.project.local cabal.project.freeze
65+ - rm -fv cabal.project cabal.project.local
99− - touch cabal.project
66+ - grep -Ev -- '^\s*--' ${HOME}/.cabal/config | grep -Ev '^\s*$'
100− - |
67+ - "printf 'packages: \".\"\\n' > cabal.project"
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
68+ - cat cabal.project
107− - cat cabal.project.local || true
108− - if [ -f "./configure.ac" ]; then (cd "." && autoreconf -i); fi
69+ - if [ -f "./configure.ac" ]; then
109− - ${CABAL} v2-freeze $WITHCOMPILER ${TEST} ${BENCH}
70+ (cd "." && autoreconf -i);
71+ fi
110− - "cat cabal.project.freeze | sed -E 's/^(constraints: *| *)//' | sed 's/any.//'"
72+ - rm -f cabal.project.freeze
111− - rm cabal.project.freeze
73+ - cabal new-build -w ${HC} ${TEST} ${BENCH} --project-file="cabal.project" --dep -j2 all
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
74+ - cabal new-build -w ${HC} --disable-tests --disable-benchmarks --project-file="cabal.project" --dep -j2 all
114−script:
75+ - rm -rf "."/.ghc.environment.* "."/dist
115 - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX)
76 - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX)
116− # Packaging...
77+
117− - ${CABAL} v2-sdist all
78+# Here starts the actual work to be performed for the package under test;
118− # Unpacking...
79+# any command which exits with a non-zero exit code causes the build to fail.
80+script:
81+ # test that source-distributions can be generated
82+ - (cd "." && cabal sdist)
119− - mv dist-newstyle/sdist/*.tar.gz ${DISTDIR}/
83+ - mv "."/dist/servant-quickcheck-*.tar.gz ${DISTDIR}/
120 - cd ${DISTDIR} || false
84 - cd ${DISTDIR} || false
121− - find . -maxdepth 1 -type f -name '*.tar.gz' -exec tar -xvf '{}' \;
85+ - find . -maxdepth 1 -name '*.tar.gz' -exec tar -xvf '{}' \;
122− - find . -maxdepth 1 -type f -name '*.tar.gz' -exec rm '{}' \;
86+ - "printf 'packages: servant-quickcheck-*/*.cabal\\n' > cabal.project"
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
87+ - cat cabal.project
134− - cat cabal.project.local || true
135− # Building...
136 # this builds all libraries and executables (without tests/benchmarks)
88 # this builds all libraries and executables (without tests/benchmarks)
137− - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all
89+ - cabal new-build -w ${HC} --disable-tests --disable-benchmarks all
138− # Building with tests and benchmarks...
90+
91+ # Build with installed constraints for packages in global-db
92+ - if $INSTALLED; then 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; else echo "Not building with installed constraints"; fi
93+
139 # build & run tests, build benchmarks
94 # build & run tests, build benchmarks
140− - ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} all
95+ - cabal new-build -w ${HC} ${TEST} ${BENCH} all
141− # Testing...
96+ - if [ "x$TEST" = "x--enable-tests" ]; then cabal new-test -w ${HC} ${TEST} ${BENCH} all; fi
142− - ${CABAL} v2-test $WITHCOMPILER ${TEST} ${BENCH} all
97+
143− # cabal check...
98+ # cabal check
144− - (cd ${PKGDIR_servant_quickcheck} && ${CABAL} -vnormal check)
99+ - (cd servant-quickcheck-* && cabal check)
100+
145− # haddock...
101+ # haddock
146− - ${CABAL} v2-haddock $WITHCOMPILER --with-haddock $HADDOCK ${TEST} ${BENCH} all
102+ - rm -rf ./dist-newstyle
147− # Building without installed constraints for packages in global-db...
103+ - if $HADDOCK; then cabal new-haddock -w ${HC} ${TEST} ${BENCH} all; else echo "Skipping haddock generation";fi
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
156
104
157−# REGENDATA ("0.10.1",["--config=cabal.haskell-ci","servant-quickcheck.cabal"])
105+# REGENDATA ["--branch","master","-o",".travis.yml","servant-quickcheck.cabal"]
158# EOF
106# EOF
CHANGELOG.yaml+2−76
@@ -1,80 +1,6 @@
1−releases:
1+upcoming:
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
2
25− - description: Fix a failure from OnlyJsonObjects when there is no content-type.
3+releases:
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
52−
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
4
79 - version: "0.0.6.0"
5 - version: "0.0.6.0"
80 changes:
6 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
servant-quickcheck.cabal+107−115
@@ -1,22 +1,26 @@
1−name: servant-quickcheck
1+name: servant-quickcheck
2−version: 0.0.9.1
2+version: 0.0.6.0
3−synopsis: QuickCheck entire APIs
3+synopsis: QuickCheck entire APIs
4description:
4description:
5− This packages provides QuickCheck properties that are tested across an entire
5+ This packages provides QuickCheck properties that are tested across an entire
6− API.
6+ API.
7
7
8−license: BSD3
8+license: BSD3
9−license-file: LICENSE
9+license-file: LICENSE
10−author: Julian K. Arni
10+author: Julian K. Arni
11−maintainer: jkarni@gmail.com
11+maintainer: jkarni@gmail.com
12−category: Web
12+category: Web
13−build-type: Simple
13+build-type: Simple
14−cabal-version: >=1.10
14+cabal-version: >=1.10
15−extra-source-files: CHANGELOG.yaml
15+extra-source-files:
16+ CHANGELOG.yaml
16−tested-with: GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || == 8.8.3
17+tested-with:
18+ GHC==7.10.3,
19+ GHC==8.0.2,
20+ GHC==8.2.2
17
21
18source-repository head
22source-repository head
19− type: git
23+ type: git
20 location: https://github.com/haskell-servant/servant-quickcheck
24 location: https://github.com/haskell-servant/servant-quickcheck
21
25
22flag long-tests
26flag long-tests
@@ -24,115 +28,103 @@ flag long-tests
24 default: False
28 default: False
25
29
26library
30library
27− exposed-modules:
31+ exposed-modules: Servant.QuickCheck
32+ , Servant.QuickCheck.Internal
33+ , Servant.QuickCheck.Internal.Predicates
28− Servant.QuickCheck
34+ , Servant.QuickCheck.Internal.HasGenRequest
29− Servant.QuickCheck.Internal
35+ , Servant.QuickCheck.Internal.QuickCheck
30− Servant.QuickCheck.Internal.Equality
36+ , Servant.QuickCheck.Internal.Equality
31− Servant.QuickCheck.Internal.ErrorTypes
37+ , Servant.QuickCheck.Internal.ErrorTypes
32− Servant.QuickCheck.Internal.HasGenRequest
38+ build-depends: base >=4.8 && <4.11
33− Servant.QuickCheck.Internal.Predicates
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.13
49+ , mtl > 2.1 && < 2.3
50+ , pretty == 1.1.*
51+ , process >= 1.2 && < 1.7
34− Servant.QuickCheck.Internal.QuickCheck
52+ , QuickCheck > 2.7 && < 2.12
53+ , servant >= 0.13 && < 0.14
54+ , servant-client >= 0.13 && < 0.14
55+ , servant-server >= 0.13 && < 0.14
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
35
62
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
63+ hs-source-dirs: src
66− default-extensions:
64+ default-extensions: TypeOperators
67− NoImplicitPrelude
65+ , FlexibleInstances
68− ConstraintKinds
66+ , FlexibleContexts
69− DataKinds
67+ , DataKinds
70− DeriveDataTypeable
68+ , GADTs
69+ , MultiParamTypeClasses
71− DeriveFunctor
70+ , DeriveFunctor
72− DeriveGeneric
73− FlexibleContexts
74− FlexibleInstances
75− FunctionalDependencies
76− GADTs
77− KindSignatures
71+ , KindSignatures
78− MultiParamTypeClasses
79− OverloadedStrings
80− RankNTypes
72+ , RankNTypes
73+ , ConstraintKinds
74+ , DeriveGeneric
81− ScopedTypeVariables
75+ , ScopedTypeVariables
82− TypeOperators
76+ , OverloadedStrings
83−
77+ , FunctionalDependencies
78+ , NoImplicitPrelude
79+ , DeriveDataTypeable
84− default-language: Haskell2010
80+ default-language: Haskell2010
85
81
86test-suite spec
82test-suite spec
87− type: exitcode-stdio-1.0
83+ type: exitcode-stdio-1.0
88− ghc-options: -Wall -threaded
84+ ghc-options: -Wall -threaded
89− default-language: Haskell2010
85+ default-language: Haskell2010
90− hs-source-dirs: test
86+ hs-source-dirs: test
91− main-is: Spec.hs
87+ main-is: Spec.hs
92− other-modules: Servant.QuickCheck.InternalSpec
88+ other-modules: Servant.QuickCheck.InternalSpec
93− build-tool-depends: hspec-discover:hspec-discover -any
89+ build-tool-depends: hspec-discover:hspec-discover
94− build-depends:
90+ build-depends: base == 4.*
95− aeson
96− , base
97− , base-compat-batteries
91+ , base-compat
98− , blaze-html
92+ , aeson
93+ , servant-quickcheck
99− , bytestring
94+ , bytestring
100− , hspec
95+ , hspec
101− , hspec-core >=2.5.5 && <2.8
96+ , hspec-core
102− , http-client
97+ , http-client
103− , QuickCheck
104− , quickcheck-io
105− , servant
106− , servant-blaze
98+ , blaze-html
107− , servant-client
99+ , warp
108− , servant-quickcheck
109− , servant-server
100+ , servant-server
101+ , servant-client
102+ , servant
103+ , servant-blaze
110− , transformers
104+ , transformers
111− , warp
105+ , QuickCheck
112−
106+ , quickcheck-io
113− default-extensions:
107+ default-extensions: TypeOperators
114− NoImplicitPrelude
115− DataKinds
116− FlexibleContexts
117− FlexibleInstances
108+ , FlexibleInstances
109+ , FlexibleContexts
118− GADTs
110+ , GADTs
111+ , DataKinds
112+ , NoImplicitPrelude
119− OverloadedStrings
113+ , OverloadedStrings
120− ScopedTypeVariables
114+ , ScopedTypeVariables
121− TypeOperators
122−
123 if flag(long-tests)
115 if flag(long-tests)
124− cpp-options: -DLONG_TESTS
116+ cpp-options: -DLONG_TESTS
125
117
126test-suite example
118test-suite example
127− type: exitcode-stdio-1.0
119+ type: exitcode-stdio-1.0
128− main-is: Main.hs
120+ main-is: Main.hs
129− hs-source-dirs: example
121+ hs-source-dirs:
122+ example
130− ghc-options: -Wall
123+ ghc-options: -Wall
131 build-depends:
124 build-depends:
132 base
125 base
133 , hspec
126 , hspec
134− , servant-quickcheck
135 , servant-server
127 , servant-server
128+ , servant-quickcheck
136 , text
129 , text
137−
138 default-language: Haskell2010
130 default-language: Haskell2010
src/Servant/QuickCheck/Internal/Equality.hs+2−6
@@ -5,19 +5,15 @@ import Data.ByteString (ByteString)
5import qualified Data.ByteString.Lazy as LB
5import qualified Data.ByteString.Lazy as LB
6import Data.Function (on)
6import Data.Function (on)
7import Network.HTTP.Client (Response, responseBody)
7import Network.HTTP.Client (Response, responseBody)
8−import Data.Semigroup (Semigroup (..))
9import Prelude.Compat
8import Prelude.Compat
10
9
11newtype ResponseEquality b
10newtype ResponseEquality b
12 = ResponseEquality { getResponseEquality :: Response b -> Response b -> Bool }
11 = ResponseEquality { getResponseEquality :: Response b -> Response b -> Bool }
13
12
14−instance Semigroup (ResponseEquality b) where
15− ResponseEquality a <> ResponseEquality b = ResponseEquality $ \x y ->
16− a x y && b x y
17−
18instance Monoid (ResponseEquality b) where
13instance Monoid (ResponseEquality b) where
19 mempty = ResponseEquality $ \_ _ -> True
14 mempty = ResponseEquality $ \_ _ -> True
20− mappend = (<>)
15+ ResponseEquality a `mappend` ResponseEquality b = ResponseEquality $ \x y ->
16+ a x y && b x y
21
17
22-- | Use `Eq` instance for `Response`
18-- | Use `Eq` instance for `Response`
23--
19--
src/Servant/QuickCheck/Internal/ErrorTypes.hs+1−3
@@ -1,4 +1,3 @@
1−{-# LANGUAGE CPP #-}
2module Servant.QuickCheck.Internal.ErrorTypes where
1module Servant.QuickCheck.Internal.ErrorTypes where
3
2
4import Control.Exception (Exception (..))
3import Control.Exception (Exception (..))
@@ -9,10 +8,9 @@ import Data.Typeable (Typeable)
9import GHC.Generics (Generic)
8import GHC.Generics (Generic)
10import qualified Network.HTTP.Client as C
9import qualified Network.HTTP.Client as C
11import Network.HTTP.Types (Header, statusCode)
10import Network.HTTP.Types (Header, statusCode)
11+import Prelude.Compat
12import Text.PrettyPrint
12import Text.PrettyPrint
13
13
14−import Prelude.Compat hiding ((<>))
15−
16data PredicateFailure
14data PredicateFailure
17 = PredicateFailure T.Text (Maybe C.Request) (C.Response LBS.ByteString)
15 = PredicateFailure T.Text (Maybe C.Request) (C.Response LBS.ByteString)
18 deriving (Typeable, Generic)
16 deriving (Typeable, Generic)
src/Servant/QuickCheck/Internal/HasGenRequest.hs+7−9
@@ -2,6 +2,7 @@
2{-# LANGUAGE PolyKinds #-}
2{-# LANGUAGE PolyKinds #-}
3module Servant.QuickCheck.Internal.HasGenRequest where
3module Servant.QuickCheck.Internal.HasGenRequest where
4
4
5+import Data.Monoid ((<>))
5import Data.String (fromString)
6import Data.String (fromString)
6import Data.String.Conversions (cs)
7import Data.String.Conversions (cs)
7import GHC.TypeLits (KnownSymbol, Nat, symbolVal)
8import GHC.TypeLits (KnownSymbol, Nat, symbolVal)
@@ -63,14 +64,18 @@ instance (KnownSymbol path, HasGenRequest b) => HasGenRequest (path :> b) where
63 (oldf, old) = genRequest (Proxy :: Proxy b)
64 (oldf, old) = genRequest (Proxy :: Proxy b)
64 new = cs $ symbolVal (Proxy :: Proxy path)
65 new = cs $ symbolVal (Proxy :: Proxy path)
65
66
67+#if MIN_VERSION_servant(0,11,0)
66instance HasGenRequest EmptyAPI where
68instance HasGenRequest EmptyAPI where
67 genRequest _ = (0, error "EmptyAPIs cannot be queried.")
69 genRequest _ = (0, error "EmptyAPIs cannot be queried.")
70+#endif
68
71
72+#if MIN_VERSION_servant(0,12,0)
69instance HasGenRequest api => HasGenRequest (Summary d :> api) where
73instance HasGenRequest api => HasGenRequest (Summary d :> api) where
70 genRequest _ = genRequest (Proxy :: Proxy api)
74 genRequest _ = genRequest (Proxy :: Proxy api)
71
75
72instance HasGenRequest api => HasGenRequest (Description d :> api) where
76instance HasGenRequest api => HasGenRequest (Description d :> api) where
73 genRequest _ = genRequest (Proxy :: Proxy api)
77 genRequest _ = genRequest (Proxy :: Proxy api)
78+#endif
74
79
75instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
80instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
76 => HasGenRequest (Capture' mods x c :> b) where
81 => HasGenRequest (Capture' mods x c :> b) where
@@ -82,6 +87,7 @@ instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
82 (oldf, old) = genRequest (Proxy :: Proxy b)
87 (oldf, old) = genRequest (Proxy :: Proxy b)
83 new = arbitrary :: Gen c
88 new = arbitrary :: Gen c
84
89
90+#if MIN_VERSION_servant(0,8,0)
85instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
91instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
86 => HasGenRequest (CaptureAll x c :> b) where
92 => HasGenRequest (CaptureAll x c :> b) where
87 genRequest _ = (oldf, do
93 genRequest _ = (oldf, do
@@ -92,6 +98,7 @@ instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
92 where
98 where
93 (oldf, old) = genRequest (Proxy :: Proxy b)
99 (oldf, old) = genRequest (Proxy :: Proxy b)
94 new = arbitrary :: Gen [c]
100 new = arbitrary :: Gen [c]
101+#endif
95
102
96instance (Arbitrary c, KnownSymbol h, HasGenRequest b, ToHttpApiData c)
103instance (Arbitrary c, KnownSymbol h, HasGenRequest b, ToHttpApiData c)
97 => HasGenRequest (Header' mods h c :> b) where
104 => HasGenRequest (Header' mods h c :> b) where
@@ -168,15 +175,6 @@ instance (ReflectMethod method)
168 , method = reflectMethod (Proxy :: Proxy method)
175 , method = reflectMethod (Proxy :: Proxy method)
169 })
176 })
170
177
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−
180instance (HasGenRequest a) => HasGenRequest (RemoteHost :> a) where
178instance (HasGenRequest a) => HasGenRequest (RemoteHost :> a) where
181 genRequest _ = genRequest (Proxy :: Proxy a)
179 genRequest _ = genRequest (Proxy :: Proxy a)
182
180
src/Servant/QuickCheck/Internal/Predicates.hs+20−29
@@ -11,7 +11,7 @@ import Data.CaseInsensitive (foldCase, foldedCase, mk)
11import Data.Either (isRight)
11import Data.Either (isRight)
12import Data.List.Split (wordsBy)
12import Data.List.Split (wordsBy)
13import Data.Maybe (fromMaybe, isJust)
13import Data.Maybe (fromMaybe, isJust)
14−import Data.Semigroup (Semigroup (..))
14+import Data.Monoid ((<>))
15import qualified Data.Text as T
15import qualified Data.Text as T
16import Data.Time (UTCTime, defaultTimeLocale, parseTimeM,
16import Data.Time (UTCTime, defaultTimeLocale, parseTimeM,
17 rfc822DateFormat)
17 rfc822DateFormat)
@@ -84,13 +84,15 @@ notLongerThan maxAllowed
84-- /Since 0.0.0.0/
84-- /Since 0.0.0.0/
85onlyJsonObjects :: ResponsePredicate
85onlyJsonObjects :: ResponsePredicate
86onlyJsonObjects
86onlyJsonObjects
87− = ResponsePredicate (\resp -> do
87+ = ResponsePredicate (\resp -> case go resp of
88+ Nothing -> throw $ PredicateFailure "onlyJsonObjects" Nothing resp
89+ Just () -> return ())
90+ where
91+ go r = do
88− case lookup "content-type" (first foldedCase <$> responseHeaders resp) of
92+ ctyp <- lookup "content-type" (first foldedCase <$> responseHeaders r)
89− Nothing -> return ()
90− Just ctype -> when ("application/json" `SBS.isPrefixOf` ctype) $ do
93+ when ("application/json" `SBS.isPrefixOf` ctyp) $ do
91− case (decode (responseBody resp) :: Maybe Object) of
94+ (_ :: Object) <- decode (responseBody r)
92− Nothing -> throw $ PredicateFailure "onlyJsonObjects" Nothing resp
93− Just _ -> return ())
95+ return ()
94
96
95-- | __Optional__
97-- | __Optional__
96--
98--
@@ -187,15 +189,14 @@ getsHaveLastModifiedHeader
187notAllowedContainsAllowHeader :: RequestPredicate
189notAllowedContainsAllowHeader :: RequestPredicate
188notAllowedContainsAllowHeader
190notAllowedContainsAllowHeader
189 = RequestPredicate $ \req mgr -> do
191 = RequestPredicate $ \req mgr -> do
190− let reqs = [ req { method = renderStdMethod m } | m <- [minBound .. maxBound]
192+ resp <- mapM (flip httpLbs mgr) $ [ req { method = renderStdMethod m }
193+ | m <- [minBound .. maxBound ]
191− , renderStdMethod m /= method req ]
194+ , renderStdMethod m /= method req ]
192− resp <- mapM (flip httpLbs mgr) reqs
193−
194− case filter pred' (zip reqs resp) of
195+ case filter pred' resp of
195− (x:_) -> throw $ PredicateFailure "notAllowedContainsAllowHeader" (Just $ fst x) (snd x)
196+ (x:_) -> throw $ PredicateFailure "notAllowedContainsAllowHeader" (Just req) x
196 [] -> return resp
197 [] -> return resp
197 where
198 where
198− pred' (_, resp) = responseStatus resp == status405 && not (hasValidHeader "Allow" go resp)
199+ pred' resp = responseStatus resp == status405 && not (hasValidHeader "Allow" go resp)
199 where
200 where
200 go x = all (\y -> isRight $ parseMethod $ SBSC.pack y)
201 go x = all (\y -> isRight $ parseMethod $ SBSC.pack y)
201 $ wordsBy (`elem` (", " :: [Char])) (SBSC.unpack x)
202 $ wordsBy (`elem` (", " :: [Char])) (SBSC.unpack x)
@@ -376,12 +377,9 @@ newtype ResponsePredicate = ResponsePredicate
376 { getResponsePredicate :: Response LBS.ByteString -> IO ()
377 { getResponsePredicate :: Response LBS.ByteString -> IO ()
377 } deriving (Generic)
378 } deriving (Generic)
378
379
379−instance Semigroup ResponsePredicate where
380− ResponsePredicate a <> ResponsePredicate b = ResponsePredicate $ \x -> a x >> b x
381−
382instance Monoid ResponsePredicate where
380instance Monoid ResponsePredicate where
383 mempty = ResponsePredicate $ const $ return ()
381 mempty = ResponsePredicate $ const $ return ()
384− mappend = (<>)
382+ ResponsePredicate a `mappend` ResponsePredicate b = ResponsePredicate $ \x -> a x >> b x
385
383
386-- | A predicate that depends on both the request and the response.
384-- | A predicate that depends on both the request and the response.
387--
385--
@@ -393,11 +391,7 @@ newtype RequestPredicate = RequestPredicate
393-- TODO: This isn't actually a monoid
391-- TODO: This isn't actually a monoid
394instance Monoid RequestPredicate where
392instance Monoid RequestPredicate where
395 mempty = RequestPredicate (\r m -> httpLbs r m >>= \x -> return ([x]))
393 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 ->
401 liftM2 (<>) (a r mgr) (b r mgr)
395 liftM2 (<>) (a r mgr) (b r mgr)
402
396
403-- | A set of predicates. Construct one with 'mempty' and '<%>'.
397-- | A set of predicates. Construct one with 'mempty' and '<%>'.
@@ -406,13 +400,10 @@ data Predicates = Predicates
406 , responsePredicates :: ResponsePredicate
400 , responsePredicates :: ResponsePredicate
407 } deriving (Generic)
401 } deriving (Generic)
408
402
409−instance Semigroup Predicates where
410− a <> b = Predicates (requestPredicates a <> requestPredicates b)
411− (responsePredicates a <> responsePredicates b)
412−
413instance Monoid Predicates where
403instance Monoid Predicates where
414 mempty = Predicates mempty mempty
404 mempty = Predicates mempty mempty
415− mappend = (<>)
405+ a `mappend` b = Predicates (requestPredicates a <> requestPredicates b)
406+ (responsePredicates a <> responsePredicates b)
416
407
417class JoinPreds a where
408class JoinPreds a where
418 joinPreds :: a -> Predicates -> Predicates
409 joinPreds :: a -> Predicates -> Predicates
src/Servant/QuickCheck/Internal/QuickCheck.hs+19−58
@@ -2,7 +2,7 @@
2{-# LANGUAGE CPP #-}
2{-# LANGUAGE CPP #-}
3module Servant.QuickCheck.Internal.QuickCheck where
3module Servant.QuickCheck.Internal.QuickCheck where
4
4
5−import Control.Concurrent (tryReadMVar, newEmptyMVar, tryPutMVar)
5+import Control.Concurrent (modifyMVar_, newMVar, readMVar)
6import Control.Monad (unless)
6import Control.Monad (unless)
7import qualified Data.ByteString.Lazy as LBS
7import qualified Data.ByteString.Lazy as LBS
8import Data.Proxy (Proxy)
8import Data.Proxy (Proxy)
@@ -11,9 +11,6 @@ import Network.Wai.Handler.Warp (withApplication)
11import Prelude.Compat
11import Prelude.Compat
12import Servant (Context (EmptyContext), HasServer,
12import Servant (Context (EmptyContext), HasServer,
13 Server, serveWithContext)
13 Server, serveWithContext)
14−#if MIN_VERSION_servant_server(0,18,0)
15−import Servant (DefaultErrorFormatters, ErrorFormatters, HasContextEntry, type (.++))
16−#endif
17import Servant.Client (BaseUrl (..), Scheme (..))
14import Servant.Client (BaseUrl (..), Scheme (..))
18import System.IO.Unsafe (unsafePerformIO)
15import System.IO.Unsafe (unsafePerformIO)
19import Test.Hspec (Expectation, expectationFailure)
16import Test.Hspec (Expectation, expectationFailure)
@@ -40,11 +37,7 @@ withServantServer api = withServantServerAndContext api EmptyContext
40-- application.
37-- application.
41--
38--
42-- /Since 0.0.0.0/
39-- /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
46withServantServerAndContext :: HasServer a ctx
40withServantServerAndContext :: HasServer a ctx
47−#endif
48 => Proxy a -> Context ctx -> IO (Server a) -> (BaseUrl -> IO r) -> IO r
41 => Proxy a -> Context ctx -> IO (Server a) -> (BaseUrl -> IO r) -> IO r
49withServantServerAndContext api ctx server t
42withServantServerAndContext api ctx server t
50 = withApplication (return . serveWithContext api ctx =<< server) $ \port ->
43 = withApplication (return . serveWithContext api ctx =<< server) $ \port ->
@@ -80,29 +73,21 @@ serversEqual api burl1 burl2 args req = do
80 let reqs = (\f -> (f burl1, f burl2)) <$> runGenRequest api
73 let reqs = (\f -> (f burl1, f burl2)) <$> runGenRequest api
81 -- This MVar stuff is clunky! But there doesn't seem to be an easy way to
74 -- This MVar stuff is clunky! But there doesn't seem to be an easy way to
82 -- return results when a test fails, since an exception is throw.
75 -- return results when a test fails, since an exception is throw.
83− deetsMVar <- newEmptyMVar
76+ deetsMVar <- newMVar $ error "should not be called"
84 r <- quickCheckWithResult args { chatty = False } $ monadicIO $ forAllM reqs $ \(req1, req2) -> do
77 r <- quickCheckWithResult args { chatty = False } $ monadicIO $ forAllM reqs $ \(req1, req2) -> do
85 resp1 <- run $ C.httpLbs (noCheckStatus req1) defManager
78 resp1 <- run $ C.httpLbs (noCheckStatus req1) defManager
86 resp2 <- run $ C.httpLbs (noCheckStatus req2) defManager
79 resp2 <- run $ C.httpLbs (noCheckStatus req2) defManager
87 unless (getResponseEquality req resp1 resp2) $ do
80 unless (getResponseEquality req resp1 resp2) $ do
88 monitor (counterexample "hi" )
81 monitor (counterexample "hi" )
82+ run $ modifyMVar_ deetsMVar $ const $ return $
89− _ <- run $ tryPutMVar deetsMVar $ ServerEqualityFailure req1 resp1 resp2
83+ ServerEqualityFailure req1 resp1 resp2
90 assert False
84 assert False
91 case r of
85 case r of
92 Success {} -> return ()
86 Success {} -> return ()
93− Failure{..} -> do
94− mx <- tryReadMVar deetsMVar
95− case mx of
96− Just x ->
97− expectationFailure $ "Failed:\n" ++ show x
87+ Failure{..} -> readMVar deetsMVar >>= \x -> expectationFailure $ "Failed:\n" ++ show x
98− Nothing ->
99− expectationFailure $ "We failed to record a reason for failure: " <> show r
100 GaveUp { numTests = n } -> expectationFailure $ "Gave up after " ++ show n ++ " tests"
88 GaveUp { numTests = n } -> expectationFailure $ "Gave up after " ++ show n ++ " tests"
101 NoExpectedFailure {} -> expectationFailure "No expected failure"
89 NoExpectedFailure {} -> expectationFailure "No expected failure"
102−#if MIN_VERSION_QuickCheck(2,12,0)
103−#else
104 InsufficientCoverage {} -> expectationFailure "Insufficient coverage"
90 InsufficientCoverage {} -> expectationFailure "Insufficient coverage"
105−#endif
106
91
107-- | Check that a server satisfies the set of properties specified.
92-- | Check that a server satisfies the set of properties specified.
108--
93--
@@ -125,61 +110,37 @@ serversEqual api burl1 burl2 args req = do
125-- /Since 0.0.0.0/
110-- /Since 0.0.0.0/
126serverSatisfies :: (HasGenRequest a) =>
111serverSatisfies :: (HasGenRequest a) =>
127 Proxy a -> BaseUrl -> Args -> Predicates -> Expectation
112 Proxy a -> BaseUrl -> Args -> Predicates -> Expectation
128−serverSatisfies api = serverSatisfiesMgr api defManager
113+serverSatisfies api burl args preds = do
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
139 let reqs = ($ burl) <$> runGenRequest api
114 let reqs = ($ burl) <$> runGenRequest api
140− deetsMVar <- newEmptyMVar
115+ deetsMVar <- newMVar $ error "should not be called"
141 r <- quickCheckWithResult args { chatty = False } $ monadicIO $ forAllM reqs $ \req -> do
116 r <- quickCheckWithResult args { chatty = False } $ monadicIO $ forAllM reqs $ \req -> do
142− v <- run $ finishPredicates preds (noCheckStatus req) manager
117+ v <- run $ finishPredicates preds (noCheckStatus req) defManager
143− _ <- run $ tryPutMVar deetsMVar v
118+ run $ modifyMVar_ deetsMVar $ const $ return v
144− case v of
119+ case v of
145− Just _ -> assert False
120+ Just _ -> assert False
146− _ -> return ()
121+ _ -> return ()
147 case r of
122 case r of
148 Success {} -> return ()
123 Success {} -> return ()
149− Failure {..} -> do
124+ Failure{..} -> readMVar deetsMVar >>= \x -> expectationFailure $
150− mx <- tryReadMVar deetsMVar
151− case mx of
152− Just x ->
153− expectationFailure $ "Failed:\n" ++ show x
125+ "Failed:\n" ++ show x
154− Nothing ->
155− expectationFailure $ "We failed to record a reason for failure: " <> show r
156 GaveUp { numTests = n } -> expectationFailure $ "Gave up after " ++ show n ++ " tests"
126 GaveUp { numTests = n } -> expectationFailure $ "Gave up after " ++ show n ++ " tests"
157 NoExpectedFailure {} -> expectationFailure $ "No expected failure"
127 NoExpectedFailure {} -> expectationFailure $ "No expected failure"
158−#if MIN_VERSION_QuickCheck(2,12,0)
159−#else
160− InsufficientCoverage {} -> expectationFailure "Insufficient coverage"
128+ InsufficientCoverage {} -> expectationFailure $ "Insufficient coverage"
161−#endif
129+
162
130
163serverDoesntSatisfy :: (HasGenRequest a) =>
131serverDoesntSatisfy :: (HasGenRequest a) =>
164 Proxy a -> BaseUrl -> Args -> Predicates -> Expectation
132 Proxy a -> BaseUrl -> Args -> Predicates -> Expectation
165−serverDoesntSatisfy api = serverDoesntSatisfyMgr api defManager
133+serverDoesntSatisfy api burl args preds = do
166−
167−serverDoesntSatisfyMgr :: (HasGenRequest a) =>
168− Proxy a -> C.Manager -> BaseUrl -> Args -> Predicates -> Expectation
169−serverDoesntSatisfyMgr api manager burl args preds = do
170 let reqs = ($ burl) <$> runGenRequest api
134 let reqs = ($ burl) <$> runGenRequest api
171 r <- quickCheckWithResult args $ monadicIO $ forAllM reqs $ \req -> do
135 r <- quickCheckWithResult args $ monadicIO $ forAllM reqs $ \req -> do
172− v <- run $ finishPredicates preds (noCheckStatus req) manager
136+ v <- run $ finishPredicates preds (noCheckStatus req) defManager
173 assert $ not $ null v
137 assert $ not $ null v
174 case r of
138 case r of
175 Success {} -> return ()
139 Success {} -> return ()
176 GaveUp { numTests = n } -> expectationFailure $ "Gave up after " ++ show n ++ " tests"
140 GaveUp { numTests = n } -> expectationFailure $ "Gave up after " ++ show n ++ " tests"
177 Failure { output = m } -> expectationFailure $ "Failed:\n" ++ show m
141 Failure { output = m } -> expectationFailure $ "Failed:\n" ++ show m
178 NoExpectedFailure {} -> expectationFailure $ "No expected failure"
142 NoExpectedFailure {} -> expectationFailure $ "No expected failure"
179−#if MIN_VERSION_QuickCheck(2,12,0)
180−#else
181− InsufficientCoverage {} -> expectationFailure "Insufficient coverage"
143+ InsufficientCoverage {} -> expectationFailure $ "Insufficient coverage"
182−#endif
183
144
184noCheckStatus :: C.Request -> C.Request
145noCheckStatus :: C.Request -> C.Request
185#if MIN_VERSION_http_client(0,5,0)
146#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
2packages:
2packages:
3- '.'
3- '.'
4extra-deps:
4extra-deps:
5+- hspec-2.4.4
6+- hspec-core-2.4.4
5−- hspec-discover-2.5.6
7+- hspec-discover-2.4.4
6−- hspec-core-2.5.6
8+- quickcheck-io-0.2.0
7−- hspec-2.5.6
8−- QuickCheck-2.12
9flags: {}
9flags: {}
10extra-package-dbs: []
10extra-package-dbs: []
test/Servant/QuickCheck/InternalSpec.hs+38−15
@@ -17,13 +17,25 @@ import qualified Text.Blaze.Html as Blaze
17import qualified Text.Blaze.Html5 as Blaze5
17import qualified Text.Blaze.Html5 as Blaze5
18import Test.Hspec (Spec, context, describe, it, shouldBe,
18import Test.Hspec (Spec, context, describe, it, shouldBe,
19 shouldContain)
19 shouldContain)
20−import Test.Hspec.Core.Spec (Arg, Example, Result (..), ResultStatus (..),
20+import Test.Hspec.Core.Spec (Arg, Example, Result (..),
21− defaultParams, safeEvaluateExample)
21+ defaultParams)
22import Test.QuickCheck.Gen (generate, unGen)
22import Test.QuickCheck.Gen (generate, unGen)
23import Test.QuickCheck.Random (mkQCGen)
23import Test.QuickCheck.Random (mkQCGen)
24
24
25
25
26+#if MIN_VERSION_servant(0,8,0)
26−import Servant.Test.ComprehensiveAPI (comprehensiveAPIWithoutStreamingOrRaw)
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
27
39
28import Servant.QuickCheck
40import Servant.QuickCheck
29import Servant.QuickCheck.Internal (genRequest, runGenRequest,
41import Servant.QuickCheck.Internal (genRequest, runGenRequest,
@@ -128,10 +140,6 @@ onlyJsonObjectSpec = describe "onlyJsonObjects" $ do
128 withServantServerAndContext octetAPI ctx serverOctetAPI $ \burl ->
140 withServantServerAndContext octetAPI ctx serverOctetAPI $ \burl ->
129 serverSatisfies octetAPI burl args (onlyJsonObjects <%> mempty)
141 serverSatisfies octetAPI burl args (onlyJsonObjects <%> mempty)
130
142
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−
135notLongerThanSpec :: Spec
143notLongerThanSpec :: Spec
136notLongerThanSpec = describe "notLongerThan" $ do
144notLongerThanSpec = describe "notLongerThan" $ do
137
145
@@ -149,7 +157,7 @@ isComprehensiveSpec :: Spec
149isComprehensiveSpec = describe "HasGenRequest" $ do
157isComprehensiveSpec = describe "HasGenRequest" $ do
150
158
151 it "has instances for all 'servant' combinators" $ do
159 it "has instances for all 'servant' combinators" $ do
152− let _g = genRequest comprehensiveAPIWithoutStreamingOrRaw
160+ let _g = genRequest comprehensiveAPIWithoutRaw
153 True `shouldBe` True -- This is a type-level check
161 True `shouldBe` True -- This is a type-level check
154
162
155deepPathSpec :: Spec
163deepPathSpec :: Spec
@@ -273,9 +281,6 @@ server2 = return $ return 1
273server3 :: IO (Server API2)
281server3 :: IO (Server API2)
274server3 = return $ return 2
282server3 = return $ return 2
275
283
276−serverFailing :: IO (Server API2)
277−serverFailing = return . throwError $ err405
278−
279-- With Doctypes
284-- With Doctypes
280type HtmlDoctype = Get '[HTML] Blaze.Html
285type HtmlDoctype = Get '[HTML] Blaze.Html
281
286
@@ -344,14 +349,27 @@ ctx = BasicAuthCheck (const . return $ NoSuchUser) :. EmptyContext
344-- Utils
349-- Utils
345------------------------------------------------------------------------------
350------------------------------------------------------------------------------
346evalExample :: (Example e, Arg e ~ ()) => e -> IO EvalResult
351evalExample :: (Example e, Arg e ~ ()) => e -> IO EvalResult
352+#if MIN_VERSION_hspec(2,4,0)
347evalExample e = do
353evalExample e = do
348 r <- safeEvaluateExample e defaultParams ($ ()) progCallback
354 r <- safeEvaluateExample e defaultParams ($ ()) progCallback
349− case resultStatus r of
355+ case r of
356+ Left err -> return $ AnException err
350− Success -> return $ AllGood
357+ Right Success -> return $ AllGood
351− Failure _ reason -> return $ FailedWith $ show reason
358+ Right (Failure _ reason) -> return $ FailedWith $ show reason
352− Pending {} -> error "should not happen"
359+ Right (Pending _) -> error "should not happen"
353 where
360 where
354 progCallback _ = return ()
361 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
355
373
356data EvalResult
374data EvalResult
357 = AnException SomeException
375 = AnException SomeException
@@ -369,3 +387,8 @@ noOfTestCases = 20000
369#else
387#else
370noOfTestCases = 1000
388noOfTestCases = 1000
371#endif
389#endif
390+
391+#if !MIN_VERSION_servant(0,8,0)
392+comprehensiveAPIWithoutRaw :: Proxy ComprehensiveAPI
393+comprehensiveAPIWithoutRaw = comprehensiveAPI
394+#endif