Files
firehose/app/test/firehose_web/controllers/blog_controller_test.exs
T
Firehose Bot 0d344a4f57 make blog slug tests content-independent
Commit 1709cb7 deleted the pinned hello-world post and ten tests
silently rotted with it - invisible until now because the suite could
not run in this clone (incomplete deps, then the broken frontmatter).
The slug, banner, og-meta and tag tests now derive slug and title from
the compiled posts at runtime (newest live post, newest draft), matching
the existing latest_post_with_links pattern, so content churn no longer
breaks them.
2026-10-29 18:05:29 +00:00

152 lines
5.3 KiB
Elixir

defmodule FirehoseWeb.BlogControllerTest do
use FirehoseWeb.ConnCase, async: false
# Content churns; the behavior under test does not. Pick deterministically
# from the compiled posts instead of pinning slugs - the pinned "hello-world"
# post was deleted in 1709cb7 and ten tests silently rotted with it.
defp a_draft_post do
Enum.find(Firehose.EngineeringBlog.all_posts(), &(&1.published == false)) ||
raise "no draft (published: false) engineering post to exercise status banners"
end
defp a_live_post do
Enum.find(Firehose.EngineeringBlog.all_posts(), &(Blogex.Post.visibility(&1) == :live)) ||
raise "no live engineering post to exercise og meta tags"
end
describe "GET /blog/:blog_id (index) - date filtering" do
test "does not show future-dated posts", %{conn: conn} do
html = conn |> get(~p"/blog/engineering") |> html_response(200)
refute html =~ "Future Test Post"
end
end
describe "GET /blog/:blog_id/:slug (show) - date filtering" do
test "still shows a future-dated post by slug", %{conn: conn} do
assert conn |> get(~p"/blog/engineering/future-test-post") |> html_response(200) =~
"Future Test Post"
end
end
describe "GET /blog/:blog_id/tag/:tag - date filtering" do
test "excludes future-dated posts from tag page", %{conn: conn} do
html = conn |> get(~p"/blog/engineering/tag/test") |> html_response(200)
refute html =~ "Future Test Post"
end
end
describe "GET /blog/:blog_id/:slug - status banners" do
setup :register_and_log_in_user
test "authenticated user sees draft banner on draft post", %{conn: conn} do
post = a_draft_post()
response = conn |> get(~p"/blog/engineering/#{post.id}")
assert html_response(response, 200) =~ "Draft"
assert response.resp_body =~ "not published"
end
test "authenticated user sees scheduled banner on future post", %{conn: conn} do
response = conn |> get(~p"/blog/engineering/future-test-post") |> html_response(200)
assert response =~ "scheduled for"
assert response =~ "January 01, 2099"
end
test "authenticated user sees no banner on live post", %{conn: conn} do
response = conn |> get(~p"/blog/engineering/why-firehose") |> html_response(200)
refute response =~ "Draft"
refute response =~ "scheduled for"
end
end
describe "GET /blog/:blog_id/:slug - no banners for unauthenticated" do
test "unauthenticated user sees no banner on draft post", %{conn: conn} do
post = a_draft_post()
response =
conn
|> get(~p"/blog/engineering/#{post.id}")
|> html_response(200)
refute response =~ "post-status-banner"
end
test "unauthenticated user sees no banner on future post", %{conn: conn} do
response =
conn
|> get(~p"/blog/engineering/future-test-post")
|> html_response(200)
refute response =~ "post-status-banner"
end
end
describe "GET /blog/:blog_id/:slug - Open Graph meta tags" do
test "meta tags include og_title", %{conn: conn} do
post = a_live_post()
response = conn |> get(~p"/blog/engineering/#{post.id}") |> html_response(200)
assert response =~ ~s(<meta property="og:title")
assert response =~ post.title
end
test "meta tags include og_description", %{conn: conn} do
post = a_live_post()
response = conn |> get(~p"/blog/engineering/#{post.id}") |> html_response(200)
assert response =~ ~s(<meta property="og:description")
end
test "meta tags include og_type article", %{conn: conn} do
post = a_live_post()
response = conn |> get(~p"/blog/engineering/#{post.id}") |> html_response(200)
assert response =~ ~s(<meta property="og:type" content="article")
end
test "meta tags include twitter:card", %{conn: conn} do
post = a_live_post()
response = conn |> get(~p"/blog/engineering/#{post.id}") |> html_response(200)
assert response =~ ~s(<meta name="twitter:card" content="summary_large_image")
end
test "meta tags include og_image when post has image", %{conn: conn} do
response = conn |> get(~p"/blog/engineering/why-firehose") |> html_response(200)
assert response =~ ~s(<meta property="og:image")
assert response =~ "firehose-logo.png"
end
test "meta tags have correct og_url", %{conn: conn} do
post = a_live_post()
response = conn |> get(~p"/blog/engineering/#{post.id}") |> html_response(200)
assert response =~
~s(<meta property="og:url" content="http://localhost:4002/blog/engineering/#{post.id}")
end
end
describe "GET /blog/:blog_id - Open Graph meta tags" do
test "meta tags include og_title for blog listing", %{conn: conn} do
response = conn |> get(~p"/blog/engineering") |> html_response(200)
assert response =~ ~s(<meta property="og:title")
end
test "meta tags have og_type website for blog listing", %{conn: conn} do
response = conn |> get(~p"/blog/engineering") |> html_response(200)
assert response =~ ~s(<meta property="og:type" content="website")
end
test "meta tags use summary twitter card for blog listing", %{conn: conn} do
response = conn |> get(~p"/blog/engineering") |> html_response(200)
assert response =~ ~s(<meta name="twitter:card" content="summary")
end
end
end