hspec-expectations-json: Hspec expectations for JSON Values

[ library, mit, test ] [ Propose Tags ]

Hspec expectations for JSON Values

Comparing JSON Values in Haskell tests comes with some challenges:

  • In API responses, additive changes are typically safe and an important way to evolve responses without breaking clients. Therefore, assertions against such responses often want to ignore any unexpected keys in Objects (at any depth), as any clients would.

  • Order often doesn't matter in API responses either, so it should be possible to assert equality regardless of Array ordering (again, at any depth).

  • When an assertion fails, showing the difference clearly needs to take the above into account (i.e. it can't show keys you've ignored, or ordering differences you didn't care about), and it has to display things clearly, e.g. as a diff.

This library handles all these things.


[Skip to Readme]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 1.0.0.0, 1.0.0.1, 1.0.0.2, 1.0.0.3, 1.0.0.4, 1.0.0.5, 1.0.0.6, 1.0.0.7, 1.0.2.0, 1.0.2.1
Change log CHANGELOG.md
Dependencies aeson (>=1.3.1.1), aeson-pretty (>=0.8.7), base (>=4.11 && <5), Diff (>=0.3.4), HUnit (>=1.6.0.0), scientific (>=0.3.6.2), text (>=1.2.3.1), unordered-containers (>=0.2.9.0), vector (>=0.12.0.2) [details]
License MIT
Copyright 2020 Freckle Education
Author Freckle Engineering
Maintainer engineering@freckle.com
Category Test
Home page https://github.com/freckle/hspec-expectations-json#readme
Bug tracker https://github.com/freckle/hspec-expectations-json/issues
Source repo head: git clone https://github.com/freckle/hspec-expectations-json
Uploaded by PatrickBrisbin at 2023-11-01T18:26:17Z
Distributions LTSHaskell:1.0.2.1, NixOS:1.0.2.1, Stackage:1.0.2.1
Downloads 1902 total (49 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2023-11-01 [all 1 reports]

Readme for hspec-expectations-json-1.0.2.1

[back to package description]

Hspec Expectations for JSON Values

Hackage Stackage Nightly Stackage LTS CI

Comparing JSON Values in Haskell tests comes with some challenges:

  • In API responses, additive changes are typically safe and an important way to evolve responses without breaking clients. Therefore, assertions against such responses often want to ignore any unexpected keys in Objects (at any depth), as any clients would.

  • Order often doesn't matter in API responses either, so it should be possible to assert equality regardless of Array ordering (again, at any depth).

  • When an assertion fails, showing the difference clearly needs to take the above into account (i.e. it can't show keys you've ignored, or ordering differences you didn't care about), and it has to display things clearly, e.g. as a diff.

This library handles all these things.

Usage

NOTE: this is effectively a distillation of the Haddocks, please view them directly for your installed version, to ensure accurate information.

Four expectations exist with the following behaviors:

Assertion that fails on: extra Object keys wrong Array order
shouldBeJson Yes Yes
shouldBeUnorderedJson Yes No
shouldMatchJson No No
shouldMatchOrderedJson No Yes

Each of these, when they fail, print a difference between the objects, where the expected-on object has been normalized to avoid indicating any of the differences your expectation is ignoring.

shouldBeJson

Passing:

catchFailure $
  [aesonQQ| { "a": true, "b": false } |] `shouldBeJson`
  [aesonQQ| { "a": true, "b": false } |]

Failing:

catchFailure $
  [aesonQQ| { "a": true, "b": false } |] `shouldBeJson`
  [aesonQQ| { "a": true, "b": true  } |]
   {
       "a": true,
---    "b": true
+++    "b": false
   }

shouldBeUnorderedJson

Passing:

catchFailure $
  [aesonQQ| { "a": [true, false], "b": false } |] `shouldBeUnorderedJson`
  [aesonQQ| { "a": [false, true], "b": false } |]

Failing:

catchFailure $
  [aesonQQ| { "a": [true, false], "b": false, "c": true } |] `shouldBeUnorderedJson`
  [aesonQQ| { "a": [false, true], "b": true             } |]
   {
       "a": [
           false,
           true
       ],
---    "b": true
+++    "b": false,
+++    "c": true
   }

shouldMatchJson

Passing:

catchFailure $
  [aesonQQ| { "a": [true, false], "b": false, "c": true } |] `shouldMatchJson`
  [aesonQQ| { "a": [false, true], "b": false            } |]

Failing:

catchFailure $
  [aesonQQ| { "a": [true, false], "b": false, "c": true } |] `shouldMatchJson`
  [aesonQQ| { "a": [false, true], "b": true             } |]
   {
       "a": [
           false,
           true
       ],
---    "b": true
+++    "b": false
   }

shouldMatchOrderedJson

Passing:

catchFailure $
  [aesonQQ| { "a": [true, false], "b": false, "c": true } |] `shouldMatchOrderedJson`
  [aesonQQ| { "a": [true, false], "b": false            } |]

Failing:

catchFailure $
  [aesonQQ| { "a": [true, false], "b": false, "c": true } |] `shouldMatchOrderedJson`
  [aesonQQ| { "a": [false, true], "b": true             } |]
   {
       "a": [
---        false,
---        true
+++        true,
+++        false
       ],
---    "b": true
+++    "b": false
   }

LICENSE | CHANGELOG