Compare commits
4
Commits
08b5bd3a12
...
bdc6670475
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bdc6670475 | ||
|
|
4688d09dcf | ||
|
|
c51bca1eb5 | ||
|
|
7bf009c38f |
@@ -13,7 +13,7 @@ defmodule DecentralisedBookIndexWeb.Plugs.RequireAdmin do
|
||||
conn
|
||||
else
|
||||
conn
|
||||
|> put_flash(:error, "Unauthorized")
|
||||
|> put_flash(:error, "Unauthorized!")
|
||||
|> redirect(to: "/")
|
||||
|> halt()
|
||||
end
|
||||
|
||||
@@ -0,0 +1,168 @@
|
||||
defmodule DecentralisedBookIndexWeb.LiveViewsPermissions do
|
||||
use DecentralisedBookIndexWeb.LiveCase, async: true
|
||||
|
||||
alias DecentralisedBookIndex.Metadata
|
||||
|
||||
setup do
|
||||
user = generate(user(role: :user))
|
||||
moderator = generate(user(role: :moderator))
|
||||
admin = generate(user(role: :admin))
|
||||
|
||||
%{
|
||||
user: user,
|
||||
moderator: moderator,
|
||||
admin: admin
|
||||
}
|
||||
end
|
||||
|
||||
describe "Book Index /books" do
|
||||
test "can be accessed by regular user", %{conn: conn, user: user} do
|
||||
{:ok, _view, html} =
|
||||
conn
|
||||
|> log_in_user(user)
|
||||
|> live("/books")
|
||||
|
||||
assert html =~ "Listing Books"
|
||||
end
|
||||
|
||||
test "can be accessed by moderator", %{conn: conn, moderator: moderator} do
|
||||
assert {:ok, _view, html} =
|
||||
conn
|
||||
|> log_in_user(moderator)
|
||||
|> live("/books")
|
||||
|
||||
assert html =~ "Listing Books"
|
||||
end
|
||||
|
||||
test "can be accessed by admin", %{conn: conn, admin: admin} do
|
||||
assert {:ok, _view, html} =
|
||||
conn
|
||||
|> log_in_user(admin)
|
||||
|> live("/books")
|
||||
|
||||
assert html =~ "Listing Books"
|
||||
end
|
||||
end
|
||||
|
||||
describe "Author Index /author" do
|
||||
test "can be accessed by regular user", %{conn: conn, user: user} do
|
||||
{:ok, _view, html} =
|
||||
conn
|
||||
|> log_in_user(user)
|
||||
|> live("/authors")
|
||||
|
||||
assert html =~ "Listing Authors"
|
||||
end
|
||||
|
||||
test "can be accessed by moderator", %{conn: conn, moderator: moderator} do
|
||||
assert {:ok, _view, html} =
|
||||
conn
|
||||
|> log_in_user(moderator)
|
||||
|> live("/authors")
|
||||
|
||||
assert html =~ "Listing Authors"
|
||||
end
|
||||
|
||||
test "can be accessed by admin", %{conn: conn, admin: admin} do
|
||||
assert {:ok, _view, html} =
|
||||
conn
|
||||
|> log_in_user(admin)
|
||||
|> live("/authors")
|
||||
|
||||
assert html =~ "Listing Authors"
|
||||
end
|
||||
end
|
||||
|
||||
describe "Publisher Index /publishers" do
|
||||
test "can't be accessed by regular user", %{conn: conn, user: user} do
|
||||
assert {:error, {:redirect, %{flash: %{"error" => "Unauthorized!"}, to: "/"}}} =
|
||||
conn
|
||||
|> log_in_user(user)
|
||||
|> live("/publishers")
|
||||
end
|
||||
|
||||
test "can be accessed by moderator", %{conn: conn, moderator: moderator} do
|
||||
assert {:ok, _view, html} =
|
||||
conn
|
||||
|> log_in_user(moderator)
|
||||
|> live("/publishers")
|
||||
|
||||
assert html =~ "Listing Publishers"
|
||||
end
|
||||
|
||||
test "can be accessed by admin", %{conn: conn, admin: admin} do
|
||||
assert {:ok, _view, html} =
|
||||
conn
|
||||
|> log_in_user(admin)
|
||||
|> live("/publishers")
|
||||
|
||||
assert html =~ "Listing Publishers"
|
||||
end
|
||||
end
|
||||
|
||||
describe "Server Index /servers" do
|
||||
test "can't be accessed by regular user", %{conn: conn, user: user} do
|
||||
assert {:error, {:redirect, %{flash: %{"error" => "Unauthorized!"}, to: "/"}}} =
|
||||
conn
|
||||
|> log_in_user(user)
|
||||
|> live("/servers")
|
||||
end
|
||||
|
||||
test "can't be accessed by moderator", %{conn: conn, moderator: moderator} do
|
||||
assert {:error, {:redirect, %{flash: %{"error" => "Unauthorized!"}, to: "/"}}} =
|
||||
conn
|
||||
|> log_in_user(moderator)
|
||||
|> live("/servers")
|
||||
end
|
||||
|
||||
test "can be accessed by admin", %{conn: conn, admin: admin} do
|
||||
assert {:ok, _view, html} =
|
||||
conn
|
||||
|> log_in_user(admin)
|
||||
|> live("/servers")
|
||||
|
||||
assert html =~ "Listing Servers"
|
||||
end
|
||||
end
|
||||
|
||||
describe "ObanWeb /oban" do
|
||||
test "can't be accessed by regular user", %{conn: conn, user: user} do
|
||||
assert {:error, {:redirect, %{flash: %{"error" => "Unauthorized!"}, to: "/"}}} =
|
||||
conn
|
||||
|> log_in_user(user)
|
||||
|> live("/oban")
|
||||
end
|
||||
|
||||
test "can't be accessed by moderator", %{conn: conn, moderator: moderator} do
|
||||
assert {:error, {:redirect, %{flash: %{"error" => "Unauthorized!"}, to: "/"}}} =
|
||||
conn
|
||||
|> log_in_user(moderator)
|
||||
|> live("/oban")
|
||||
end
|
||||
end
|
||||
|
||||
describe "User Index /users" do
|
||||
test "can't be accessed by regular user", %{conn: conn, user: user} do
|
||||
assert {:error, {:redirect, %{flash: %{"error" => "Unauthorized!"}, to: "/"}}} =
|
||||
conn
|
||||
|> log_in_user(user)
|
||||
|> live("/users")
|
||||
end
|
||||
|
||||
test "can't be accessed by moderator", %{conn: conn, moderator: moderator} do
|
||||
assert {:error, {:redirect, %{flash: %{"error" => "Unauthorized!"}, to: "/"}}} =
|
||||
conn
|
||||
|> log_in_user(moderator)
|
||||
|> live("/users")
|
||||
end
|
||||
|
||||
test "can be accessed by admin", %{conn: conn, admin: admin} do
|
||||
assert {:ok, _view, html} =
|
||||
conn
|
||||
|> log_in_user(admin)
|
||||
|> live("/users")
|
||||
|
||||
assert html =~ "Listing Users"
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -40,4 +40,15 @@ defmodule DecentralisedBookIndex.Helpers do
|
||||
|> DateTime.add(seconds)
|
||||
|> DateTime.to_iso8601()
|
||||
end
|
||||
|
||||
@doc """
|
||||
Logs the given `user` into the `conn`.
|
||||
|
||||
It returns an updated `conn`.
|
||||
"""
|
||||
def log_in_user(conn, user) do
|
||||
conn
|
||||
|> Phoenix.ConnTest.init_test_session(%{})
|
||||
|> AshAuthentication.Plug.Helpers.store_in_session(user)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
defmodule DecentralisedBookIndexWeb.LiveCase do
|
||||
@moduledoc """
|
||||
This module defines the setup for tests requiring
|
||||
access to the application's data layer.
|
||||
|
||||
You may define functions here to be used as helpers in
|
||||
your tests.
|
||||
|
||||
Finally, if the test case interacts with the database,
|
||||
we enable the SQL sandbox, so changes done to the database
|
||||
are reverted at the end of every test. If you are using
|
||||
PostgreSQL, you can even run database tests asynchronously
|
||||
by setting `use DecentralisedBookIndex.DataCase, async: true`, although
|
||||
this option is not recommended for other databases.
|
||||
"""
|
||||
|
||||
use ExUnit.CaseTemplate
|
||||
|
||||
using do
|
||||
quote do
|
||||
alias DecentralisedBookIndex.Repo
|
||||
|
||||
import Ecto
|
||||
import Ecto.Changeset
|
||||
import Ecto.Query
|
||||
import DecentralisedBookIndex.DataCase
|
||||
import DecentralisedBookIndex.Generators
|
||||
import DecentralisedBookIndex.Helpers
|
||||
|
||||
# The default endpoint for testing
|
||||
@endpoint DecentralisedBookIndexWeb.Endpoint
|
||||
|
||||
use DecentralisedBookIndexWeb, :verified_routes
|
||||
|
||||
# Import conveniences for testing with connections
|
||||
import Plug.Conn
|
||||
import Phoenix.ConnTest
|
||||
import DecentralisedBookIndexWeb.ConnCase
|
||||
import Phoenix.LiveViewTest
|
||||
end
|
||||
end
|
||||
|
||||
setup tags do
|
||||
DecentralisedBookIndex.DataCase.setup_sandbox(tags)
|
||||
{:ok, conn: Phoenix.ConnTest.build_conn()}
|
||||
end
|
||||
|
||||
@doc """
|
||||
Sets up the sandbox based on the test tags.
|
||||
"""
|
||||
def setup_sandbox(tags) do
|
||||
pid =
|
||||
Ecto.Adapters.SQL.Sandbox.start_owner!(DecentralisedBookIndex.Repo,
|
||||
shared: not tags[:async]
|
||||
)
|
||||
|
||||
on_exit(fn -> Ecto.Adapters.SQL.Sandbox.stop_owner(pid) end)
|
||||
end
|
||||
|
||||
@doc """
|
||||
A helper that transforms changeset errors into a map of messages.
|
||||
|
||||
assert {:error, changeset} = Accounts.create_user(%{password: "short"})
|
||||
assert "password is too short" in errors_on(changeset).password
|
||||
assert %{password: ["password is too short"]} = errors_on(changeset)
|
||||
|
||||
"""
|
||||
def errors_on(changeset) do
|
||||
Ecto.Changeset.traverse_errors(changeset, fn {message, opts} ->
|
||||
Regex.replace(~r"%{(\w+)}", message, fn _, key ->
|
||||
opts |> Keyword.get(String.to_existing_atom(key), key) |> to_string()
|
||||
end)
|
||||
end)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user