Link - Dual

Setup

defmodule Foo do
  use(Mazurka.Resource)

  param(foo)

  mediatype(Hyper) do
    action() do
      %{"foo" => foo}
    end
  end
end
defmodule Bar do
  use(Mazurka.Resource)

  param(bar)

  mediatype(Hyper) do
    action() do
      link = Foo
      %{"bar" => bar, "foo" => link_to(Foo, %{"foo" => bar <> bar}), "baz" => link_to(link, %{"foo" => bar})}
    end
  end
end

Foo.action

{body, content_type, _} = Foo.action([], %{"foo" => "123"}, %{}, %{}, Router)
%{"foo" => "123", "href" => "/foo/123"} == body
{"application", "json", %{}} = content_type

Foo.affordance

{body, content_type} = Foo.affordance([], %{"foo" => "123"}, %{}, %{}, Router)
%{"href" => "/foo/123"} == body
{"application", "json", %{}} == content_type

Bar.action

{body, content_type, _} = Bar.action([], %{"bar" => "123"}, %{}, %{}, Router)
%{"bar" => "123", "foo" => %{"href" => "/foo/123123"}, "baz" => %{"href" => "/foo/123"}, "href" => "/bar/123"} == body
{"application", "json", %{}} == content_type

Bar.affordance

{body, content_type} = Bar.affordance([], %{"bar" => "123"}, %{}, %{}, Router)
%{"action" => "/bar/123", "method" => "POST", "input" => %{}} = body
{"application", "json", %{}} == content_type

Bar.action missing router

assert_raise(Mazurka.MissingRouterException, fn -> Bar.action([], %{"bar" => "123"}, %{}, %{}) end)

Bar.affordance missing router

assert_raise(Mazurka.MissingRouterException, fn -> Bar.affordance([], %{"bar" => "123"}, %{}, %{}) end)