Compare commits

...

32 Commits

Author SHA1 Message Date
fisx
0535413b1a
Merge pull request #72 from maksbotan/maksbotan/support-servant-0.18
Support servant-server-0.18
2020-07-31 09:54:59 +02:00
Maxim Koltsov
7cc95a8120
Update src/Servant/QuickCheck/Internal/QuickCheck.hs
Co-authored-by: fisx <mf@zerobuzz.net>
2020-07-31 10:43:19 +03:00
Maxim Koltsov
e1a919127a
haskell-ci regenerate 2020-07-30 19:32:29 +03:00
Maxim Koltsov
e6daf03c16
Support servant-server-0.18 2020-07-30 19:22:14 +03:00
Matthias Fischmann
7926ad6bdb
Fix lower version bounds for servant packages. 2020-07-10 13:54:21 +02:00
Matthias Fischmann
fa9cc11095
Bump version; add changelog entry. 2020-07-02 22:40:04 +02:00
Julian Arni
dfec2529ac
Merge pull request #65 from fizruk/support-servant-0.15
Support servant-0.15
2020-06-25 12:10:58 +02:00
Julian Arni
eb3cdbcd3a
Merge branch 'master' into support-servant-0.15 2020-06-25 11:02:24 +02:00
Julian Arni
f48088b7d2
Merge pull request #70 from felixmulder/relax-constraints-for-GHC-8.10
Relax constraints for GHC 8.10
2020-06-25 11:00:59 +02:00
Felix Mulder
2bf03e822a Relax constraints for GHC 8.10 2020-06-07 09:58:56 +02:00
Oleg Grenrus
092ebe5423
Merge pull request #68 from haskell-servant/servant-0.17
Support servant-0.17
2020-01-24 10:45:48 +02:00
Oleg Grenrus
13d32d6768 Support servant-0.17 2020-01-23 23:38:03 +02:00
Oleg Grenrus
8e8e9b501b Change version back to 0.0.7.4
There are no changes since the tag in the src/
2019-09-16 02:11:42 +03:00
Oleg Grenrus
c93bd5a832
Merge pull request #66 from haskell-servant/updates
Updates: 2019-09
2019-09-16 02:09:26 +03:00
Oleg Grenrus
f9989bbf79 Updates: 2019-09 2019-09-15 18:22:05 +03:00
Nickolay Kudasov
bb8177928e
Support servant-0.15 2019-07-04 11:52:51 +03:00
Oleg Grenrus
f6fb9033e9
Merge pull request #63 from haskell-servant/updates
Support servant-0.16 and http-media-0.8
2019-04-17 12:28:42 +03:00
Oleg Grenrus
804b06283d Update .travis.yml 2019-04-17 11:36:31 +03:00
Oleg Grenrus
a5cdf78d82 Support servant-0.16 and http-media-0.8 2019-04-16 22:19:54 +03:00
Oleg Grenrus
638580ba49
Merge pull request #62 from haskell-servant/servant-0.16
Allow servant-0.16
2019-02-28 00:05:15 +02:00
Oleg Grenrus
8803b1c09e Allow servant-0.16 2019-02-27 20:42:16 +02:00
parsonsmatt
e69d4026af v0.0.7.3 2018-10-24 07:48:05 -06:00
Oleg Grenrus
98fd048bdc
Merge pull request #59 from haskell-servant/ghc-8.6
Support GHC-8.6
2018-10-15 21:13:54 +03:00
Oleg Grenrus
902d7a7583 Support GHC-8.6 2018-10-15 17:51:44 +03:00
parsonsmatt
bc36737c45 Clean up stack.yaml and dependencies 2018-10-12 13:34:13 -06:00
parsonsmatt
0190e5e737 QuickCheck 2.12 Compatibility
This commit relaxes the bounds on QuickCheck, allowing it to be
compatible with 2.12. In order to be compatible with 2.12, we had to CPP
some definitions that referenced code that was deleted.
2018-10-12 13:34:13 -06:00
Alp Mestanogullari
7d6a97af5a
Merge pull request #57 from Phenitei/notAllowedBug
Fix #56: a notAllowedContainsAllowHeader bug
2018-08-29 12:01:14 +02:00
Joachim Desroches
9743ac5ec4 Fix a bug in onlyJsonObjects that made it fail if there was no
content-type.
2018-08-27 22:31:18 -06:00
Joachim Desroches
e3bf044741 Add test for onlyJsonObjects when no content-type header is present. 2018-08-27 22:31:18 -06:00
Joachim Desroches
89c9170bdf
Fix #56
A bug where the request printed alongside a failure in
notAllowedContainsAllowHeader was not the request causing the failure.
2018-08-27 18:12:22 +02:00
Oleg Grenrus
35c98622fc
Merge pull request #53 from haskell-servant/servant-0.14
Support servant-0.14
2018-06-19 14:51:14 +03:00
Oleg Grenrus
cb06284c75 Support servant-0.14 2018-06-19 13:05:16 +03:00
10 changed files with 353 additions and 237 deletions

