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""" - - """ - 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

\n

Bloop

" + 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 @@