README.md

# Artem

## [![Hex pm](http://img.shields.io/hexpm/v/artem.svg?style=flat)](https://hex.pm/packages/artem) [![Hex Docs](https://img.shields.io/badge/hex-docs-9768d1.svg)](https://hexdocs.pm/artem) [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)![.github/workflows/elixir.yml](https://github.com/maartenvanvliet/artem/workflows/.github/workflows/elixir.yml/badge.svg)

---

Library to help testing Absinthe graphql queries.

It has several features to aid in testing:

- precompile queries during compile time
- use sigils for less verbose syntax
- generates functions for named graphql operations

## Installation

The package can be installed
by adding `artem` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:artem, "~> 1.0.0"}
  ]
end
```

## Usage

Add the `Artem` module with the `use` clause. You'll need to
supply the `schema:` option with the Absinthe schema under test.

```elixir
defmodule ArtemTest do
  use ExUnit.Case

  use Artem, schema: Your.Absinthe.Schema
end
```

Now you get access to the macros supplied by Artem. There are a couple of ways
to use them

### Sigils

The first approach is using sigils

```elixir
defmodule ArtemTest do
  #...
  @version_query ~q"
    query {
      version
    }
  "
  test "run query" do
    assert {:ok, %{data: %{"version" => "201008"}}} == Artem.run(@version_query)
  end

```

This precompiles the document into the `@version_query` module attribute. If you run
this document multiple times in your tests you'll only have to run the static parts
(parsing/some validation) of the document once. This can also be used outside of testing,
if your app relies on internal graphql queries for example.

### Generated functions

The second approach builds on this but when your graphql operations are named
they are compiled into functions you can call.

```elixir
defmodule ArtemTest do
  #...
  ~q"
    query MyTest($format: String{
      datetime(format: $format)
    }
  "

  test "run query" do
    assert {:ok, %{data: %{"datetime" => "201008"}}} ==
            my_test(variables: %{format: "YYMMDD"}, context: %{current_user_id: 1})
  end

```

You can pass in the variables/context into the function.

Note that the name of the function is snake_cased from the camelized name of
the operation.

### precompile/2

The third way is using the precompile/2 macro

```elixir
defmodule ArtemTest do
  #...
  @query precompile("
    query {
      version
    }
  ")

  test "run query" do
    assert {:ok, %{data: %{"version" => "201008"}}} == Artem.run(@query)
  end

```

The sigil is syntactic sugar for calling the precompile macro. You can
use this for more direct control over this process, allowing easier
composability.

Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at [https://hexdocs.pm/artem](https://hexdocs.pm/artem).