View File

@ -1,109 +1,158 @@
# This Travis job script has been generated by a script via # This Travis job script has been generated by a script via
# #
# runghc make_travis_yml_2.hs '--branch' 'master' '-o' '.travis.yml' 'servant-quickcheck.cabal' # haskell-ci '--config=cabal.haskell-ci' 'servant-quickcheck.cabal'
# #
# For more information, see https://github.com/hvr/multi-ghc-travis # To regenerate the script (for example after adjusting tested-with) run
# #
# haskell-ci regenerate
#
# For more information, see https://github.com/haskell-CI/haskell-ci
#
# version: 0.10.1
#
version: ~> 1.0
language: c language: c
sudo: false os: linux
dist: xenial
git: git:
submodules: false # whether to recursively clone submodules # whether to recursively clone submodules
submodules: false
branches: branches:
only: only:
- master - master
cache: cache:
directories: directories:
- $HOME/.cabal/packages - $HOME/.cabal/packages
- $HOME/.cabal/store - $HOME/.cabal/store
- $HOME/.hlint
before_cache: before_cache:
- rm -fv $HOME/.cabal/packages/hackage.haskell.org/build-reports.log - rm -fv $CABALHOME/packages/hackage.haskell.org/build-reports.log
# remove files that are regenerated by 'cabal update' # remove files that are regenerated by 'cabal update'
- rm -fv $HOME/.cabal/packages/hackage.haskell.org/00-index.* - rm -fv $CABALHOME/packages/hackage.haskell.org/00-index.*
- rm -fv $HOME/.cabal/packages/hackage.haskell.org/*.json - rm -fv $CABALHOME/packages/hackage.haskell.org/*.json
- rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.cache - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.cache
- rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar
- rm -fv $HOME/.cabal/packages/hackage.haskell.org/01-index.tar.idx - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar.idx
- rm -rfv $CABALHOME/packages/head.hackage
- rm -rfv $HOME/.cabal/packages/head.hackage jobs:
matrix:
include: include:
- compiler: "ghc-7.10.3" - compiler: ghc-8.8.3
# env: TEST=--disable-tests BENCH=--disable-benchmarks 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"]}}
addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-7.10.3], sources: [hvr-ghc]}} os: linux
- compiler: "ghc-8.0.2" - compiler: ghc-8.6.5
# env: TEST=--disable-tests BENCH=--disable-benchmarks 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"]}}
addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.0.2], sources: [hvr-ghc]}} os: linux
- compiler: "ghc-8.2.2" - compiler: ghc-8.4.4
# env: TEST=--disable-tests BENCH=--disable-benchmarks 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"]}}
addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.2.2], sources: [hvr-ghc]}} os: linux
- compiler: "ghc-8.4.1" - compiler: ghc-8.2.2
# env: TEST=--disable-tests BENCH=--disable-benchmarks 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"]}}
addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.4.1], sources: [hvr-ghc]}} os: linux
- compiler: ghc-8.0.2
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"]}}
os: linux
before_install: before_install:
- HC=${CC} - HC=$(echo "/opt/$CC/bin/ghc" | sed 's/-/\//')
- HCPKG=${HC/ghc/ghc-pkg} - WITHCOMPILER="-w $HC"
- HADDOCK=$(echo "/opt/$CC/bin/haddock" | sed 's/-/\//')
- HCPKG="$HC-pkg"
- unset CC - unset CC
- ROOTDIR=$(pwd) - CABAL=/opt/ghc/bin/cabal
- mkdir -p $HOME/.local/bin - CABALHOME=$HOME/.cabal
- "PATH=/opt/ghc/bin:/opt/ghc-ppa-tools/bin:$HOME/local/bin:$PATH" - export PATH="$CABALHOME/bin:$PATH"
- HCNUMVER=$(( $(${HC} --numeric-version|sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]+).*/\1 * 10000 + \2 * 100 + \3/') )) - TOP=$(pwd)
- "HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\\d+)\\.(\\d+)\\.(\\d+)(\\.(\\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')"
- echo $HCNUMVER - echo $HCNUMVER
- CABAL="$CABAL -vnormal+nowrap"
- set -o pipefail
- TEST=--enable-tests
- BENCH=--enable-benchmarks
- HEADHACKAGE=false
- rm -f $CABALHOME/config
- |
echo "verbose: normal +nowrap +markoutput" >> $CABALHOME/config
echo "remote-build-reporting: anonymous" >> $CABALHOME/config
echo "write-ghc-environment-files: always" >> $CABALHOME/config
echo "remote-repo-cache: $CABALHOME/packages" >> $CABALHOME/config
echo "logs-dir: $CABALHOME/logs" >> $CABALHOME/config
echo "world-file: $CABALHOME/world" >> $CABALHOME/config
echo "extra-prog-path: $CABALHOME/bin" >> $CABALHOME/config
echo "symlink-bindir: $CABALHOME/bin" >> $CABALHOME/config
echo "installdir: $CABALHOME/bin" >> $CABALHOME/config
echo "build-summary: $CABALHOME/logs/build.log" >> $CABALHOME/config
echo "store-dir: $CABALHOME/store" >> $CABALHOME/config
echo "install-dirs user" >> $CABALHOME/config
echo " prefix: $CABALHOME" >> $CABALHOME/config
echo "repository hackage.haskell.org" >> $CABALHOME/config
echo " url: http://hackage.haskell.org/" >> $CABALHOME/config
install: install:
- cabal --version - ${CABAL} --version
- echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]" - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
- BENCH=${BENCH---enable-benchmarks} - |
- TEST=${TEST---enable-tests} echo "program-default-options" >> $CABALHOME/config
- HADDOCK=${HADDOCK-true} echo " ghc-options: $GHCJOBS +RTS -M6G -RTS" >> $CABALHOME/config
- INSTALLED=${INSTALLED-true} - cat $CABALHOME/config
- GHCHEAD=${GHCHEAD-false} - rm -fv cabal.project cabal.project.local cabal.project.freeze
- travis_retry cabal update -v - travis_retry ${CABAL} v2-update -v
- "sed -i.bak 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config" # Generate cabal.project
- rm -fv cabal.project cabal.project.local - rm -rf cabal.project cabal.project.local cabal.project.freeze
- grep -Ev -- '^\s*--' ${HOME}/.cabal/config | grep -Ev '^\s*$' - touch cabal.project
- "printf 'packages: \".\"\\n' > cabal.project" - |
- cat cabal.project echo "packages: ." >> cabal.project
- if [ -f "./configure.ac" ]; then - if [ $HCNUMVER -ge 80200 ] ; then echo 'package servant-quickcheck' >> cabal.project ; fi
(cd "." && autoreconf -i); - "if [ $HCNUMVER -ge 80200 ] ; then echo ' ghc-options: -Werror=missing-methods' >> cabal.project ; fi"
fi - |
- rm -f cabal.project.freeze - "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"
- cabal new-build -w ${HC} ${TEST} ${BENCH} --project-file="cabal.project" --dep -j2 all - cat cabal.project || true
- cabal new-build -w ${HC} --disable-tests --disable-benchmarks --project-file="cabal.project" --dep -j2 all - cat cabal.project.local || true
- rm -rf .ghc.environment.* "."/dist - if [ -f "./configure.ac" ]; then (cd "." && autoreconf -i); fi
- DISTDIR=$(mktemp -d /tmp/dist-test.XXXX) - ${CABAL} v2-freeze $WITHCOMPILER ${TEST} ${BENCH}
- "cat cabal.project.freeze | sed -E 's/^(constraints: *| *)//' | sed 's/any.//'"
# Here starts the actual work to be performed for the package under test; - rm cabal.project.freeze
# any command which exits with a non-zero exit code causes the build to fail. - travis_wait 40 ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} --dep -j2 all
- travis_wait 40 ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --dep -j2 all
script: script:
# test that source-distributions can be generated - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX)
- (cd "." && cabal sdist) # Packaging...
- mv "."/dist/servant-quickcheck-*.tar.gz ${DISTDIR}/ - ${CABAL} v2-sdist all
# Unpacking...
- mv dist-newstyle/sdist/*.tar.gz ${DISTDIR}/
- cd ${DISTDIR} || false - cd ${DISTDIR} || false
- find . -maxdepth 1 -name '*.tar.gz' -exec tar -xvf '{}' \; - find . -maxdepth 1 -type f -name '*.tar.gz' -exec tar -xvf '{}' \;
- "printf 'packages: servant-quickcheck-*/*.cabal\\n' > cabal.project" - find . -maxdepth 1 -type f -name '*.tar.gz' -exec rm '{}' \;
- cat cabal.project - PKGDIR_servant_quickcheck="$(find . -maxdepth 1 -type d -regex '.*/servant-quickcheck-[0-9.]*')"
# Generate cabal.project
- rm -rf cabal.project cabal.project.local cabal.project.freeze
- touch cabal.project
- |
echo "packages: ${PKGDIR_servant_quickcheck}" >> cabal.project
- if [ $HCNUMVER -ge 80200 ] ; then echo 'package servant-quickcheck' >> cabal.project ; fi
- "if [ $HCNUMVER -ge 80200 ] ; then echo ' ghc-options: -Werror=missing-methods' >> cabal.project ; fi"
- |
- "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"
- cat cabal.project || true
- cat cabal.project.local || true
# Building...
# this builds all libraries and executables (without tests/benchmarks) # this builds all libraries and executables (without tests/benchmarks)
- cabal new-build -w ${HC} --disable-tests --disable-benchmarks all - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all
# Building with tests and benchmarks...
# Build with installed constraints for packages in global-db
- 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
# build & run tests, build benchmarks # build & run tests, build benchmarks
- cabal new-build -w ${HC} ${TEST} ${BENCH} all - ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} all
- if [ "x$TEST" = "x--enable-tests" ]; then cabal new-test -w ${HC} ${TEST} ${BENCH} all; fi # Testing...
- ${CABAL} v2-test $WITHCOMPILER ${TEST} ${BENCH} all
# cabal check...
- (cd ${PKGDIR_servant_quickcheck} && ${CABAL} -vnormal check)
# haddock...
- ${CABAL} v2-haddock $WITHCOMPILER --with-haddock $HADDOCK ${TEST} ${BENCH} all
# Building without installed constraints for packages in global-db...
- rm -f cabal.project.local
- ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all
# Constraint sets
- rm -rf cabal.project.local
# Constraint set base-compat-0.10
- ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --constraint='base-compat ==0.10.*' all
# Constraint set base-compat-0.11
- ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --constraint='base-compat ==0.11.*' all
# cabal check # REGENDATA ("0.10.1",["--config=cabal.haskell-ci","servant-quickcheck.cabal"])
- (cd servant-quickcheck-* && cabal check)
# haddock
- rm -rf ./dist-newstyle
- if $HADDOCK; then cabal new-haddock -w ${HC} ${TEST} ${BENCH} all; else echo "Skipping haddock generation";fi
# REGENDATA ["--branch","master","-o",".travis.yml","servant-quickcheck.cabal"]
# EOF # EOF

