1. Rename goto_engineering_post_page/2 to visit_engineering_path/2 for better accuracy (used for both post pages and tag pages) 2. Simplify Makefile test target by removing explicit ecto.create and ecto.migrate commands (mix test handles migrations automatically) 3. Update blog_test.exs header comment to reflect actual changes made 4. Move Sandbox alias to top level in data_case.ex
152 lines
5.4 KiB
Elixir
152 lines
5.4 KiB
Elixir
# 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) =~ "<rss"
|
|
assert response_content_type(conn, :xml)
|
|
end
|
|
|
|
test "GET /api/blog/engineering/tag/:tag returns JSON with posts", %{conn: conn} do
|
|
conn = conn |> 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) =~ "<rss"
|
|
assert response_content_type(conn, :xml)
|
|
end
|
|
|
|
test "GET /api/blog/releases/tag/:tag returns JSON with posts", %{conn: conn} do
|
|
conn = conn |> 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
|