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>
90 lines
2.5 KiB
Elixir
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
|