Packages
mazurka
0.2.7
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.3.39
0.3.38
0.3.37
0.3.36
0.3.35
0.3.34
0.3.33
0.3.32
0.3.31
0.3.30
0.3.29
0.3.28
0.3.27
0.3.26
0.3.25
0.3.24
0.3.23
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
hypermedia api toolkit
Current section
Files
Jump to
Current section
Files
lib/mazurka/resource/test.ex
defmodule Mazurka.Resource.Test do
defmacro test(name, [do: block]) do
meta = %{file: __CALLER__.file,
line: __CALLER__.line}
Mazurka.Compiler.Utils.register(__MODULE__, {name, block}, meta)
end
defmacro request([do: block]) do
if Mix.env == :test do
quote do
require Mazurka.Protocol.Request
conn = Mazurka.Protocol.Request.request __MODULE__ do
import Mazurka.Protocol.Request
unquote(block)
end
var!(__router__).request_call(conn, [])
end
end
end
def compile(_, _) do
nil
end
def compile_global(tests, env) do
do_compile(tests, env, Mix.env)
end
defp do_compile(_tests, _env, :dev) do
quote do
@doc false
defmacro tests(_) do
nil
end
end
end
defp do_compile(tests, env, _) do
module = env.module
definitions = Enum.map(tests, fn({{name, block}, _meta}) ->
quote do
def unquote(:"test #{name}")({_, var!(__router__)}, _) do
import Kernel
import Mazurka.Compiler.Kernel, only: []
import Mazurka.Resource.Test
import ExUnit.Assertions
unquote(block)
end
end
end)
tests = Enum.map(tests, fn({{name, _}, meta}) ->
{name, meta}
end)
quote do
@doc false
defmacro tests(router) do
router = Mazurka.Compiler.Utils.eval(router, __CALLER__)
Mazurka.Resource.Test.register_tests(router, unquote(module), unquote(Macro.escape(tests)))
end
unquote_splicing(definitions)
@doc false
def __ex_unit__(router, pass, context) do
{:ok, context}
end
end
end
def register_tests(router, module, tests) do
cases = Enum.map(tests, fn({name, meta}) ->
meta = Macro.escape(meta)
quote bind_quoted: [module: module, router: router, name: name, meta: meta] do
Mazurka.Resource.Test.Case.test module, router, name, meta
end
end)
test_ast = quote do
require Mazurka.Resource.Test.Case
unquote_splicing(cases)
end
Module.register_attribute(router, :mazurka_test, accumulate: true)
Module.put_attribute(router, :mazurka_test, test_ast)
nil
end
def get_tests(module) do
Module.get_attribute(module, :mazurka_test)
end
defmodule Case do
defmacro test(source, router, message, meta, var \\ quote(do: _)) do
var = Macro.escape(var)
quote bind_quoted: binding do
test = :"test #{message}"
Mazurka.Resource.Test.Case.__on_definition__(__ENV__, test, source, router, meta)
end
end
def __on_definition__(env, name, source, router, additional_tags) do
mod = env.module
tags = Module.get_attribute(mod, :tag) ++ Module.get_attribute(mod, :moduletag)
tags = tags |> normalize_tags |> Dict.merge(additional_tags)
Module.put_attribute(mod, :ex_unit_tests,
%ExUnit.Test{name: name, case: {source, router}, tags: tags})
Module.delete_attribute(mod, :tag)
end
defp normalize_tags(tags) do
Enum.reduce Enum.reverse(tags), %{}, fn
tag, acc when is_atom(tag) -> Map.put(acc, tag, true)
tag, acc when is_list(tag) -> Dict.merge(acc, tag)
end
end
end
end