From 8590df5032f28e5bc46b20ccd7e788b6dddeaf3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Gilberto=20Balsini=20Moura?= Date: Mon, 14 Sep 2020 12:21:48 -0300 Subject: [PATCH] Add authorised routes with tests --- .../live/admin_dashboard_live.ex | 18 +++++++++++ .../live/user_dashboard_live.ex | 18 +++++++++++ lib/real_estate_web/router.ex | 22 ++++++++++++- .../live/admin_dashboard_live_test.exs | 30 +++++++++++++++++ .../live/user_dashboard_live_test.exs | 32 +++++++++++++++++++ test/support/fixtures/accounts_fixtures.ex | 12 +++++++ 6 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 lib/real_estate_web/live/admin_dashboard_live.ex create mode 100644 lib/real_estate_web/live/user_dashboard_live.ex create mode 100644 test/real_estate_web/live/admin_dashboard_live_test.exs create mode 100644 test/real_estate_web/live/user_dashboard_live_test.exs diff --git a/lib/real_estate_web/live/admin_dashboard_live.ex b/lib/real_estate_web/live/admin_dashboard_live.ex new file mode 100644 index 00000000..8b1912f4 --- /dev/null +++ b/lib/real_estate_web/live/admin_dashboard_live.ex @@ -0,0 +1,18 @@ +defmodule RealEstateWeb.AdminDashboardLive do + use RealEstateWeb, :live_view + + @impl true + def mount(_params, session, socket) do + socket = assign_defaults(session, socket) + {:ok, socket} + end + + @impl true + def render(assigns) do + ~L""" +
+

Welcome to the admin dashboard!

+
+ """ + end +end diff --git a/lib/real_estate_web/live/user_dashboard_live.ex b/lib/real_estate_web/live/user_dashboard_live.ex new file mode 100644 index 00000000..4a03913d --- /dev/null +++ b/lib/real_estate_web/live/user_dashboard_live.ex @@ -0,0 +1,18 @@ +defmodule RealEstateWeb.UserDashboardLive do + use RealEstateWeb, :live_view + + @impl true + def mount(_params, session, socket) do + socket = assign_defaults(session, socket) + {:ok, socket} + end + + @impl true + def render(assigns) do + ~L""" +
+

Welcome to the user dashboard!

+
+ """ + end +end diff --git a/lib/real_estate_web/router.ex b/lib/real_estate_web/router.ex index 1f0b4f41..c71757ae 100644 --- a/lib/real_estate_web/router.ex +++ b/lib/real_estate_web/router.ex @@ -1,7 +1,7 @@ defmodule RealEstateWeb.Router do use RealEstateWeb, :router - import RealEstateWeb.UserAuth + alias RealEstateWeb.EnsureRolePlug pipeline :browser do plug :accepts, ["html"] @@ -17,6 +17,14 @@ defmodule RealEstateWeb.Router do plug :accepts, ["json"] end + pipeline :user do + plug EnsureRolePlug, [:admin, :user] + end + + pipeline :admin do + plug EnsureRolePlug, :admin + end + # Other scopes may use custom stacks. # scope "/api", RealEstateWeb do # pipe_through :api @@ -73,4 +81,16 @@ defmodule RealEstateWeb.Router do post "/users/confirm", UserConfirmationController, :create get "/users/confirm/:token", UserConfirmationController, :confirm end + + scope "/", RealEstateWeb do + pipe_through [:browser, :require_authenticated_user, :user] + + live "/user_dashboard", UserDashboardLive, :index + end + + scope "/", RealEstateWeb do + pipe_through [:browser, :require_authenticated_user, :admin] + + live "/admin_dashboard", AdminDashboardLive, :index + end end diff --git a/test/real_estate_web/live/admin_dashboard_live_test.exs b/test/real_estate_web/live/admin_dashboard_live_test.exs new file mode 100644 index 00000000..95348049 --- /dev/null +++ b/test/real_estate_web/live/admin_dashboard_live_test.exs @@ -0,0 +1,30 @@ +defmodule RealEstateWeb.AdminDashboardLiveTest do + use RealEstateWeb.ConnCase + + import Phoenix.LiveViewTest + import RealEstate.AccountsFixtures + + test "disconnected and connected render without authentication should redirect to login page", + %{conn: conn} do + # If we don't previously log in we will be redirected to the login page + assert {:error, {:redirect, %{to: "/users/log_in"}}} = live(conn, "/admin_dashboard") + end + + test "disconnected and connected render authenticated with user role should redirect to index page", + %{ + conn: conn + } do + conn = conn |> log_in_user(user_fixture()) + assert {:error, {:redirect, %{to: "/"}}} = live(conn, "/admin_dashboard") + end + + test "disconnected and connected render authenticated with admin role should redirect to index page", + %{ + conn: conn + } do + conn = conn |> log_in_user(admin_fixture()) + {:ok, admin_dashboard, disconnected_html} = live(conn, "/admin_dashboard") + assert disconnected_html =~ "Welcome to the admin dashboard!" + assert render(admin_dashboard) =~ "Welcome to the admin dashboard!" + end +end diff --git a/test/real_estate_web/live/user_dashboard_live_test.exs b/test/real_estate_web/live/user_dashboard_live_test.exs new file mode 100644 index 00000000..fcd20b30 --- /dev/null +++ b/test/real_estate_web/live/user_dashboard_live_test.exs @@ -0,0 +1,32 @@ +defmodule RealEstateWeb.UserDashboardLiveTest do + use RealEstateWeb.ConnCase + + import Phoenix.LiveViewTest + import RealEstate.AccountsFixtures + + test "disconnected and connected render without authentication should redirect to login page", + %{conn: conn} do + # If we don't previously log in we will be redirected to the login page + assert {:error, {:redirect, %{to: "/users/log_in"}}} = live(conn, "/user_dashboard") + end + + test "disconnected and connected render authenticated with user role should redirect to index page", + %{ + conn: conn + } do + conn = conn |> log_in_user(user_fixture()) + {:ok, user_dashboard, disconnected_html} = live(conn, "/user_dashboard") + assert disconnected_html =~ "Welcome to the user dashboard!" + assert render(user_dashboard) =~ "Welcome to the user dashboard!" + end + + test "disconnected and connected render authenticated with admin role should redirect to index page", + %{ + conn: conn + } do + conn = conn |> log_in_user(admin_fixture()) + {:ok, user_dashboard, disconnected_html} = live(conn, "/user_dashboard") + assert disconnected_html =~ "Welcome to the user dashboard!" + assert render(user_dashboard) =~ "Welcome to the user dashboard!" + end +end diff --git a/test/support/fixtures/accounts_fixtures.ex b/test/support/fixtures/accounts_fixtures.ex index cb8d0291..79c2c436 100644 --- a/test/support/fixtures/accounts_fixtures.ex +++ b/test/support/fixtures/accounts_fixtures.ex @@ -19,6 +19,18 @@ defmodule RealEstate.AccountsFixtures do user end + def admin_fixture(attrs \\ %{}) do + {:ok, user} = + attrs + |> Enum.into(%{ + email: unique_user_email(), + password: valid_user_password() + }) + |> RealEstate.Accounts.register_admin() + + user + end + def extract_user_token(fun) do {:ok, captured} = fun.(&"[TOKEN]#{&1}[TOKEN]") [_, token, _] = String.split(captured.body, "[TOKEN]")