Packages

Helpers/Assertions for Absinthe

Current section

Files

Jump to
anise lib subscription_case.ex
Raw

lib/subscription_case.ex

defmodule Anise.SubscriptionCase do
@moduledoc """
Conveniences for testing Absinthe subscriptions
# Usage
## Setup
You need to use `use` macro, and pass required options.
```elixir
@endpoint MyAppWeb.Endpoint
use Anise.SubscriptionCase,
schema: MyAppWeb.Schema,
socket: MyAppWeb.UserSocket
```
Example above is from application specific SubscriptionCase, like ones that Phoenix generates.
## Usage
```elixir
test "sub with fufilment", %{socket: socket, conn: conn} do
assert %{
payload: %{subscriptionId: sub_id},
status: :ok
} = subscribe(socket, @subscription)
graphql(conn, "/api", @mutation, %{email: "test@example.com", name: "Boris"})
assert subscription_fulfilment = %{
result: %{data: %{"userAdded" => %{"name" => "Boris"}}}
}
end
```
"""
use ExUnit.CaseTemplate
alias Absinthe.Phoenix.SubscriptionTest
using(opts) do
quote do
use Phoenix.ConnTest
use Phoenix.ChannelTest
# validates schema and import base absinthe testings functions
use Absinthe.Phoenix.SubscriptionTest,
schema: Keyword.get(unquote(opts), :schema)
setup do
# connects to socket
{:ok, socket} =
Phoenix.ChannelTest.connect(
Keyword.get(unquote(opts), :socket),
Keyword.get(unquote(opts), :socket_params) || %{}
)
# Join socket
{:ok, socket} = Absinthe.Phoenix.SubscriptionTest.join_absinthe(socket)
{:ok, socket: socket, conn: Phoenix.ConnTest.build_conn()}
end
import unquote(__MODULE__)
end
end
use Phoenix.ChannelTest
@doc false
def subscribe(socket, subscription_query) do
ref = SubscriptionTest.push_doc(socket, subscription_query)
Phoenix.ChannelTest.assert_reply(ref, :ok, _)
end
@doc """
When subscription fufiled it receives data from it.
## WARNING
Paylod are patterns, dont forget to pin variables!
### Exapmples
Good
```elixir
expected = %{result: %{data: %{"userAdded" => %{"name" => "Boris"}}}}
assert_subscription_fulfilment fufilment
assert fufilment = expected
```
Bad
```elixir
expected = %{result: %{data: %{"userAdded" => %{"name" => "Boris"}}}}
assert_subscription_fulfilment expected
```
"""
defmacro assert_subscription_fulfilment(expected) do
quote do
assert_push("subscription:data", unquote(expected))
end
end
@doc """
Same as assert_subscription_fulfilment but refute
"""
defmacro refute_subscription_fulfilment(expected) do
quote do
refute_push("subscription:data", unquote(expected))
end
end
end