Skip to content

Commit

Permalink
Merge pull request #19 from zhongwencool/test-mock
Browse files Browse the repository at this point in the history
use Mock for test
  • Loading branch information
secretworry committed Dec 18, 2016
2 parents bef6cc8 + ddc6f5f commit 08aab75
Show file tree
Hide file tree
Showing 17 changed files with 444 additions and 65 deletions.
4 changes: 2 additions & 2 deletions lib/maxwell/adapter/hackney.ex
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,11 @@ if Code.ensure_loaded?(:hackney) do
url |> Conn.append_query_string(path, query_string)
end
defp header_serialize(headers) do
headers |> Enum.map(&elem(&1, 1))
headers |> Map.values
end

defp format_response({:ok, status, headers, body}, conn) when is_binary(body) do
headers = for {key, value}<- headers, into: %{} do
headers = for {key, value} <- headers, into: %{} do
down_key = key |> to_string |> String.downcase
{down_key, {key, to_string(value)}}
end
Expand Down
12 changes: 6 additions & 6 deletions lib/maxwell/adapter/ibrowse.ex
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ if Code.ensure_loaded?(:ibrowse) do
[`ibrowse`](https://github.com/cmullaparthi/ibrowse) adapter
"""

@chunk_size 4*1024*1024
@chunk_size 4 * 1024 * 1024
use Maxwell.Adapter


Expand Down Expand Up @@ -78,12 +78,12 @@ if Code.ensure_loaded?(:ibrowse) do
url |> Conn.append_query_string(path, query_string) |> to_char_list
end
defp header_serialize(headers) do
headers |> Enum.map(&elem(&1, 1))
headers |> Map.values
end

defp format_response({:ok, status, headers, body}, conn) do
{status, _} = status |> to_string |> Integer.parse
headers = for {key, value}<- headers, into: %{} do
headers = for {key, value} <- headers, into: %{} do
down_key = key |> to_string |> String.downcase
{down_key, {key, to_string(value)}}
end
Expand Down Expand Up @@ -124,14 +124,14 @@ if Code.ensure_loaded?(:ibrowse) do
end
defp stream_iterate(next_stream_fun)when is_function(next_stream_fun, 1) do
case next_stream_fun.({:cont, nil}) do
{:suspended, elem, next_stream_fun} -> {:ok, elem, next_stream_fun}
{:suspended, item, next_stream_fun} -> {:ok, item, next_stream_fun}
{:halted, _} -> :eof
{:done, _} -> :eof
end
end
defp stream_iterate(stream) do
case Enumerable.reduce(stream, {:cont, nil}, fn(elem, nil) -> {:suspend, elem} end) do
{:suspended, elem, next_stream} -> {:ok, elem, next_stream}
case Enumerable.reduce(stream, {:cont, nil}, fn(item, nil)-> {:suspend, item} end) do
{:suspended, item, next_stream} -> {:ok, item, next_stream}
{:done, _} -> :eof
{:halted, _} -> :eof
end
Expand Down
3 changes: 2 additions & 1 deletion lib/maxwell/error.ex
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ defmodule Maxwell.Error do
defexception [:url, :status, :method, :reason, :message, :conn]

def exception({module, reason, conn}) do
%Maxwell.Conn{url: url, status: status, method: method} = conn
%Maxwell.Conn{url: url, status: status, method: method, path: path} = conn
message = """
url: #{url}
path: #{inspect path}
method: #{method}
status: #{status}
reason: #{inspect reason}
Expand Down
2 changes: 1 addition & 1 deletion lib/maxwell/middleware/header.ex
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ defmodule Maxwell.Middleware.Headers do

def init(headers) do
check_headers(headers)
Conn.put_req_header(%Conn{}, headers) |> Map.get(:req_headers)
%Conn{} |> Conn.put_req_header(headers) |> Map.get(:req_headers)
end

def request(conn, req_headers) do
Expand Down
1 change: 1 addition & 0 deletions mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ defmodule Maxwell.Mixfile do
{:cmark, "~> 0.6", only: [:dev]},
{:inch_ex, "~> 0.5.4", only: :docs},
{:credo, "~> 0.5", only: [:dev]},
{:mock, "~> 0.2.0", only: :test},
]
end

Expand Down
2 changes: 2 additions & 0 deletions mix.lock
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
"inch_ex": {:hex, :inch_ex, "0.5.5", "b63f57e281467bd3456461525fdbc9e158c8edbe603da6e3e4671befde796a3d", [:mix], [{:poison, "~> 1.5 or ~> 2.0 or ~> 3.0", [hex: :poison, optional: false]}]},
"jsx": {:hex, :jsx, "2.8.0", "749bec6d205c694ae1786d62cea6cc45a390437e24835fd16d12d74f07097727", [:mix, :rebar], []},
"markdown": {:git, "https://github.com/devinus/markdown.git", "38dc74c88d52fd7569ad4f63d32b344d35a7fcce", []},
"meck": {:hex, :meck, "0.8.4", "59ca1cd971372aa223138efcf9b29475bde299e1953046a0c727184790ab1520", [:make, :rebar], []},
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], []},
"mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], []},
"mock": {:hex, :mock, "0.2.0", "5991877be6bb514b647dbd6f4869bc12bd7f2829df16e86c98d6108f966d34d7", [:mix], [{:meck, "~> 0.8.2", [hex: :meck, optional: false]}]},
"poison": {:hex, :poison, "2.2.0", "4763b69a8a77bd77d26f477d196428b741261a761257ff1cf92753a0d4d24a63", [:mix], []},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:make, :rebar], []}}
4 changes: 2 additions & 2 deletions test/maxwell/adapter/adapter_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ defmodule MaxwellAdapterTest do
end

