Skip to content

Commit

Permalink
Populate query_params from Plug.Test.conn/3 (#1015)
Browse files Browse the repository at this point in the history
  • Loading branch information
chulkilee committed Mar 4, 2021
1 parent 64d9436 commit f24af6a
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 10 deletions.
23 changes: 13 additions & 10 deletions lib/plug/adapters/test/conn.ex
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ defmodule Plug.Adapters.Test.Conn do
query = uri.query || ""
owner = self()

{body, body_params, params, query, req_headers} =
{params, {body, body_params}, {query, query_params}, req_headers} =
body_or_params(body_or_params, query, conn.req_headers, method)

state = %{
Expand Down Expand Up @@ -43,6 +43,7 @@ defmodule Plug.Adapters.Test.Conn do
req_headers: req_headers,
request_path: uri.path,
query_string: query,
query_params: query_params || %Plug.Conn.Unfetched{aspect: :query_params},
body_params: body_params || %Plug.Conn.Unfetched{aspect: :body_params},
params: params || %Plug.Conn.Unfetched{aspect: :params},
scheme: (uri.scheme || "http") |> String.downcase() |> String.to_atom()
Expand Down Expand Up @@ -135,10 +136,10 @@ defmodule Plug.Adapters.Test.Conn do
end
end

defp body_or_params(nil, query, headers, _method), do: {"", nil, nil, query, headers}
defp body_or_params(nil, query, headers, _method), do: {nil, {"", nil}, {query, nil}, headers}

defp body_or_params(body, query, headers, _method) when is_binary(body) do
{body, nil, nil, query, headers}
{nil, {body, nil}, {query, nil}, headers}
end

defp body_or_params(params, query, headers, method) when is_list(params) do
Expand All @@ -149,25 +150,27 @@ defmodule Plug.Adapters.Test.Conn do
when is_map(params) and method in ["GET", "HEAD"] do
params = stringify_params(params, &to_string/1)

query = Plug.Conn.Query.decode(query)
params = Map.merge(query, params)
from_query = Plug.Conn.Query.decode(query)
params = Map.merge(from_query, params)

query =
params
|> Map.merge(query)
|> Map.merge(from_query)
|> Plug.Conn.Query.encode()

{"", nil, params, query, headers}
{params, {"", nil}, {query, params}, headers}
end

defp body_or_params(params, query, headers, _method) when is_map(params) do
content_type_header = {"content-type", "multipart/mixed; boundary=plug_conn_test"}
content_type = List.keyfind(headers, "content-type", 0, content_type_header)

headers = List.keystore(headers, "content-type", 0, content_type)

body_params = stringify_params(params, & &1)
params = Map.merge(Plug.Conn.Query.decode(query), body_params)
{"--plug_conn_test--", body_params, params, query, headers}
query_params = Plug.Conn.Query.decode(query)
params = Map.merge(query_params, body_params)

{params, {"--plug_conn_test--", body_params}, {query, query_params}, headers}
end

defp stringify_params([{_, _} | _] = params, value_fun),
Expand Down
9 changes: 9 additions & 0 deletions test/plug/adapters/test/conn_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -18,47 +18,56 @@ defmodule Plug.Adapters.Test.ConnTest do
conn = conn(:head, "/posts", page: 2)
assert conn.body_params == %Plug.Conn.Unfetched{aspect: :body_params}
assert conn.query_string == "page=2"
assert conn.query_params == conn.params
assert conn.params == %{"page" => "2"}
assert conn.req_headers == []

conn = conn(:get, "/", a: [b: 0, c: 5], d: [%{e: "f"}])
assert conn.body_params == %Plug.Conn.Unfetched{aspect: :body_params}
assert conn.query_string == "a[b]=0&a[c]=5&d[][e]=f"
assert conn.query_params == conn.params
assert conn.params == %{"a" => %{"b" => "0", "c" => "5"}, "d" => [%{"e" => "f"}]}

conn = conn(:get, "/?foo=bar", %{foo: "baz"})
assert conn.body_params == %Plug.Conn.Unfetched{aspect: :body_params}
assert conn.query_string == "foo=bar"
assert conn.query_params == conn.params
assert conn.params == %{"foo" => "baz"}

conn = conn(:get, "/?foo=bar", %{biz: "baz"})
assert conn.body_params == %Plug.Conn.Unfetched{aspect: :body_params}
assert conn.query_string == "biz=baz&foo=bar"
assert conn.query_params == conn.params
assert conn.params == %{"foo" => "bar", "biz" => "baz"}

conn = conn(:get, "/?f=g", a: "b", c: [d: "e"])
assert conn.body_params == %Plug.Conn.Unfetched{aspect: :body_params}
assert conn.query_string == "a=b&c[d]=e&f=g"
assert conn.query_params == conn.params
assert conn.params == %{"a" => "b", "c" => %{"d" => "e"}, "f" => "g"}

conn = conn(:get, "/", %{})
assert conn.body_params == %Plug.Conn.Unfetched{aspect: :body_params}
assert conn.query_string == ""
assert conn.query_params == conn.params
assert conn.params == %{}

conn = conn(:post, "/?foo=bar", %{foo: "baz", answer: 42})
assert conn.body_params == %{"foo" => "baz", "answer" => 42}
assert conn.query_string == "foo=bar"
assert conn.query_params == %{"foo" => "bar"}
assert conn.params == %{"foo" => "baz", "answer" => 42}

conn = conn(:post, "/?foo=bar", %{biz: "baz"})
assert conn.body_params == %{"biz" => "baz"}
assert conn.query_string == "foo=bar"
assert conn.query_params == %{"foo" => "bar"}
assert conn.params == %{"foo" => "bar", "biz" => "baz"}

conn = conn(:post, "/", %{})
assert conn.body_params == %{}
assert conn.query_string == ""
assert conn.query_params == %{}
assert conn.params == %{}
end

Expand Down

0 comments on commit f24af6a

Please sign in to comment.