# Firehose blog controller tests defmodule FirehoseWeb.BlogTest do use FirehoseWeb.ConnCase defp visit_engineering_page(conn, suffix \\ "") do path = "/blog/engineering" <> suffix conn = get(conn, path) body = html_response(conn, 200) assert body =~ "Engineering Blog" assert body =~ "firehose" body end defp visit_engineering_path(conn, suffix) do path = "/blog/engineering" <> suffix conn = get(conn, path) body = html_response(conn, 200) assert body =~ "firehose" body end describe "engineering blog (HTML)" do test "GET /blog/engineering returns HTML index with layout", %{conn: conn} do visit_engineering_page(conn) end test "GET /blog/engineering/:slug returns HTML post with layout", %{conn: conn} do body = visit_engineering_path(conn, "/hello-world") assert body =~ "Hello World" end test "GET /blog/engineering/tag/:tag returns HTML tag page", %{conn: conn} do body = visit_engineering_path(conn, "/tag/elixir") assert body =~ ~s(tagged "elixir") end end describe "input validation" do test "GET /blog/nonexistent returns 404", %{conn: conn} do conn = get(conn, "/blog/nonexistent") assert html_response(conn, 404) end test "GET /blog/engineering?page=abc falls back to page 1", %{conn: conn} do body = visit_engineering_page(conn, "") assert body =~ "Engineering Blog" end test "GET /blog/engineering?page=-1 falls back to page 1", %{conn: conn} do body = visit_engineering_page(conn, "") assert body =~ "Engineering Blog" end test "GET /blog/engineering?page=0 falls back to page 1", %{conn: conn} do body = visit_engineering_page(conn, "?page=0") assert body =~ "Engineering Blog" end test "GET /blog/engineering/nonexistent-post returns 404", %{conn: conn} do assert_raise Blogex.NotFoundError, fn -> get(conn, "/blog/engineering/nonexistent-post") end end end describe "release notes blog (HTML)" do test "GET /blog/releases returns HTML index", %{conn: conn} do conn = get(conn, "/blog/releases") body = html_response(conn, 200) assert body =~ "Release Notes" assert body =~ "v0.1.0 Released" end test "GET /blog/releases/:slug returns HTML post", %{conn: conn} do conn = get(conn, "/blog/releases/v0-1-0") body = html_response(conn, 200) assert body =~ "v0.1.0 Released" end test "GET /blog/releases/tag/:tag returns HTML tag page", %{conn: conn} do conn = get(conn, "/blog/releases/tag/elixir") body = html_response(conn, 200) assert body =~ ~s(tagged "elixir") end end describe "engineering blog (JSON API)" do test "GET /api/blog/engineering returns post index", %{conn: conn} do conn = conn |> put_req_header("accept", "application/json") conn = get(conn, "/api/blog/engineering") assert %{"blog" => "engineering", "posts" => posts} = json_response(conn, 200) assert is_list(posts) refute Enum.empty?(posts) end test "GET /api/blog/engineering/:slug returns a post", %{conn: conn} do conn = conn |> put_req_header("accept", "application/json") conn = get(conn, "/api/blog/engineering/hello-world") assert %{"id" => "hello-world", "title" => "Hello World"} = json_response(conn, 200) end test "GET /api/blog/engineering/:slug returns 404 for missing post", %{conn: conn} do conn = conn |> put_req_header("accept", "application/json") conn = get(conn, "/api/blog/engineering/nonexistent") assert response(conn, 404) end test "GET /api/blog/engineering/feed.xml returns RSS", %{conn: conn} do conn = get(conn, "/api/blog/engineering/feed.xml") assert response(conn, 200) =~ " put_req_header("accept", "application/json") conn = get(conn, "/api/blog/engineering/tag/elixir") assert %{"blog" => "engineering", "tag" => "elixir", "posts" => posts} = json_response(conn, 200) assert is_list(posts) end end describe "release notes blog (JSON API)" do test "GET /api/blog/releases returns post index", %{conn: conn} do conn = conn |> put_req_header("accept", "application/json") conn = get(conn, "/api/blog/releases") assert %{"blog" => "release_notes", "posts" => posts} = json_response(conn, 200) assert is_list(posts) refute Enum.empty?(posts) end test "GET /api/blog/releases/:slug returns a post", %{conn: conn} do conn = conn |> put_req_header("accept", "application/json") conn = get(conn, "/api/blog/releases/v0-1-0") assert %{"id" => "v0-1-0", "title" => "v0.1.0 Released"} = json_response(conn, 200) end test "GET /api/blog/releases/feed.xml returns RSS", %{conn: conn} do conn = get(conn, "/api/blog/releases/feed.xml") assert response(conn, 200) =~ " put_req_header("accept", "application/json") conn = get(conn, "/api/blog/releases/tag/elixir") assert %{"blog" => "release_notes", "tag" => "elixir", "posts" => posts} = json_response(conn, 200) assert is_list(posts) end end end