diff --git a/lib/live_debugger/utils/url.ex b/lib/live_debugger/utils/url.ex index 585843ae1..4dda678e2 100644 --- a/lib/live_debugger/utils/url.ex +++ b/lib/live_debugger/utils/url.ex @@ -27,35 +27,39 @@ defmodule LiveDebugger.Utils.URL do @spec upsert_query_param(url :: String.t(), key :: String.t(), value :: String.t()) :: String.t() - def upsert_query_param(url, key, value) do + def upsert_query_param(url, key, value) + when is_binary(url) and is_binary(key) and is_binary(value) do upsert_query_params(url, %{key => value}) end @spec upsert_query_params(url :: String.t(), params :: %{String.t() => String.t()}) :: String.t() - def upsert_query_params(url, params) do + def upsert_query_params(url, params) when is_binary(url) and is_map(params) do modify_query_params(url, &Map.merge(&1, params)) end @spec remove_query_param(url :: String.t(), key :: String.t()) :: String.t() - def remove_query_param(url, key) do + def remove_query_param(url, key) when is_binary(url) and is_binary(key) do modify_query_params(url, &Map.delete(&1, key)) end @spec remove_query_params(url :: String.t(), keys :: [String.t()]) :: String.t() - def remove_query_params(url, keys) do + def remove_query_params(url, keys) when is_binary(url) and is_list(keys) do modify_query_params(url, &Map.drop(&1, keys)) end @spec modify_query_params(url :: String.t(), fun :: (map() -> map())) :: String.t() - def modify_query_params(url, fun) do + def modify_query_params(url, fun) when is_binary(url) and is_function(fun) do uri = URI.parse(url) params = (uri.query || "") |> URI.decode_query() |> fun.() - |> URI.encode_query() + |> case do + params when map_size(params) == 0 -> nil + params -> URI.encode_query(params) + end URI.to_string(%URI{uri | query: params}) end diff --git a/test/utils/url_test.exs b/test/utils/url_test.exs new file mode 100644 index 000000000..81acfc5ee --- /dev/null +++ b/test/utils/url_test.exs @@ -0,0 +1,107 @@ +defmodule LiveDebugger.Utils.URLTest do + @moduledoc false + use ExUnit.Case, async: true + + alias LiveDebugger.Utils.URL + + describe "to_relative/1" do + test "converts absolute URL to relative URL" do + assert URL.to_relative("http://example.com/foo?bar=baz") == "/foo?bar=baz" + end + + test "handles URLs without query parameters" do + assert URL.to_relative("http://example.com/foo") == "/foo" + end + + test "handles URLs with only query parameters" do + assert URL.to_relative("http://example.com?bar=baz") == "?bar=baz" + end + end + + describe "update_path/2" do + test "updates the path of a URL" do + assert URL.update_path("http://example.com/foo?bar=baz", "/new_path") == + "http://example.com/new_path?bar=baz" + end + + test "handles URLs without query parameters" do + assert URL.update_path("http://example.com/foo", "/new_path") == + "http://example.com/new_path" + end + + test "adds path when no path exists" do + assert URL.update_path("http://example.com", "/new_path") == + "http://example.com/new_path" + end + end + + describe "upsert_query_param/3" do + test "adds a query parameter in a URL" do + assert URL.upsert_query_param("http://example.com/foo", "key", "value") == + "http://example.com/foo?key=value" + end + + test "updates a query parameter in a URL with existing parameters" do + assert URL.upsert_query_param("http://example.com/foo?key1=value1", "key2", "value2") == + "http://example.com/foo?key1=value1&key2=value2" + end + end + + describe "upsert_query_params/2" do + test "adds multiple query parameters in a URL" do + assert URL.upsert_query_params("http://example.com/foo", %{ + "key1" => "value1", + "key2" => "value2" + }) == + "http://example.com/foo?key1=value1&key2=value2" + end + + test "updates existing query parameters in a URL" do + assert URL.upsert_query_params("http://example.com/foo?key1=value1", %{ + "key2" => "value2", + "key3" => "value3" + }) == + "http://example.com/foo?key1=value1&key2=value2&key3=value3" + end + + test "doesn't modify the URL if no parameters are provided" do + assert URL.upsert_query_params("http://example.com/foo", %{}) == + "http://example.com/foo" + end + end + + describe "remove_query_param/2" do + test "removes a query parameter from a URL" do + assert URL.remove_query_param("http://example.com/foo?key=value", "key") == + "http://example.com/foo" + end + + test "doesn't modify the URL if the parameter doesn't exist" do + assert URL.remove_query_param("http://example.com/foo?key=value", "nonexistent") == + "http://example.com/foo?key=value" + end + end + + describe "remove_query_params/2" do + test "removes multiple query parameters from a URL" do + assert URL.remove_query_params("http://example.com/foo?key1=value1&key2=value2", [ + "key1", + "key2" + ]) == + "http://example.com/foo" + end + + test "doesn't modify the URL if no parameters exist" do + assert URL.remove_query_params("http://example.com/foo?key=value", ["nonexistent"]) == + "http://example.com/foo?key=value" + end + end + + describe "modify_query_params/2" do + test "modifies query parameters in a URL using a function" do + assert URL.modify_query_params("http://example.com/foo?key=value", fn params -> + Map.put(params, "new_key", "new_value") + end) == "http://example.com/foo?key=value&new_key=new_value" + end + end +end