From 22a1e023a4d57581768c97699e2bc1aef6a1b48c Mon Sep 17 00:00:00 2001 From: Moises Macia Date: Wed, 14 Oct 2026 20:39:08 +0000 Subject: [PATCH] add tests --- lib/feed_reader/url.ex | 2 +- test/feed_reader/url_test.exs | 45 +++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 test/feed_reader/url_test.exs diff --git a/lib/feed_reader/url.ex b/lib/feed_reader/url.ex index 9049e3c..59e9b0d 100644 --- a/lib/feed_reader/url.ex +++ b/lib/feed_reader/url.ex @@ -16,7 +16,7 @@ defmodule FeedReader.URL do defp absolute?(url) when is_binary(url) do uri = URI.parse(url) - is_binary(uri.scheme) and is_binary(uri.host) + is_binary(uri.scheme) and uri.scheme != "" and is_binary(uri.host) and uri.host != "" rescue URI.Error -> false end diff --git a/test/feed_reader/url_test.exs b/test/feed_reader/url_test.exs new file mode 100644 index 0000000..2cc618d --- /dev/null +++ b/test/feed_reader/url_test.exs @@ -0,0 +1,45 @@ +defmodule FeedReader.URLTest do + use ExUnit.Case, async: true + + alias FeedReader.URL + + test "returns nil for a missing URL" do + assert URL.resolve_root_relative(nil, ["https://example.com"]) == nil + end + + test "returns absolute and other non-root-relative URLs unchanged" do + absolute = "https://cdn.example.com/story" + + assert URL.resolve_root_relative(absolute, ["https://example.com"]) == absolute + assert URL.resolve_root_relative("story", ["https://example.com"]) == "story" + end + + test "resolves a root-relative URL against the first absolute base" do + assert URL.resolve_root_relative("/story", ["relative", nil, "https://example.com/feed"]) == + "https://example.com/story" + end + + test "keeps a root-relative URL when no absolute base exists" do + assert URL.resolve_root_relative("/story", [nil, "relative", 123]) == "/story" + end + + test "requires a list of bases for root-relative resolution" do + assert URL.resolve_root_relative("/story", nil) == "/story" + assert URL.resolve_root_relative("/story", "https://example.com") == "/story" + end + + test "accepts only absolute bases with both a scheme and host" do + bases = [ + "/relative", + "mailto:reader@example.com", + "https:///missing-host", + "https://example.com" + ] + + assert URL.resolve_root_relative("/story", bases) == "https://example.com/story" + end + + test "preserves the URL when URI parsing receives a non-binary base" do + assert URL.resolve_root_relative("/story", [42]) == "/story" + end +end