View File

@ -1,4 +1,46 @@
releases: releases:
- version: "0.0.9.0"
changes:
- description: "Support servant-0.15 (#65)"
authors: fizruk
date: 2020-06-25
- description: "Relax constraints for GHC 8.10 (#70)"
authors: felixmulder
date: 2020-06-20
- version: "0.0.8.0"
changes:
- description: Support for servant-0.17
authors: phadej
date: 2019-01-23
- version: "0.0.7.3"
changes:
- description: Support for servant-0.14
issue: 53
authors: phadej
date: 2018-06-12
- description: Fix a failure from OnlyJsonObjects when there is no content-type.
issue: 55
authors: Phenitei
date: 2018-08-27
- description: A bug fix where notAllowedContainsAllowHeader would print the initial request alongside the failure instead of the request causing the failure when it failed.
issue: 57
authors: Phenitei
date: 2018-08-29
- description: QuickCheck 2.12 compatibility
issue: 58
authors: parsonsmatt
date: 2018-10-12
- description: GHC 8.6 compatibility
issue: 59
authors: phadej
date: 2018-10-15
- version: "0.0.7.2" - version: "0.0.7.2"
changes: changes:

7
cabal.haskell-ci Normal file
View File

@ -0,0 +1,7 @@
branches: master
constraint-set base-compat-0.10
constraints: base-compat ==0.10.*
constraint-set base-compat-0.11
constraints: base-compat ==0.11.*

