berrypod/test/berrypod_web/r_test.exs
jamey 6b90b394dd add R module for runtime url routing
GenServer with ETS caching for dynamic URLs:
- Path helpers: cart(), product(id), collection(slug), order(num), page(slug)
- Reverse lookups: page_type_from_slug/1, prefix_type_from_segment/1
- Cache invalidation with sync/async variants
- Supervision tree integration with cache warming

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-04-01 00:35:41 +01:00

90 lines
2.5 KiB
Elixir

defmodule BerrypodWeb.RTest do
use Berrypod.DataCase, async: false
alias BerrypodWeb.R
alias Berrypod.Pages
setup do
# Clear caches between tests
R.invalidate_all_sync()
Berrypod.Pages.PageCache.invalidate_all()
:ok
end
describe "page path functions" do
test "returns default paths when no custom slugs set" do
assert R.cart() == "/cart"
assert R.about() == "/about"
assert R.contact() == "/contact"
assert R.search() == "/search"
end
test "returns custom path after url_slug is set" do
{:ok, _} = Pages.update_page_url_slug("cart", "basket")
assert R.cart() == "/basket"
end
test "returns default path after url_slug is cleared" do
{:ok, _} = Pages.update_page_url_slug("about", "our-story")
assert R.about() == "/our-story"
{:ok, _} = Pages.update_page_url_slug("about", "")
assert R.about() == "/about"
end
end
describe "page/1 generic function" do
test "routes through specific functions for system pages" do
{:ok, _} = Pages.update_page_url_slug("cart", "basket")
assert R.page("cart") == "/basket"
assert R.page("home") == "/"
end
test "returns /slug for custom pages" do
assert R.page("my-custom-page") == "/my-custom-page"
end
end
describe "reverse lookups" do
test "page_type_from_slug finds system page by custom url" do
{:ok, _} = Pages.update_page_url_slug("about", "our-story")
assert R.page_type_from_slug("our-story") == {:page, :about}
end
test "page_type_from_slug finds system page by default url" do
assert R.page_type_from_slug("cart") == {:page, :cart}
assert R.page_type_from_slug("about") == {:page, :about}
end
test "page_type_from_slug returns nil for unknown slug" do
assert R.page_type_from_slug("nonexistent") == nil
end
test "page_type_from_slug finds custom page" do
{:ok, _} = Pages.create_custom_page(%{slug: "faq", title: "FAQ", published: true})
assert {:custom, page} = R.page_type_from_slug("faq")
assert page.slug == "faq"
end
end
describe "prefix functions" do
test "returns default prefixes" do
assert R.product(123) == "/products/123"
assert R.collection("art") == "/collections/art"
assert R.order("ORD-123") == "/orders/ORD-123"
end
end
describe "url/1" do
test "prepends endpoint URL to path" do
url = R.url("/cart")
assert String.starts_with?(url, "http")
assert String.ends_with?(url, "/cart")
end
end
end