test "return :status 400" do
assert_raise(Maxwell.Error, "url: \nmethod: get\nstatus: 400\nreason: :response_status_not_match\nmodule: Elixir.MaxwellAdapterTest.Client\n",
assert_raise(Maxwell.Error, "url: \npath: \"\"\nmethod: get\nstatus: 400\nreason: :response_status_not_match\nmodule: Elixir.MaxwellAdapterTest.Client\n",
fn() -> %Conn{status: 100} |> Client.get! end)
end

Expand Down Expand Up @@ -93,7 +93,7 @@ defmodule MaxwellAdapterTest do
end

test "adapter not implement send_file/1" do
assert_raise Maxwell.Error, "url: http://example.com\nmethod: post\nstatus: \nreason: \"Elixir.MaxwellAdapterTest.TestAdapter Adapter doesn't implement send_file/1\"\nmodule: Elixir.MaxwellAdapterTest.TestAdapter\n", fn ->
assert_raise Maxwell.Error, "url: http://example.com\npath: \"/foo\"\nmethod: post\nstatus: \nreason: \"Elixir.MaxwellAdapterTest.TestAdapter Adapter doesn't implement send_file/1\"\nmodule: Elixir.MaxwellAdapterTest.TestAdapter\n", fn ->
"http://example.com"
|> new
|> put_path("/foo")
Expand Down
150 changes: 150 additions & 0 deletions test/maxwell/adapter/adapter_test_helper.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
defmodule Maxwell.Adapter.TestHelper do
defmacro __using__([adapter: adapter]) do
client = adapter |> Macro.expand(__CALLER__) |> Module.concat(TestClient)
quote location: :keep do
use ExUnit.Case, async: false
import Maxwell.Conn

defmodule unquote(client) do
use Maxwell.Builder
adapter unquote(adapter)

middleware Maxwell.Middleware.BaseUrl, "http://httpbin.org"
middleware Maxwell.Middleware.Opts, [connect_timeout: 5000]
middleware Maxwell.Middleware.Json

def get_ip_test() do
"/ip" |> put_path |> get!
end

def encode_decode_json_test(body) do
"/post"
|> put_path
|> put_req_body(body)
|> post!
|> get_resp_body("json")
end

def user_agent_test(user_agent) do
"/user-agent"
|> put_path
|> put_req_header("user-agent", user_agent)
|> get!
|> get_resp_body("user-agent")
end

def put_json_test(json) do
"/put"
|> put_path
|> put_req_body(json)
|> put!
|> get_resp_body("data")
end

def delete_test() do
"/delete"
|> put_path
|> delete!
|> get_resp_body("data")
end

def multipart_test() do
"/post"
|> put_path
|> put_req_body({:multipart, [{:file, "test/maxwell/multipart_test_file.sh"}]})
|> post!
end
def multipart_with_extra_header_test() do
"/post"
|> put_path
|> put_req_body({:multipart, [{:file, "test/maxwell/multipart_test_file.sh", [{"Content-Type", "image/jpeg"}]}]})
|> post!
end

def file_test(filepath) do
"/post"
|> put_path
|> put_req_body({:file, filepath})
|> post!
end

def file_test(filepath, content_type) do
"/post"
|> put_path
|> put_req_body({:file, filepath})
|> put_req_header("content-type", content_type)
|> post!
end

def stream_test() do
"/post"
|> put_path
|> put_req_header("content-type", "application/vnd.lotus-1-2-3")
|> put_req_header("content-length", 6)
|> put_req_body(Stream.map(["1", "2", "3"], fn(x) -> List.duplicate(x, 2) end))
|> post!
end
end

setup do
:random.seed(:erlang.phash2([node()]), :erlang.monotonic_time, :erlang.unique_integer)
:ok
end

test "sync request" do
assert unquote(client).get_ip_test |> get_status == 200
end

test "encode decode json test" do
result = %{"josnkey1" => "jsonvalue1", "josnkey2" => "jsonvalue2"} |> unquote(client).encode_decode_json_test
assert result == %{"josnkey1" => "jsonvalue1", "josnkey2" => "jsonvalue2"}

end

test "mutilpart body file" do
conn = unquote(client).multipart_test
assert get_resp_body(conn, "files") == %{"file" => "#!/usr/bin/env bash\necho \"test multipart file\"\n"}
end

test "mutilpart body file extra headers" do
conn = unquote(client).multipart_with_extra_header_test
assert get_resp_body(conn, "files") == %{"file" => "#!/usr/bin/env bash\necho \"test multipart file\"\n"}
end

test "send file without content-type" do
conn = unquote(client).file_test("test/maxwell/multipart_test_file.sh")
assert get_resp_body(conn, "data") == "#!/usr/bin/env bash\necho \"test multipart file\"\n"
end

test "send file with content-type" do
conn = unquote(client).file_test("test/maxwell/multipart_test_file.sh", "application/x-sh")
assert get_resp_body(conn, "data") == "#!/usr/bin/env bash\necho \"test multipart file\"\n"
end

test "send stream" do
conn = unquote(client).stream_test
assert get_resp_body(conn, "data") == "112233"
end

test "user-agent header test" do
assert "test" |> unquote(client).user_agent_test == "test"
end

test "/put" do
assert %{"key" => "value"} |> unquote(client).put_json_test == "{\"key\":\"value\"}"
end

test "/delete" do
assert unquote(client).delete_test == ""
end

test "Head without body(test return {:ok, status, header})" do
body = unquote(client).head! |> get_resp_body |> Kernel.to_string
assert body == ""
end
end

end

end

0 comments on commit 08aab75

Please sign in to comment.