4
cabal.project Normal file
View File

@ -0,0 +1,4 @@
packages: .
tests: true
allow-newer: servant-blaze:servant

View File

@ -1,27 +1,22 @@
name: servant-quickcheck name: servant-quickcheck
version: 0.0.7.2 version: 0.0.9.1
synopsis: QuickCheck entire APIs synopsis: QuickCheck entire APIs
description: description:
This packages provides QuickCheck properties that are tested across an entire This packages provides QuickCheck properties that are tested across an entire
API. API.
license: BSD3 license: BSD3
license-file: LICENSE license-file: LICENSE
author: Julian K. Arni author: Julian K. Arni
maintainer: jkarni@gmail.com maintainer: jkarni@gmail.com
category: Web category: Web
build-type: Simple build-type: Simple
cabal-version: >=1.10 cabal-version: >=1.10
extra-source-files: extra-source-files: CHANGELOG.yaml
CHANGELOG.yaml tested-with: GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || == 8.8.3
tested-with:
GHC==7.10.3,
GHC==8.0.2,
GHC==8.2.2,
GHC==8.4.1
source-repository head source-repository head
type: git type: git
location: https://github.com/haskell-servant/servant-quickcheck location: https://github.com/haskell-servant/servant-quickcheck
flag long-tests flag long-tests
@ -29,107 +24,115 @@ flag long-tests
default: False default: False
library library
exposed-modules: Servant.QuickCheck exposed-modules:
, Servant.QuickCheck.Internal Servant.QuickCheck
, Servant.QuickCheck.Internal.Predicates Servant.QuickCheck.Internal
, Servant.QuickCheck.Internal.HasGenRequest Servant.QuickCheck.Internal.Equality
, Servant.QuickCheck.Internal.QuickCheck Servant.QuickCheck.Internal.ErrorTypes
, Servant.QuickCheck.Internal.Equality Servant.QuickCheck.Internal.HasGenRequest
, Servant.QuickCheck.Internal.ErrorTypes Servant.QuickCheck.Internal.Predicates
build-depends: base >=4.8 && <4.12 Servant.QuickCheck.Internal.QuickCheck
, base-compat-batteries >= 0.10.1 && <0.11
, aeson > 0.8 && < 2
, bytestring == 0.10.*
, case-insensitive == 1.2.*
, clock >= 0.7 && < 0.8
, data-default-class >= 0.0 && < 0.2
, hspec >= 2.5 && < 2.6
, http-client >= 0.4.30 && < 0.6
, http-media >= 0.6 && <0.8
, http-types > 0.8 && < 0.13
, mtl > 2.1 && < 2.3
, pretty == 1.1.*
, process >= 1.2 && < 1.7
, QuickCheck > 2.7 && < 2.12
, servant >= 0.13 && < 0.14
, servant-client >= 0.13 && < 0.14
, servant-server >= 0.13 && < 0.14
, split == 0.2.*
, string-conversions > 0.3 && < 0.5
, temporary >= 1.2 && <1.4
, text == 1.*
, time >= 1.5 && < 1.9
, warp >= 3.2.4 && < 3.3
if !impl(ghc >= 8.0) build-depends:
build-depends: aeson >=0.8 && <2
semigroups >= 0.18.3 && <0.19 , base >=4.9 && <4.15
, base-compat-batteries >=0.10.1 && <0.12
, bytestring >=0.10 && <0.11
, case-insensitive >=1.2 && <1.3
, clock >=0.7 && <0.9
, data-default-class >=0.0 && <0.2
, hspec >=2.5.6 && <2.8
, http-client >=0.4.30 && <0.8
, http-media >=0.6 && <0.9
, http-types >=0.8 && <0.13
, mtl >=2.1 && <2.3
, pretty >=1.1 && <1.2
, process >=1.2 && <1.7
, QuickCheck >=2.7 && <2.15
, servant >=0.17 && <0.19
, servant-client >=0.17 && <0.19
, servant-server >=0.17 && <0.19
, split >=0.2 && <0.3
, string-conversions >=0.3 && <0.5
, temporary >=1.2 && <1.4
, text >=1 && <2
, time >=1.5 && <1.11
, warp >=3.2.4 && <3.4
hs-source-dirs: src if !impl(ghc >=8.0)
default-extensions: TypeOperators build-depends: semigroups >=0.18.3 && <0.20
, FlexibleInstances
, FlexibleContexts hs-source-dirs: src
, DataKinds default-extensions:
, GADTs NoImplicitPrelude
, MultiParamTypeClasses ConstraintKinds
, DeriveFunctor DataKinds
, KindSignatures DeriveDataTypeable
, RankNTypes DeriveFunctor
, ConstraintKinds DeriveGeneric
, DeriveGeneric FlexibleContexts
, ScopedTypeVariables FlexibleInstances
, OverloadedStrings FunctionalDependencies
, FunctionalDependencies GADTs
, NoImplicitPrelude KindSignatures
, DeriveDataTypeable MultiParamTypeClasses
default-language: Haskell2010 OverloadedStrings
RankNTypes
ScopedTypeVariables
TypeOperators
default-language: Haskell2010
test-suite spec test-suite spec
type: exitcode-stdio-1.0 type: exitcode-stdio-1.0
ghc-options: -Wall -threaded ghc-options: -Wall -threaded
default-language: Haskell2010 default-language: Haskell2010
hs-source-dirs: test hs-source-dirs: test
main-is: Spec.hs main-is: Spec.hs
other-modules: Servant.QuickCheck.InternalSpec other-modules: Servant.QuickCheck.InternalSpec
build-tool-depends: hspec-discover:hspec-discover build-tool-depends: hspec-discover:hspec-discover -any
build-depends: base build-depends:
, base-compat-batteries aeson
, aeson , base
, servant-quickcheck , base-compat-batteries
, bytestring , blaze-html
, hspec , bytestring
, hspec-core , hspec
, http-client , hspec-core >=2.5.5 && <2.8
, blaze-html , http-client
, warp , QuickCheck
, servant-server , quickcheck-io
, servant-client , servant
, servant , servant-blaze
, servant-blaze , servant-client
, transformers , servant-quickcheck
, QuickCheck , servant-server
, quickcheck-io , transformers
default-extensions: TypeOperators , warp
, FlexibleInstances
, FlexibleContexts default-extensions:
, GADTs NoImplicitPrelude
, DataKinds DataKinds
, NoImplicitPrelude FlexibleContexts
, OverloadedStrings FlexibleInstances
, ScopedTypeVariables GADTs
OverloadedStrings
ScopedTypeVariables
TypeOperators
if flag(long-tests) if flag(long-tests)
cpp-options: -DLONG_TESTS cpp-options: -DLONG_TESTS
test-suite example test-suite example
type: exitcode-stdio-1.0 type: exitcode-stdio-1.0
main-is: Main.hs main-is: Main.hs
hs-source-dirs: hs-source-dirs: example
example ghc-options: -Wall
ghc-options: -Wall
build-depends: build-depends:
base base
, hspec , hspec
, servant-server
, servant-quickcheck , servant-quickcheck
, servant-server
, text , text
default-language: Haskell2010 default-language: Haskell2010

