Adam Millerchip
7915b6d4ed
I originally developed this as an employee under the assumption that this would be released as an official SDK maintained by the company. But this is not the case, so I'm resetting the history to develop this in a personal capacity. This commit represents the progress until now.
241 lines
6.9 KiB
Elixir
241 lines
6.9 KiB
Elixir
Mox.defmock(MockAPIClient, for: HTTPoison.Base)
|
|
Mox.defmock(MockTokenServer, for: LineBot.TokenServer.Behaviour)
|
|
|
|
defmodule LineBot.TestHelpers do
|
|
defmacro test_get_with_status(function, uri, args, params, status, status_atom) do
|
|
quote do
|
|
test "when get response is #{unquote(status)}" do
|
|
expect(MockAPIClient, :get, fn unquote(uri), [], params: unquote(params) ->
|
|
{:ok, %{status_code: unquote(status), body: "body"}}
|
|
end)
|
|
|
|
assert {unquote(status_atom), "body"} == apply(LineBot, unquote(function), unquote(args))
|
|
end
|
|
end
|
|
end
|
|
|
|
defmacro test_get_for(function, uri, args, params) do
|
|
quote do
|
|
describe Atom.to_string(unquote(function)) do
|
|
test_get_with_status(
|
|
unquote(function),
|
|
unquote(uri),
|
|
unquote(args),
|
|
unquote(params),
|
|
200,
|
|
:ok
|
|
)
|
|
|
|
test_get_with_status(
|
|
unquote(function),
|
|
unquote(uri),
|
|
unquote(args),
|
|
unquote(params),
|
|
401,
|
|
:unauthorized
|
|
)
|
|
|
|
test_get_with_status(
|
|
unquote(function),
|
|
unquote(uri),
|
|
unquote(args),
|
|
unquote(params),
|
|
403,
|
|
:forbidden
|
|
)
|
|
|
|
test_get_with_status(
|
|
unquote(function),
|
|
unquote(uri),
|
|
unquote(args),
|
|
unquote(params),
|
|
404,
|
|
:not_found
|
|
)
|
|
|
|
test_get_with_status(
|
|
unquote(function),
|
|
unquote(uri),
|
|
unquote(args),
|
|
unquote(params),
|
|
429,
|
|
:too_many_requests
|
|
)
|
|
|
|
test_get_with_status(
|
|
unquote(function),
|
|
unquote(uri),
|
|
unquote(args),
|
|
unquote(params),
|
|
500,
|
|
:server_error
|
|
)
|
|
|
|
test "when error occurs during post" do
|
|
error = %HTTPoison.Error{reason: "test error"}
|
|
|
|
expect(MockAPIClient, :get, fn unquote(uri), [], params: unquote(params) ->
|
|
{:error, error}
|
|
end)
|
|
|
|
assert {:error, error} == apply(LineBot, unquote(function), unquote(args))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
defmacro expect_post_status(uri, status) do
|
|
quote do
|
|
expect(MockAPIClient, :post, fn unquote(uri), data ->
|
|
{:ok, %{status_code: unquote(status), body: data}}
|
|
end)
|
|
end
|
|
end
|
|
|
|
defmacro test_post_msg_with_status(function, uri, to, status, status_atom) do
|
|
quote do
|
|
test "when post response is #{unquote(status)}", %{data: data} do
|
|
expect_post_status(unquote(uri), unquote(status))
|
|
args = [["message"], "disabled"]
|
|
args = if unquote(to), do: [unquote(to) | args], else: args
|
|
assert {unquote(status_atom), data} == apply(LineBot, unquote(function), args)
|
|
end
|
|
end
|
|
end
|
|
|
|
defmacro test_post_msg(function, uri, to, data) do
|
|
quote do
|
|
describe Atom.to_string(unquote(function)) do
|
|
setup do
|
|
%{data: unquote(data)}
|
|
end
|
|
|
|
test_post_msg_with_status(unquote(function), unquote(uri), unquote(to), 200, :ok)
|
|
|
|
test_post_msg_with_status(
|
|
unquote(function),
|
|
unquote(uri),
|
|
unquote(to),
|
|
401,
|
|
:unauthorized
|
|
)
|
|
|
|
test_post_msg_with_status(unquote(function), unquote(uri), unquote(to), 403, :forbidden)
|
|
test_post_msg_with_status(unquote(function), unquote(uri), unquote(to), 404, :not_found)
|
|
|
|
test_post_msg_with_status(
|
|
unquote(function),
|
|
unquote(uri),
|
|
unquote(to),
|
|
429,
|
|
:too_many_requests
|
|
)
|
|
|
|
test_post_msg_with_status(
|
|
unquote(function),
|
|
unquote(uri),
|
|
unquote(to),
|
|
500,
|
|
:server_error
|
|
)
|
|
|
|
test "when error occurs during post" do
|
|
error = %HTTPoison.Error{reason: "test error"}
|
|
expect(MockAPIClient, :post, fn unquote(uri), _data -> {:error, error} end)
|
|
|
|
args = [["message"], "disabled"]
|
|
args = if unquote(to), do: [unquote(to) | args], else: args
|
|
assert {:error, error} == apply(LineBot, unquote(function), args)
|
|
end
|
|
|
|
test "notification_disabled defaults to false" do
|
|
expect(MockAPIClient, :post, fn unquote(uri), data ->
|
|
{:ok, %{status_code: 200, body: data}}
|
|
end)
|
|
|
|
args = [["message"]]
|
|
args = if unquote(to), do: [unquote(to) | args], else: args
|
|
|
|
assert {:ok, %{"notificationDisabled" => false}} =
|
|
apply(LineBot, unquote(function), args)
|
|
|
|
expect(MockAPIClient, :post, fn unquote(uri), data ->
|
|
{:ok, %{status_code: 200, body: data}}
|
|
end)
|
|
|
|
args = [["message"], true]
|
|
args = if unquote(to), do: [unquote(to) | args], else: args
|
|
|
|
assert {:ok, %{"notificationDisabled" => true}} =
|
|
apply(LineBot, unquote(function), args)
|
|
end
|
|
|
|
test "single message is converted to single-element list" do
|
|
expect(MockAPIClient, :post, fn unquote(uri), data ->
|
|
{:ok, %{status_code: 200, body: data}}
|
|
end)
|
|
|
|
args = ["message"]
|
|
args = if unquote(to), do: [unquote(to) | args], else: args
|
|
|
|
assert {:ok, %{"messages" => ["message"]}} = apply(LineBot, unquote(function), args)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
defmacro test_post_uri_with_status(function, uri, arg, status, status_atom) do
|
|
quote do
|
|
test "when post response is #{unquote(status)}" do
|
|
data = %{}
|
|
expect_post_status(unquote(uri), unquote(status))
|
|
assert {unquote(status_atom), data} == apply(LineBot, unquote(function), [unquote(arg)])
|
|
end
|
|
end
|
|
end
|
|
|
|
# TODO remove this duplication by refactoring the macro to test try_post behaviour,
|
|
# and extracting the surrouding logic
|
|
defmacro test_post_uri(function, uri, arg) do
|
|
quote do
|
|
describe Atom.to_string(unquote(function)) do
|
|
test_post_uri_with_status(unquote(function), unquote(uri), unquote(arg), 200, :ok)
|
|
|
|
test_post_uri_with_status(
|
|
unquote(function),
|
|
unquote(uri),
|
|
unquote(arg),
|
|
401,
|
|
:unauthorized
|
|
)
|
|
|
|
test_post_uri_with_status(unquote(function), unquote(uri), unquote(arg), 403, :forbidden)
|
|
test_post_uri_with_status(unquote(function), unquote(uri), unquote(arg), 404, :not_found)
|
|
|
|
test_post_uri_with_status(
|
|
unquote(function),
|
|
unquote(uri),
|
|
unquote(arg),
|
|
429,
|
|
:too_many_requests
|
|
)
|
|
|
|
test_post_uri_with_status(
|
|
unquote(function),
|
|
unquote(uri),
|
|
unquote(arg),
|
|
500,
|
|
:server_error
|
|
)
|
|
|
|
test "when error occurs during post" do
|
|
error = %HTTPoison.Error{reason: "test error"}
|
|
expect(MockAPIClient, :post, fn unquote(uri), _data -> {:error, error} end)
|
|
assert {:error, error} == apply(LineBot, unquote(function), [unquote(arg)])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
ExUnit.start()
|