Compare commits
4
Commits
08b5bd3a12
...
bdc6670475
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bdc6670475 | ||
|
|
4688d09dcf | ||
|
|
c51bca1eb5 | ||
|
|
7bf009c38f |
@@ -13,7 +13,7 @@ defmodule DecentralisedBookIndexWeb.Plugs.RequireAdmin do
|
|||||||
conn
|
conn
|
||||||
else
|
else
|
||||||
conn
|
conn
|
||||||
|> put_flash(:error, "Unauthorized")
|
|> put_flash(:error, "Unauthorized!")
|
||||||
|> redirect(to: "/")
|
|> redirect(to: "/")
|
||||||
|> halt()
|
|> halt()
|
||||||
end
|
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.add(seconds)
|
||||||
|> DateTime.to_iso8601()
|
|> DateTime.to_iso8601()
|
||||||
end
|
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
|
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