# Test That JSON!
Helpers for a better JSON testing experience in Elixir.
[![Build Status](https://travis-ci.org/facto/test_that_json.svg?branch=master)](https://travis-ci.org/facto/test_that_json)
[![Inline docs](http://inch-ci.org/github/facto/test_that_json.svg)](http://inch-ci.org/github/facto/test_that_json)
Using [ESpec](https://github.com/antonmi/espec)? Check out [test_that_json_espec](https://github.com/facto/test_that_json_espec).
## Docs
[All Docs](https://hexdocs.pm/test_that_json/api-reference.html)
For now, see the [`Json`](https://hexdocs.pm/test_that_json/TestThatJson.Json.html) module for docs for much of the API.
This project has an extensive test suite, so see that for detailed usage.
## Helpers
- [X] `has_json_keys`
- [X] `has_only_json_keys`
- [X] `has_json_values`
- [X] `has_only_json_values`
- [X] `has_json_properties`
- [X] `has_only_json_properties`
- [X] `has_json_path`
- [X] `has_json_size`
- [X] `has_json_type`
- [X] `is_json_equal`
- [X] `load_json`
- [X] `load_json!`
- [X] `parse_json`
- [X] `parse_json!`
- [X] `prettify_json`
- [X] `prettify_json!`
- [X] `to_json`
- [X] `to_json!`
- [X] `to_prettified_json`
- [X] `to_prettified_json!`
## Additional Functionality
- [ ] Helpers that return a boolean can optionally take a path
- [ ] Helpers can be composed together w/ the pipe |> operator
## Example
```elixir
defmodule MyProject.ExampleTest
use ExUnit.Case
import TestThatJson.Helpers
test "verifying JSON key presence" do
json = load_json("test/support/json/valid.json") # example helper use
assert has_json_keys(["key1", "key2"])
end
end
```
Test That JSON! has extensive tests, but they're mostly written as [ESpec](https://github.com/antonmi/espec) specs because I like that style for complex testing. See the `test` directory for some basic happy-path tests, and the `spec` directory for detailed use cases.
## Installation
1. Add `test_that_json` as a test-only dependency in `mix.exs`:
```elixir
def deps do
[
{:test_that_json, "~> 0.5.0", only: :test},
]
end
```
## Configuration
### Key Exclusion
By default, to avoid needing to know the values of these ahead of time, the following keys are ignored for all JSON objects: `id`, `inserted_at`, and `updated_at`.
This can be reconfigured as follows:
``` elixir
config :test_that_json,
excluded_keys: ~w(id inserted_at updated_at some other keys)
```
## Paths
These are simple strings of "/"-separated object keys and array indexes passed to `has_json_path`. For instance, with the following JSON:
``` json
{
"first_name": "Jon",
"last_name": "Snow",
"friends": [
{
"first_name": "Know",
"last_name": "Nothing"
}
]
}
```
We could access the first friend's first name with the path "friends/0/first_name".
## Project Chores
- [X] Tests
- [ ] Docs for entire helper API
## Related Projects
- [DockYard/json_api_assert](https://github.com/DockYard/json_api_assert)
- [jonasschmidt/ex_json_schema](https://github.com/jonasschmidt/ex_json_schema)
## Thanks
Thanks to the creators and maintainers of the [Ruby json_spec](https://github.com/collectiveidea/json_spec) project for heavy inspiration.
## Contributing
1. Before opening a pull request, please open an issue first.
2. Do the usual fork/add/fix/run tests dance, or whatever tickles your fancy. Tests are highly encouraged.
3. Open a PR.
4. Treat yourself. You deserve it.
## License
See the [LICENSE](LICENSE.md) file for license rights and limitations (MIT).