View File

@ -63,18 +63,14 @@ instance (KnownSymbol path, HasGenRequest b) => HasGenRequest (path :> b) where
(oldf, old) = genRequest (Proxy :: Proxy b) (oldf, old) = genRequest (Proxy :: Proxy b)
new = cs $ symbolVal (Proxy :: Proxy path) new = cs $ symbolVal (Proxy :: Proxy path)
#if MIN_VERSION_servant(0,11,0)
instance HasGenRequest EmptyAPI where instance HasGenRequest EmptyAPI where
genRequest _ = (0, error "EmptyAPIs cannot be queried.") genRequest _ = (0, error "EmptyAPIs cannot be queried.")
#endif
#if MIN_VERSION_servant(0,12,0)
instance HasGenRequest api => HasGenRequest (Summary d :> api) where instance HasGenRequest api => HasGenRequest (Summary d :> api) where
genRequest _ = genRequest (Proxy :: Proxy api) genRequest _ = genRequest (Proxy :: Proxy api)
instance HasGenRequest api => HasGenRequest (Description d :> api) where instance HasGenRequest api => HasGenRequest (Description d :> api) where
genRequest _ = genRequest (Proxy :: Proxy api) genRequest _ = genRequest (Proxy :: Proxy api)
#endif
instance (Arbitrary c, HasGenRequest b, ToHttpApiData c ) instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
=> HasGenRequest (Capture' mods x c :> b) where => HasGenRequest (Capture' mods x c :> b) where
@ -86,7 +82,6 @@ instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
(oldf, old) = genRequest (Proxy :: Proxy b) (oldf, old) = genRequest (Proxy :: Proxy b)
new = arbitrary :: Gen c new = arbitrary :: Gen c
#if MIN_VERSION_servant(0,8,0)
instance (Arbitrary c, HasGenRequest b, ToHttpApiData c ) instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
=> HasGenRequest (CaptureAll x c :> b) where => HasGenRequest (CaptureAll x c :> b) where
genRequest _ = (oldf, do genRequest _ = (oldf, do
@ -97,7 +92,6 @@ instance (Arbitrary c, HasGenRequest b, ToHttpApiData c )
where where
(oldf, old) = genRequest (Proxy :: Proxy b) (oldf, old) = genRequest (Proxy :: Proxy b)
new = arbitrary :: Gen [c] new = arbitrary :: Gen [c]
#endif
instance (Arbitrary c, KnownSymbol h, HasGenRequest b, ToHttpApiData c) instance (Arbitrary c, KnownSymbol h, HasGenRequest b, ToHttpApiData c)
=> HasGenRequest (Header' mods h c :> b) where => HasGenRequest (Header' mods h c :> b) where
@ -174,6 +168,15 @@ instance (ReflectMethod method)
, method = reflectMethod (Proxy :: Proxy method) , method = reflectMethod (Proxy :: Proxy method)
}) })
instance (ReflectMethod method)
=> HasGenRequest (NoContentVerb (method :: k)) where
genRequest _ = (1, return $ \burl -> defaultRequest
{ host = cs $ baseUrlHost burl
, port = baseUrlPort burl
, secure = baseUrlScheme burl == Https
, method = reflectMethod (Proxy :: Proxy method)
})
instance (HasGenRequest a) => HasGenRequest (RemoteHost :> a) where instance (HasGenRequest a) => HasGenRequest (RemoteHost :> a) where
genRequest _ = genRequest (Proxy :: Proxy a) genRequest _ = genRequest (Proxy :: Proxy a)

