diff --git a/lib/fun_with_flags/ui/utils.ex b/lib/fun_with_flags/ui/utils.ex index 087596a..7eea49d 100644 --- a/lib/fun_with_flags/ui/utils.ex +++ b/lib/fun_with_flags/ui/utils.ex @@ -160,17 +160,19 @@ defmodule FunWithFlags.UI.Utils do def validate(name) do string = to_string(name) + cond do blank?(string) -> {:fail, "can't be blank"} - String.match?(string, ~r/\?/) -> - {:fail, "includes invalid characters: '?'"} + + string |> String.to_charlist() |> Enum.any?(&URI.char_reserved?/1) -> + {:fail, "includes URI reserved characters"} + true -> :ok end end - def parse_and_validate_float(string) do if blank?(string) do {:fail, "can't be blank"} diff --git a/test/fun_with_flags/ui/utils_test.exs b/test/fun_with_flags/ui/utils_test.exs index 742a966..b769f49 100644 --- a/test/fun_with_flags/ui/utils_test.exs +++ b/test/fun_with_flags/ui/utils_test.exs @@ -200,21 +200,22 @@ defmodule FunWithFlags.UI.UtilsTest do end end - describe "sanitize(name)" do test "it removes leading and trailing whitespace" do assert "apricot" = Utils.sanitize(" apricot ") end end - describe "validate(name)" do test "it returns {:fail, reason} for blank values" do assert {:fail, "can't be blank"} = Utils.validate(:"") end - test "it returns {:fail, reason} for values with question marks" do - assert {:fail, "includes invalid characters: '?'"} = Utils.validate(:banana?) + test "it returns {:fail, reason} for values with URI reserved characters" do + assert {:fail, "includes URI reserved characters"} = Utils.validate(:banana?) + assert {:fail, "includes URI reserved characters"} = Utils.validate(:"ban/ana") + assert {:fail, "includes URI reserved characters"} = Utils.validate(:"ban#ana") + assert {:fail, "includes URI reserved characters"} = Utils.validate(:"ban&ana") end test "it returns :ok otherwise" do