wrap up users

This commit is contained in:
Jamil Bou Kheir
2020-05-20 22:41:32 -07:00
parent 0b43156e21
commit 88e1067816
7 changed files with 99 additions and 36 deletions

View File

@@ -19,7 +19,12 @@ defmodule FgHttpWeb.DeviceController do
end
def create(conn, %{"device" => %{"public_key" => _public_key} = device_params}) do
our_params = %{"user_id" => conn.assigns.current_user.id, "name" => "Default"}
our_params = %{
"user_id" => conn.assigns.current_user.id,
"name" => "Default",
"ifname" => "wg0"
}
all_params = Map.merge(device_params, our_params)
case Devices.create_device(all_params) do

View File

@@ -1,5 +1,11 @@
<h1>New Device</h1>
<%= if assigns[:changeset] do %>
The following errors occurred when creating this Device:
<%= aggregated_errors(@changeset) %>
<% end %>
<%= live_render(@conn, FgHttpWeb.NewDeviceLive, session: %{"current_user_id" => @conn.assigns.current_user.id}) %>
<p>

View File

@@ -1,3 +1,16 @@
defmodule FgHttpWeb.DeviceView do
use FgHttpWeb, :view
import Ecto.Changeset, only: [traverse_errors: 2]
def aggregated_errors(changeset) do
traverse_errors(changeset, fn {msg, opts} ->
Enum.reduce(opts, msg, fn {key, value}, acc ->
String.replace(acc, "%{#{key}}", to_string(value))
end)
end)
|> Enum.reduce("", fn {key, value}, acc ->
joined_errors = Enum.join(value, "; ")
"#{acc}#{key}: #{joined_errors}\n"
end)
end
end

View File

@@ -1,53 +1,42 @@
defmodule FgHttpWeb.DeviceControllerTest do
use FgHttpWeb.ConnCase
use FgHttpWeb.ConnCase, async: true
alias FgHttp.Devices
alias FgHttp.Users
import FgHttp.Fixtures
@create_attrs %{name: "some name", ifname: "wg0", public_key: "foobar"}
@create_attrs %{public_key: "foobar"}
@update_attrs %{name: "some updated name"}
@invalid_attrs %{user_id: nil}
def fixture(:user) do
attrs = %{email: "test", password: "foobar", password_confirmation: "foobar"}
{:ok, user} = Users.create_user(attrs)
user
end
def fixture(:device) do
{:ok, device} = Devices.create_device(Map.merge(%{user_id: fixture(:user).id}, @create_attrs))
device
end
@invalid_attrs %{public_key: nil}
describe "index" do
test "lists all devices", %{conn: conn} do
# Mock authentication
conn = Plug.Conn.assign(conn, :current_user, fixture(:user))
test "lists all devices", %{authed_conn: conn} do
conn = get(conn, Routes.device_path(conn, :index))
assert html_response(conn, 200) =~ "Listing Devices"
end
end
describe "new device" do
test "renders form", %{conn: conn} do
# Mock authentication
conn = Plug.Conn.assign(conn, :current_user, fixture(:user))
test "renders form", %{authed_conn: conn} do
conn = get(conn, Routes.device_path(conn, :new))
assert html_response(conn, 200) =~ "New Device"
end
end
describe "create device" do
test "redirects when data is valid", %{authed_conn: conn} do
conn = post(conn, Routes.device_path(conn, :create), device: @create_attrs)
assert html_response(conn, 302) =~ "redirected"
end
test "renders errors when data is invalid", %{authed_conn: conn} do
conn = post(conn, Routes.device_path(conn, :create), device: @invalid_attrs)
assert html_response(conn, 200) =~ "public_key: can&#39;t be blank"
end
end
describe "edit device" do
setup [:create_device]
test "renders form for editing chosen device", %{conn: conn, device: device} do
conn =
conn
|> Plug.Conn.assign(:current_user, fixture(:user))
|> Plug.Conn.assign(:current_session, fixture(:user))
test "renders form for editing chosen device", %{authed_conn: conn, device: device} do
conn = get(conn, Routes.device_path(conn, :edit, device))
assert html_response(conn, 200) =~ "Edit Device"
end
@@ -56,7 +45,7 @@ defmodule FgHttpWeb.DeviceControllerTest do
describe "update device" do
setup [:create_device]
test "redirects when data is valid", %{conn: conn, device: device} do
test "redirects when data is valid", %{authed_conn: conn, device: device} do
conn = put(conn, Routes.device_path(conn, :update, device), device: @update_attrs)
assert redirected_to(conn) == Routes.device_path(conn, :show, device)
@@ -64,7 +53,7 @@ defmodule FgHttpWeb.DeviceControllerTest do
assert html_response(conn, 200) =~ "some updated name"
end
test "renders errors when data is invalid", %{conn: conn, device: device} do
test "renders errors when data is invalid", %{authed_conn: conn, device: device} do
conn = put(conn, Routes.device_path(conn, :update, device), device: @invalid_attrs)
assert html_response(conn, 200) =~ "Edit Device"
end
@@ -73,7 +62,7 @@ defmodule FgHttpWeb.DeviceControllerTest do
describe "delete device" do
setup [:create_device]
test "deletes chosen device", %{conn: conn, device: device} do
test "deletes chosen device", %{authed_conn: conn, device: device} do
conn = delete(conn, Routes.device_path(conn, :delete, device))
assert redirected_to(conn) == Routes.device_path(conn, :index)

View File

@@ -1,5 +1,5 @@
defmodule FgHttpWeb.RuleControllerTest do
use FgHttpWeb.ConnCase
use FgHttpWeb.ConnCase, async: true
describe "index" do
end

View File

@@ -19,6 +19,8 @@ defmodule FgHttpWeb.ConnCase do
alias Ecto.Adapters.SQL.Sandbox
import FgHttp.Fixtures
using do
quote do
# Import conveniences for testing with connections
@@ -31,6 +33,26 @@ defmodule FgHttpWeb.ConnCase do
end
end
def new_conn do
Phoenix.ConnTest.build_conn()
end
def authed_conn do
user = fixture(:user)
session =
fixture(:session, %{
user_id: user.id,
user_password: "test",
user_email: "test"
})
new_conn()
|> Plug.Conn.assign(:current_user, user)
|> Plug.Conn.assign(:current_session, session)
|> Plug.Conn.assign(:user_signed_in?, true)
end
setup tags do
:ok = Sandbox.checkout(FgHttp.Repo)
@@ -38,6 +60,6 @@ defmodule FgHttpWeb.ConnCase do
Sandbox.mode(FgHttp.Repo, {:shared, self()})
end
{:ok, conn: Phoenix.ConnTest.build_conn()}
{:ok, unauthed_conn: new_conn(), authed_conn: authed_conn()}
end
end

View File

@@ -0,0 +1,28 @@
defmodule FgHttp.Fixtures do
@moduledoc """
Convenience helpers for inserting records
"""
alias FgHttp.{Devices, Repo, Sessions, Users, Users.User}
def fixture(:user) do
case Repo.get_by(User, email: "test") do
nil ->
attrs = %{email: "test", password: "test", password_confirmation: "test"}
{:ok, user} = Users.create_user(attrs)
user
%User{} = user ->
user
end
end
def fixture(:device) do
attrs = %{public_key: "foobar", ifname: "wg0", name: "factory"}
{:ok, device} = Devices.create_device(Map.merge(%{user_id: fixture(:user).id}, attrs))
device
end
def fixture(:session, attrs \\ %{}) do
{:ok, _session} = Sessions.create_session(attrs)
end
end