View File

@ -84,15 +84,13 @@ notLongerThan maxAllowed
-- /Since 0.0.0.0/ -- /Since 0.0.0.0/
onlyJsonObjects :: ResponsePredicate onlyJsonObjects :: ResponsePredicate
onlyJsonObjects onlyJsonObjects
= ResponsePredicate (\resp -> case go resp of = ResponsePredicate (\resp -> do
Nothing -> throw $ PredicateFailure "onlyJsonObjects" Nothing resp case lookup "content-type" (first foldedCase <$> responseHeaders resp) of
Just () -> return ()) Nothing -> return ()
where Just ctype -> when ("application/json" `SBS.isPrefixOf` ctype) $ do
go r = do case (decode (responseBody resp) :: Maybe Object) of
ctyp <- lookup "content-type" (first foldedCase <$> responseHeaders r) Nothing -> throw $ PredicateFailure "onlyJsonObjects" Nothing resp
when ("application/json" `SBS.isPrefixOf` ctyp) $ do Just _ -> return ())
(_ :: Object) <- decode (responseBody r)
return ()
-- | __Optional__ -- | __Optional__
-- --
@ -189,14 +187,15 @@ getsHaveLastModifiedHeader
notAllowedContainsAllowHeader :: RequestPredicate notAllowedContainsAllowHeader :: RequestPredicate
notAllowedContainsAllowHeader notAllowedContainsAllowHeader
= RequestPredicate $ \req mgr -> do = RequestPredicate $ \req mgr -> do
resp <- mapM (flip httpLbs mgr) $ [ req { method = renderStdMethod m } let reqs = [ req { method = renderStdMethod m } | m <- [minBound .. maxBound]
| m <- [minBound .. maxBound ] , renderStdMethod m /= method req ]
, renderStdMethod m /= method req ] resp <- mapM (flip httpLbs mgr) reqs
case filter pred' resp of
(x:_) -> throw $ PredicateFailure "notAllowedContainsAllowHeader" (Just req) x case filter pred' (zip reqs resp) of
(x:_) -> throw $ PredicateFailure "notAllowedContainsAllowHeader" (Just $ fst x) (snd x)
[] -> return resp [] -> return resp
where where
pred' resp = responseStatus resp == status405 && not (hasValidHeader "Allow" go resp) pred' (_, resp) = responseStatus resp == status405 && not (hasValidHeader "Allow" go resp)
where where
go x = all (\y -> isRight $ parseMethod $ SBSC.pack y) go x = all (\y -> isRight $ parseMethod $ SBSC.pack y)
$ wordsBy (`elem` (", " :: [Char])) (SBSC.unpack x) $ wordsBy (`elem` (", " :: [Char])) (SBSC.unpack x)

