Current section

Files

Jump to
xcribe lib xcribe document.ex
Raw

lib/xcribe/document.ex

defmodule Xcribe.Document do
@moduledoc """
Exposes document/2 macro to be used in test specs.
"""
alias Xcribe.{Config, ConnParser, Recorder}
@doc """
Document a request by a given `Plug.Conn`.
Each connection sent to documenting in your tests is parsed. Is expected that
connection has been passed through the app `Endpoint` as a finished request.
The parser will extract all needed info from `Conn` and uses app `Router`
for additional information about the request.
The attribute `description` may be given at `document` macro call with the
option `:as`:
test "test name", %{conn: conn} do
...
document(conn, as: "description here")
...
end
If no description is given the current test description will be used.
"""
defmacro document(conn, opts \\ []) do
test_description = __CALLER__.function |> elem(0) |> to_string
"test " <> suggest_from_test = test_description
meta =
Macro.escape(%{
call: %{description: test_description, file: __CALLER__.file, line: __CALLER__.line}
})
quote bind_quoted: [conn: conn, opts: opts, suggestion: suggest_from_test, meta: meta] do
options = Keyword.merge([as: suggestion], opts)
if Config.active?() do
conn
|> ConnParser.execute(Keyword.fetch!(options, :as))
|> Map.put(:__meta__, meta)
|> Recorder.save()
end
conn
end
end
end