# json_schema_test_suite

[![ci](https://github.com/macisamuele/json-schema-test-suite-rs/workflows/ci/badge.svg)](https://github.com/macisamuele/json-schema-test-suite-rs/actions)
[![codecov](https://codecov.io/gh/macisamuele/json-schema-test-suite-rs/branch/master/graph/badge.svg)](https://codecov.io/gh/macisamuele/json-schema-test-suite-rs)
[![Crates.io](https://img.shields.io/crates/v/json-schema-test-suite.svg)](https://crates.io/crates/json-schema-test-suite)
[![docs.rs](https://docs.rs/json_schema_test_suite/badge.svg)](https://docs.rs/json-schema-test-suite/)

The crate provides a procedural macro attribute that allow to generate all the test cases
described by [JSON-Schema-Test-Suite](https://github.com/json-schema-org/JSON-Schema-Test-Suite).

The main objective is to ensure that for each test a mock server is started and will be able to
capture all the requests, ensuring that tests can be ran only interacting with `cargo test`

In order to use the procedural macro attribute there are few assumptions that are made:

* [`lazy_static`](https://crates.io/crates/lazy_static) dependency is added into your `[dev-dependencies]`
  section of the `Cargo.toml` file
* [`mockito`](https://crates.io/crates/mockito) dependency is added into your `[dev-dependencies]`
  section of the `Cargo.toml` file
* [`serde-json`](https://crates.io/crates/serde-json) dependency is added into your `[dev-dependencies]`
  section of the `Cargo.toml` file
* the annotated method signature should be: `fn (&str, json_schema_test_suite::TestCase) -> ()`

## How to use

### Cargo.toml

```toml
# Ensure that the following lines are present into your Cargo.toml file
[dev-dependencies]
json_schema_test_suite = "0"
# Be careful with dependencies version (using `*` version is never recommended).
# The proc-macro uses nothing fancy with the dependencies, so any version should work well :)
lazy_static = "*"
mockito = "*"
serde_json = "*"
```

### Rust test file example

```rust
use json_schema_test_suite::{json_schema_test_suite, TestCase};

// If no tests should be ignored
#[json_schema_test_suite(
    // path separator is assumed to be `/` (regardless of the run platform)
    "path/to/JSON-Schema-Test-Suite/repository",
    // test directory (in <JSON-Schema-Test-Suite>/tests/<test_directory>)
    "draft7"
)]
// If some tests needs to be ignored, just defined them into `{ ... }` as follow
#[json_schema_test_suite(
    // path separator is assumed to be `/` (regardless of the run platform)
    "path/to/JSON-Schema-Test-Suite/repository",
    // test directory (in <JSON-Schema-Test-Suite>/tests/<test_directory>)
    "draft6",
    {   // Names, as generated by the macro, of the tests to ignore
        // NOTE: They can be regular expression as well.
        "name of the tests to ignore",
    }
)]
fn my_simple_test(
    // address of the HTTP server providing the remote files of JSON-Schema-Test-Suite.
    // The format will be: `hostname:port`.
    // This parameter is passed because by starting a mock server we might not start it
    // into `localhost:1234` as expected by JSON-Schema-Test-Suite
    server_address: &str,
    // Representation of the test case
    test_case: TestCase,
) {
    // TODO: Add here your testing logic
}
```

License: MIT