View File

@ -11,6 +11,9 @@ import Network.Wai.Handler.Warp (withApplication)
import Prelude.Compat import Prelude.Compat
import Servant (Context (EmptyContext), HasServer, import Servant (Context (EmptyContext), HasServer,
Server, serveWithContext) Server, serveWithContext)
#if MIN_VERSION_servant_server(0,18,0)
import Servant (DefaultErrorFormatters, ErrorFormatters, HasContextEntry, type (.++))
#endif
import Servant.Client (BaseUrl (..), Scheme (..)) import Servant.Client (BaseUrl (..), Scheme (..))
import System.IO.Unsafe (unsafePerformIO) import System.IO.Unsafe (unsafePerformIO)
import Test.Hspec (Expectation, expectationFailure) import Test.Hspec (Expectation, expectationFailure)
@ -37,7 +40,11 @@ withServantServer api = withServantServerAndContext api EmptyContext
-- application. -- application.
-- --
-- /Since 0.0.0.0/ -- /Since 0.0.0.0/
#if MIN_VERSION_servant_server(0,18,0)
withServantServerAndContext :: (HasServer a ctx, HasContextEntry (ctx .++ DefaultErrorFormatters) ErrorFormatters)
#else
withServantServerAndContext :: HasServer a ctx withServantServerAndContext :: HasServer a ctx
#endif
=> Proxy a -> Context ctx -> IO (Server a) -> (BaseUrl -> IO r) -> IO r => Proxy a -> Context ctx -> IO (Server a) -> (BaseUrl -> IO r) -> IO r
withServantServerAndContext api ctx server t withServantServerAndContext api ctx server t
= withApplication (return . serveWithContext api ctx =<< server) $ \port -> = withApplication (return . serveWithContext api ctx =<< server) $ \port ->
@ -92,7 +99,10 @@ serversEqual api burl1 burl2 args req = do
expectationFailure $ "We failed to record a reason for failure: " <> show r expectationFailure $ "We failed to record a reason for failure: " <> show r
GaveUp { numTests = n } -> expectationFailure $ "Gave up after " ++ show n ++ " tests" GaveUp { numTests = n } -> expectationFailure $ "Gave up after " ++ show n ++ " tests"
NoExpectedFailure {} -> expectationFailure "No expected failure" NoExpectedFailure {} -> expectationFailure "No expected failure"
#if MIN_VERSION_QuickCheck(2,12,0)
#else
InsufficientCoverage {} -> expectationFailure "Insufficient coverage" InsufficientCoverage {} -> expectationFailure "Insufficient coverage"
#endif
-- | Check that a server satisfies the set of properties specified. -- | Check that a server satisfies the set of properties specified.
-- --
@ -145,7 +155,10 @@ serverSatisfiesMgr api manager burl args preds = do
expectationFailure $ "We failed to record a reason for failure: " <> show r expectationFailure $ "We failed to record a reason for failure: " <> show r
GaveUp { numTests = n } -> expectationFailure $ "Gave up after " ++ show n ++ " tests" GaveUp { numTests = n } -> expectationFailure $ "Gave up after " ++ show n ++ " tests"
NoExpectedFailure {} -> expectationFailure $ "No expected failure" NoExpectedFailure {} -> expectationFailure $ "No expected failure"
InsufficientCoverage {} -> expectationFailure $ "Insufficient coverage" #if MIN_VERSION_QuickCheck(2,12,0)
#else
InsufficientCoverage {} -> expectationFailure "Insufficient coverage"
#endif
serverDoesntSatisfy :: (HasGenRequest a) => serverDoesntSatisfy :: (HasGenRequest a) =>
Proxy a -> BaseUrl -> Args -> Predicates -> Expectation Proxy a -> BaseUrl -> Args -> Predicates -> Expectation
@ -163,7 +176,10 @@ serverDoesntSatisfyMgr api manager burl args preds = do
GaveUp { numTests = n } -> expectationFailure $ "Gave up after " ++ show n ++ " tests" GaveUp { numTests = n } -> expectationFailure $ "Gave up after " ++ show n ++ " tests"
Failure { output = m } -> expectationFailure $ "Failed:\n" ++ show m Failure { output = m } -> expectationFailure $ "Failed:\n" ++ show m
NoExpectedFailure {} -> expectationFailure $ "No expected failure" NoExpectedFailure {} -> expectationFailure $ "No expected failure"
InsufficientCoverage {} -> expectationFailure $ "Insufficient coverage" #if MIN_VERSION_QuickCheck(2,12,0)
#else
InsufficientCoverage {} -> expectationFailure "Insufficient coverage"
#endif
noCheckStatus :: C.Request -> C.Request noCheckStatus :: C.Request -> C.Request
#if MIN_VERSION_http_client(0,5,0) #if MIN_VERSION_http_client(0,5,0)

