Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions lib/live_debugger/utils/url.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
107 changes: 107 additions & 0 deletions test/utils/url_test.exs
Original file line number Diff line number Diff line change
@@ -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