diff --git a/apps/admin/lib/admin/controllers/.keep b/apps/admin/lib/admin/controllers/.keep
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/admin/lib/admin/controllers/page_controller.ex b/apps/admin/lib/admin/controllers/page_controller.ex
deleted file mode 100644
index ccf92307..00000000
--- a/apps/admin/lib/admin/controllers/page_controller.ex
+++ /dev/null
@@ -1,7 +0,0 @@
-defmodule Admin.PageController do
- use Admin, :controller
-
- def index(conn, _params) do
- render(conn, "index.html")
- end
-end
diff --git a/apps/admin/lib/admin/views/error_helpers.ex b/apps/admin/lib/admin/views/error_helpers.ex
index 3bf97133..7154dd65 100644
--- a/apps/admin/lib/admin/views/error_helpers.ex
+++ b/apps/admin/lib/admin/views/error_helpers.ex
@@ -5,17 +5,8 @@ defmodule Admin.ErrorHelpers do
use Phoenix.HTML
- @doc """
- Generates tag for inlined form input errors.
- """
- def error_tag(form, field) do
- Enum.map(Keyword.get_values(form.errors, field), fn error ->
- content_tag(:span, translate_error(error),
- class: "invalid-feedback",
- phx_feedback_for: input_id(form, field)
- )
- end)
- end
+ defdelegate error_tag(form, field), to: CoreWeb.ErrorHelpers
+ defdelegate error_tag(form, field, opts), to: CoreWeb.ErrorHelpers
@doc """
Translates an error message using gettext.
diff --git a/apps/admin/lib/mix/tasks/customize_kaffy_templates.ex b/apps/admin/lib/mix/tasks/customize_kaffy_templates.ex
deleted file mode 100644
index 07df5029..00000000
--- a/apps/admin/lib/mix/tasks/customize_kaffy_templates.ex
+++ /dev/null
@@ -1,22 +0,0 @@
-defmodule Mix.Tasks.Legendary.CustomizeKaffyTemplates do
- use Mix.Task
-
- @shortdoc "Overwrites kaffy templates with custom versions."
- def run(_) do
- base = Path.expand("lib/kaffy_web/templates/")
-
- replacements =
- base
- |> Path.join("**/*.eex")
- |> Path.wildcard()
-
- new_base =
- Mix.Project.deps_path()
- |> Path.join("kaffy/lib/kaffy_web/templates")
-
- replacements
- |> Enum.each(fn template_path ->
- File.copy(template_path, template_path |> String.replace(base, new_base))
- end)
- end
-end
diff --git a/apps/admin/mix.exs b/apps/admin/mix.exs
index 2eae2ec8..a0336c72 100644
--- a/apps/admin/mix.exs
+++ b/apps/admin/mix.exs
@@ -16,6 +16,7 @@ defmodule Admin.MixProject do
aliases: aliases(),
deps: deps(),
test_coverage: [tool: ExCoveralls],
+ preferred_cli_env: [coveralls: :test, "coveralls.detail": :test, "coveralls.post": :test, "coveralls.html": :test],
]
end
@@ -39,6 +40,7 @@ defmodule Admin.MixProject do
defp deps do
[
{:auth_web, in_umbrella: true},
+ {:core, in_umbrella: true},
{:ecto_sql, "~> 3.4"},
{:excoveralls, "~> 0.10", only: [:dev, :test]},
{:kaffy, path: "kaffy"},
diff --git a/apps/admin/test/admin/views/error_helpers_test.exs b/apps/admin/test/admin/views/error_helpers_test.exs
new file mode 100644
index 00000000..294b2dd6
--- /dev/null
+++ b/apps/admin/test/admin/views/error_helpers_test.exs
@@ -0,0 +1,32 @@
+defmodule Admin.ErrorHelpersTest do
+ use Admin.ConnCase
+
+ import Phoenix.HTML, only: [safe_to_string: 1]
+ import Phoenix.HTML.Form, only: [form_for: 3]
+
+ import Admin.ErrorHelpers
+
+ def form do
+ :example
+ |> form_for(
+ "/example",
+ as: :test_params,
+ errors: [error_field: {"is an error", []}],
+ )
+ end
+
+ test "error_tag/2" do
+ [safe] = error_tag(form(), :error_field)
+ assert safe_to_string(safe) =~ "invalid-feedback"
+ end
+
+ test "error_tag/3" do
+ [safe] = error_tag(form(), :error_field, class: "test-class")
+ assert safe_to_string(safe) =~ "test-class"
+ end
+
+ test "translate_error/1" do
+ assert translate_error({"is an error", []}) == "is an error"
+ assert translate_error({"%{count} errors", %{count: 3}}) == "3 errors"
+ end
+end
diff --git a/apps/app/mix.exs b/apps/app/mix.exs
index 7cba2808..3c8765b7 100644
--- a/apps/app/mix.exs
+++ b/apps/app/mix.exs
@@ -16,6 +16,7 @@ defmodule App.MixProject do
aliases: aliases(),
deps: deps(),
test_coverage: [tool: ExCoveralls],
+ preferred_cli_env: [coveralls: :test, "coveralls.detail": :test, "coveralls.post": :test, "coveralls.html": :test],
]
end
diff --git a/apps/auth/lib/auth/roles.ex b/apps/auth/lib/auth/roles.ex
index cd080168..e28403c6 100644
--- a/apps/auth/lib/auth/roles.ex
+++ b/apps/auth/lib/auth/roles.ex
@@ -2,12 +2,6 @@ defmodule Auth.Roles do
def has_role?(userlike, role) when is_atom(role), do: has_role?(userlike, Atom.to_string(role))
def has_role?(nil, _), do: false
def has_role?(user = %Auth.User{}, role) do
- Enum.any?(user.roles, & &1 == role)
- end
-
- def has_role?(conn = %Plug.Conn{}, role) do
- conn
- |> Pow.Plug.current_user()
- |> has_role?(role)
+ Enum.any?(user.roles || [], & &1 == role)
end
end
diff --git a/apps/auth/lib/auth/user.ex b/apps/auth/lib/auth/user.ex
index 0fa40ad7..409e95cf 100644
--- a/apps/auth/lib/auth/user.ex
+++ b/apps/auth/lib/auth/user.ex
@@ -40,7 +40,7 @@ defmodule Auth.User do
|> pow_extension_changeset(attrs)
end
- def reset_password_changeset(user = %user_mod{}, params) do
+ def reset_password_changeset(user = %Auth.User{}, params) do
user
|> new_password_changeset(params, @pow_config)
|> Changeset.validate_required([:password])
diff --git a/apps/auth/mix.exs b/apps/auth/mix.exs
index 88958e05..d49d7f30 100644
--- a/apps/auth/mix.exs
+++ b/apps/auth/mix.exs
@@ -15,6 +15,7 @@ defmodule Auth.MixProject do
aliases: aliases(),
deps: deps(),
test_coverage: [tool: ExCoveralls],
+ preferred_cli_env: [coveralls: :test, "coveralls.detail": :test, "coveralls.post": :test, "coveralls.html": :test],
]
end
diff --git a/apps/auth/test/auth/roles_test.exs b/apps/auth/test/auth/roles_test.exs
new file mode 100644
index 00000000..ab0bb5db
--- /dev/null
+++ b/apps/auth/test/auth/roles_test.exs
@@ -0,0 +1,23 @@
+defmodule Auth.RolesTest do
+ use Auth.DataCase
+
+ import Auth.Roles
+
+ alias Auth.User
+
+ describe "has_role?/2" do
+ test "with no user" do
+ refute has_role?(nil, "admin")
+ end
+
+ test "with an atom role" do
+ assert has_role?(%User{roles: ["admin"]}, :admin)
+ refute has_role?(%User{roles: ["admin"]}, :blooper)
+ end
+
+ test "with a string role" do
+ assert has_role?(%User{roles: ["admin"]}, "admin")
+ refute has_role?(%User{roles: ["admin"]}, "blooper")
+ end
+ end
+end
diff --git a/apps/auth/test/auth/user_test.exs b/apps/auth/test/auth/user_test.exs
new file mode 100644
index 00000000..b9af9950
--- /dev/null
+++ b/apps/auth/test/auth/user_test.exs
@@ -0,0 +1,37 @@
+defmodule Auth.UserTest do
+ use Auth.DataCase
+
+ import Auth.User
+
+ alias Auth.User
+
+ describe "admin_changeset/2" do
+ test "handles roles from text properly" do
+ changeset = admin_changeset(%User{}, %{"roles" => ~S(["snorlax", "pikachu"])})
+
+ assert changeset.changes.roles == ["snorlax", "pikachu"]
+ end
+ end
+
+ describe "changeset/2" do
+ test "requires an email" do
+ changeset = changeset(%User{}, %{"password" => "bloopers"})
+
+ refute changeset.valid?
+ end
+
+ test "does not require password confirmation" do
+ changeset = changeset(%User{}, %{"email" => "bloop@example.org", "password" => "bloopers"})
+
+ assert changeset.valid?
+ end
+ end
+
+ describe "reset_password_changeset/2" do
+ test "does not require password confirmation" do
+ changeset = reset_password_changeset(%User{}, %{"password" => "bloopers"})
+
+ assert changeset.valid?
+ end
+ end
+end
diff --git a/apps/auth_web/lib/auth_web/plugs/require_auth.ex b/apps/auth_web/lib/auth_web/plugs/require_auth.ex
deleted file mode 100644
index e7a53b8d..00000000
--- a/apps/auth_web/lib/auth_web/plugs/require_auth.ex
+++ /dev/null
@@ -1,21 +0,0 @@
-defmodule AuthWeb.Plugs.RequireAuth do
- @moduledoc """
- A plug that returns 403 unauthorized if the user is not authenticated. Used
- to block out logged-in-only routes.
- """
- import Plug.Conn
-
- def init(opts) do
- opts
- end
-
- def call(conn, _opts) do
- if Pow.Plug.current_user(conn) do
- conn
- else
- conn
- |> send_resp(403, "Unauthorized")
- |> halt()
- end
- end
-end
diff --git a/apps/auth_web/mix.exs b/apps/auth_web/mix.exs
index 4c30175e..18180bfe 100644
--- a/apps/auth_web/mix.exs
+++ b/apps/auth_web/mix.exs
@@ -16,6 +16,7 @@ defmodule AuthWeb.MixProject do
aliases: aliases(),
deps: deps(),
test_coverage: [tool: ExCoveralls],
+ preferred_cli_env: [coveralls: :test, "coveralls.detail": :test, "coveralls.post": :test, "coveralls.html": :test],
]
end
diff --git a/apps/auth_web/test/auth_web/plugs/require_admin_test.exs b/apps/auth_web/test/auth_web/plugs/require_admin_test.exs
new file mode 100644
index 00000000..461a4599
--- /dev/null
+++ b/apps/auth_web/test/auth_web/plugs/require_admin_test.exs
@@ -0,0 +1,30 @@
+defmodule AuthWeb.Plugs.RequireAdminTest do
+ use AuthWeb.ConnCase
+
+ alias AuthWeb.Plugs.RequireAdmin
+ alias Auth.User
+
+ setup %{conn: conn} do
+ %{conn: Pow.Plug.put_config(conn, current_user_assigns_key: :current_user)}
+ end
+
+ test "init/1" do
+ assert RequireAdmin.init([]) == []
+ end
+
+ test "call/2 without user", %{conn: conn} do
+ conn = RequireAdmin.call(conn, [])
+
+ assert response(conn, 403)
+ assert conn.halted
+ end
+
+ test "call/2 with a user", %{conn: conn} do
+ conn =
+ conn
+ |> Pow.Plug.assign_current_user(%User{roles: ["admin"]}, [])
+ |> RequireAdmin.call([])
+
+ assert !conn.halted
+ end
+end
diff --git a/apps/auth_web/test/auth_web/pow/mailer_test.exs b/apps/auth_web/test/auth_web/pow/mailer_test.exs
new file mode 100644
index 00000000..7f663d94
--- /dev/null
+++ b/apps/auth_web/test/auth_web/pow/mailer_test.exs
@@ -0,0 +1,32 @@
+defmodule AuthWeb.Pow.MailerTest do
+ use ExUnit.Case
+ use Bamboo.Test
+
+ import AuthWeb.Pow.Mailer
+
+ alias Auth.User
+
+ def hello_email do
+ cast(%{
+ user: %User{email: "test@example.org"},
+ subject: "Hello, email",
+ text: "This is a hello email.",
+ html: "
Hello!
",
+ })
+ end
+
+ test "cast/1" do
+ email = hello_email()
+ assert %{to: "test@example.org"} = email
+ assert email.text_body =~ "This is a hello email."
+ assert email.html_body =~ "Hello!
"
+ end
+
+ test "process/1" do
+ email = hello_email()
+
+ process(email)
+
+ assert_delivered_email email
+ end
+end
diff --git a/apps/content/lib/content/option.ex b/apps/content/lib/content/option.ex
index 85aad75b..6c6cad8f 100644
--- a/apps/content/lib/content/option.ex
+++ b/apps/content/lib/content/option.ex
@@ -22,9 +22,4 @@ defmodule Content.Option do
values
end
end
-
- def put_new_value(struct, value) do
- struct
- |> change(%{value: PhpSerializer.serialize(value)})
- end
end
diff --git a/apps/content/lib/content/post.ex b/apps/content/lib/content/post.ex
index 025083a7..de038def 100644
--- a/apps/content/lib/content/post.ex
+++ b/apps/content/lib/content/post.ex
@@ -108,13 +108,6 @@ defmodule Content.Post do
content_page_count(struct) > 1
end
- def metas_map(list) when is_list(list) do
- list
- |> Enum.map(fn post ->
- {post.id, metas_map(post)}
- end)
- |> Map.new
- end
def metas_map(%Content.Post{} = struct) do
struct.metas
|> Enum.map(&({&1.key, &1.value}))
diff --git a/apps/content/lib/content_web/controllers/page_controller.ex b/apps/content/lib/content_web/controllers/page_controller.ex
deleted file mode 100644
index b4019997..00000000
--- a/apps/content/lib/content_web/controllers/page_controller.ex
+++ /dev/null
@@ -1,11 +0,0 @@
-defmodule Content.PageController do
- use Content, :controller
-
- def index(conn, _params) do
- render(conn, "index.html")
- end
-
- def show(conn, %{"id" => id}) do
- render(conn, "#{id}.html")
- end
-end
diff --git a/apps/content/lib/content_web/controllers/posts_controller.ex b/apps/content/lib/content_web/controllers/posts_controller.ex
index a9ac60d3..4a439759 100644
--- a/apps/content/lib/content_web/controllers/posts_controller.ex
+++ b/apps/content/lib/content_web/controllers/posts_controller.ex
@@ -5,6 +5,10 @@ defmodule Content.PostsController do
plug :put_layout, false when action in [:preview]
+ def index(conn, %{"category" => _} = params) do
+ conn |> index_posts(params)
+ end
+
def index(conn, params) do
show_on_front = Options.get_value("show_on_front") || "page"
diff --git a/apps/content/lib/content_web/router.ex b/apps/content/lib/content_web/router.ex
index 5087fb0a..e3f1ca72 100644
--- a/apps/content/lib/content_web/router.ex
+++ b/apps/content/lib/content_web/router.ex
@@ -1,6 +1,6 @@
defmodule Content.Router do
use Content, :router
- alias AuthWeb.Plugs.{RequireAdmin, RequireAuth}
+ alias AuthWeb.Plugs.{RequireAdmin}
pipeline :browser do
plug :accepts, ["html"]
@@ -23,7 +23,7 @@ defmodule Content.Router do
end
pipeline :require_auth do
- plug(RequireAuth)
+ plug Pow.Plug.RequireAuthenticated, error_handler: Pow.Phoenix.PlugErrorHandler
end
pipeline :require_admin do
diff --git a/apps/content/lib/content_web/views/layout_view.ex b/apps/content/lib/content_web/views/layout_view.ex
index d665640c..5de2bf14 100644
--- a/apps/content/lib/content_web/views/layout_view.ex
+++ b/apps/content/lib/content_web/views/layout_view.ex
@@ -16,12 +16,7 @@ defmodule Content.LayoutView do
end
def title(_, _, _) do
- case Options.get("blogname") do
- opt = %Option{} ->
- opt.value
- _ ->
- I18n.t! "en", "site.title"
- end
+ I18n.t! "en", "site.title"
end
def excerpt(Content.PostsView, "show.html", assigns) do
@@ -34,12 +29,7 @@ defmodule Content.LayoutView do
end
def excerpt(_, _, _) do
- case Options.get("blogdescription") do
- opt = %Option{} ->
- opt.value
- _ ->
- I18n.t! "en", "site.excerpt"
- end
+ I18n.t! "en", "site.excerpt"
end
def author(Content.PostsView, "show.html", assigns) do
@@ -66,27 +56,4 @@ defmodule Content.LayoutView do
def corresponding_feed_url(conn, _, _, _) do
Routes.index_feed_url(conn, :index)
end
-
- def menu_markup(menu_items, conn), do: menu_markup(menu_items, conn, 0)
- def menu_markup(nil, _, _), do: ""
- def menu_markup([], _, _), do: ""
- def menu_markup(menu_items, conn, level) do
- ~E"""
-
- <%= for item <- menu_items do %>
- -
-
-
- <% end %>
-
- """
- end
end
diff --git a/apps/content/lib/content_web/views/posts_view.ex b/apps/content/lib/content_web/views/posts_view.ex
index f4966fd4..3ebbefff 100644
--- a/apps/content/lib/content_web/views/posts_view.ex
+++ b/apps/content/lib/content_web/views/posts_view.ex
@@ -38,14 +38,6 @@ defmodule Content.PostsView do
|> Comment.changeset()
end
- def comment_changeset_for_parent(%Comment{} = comment) do
- %Comment{
- parent: comment.id,
- post_id: comment.post_id
- }
- |> Comment.changeset()
- end
-
def auto_paragraph_tags(string) do
string
|> Kernel.||("")
diff --git a/apps/content/mix.exs b/apps/content/mix.exs
index f83f4dcd..a617ee74 100644
--- a/apps/content/mix.exs
+++ b/apps/content/mix.exs
@@ -16,7 +16,7 @@ defmodule Content.MixProject do
aliases: aliases(),
deps: deps(),
test_coverage: [tool: ExCoveralls],
- preferred_cli_env: [coveralls: :test, "coveralls.detail": :test, "coveralls.post": :test, "coveralls.html": :test]
+ preferred_cli_env: [coveralls: :test, "coveralls.detail": :test, "coveralls.post": :test, "coveralls.html": :test],
]
end
diff --git a/apps/content/test/content/posts_test.exs b/apps/content/test/content/posts_test.exs
new file mode 100644
index 00000000..144566b5
--- /dev/null
+++ b/apps/content/test/content/posts_test.exs
@@ -0,0 +1,61 @@
+defmodule Content.PostsTest do
+ use Content.DataCase
+
+ alias Content.{Post, Posts, Repo}
+
+ setup do
+ admin_only_post =
+ %Post{
+ title: "Admin-only post",
+ name: "admin-only-post",
+ status: "draft",
+ type: "post",
+ date: ~N[2020-02-01T00:00:00],
+ }
+ |> Repo.insert!()
+
+ public_post =
+ %Post{
+ title: "Public post",
+ name: "public-post",
+ status: "publish",
+ type: "post",
+ date: ~N[2020-01-01T00:00:00],
+ }
+ |> Repo.insert!()
+
+ %{
+ admin_only_post: admin_only_post,
+ public_post: public_post,
+ }
+ end
+
+ test "list_admin_posts/2" do
+ results = Posts.list_admin_posts("1")
+
+ assert Enum.count(results) == 2
+ assert [%{name: "admin-only-post"}, %{name: "public-post"}] = results
+ end
+
+ test "get_post_with_drafts!/1 with slug" do
+ assert %Post{} = Posts.get_post_with_drafts!("admin-only-post")
+ end
+
+ test "get_post_with_drafts!/1 with id", %{admin_only_post: %{id: id}} do
+ assert %Post{} = Posts.get_post_with_drafts!(Integer.to_string(id))
+ end
+
+ test "update_posts/2", %{public_post: post} do
+ assert {:ok, %Post{content: "boop"}} = Posts.update_posts(post, %{content: "boop"})
+ end
+
+ test "delete_posts/1", %{public_post: post} do
+ assert Enum.count(Posts.list_posts()) == 1
+ assert {:ok, _} = Posts.delete_posts(post)
+ assert Enum.count(Posts.list_posts()) == 0
+ end
+
+ test "change_posts/1", %{public_post: post} do
+ assert %{data: %Post{name: "public-post"}} = Posts.change_posts(post)
+ end
+end
diff --git a/apps/content/test/content/shortcode_test.exs b/apps/content/test/content/shortcode_test.exs
index 2154578d..7d4b96d4 100644
--- a/apps/content/test/content/shortcode_test.exs
+++ b/apps/content/test/content/shortcode_test.exs
@@ -67,5 +67,9 @@ defmodule Content.ShortcodesTest do
test "handles mangled shortcodes gracefully" do
assert expand_shortcodes("[[unclosed shortcode") == "[[unclosed shortcode"
end
+
+ test "handles comments in html" do
+ assert expand_shortcodes("") == ""
+ end
end
end
diff --git a/apps/content/test/content_web/controllers/feeds_controller_test.exs b/apps/content/test/content_web/controllers/feeds_controller_test.exs
new file mode 100644
index 00000000..5be1f240
--- /dev/null
+++ b/apps/content/test/content_web/controllers/feeds_controller_test.exs
@@ -0,0 +1,65 @@
+defmodule Content.FeedsControllerTest do
+ use Content.ConnCase
+
+ alias Content.{Term, TermRelationship, TermTaxonomy, Posts, Repo}
+
+ @post_attrs %{
+ id: 456,
+ title: "Test post",
+ type: "post",
+ name: "blergh",
+ status: "publish",
+ date: ~N[2020-02-01T00:00:00],
+ }
+ @post_category %Term{
+ id: 42,
+ name: "Test Category",
+ slug: "test-category",
+ }
+ @post_category_taxonomy %TermTaxonomy{
+ id: 64,
+ term_id: 42,
+ taxonomy: "category",
+ description: "A test category",
+ parent: 0,
+ }
+ @post_category_relationship %TermRelationship{
+ term_taxonomy_id: 64,
+ object_id: 456,
+ }
+
+ def fixture(:category) do
+ {:ok, category} = @post_category |> Repo.insert()
+ {:ok, _term_taxonomy} = @post_category_taxonomy |> Repo.insert()
+ {:ok, _term_relationship} = @post_category_relationship |> Repo.insert()
+ category
+ end
+
+ def fixture(:post) do
+ {:ok, post} = Posts.create_posts(@post_attrs)
+ post
+ end
+
+ setup %{conn: conn} do
+
+ %{
+ conn: conn,
+ post: fixture(:post),
+ category: fixture(:category),
+ }
+ end
+
+ describe "feeds" do
+ test "index/2 without category", %{conn: conn} do
+ conn = get conn, Routes.index_feed_path(conn, :index)
+
+ assert response(conn, 200) =~ "- "
+ end
+
+ test "index/2 with category", %{conn: conn} do
+ conn = get conn, Routes.category_feed_path(conn, :index, "test-category")
+
+ assert response(conn, 200) =~ "
- "
+ end
+ end
+end
diff --git a/apps/content/test/content_web/controllers/page_controller_test.exs b/apps/content/test/content_web/controllers/page_controller_test.exs
deleted file mode 100644
index 84071587..00000000
--- a/apps/content/test/content_web/controllers/page_controller_test.exs
+++ /dev/null
@@ -1,8 +0,0 @@
-defmodule Content.PageControllerTest do
- use Content.ConnCase
-
- test "GET /", %{conn: conn} do
- conn = get(conn, "/index")
- assert html_response(conn, 200)
- end
-end
diff --git a/apps/content/test/content_web/controllers/posts_controller_test.exs b/apps/content/test/content_web/controllers/posts_controller_test.exs
index dd0e3bc4..b5b70b2f 100644
--- a/apps/content/test/content_web/controllers/posts_controller_test.exs
+++ b/apps/content/test/content_web/controllers/posts_controller_test.exs
@@ -116,6 +116,14 @@ defmodule Content.PostsControllerTest do
assert html_response(conn, 200) =~ "My Post"
end
+ test "lists all posts by category page", %{conn: conn} do
+ fixture(:posts)
+ fixture(:category)
+
+ conn = get conn, Routes.category_page_path(conn, :index, @post_category.slug, "2")
+ assert html_response(conn, 200)
+ end
+
test "lists all posts for page", %{conn: conn} do
fixture(:posts)
@@ -151,6 +159,18 @@ defmodule Content.PostsControllerTest do
assert html_response(conn, 200) =~ posts.title
end
+
+ test "show a static page", %{conn: conn} do
+ conn = get conn, Routes.posts_path(conn, :show, "index")
+
+ assert html_response(conn, 200)
+ end
+
+ test "show a 404 if there's no match", %{conn: conn} do
+ assert_raise Phoenix.Router.NoRouteError, fn ->
+ get conn, Routes.posts_path(conn, :show, "blooper")
+ end
+ end
end
describe "show the front post" do
diff --git a/apps/content/test/content_web/views/layout_view_test.exs b/apps/content/test/content_web/views/layout_view_test.exs
index 7d049194..55cfe45d 100644
--- a/apps/content/test/content_web/views/layout_view_test.exs
+++ b/apps/content/test/content_web/views/layout_view_test.exs
@@ -1,8 +1,70 @@
defmodule Content.LayoutViewTest do
- use Content.ConnCase, async: true
+ use Content.ConnCase
# When testing helpers, you may want to import Phoenix.HTML and
# use functions such as safe_to_string() to convert the helper
# result into an HTML string.
# import Phoenix.HTML
+
+ import Content.LayoutView
+
+ describe "title/3" do
+ def default_title do
+ I18n.t! "en", "site.title"
+ end
+
+ test "for index" do
+ assert title(Content.PostsView, "index.html", %{page: 1}) =~ "Page 1 | #{default_title()}"
+ end
+
+ test "for feed" do
+ assert title(Content.FeedsView, "index.rss", %{category: "Category Test"}) =~ "Category Test | #{default_title()}"
+ end
+
+ test "for category" do
+ assert title(Content.PostsView, "show.html", %{post: %{title: "Test"}}) =~ "Test | #{default_title()}"
+ end
+
+ test "for nil" do
+ title(nil, nil, nil)
+ end
+ end
+
+ describe "excerpt/3" do
+ test "for a post" do
+ assert excerpt(Content.PostsView, "show.html", %{post: %{excerpt: "Excerpt test"}}) =~ "Excerpt test"
+ end
+
+ test "for a category" do
+ assert excerpt(Content.FeedsView, "index.rss", %{category: "category-test"}) =~ "category-test |"
+ end
+ end
+
+ describe "author/3" do
+ test "with a display name" do
+ assert author(Content.PostsView, "show.html", %{author: %{display_name: "Rufus"}}) =~ "Rufus"
+ end
+
+ test "without a display name" do
+ assert author(Content.PostsView, "show.html", %{}) =~ "Anonymous"
+ end
+ end
+
+ describe "corresponding_feed_url/4" do
+ setup %{conn: conn} do
+ %{conn: put_private(conn, :phoenix_router_url, "/pages")}
+ end
+
+ test "with a nil category", %{conn: conn} do
+ assert corresponding_feed_url(conn, nil, nil, %{category: nil}) == "/pages/feed.rss"
+ end
+
+ test "with a non-nil category", %{conn: conn} do
+ assert corresponding_feed_url(conn, Content.PostsView, "index.html", %{category: "test-category"}) == "/pages/category/test-category/feed.rss"
+ end
+
+ test "without a category", %{conn: conn} do
+ assert corresponding_feed_url(conn, nil, nil, %{}) == "/pages/feed.rss"
+ end
+ end
end
diff --git a/apps/content/test/content_web/views/posts_view_test.exs b/apps/content/test/content_web/views/posts_view_test.exs
new file mode 100644
index 00000000..203cc6bd
--- /dev/null
+++ b/apps/content/test/content_web/views/posts_view_test.exs
@@ -0,0 +1,14 @@
+defmodule Content.PostsViewTest do
+ use Content.ConnCase
+
+ import Content.PostsView
+ import Phoenix.HTML, only: [safe_to_string: 1]
+
+ test "auto_paragraph_tags/1 with nil" do
+ assert safe_to_string(auto_paragraph_tags(nil)) =~ ""
+ end
+
+ test "auto_paragraph_tags/1 with text" do
+ assert safe_to_string(auto_paragraph_tags("Bloop\n\nBloop")) =~ "
Bloop
\nBloop
"
+ end
+end
diff --git a/apps/content/test/support/conn_case.ex b/apps/content/test/support/conn_case.ex
index 34079cbd..987e75ee 100644
--- a/apps/content/test/support/conn_case.ex
+++ b/apps/content/test/support/conn_case.ex
@@ -32,7 +32,7 @@ defmodule Content.ConnCase do
defmacro as_admin(do: expression) do
quote do
- with_mock AuthWeb.Plugs.RequireAuth, [call: fn(conn, _opts) -> conn end] do
+ with_mock Pow.Plug.RequireAuthenticated, [call: fn(conn, _opts) -> conn end] do
with_mock AuthWeb.Plugs.RequireAdmin, [call: fn(conn, _opts) -> conn end] do
unquote(expression)
end
diff --git a/apps/core/lib/core_web/templates/layout/_menu.html.eex b/apps/core/lib/core_web/templates/layout/_menu.html.eex
index a025c4f1..4af7bc09 100644
--- a/apps/core/lib/core_web/templates/layout/_menu.html.eex
+++ b/apps/core/lib/core_web/templates/layout/_menu.html.eex
@@ -4,7 +4,7 @@
Home
- <%= if Auth.Roles.has_role?(@conn, :admin) do %>
+ <%= if has_role?(@conn, :admin) do %>
Admin
<% end %>
diff --git a/apps/core/lib/core_web/templates/layout/_side_menu.html.eex b/apps/core/lib/core_web/templates/layout/_side_menu.html.eex
index 82029885..76b7292e 100644
--- a/apps/core/lib/core_web/templates/layout/_side_menu.html.eex
+++ b/apps/core/lib/core_web/templates/layout/_side_menu.html.eex
@@ -1,6 +1,6 @@