View File

@ -1,14 +1,10 @@
resolver: lts-11.8 resolver: nightly-2018-09-03
packages: packages:
- '.' - '.'
extra-deps: extra-deps:
- base-compat-batteries-0.10.1 - hspec-discover-2.5.6
- base-compat-0.10.1 - hspec-core-2.5.6
- hspec-discover-2.5.0 - hspec-2.5.6
- hspec-core-2.5.0 - QuickCheck-2.12
- hspec-2.5.0
# aeson pre-1.3.1.0 has an upper bound on `base-compat-batteries` that preclude
# the 0.10.1 that we depend on
- aeson-1.3.1.0
flags: {} flags: {}
extra-package-dbs: [] extra-package-dbs: []

View File

@ -23,12 +23,7 @@ import Test.QuickCheck.Gen (generate, unGen)
import Test.QuickCheck.Random (mkQCGen) import Test.QuickCheck.Random (mkQCGen)
#if MIN_VERSION_servant(0,8,0) import Servant.Test.ComprehensiveAPI (comprehensiveAPIWithoutStreamingOrRaw)
import Servant.API.Internal.Test.ComprehensiveAPI (comprehensiveAPIWithoutRaw)
#else
import Servant.API.Internal.Test.ComprehensiveAPI (ComprehensiveAPI,
comprehensiveAPI)
#endif
import Servant.QuickCheck import Servant.QuickCheck
import Servant.QuickCheck.Internal (genRequest, runGenRequest, import Servant.QuickCheck.Internal (genRequest, runGenRequest,
@ -133,6 +128,10 @@ onlyJsonObjectSpec = describe "onlyJsonObjects" $ do
withServantServerAndContext octetAPI ctx serverOctetAPI $ \burl -> withServantServerAndContext octetAPI ctx serverOctetAPI $ \burl ->
serverSatisfies octetAPI burl args (onlyJsonObjects <%> mempty) serverSatisfies octetAPI burl args (onlyJsonObjects <%> mempty)
it "does not fail when there is no content-type" $ do
withServantServerAndContext api2 ctx serverFailing $ \burl ->
serverSatisfies api2 burl args (onlyJsonObjects <%> mempty)
notLongerThanSpec :: Spec notLongerThanSpec :: Spec
notLongerThanSpec = describe "notLongerThan" $ do notLongerThanSpec = describe "notLongerThan" $ do
@ -150,7 +149,7 @@ isComprehensiveSpec :: Spec
isComprehensiveSpec = describe "HasGenRequest" $ do isComprehensiveSpec = describe "HasGenRequest" $ do
it "has instances for all 'servant' combinators" $ do it "has instances for all 'servant' combinators" $ do
let _g = genRequest comprehensiveAPIWithoutRaw let _g = genRequest comprehensiveAPIWithoutStreamingOrRaw
True `shouldBe` True -- This is a type-level check True `shouldBe` True -- This is a type-level check
deepPathSpec :: Spec deepPathSpec :: Spec
@ -274,6 +273,9 @@ server2 = return $ return 1
server3 :: IO (Server API2) server3 :: IO (Server API2)
server3 = return $ return 2 server3 = return $ return 2
serverFailing :: IO (Server API2)
serverFailing = return . throwError $ err405
-- With Doctypes -- With Doctypes
type HtmlDoctype = Get '[HTML] Blaze.Html type HtmlDoctype = Get '[HTML] Blaze.Html
@ -367,8 +369,3 @@ noOfTestCases = 20000
#else #else
noOfTestCases = 1000 noOfTestCases = 1000
#endif #endif
#if !MIN_VERSION_servant(0,8,0)
comprehensiveAPIWithoutRaw :: Proxy ComprehensiveAPI
comprehensiveAPIWithoutRaw = comprehensiveAPI
#endif