From be27209523c71e6fac2eb8046c8043c365529ec2 Mon Sep 17 00:00:00 2001 From: Jamil Bou Kheir Date: Tue, 9 Jun 2020 08:57:49 -0700 Subject: [PATCH] more coverage --- apps/fg_http/coveralls.json | 5 ++ apps/fg_http/lib/fg_http/users.ex | 68 ------------------- apps/fg_http/lib/fg_http/users/user.ex | 33 +++++++-- apps/fg_http/lib/fg_http/util/fg_map.ex | 12 ++++ .../controllers/user_controller.ex | 1 + .../fg_http_web/templates/layout/app.html.eex | 1 + .../templates/session/new.html.eex | 2 + .../fg_http_web/templates/user/edit.html.eex | 35 +++++++++- .../fg_http_web/templates/user/new.html.eex | 8 ++- .../fg_http_web/templates/user/show.html.eex | 6 ++ .../fg_http/test/fg_http/util/fg_map_test.exs | 13 ++++ .../controllers/rule_controller_test.exs | 3 +- .../controllers/user_controller_test.exs | 34 ++++++++-- mix.lock | 4 +- 14 files changed, 139 insertions(+), 86 deletions(-) create mode 100644 apps/fg_http/coveralls.json create mode 100644 apps/fg_http/lib/fg_http/util/fg_map.ex create mode 100644 apps/fg_http/test/fg_http/util/fg_map_test.exs diff --git a/apps/fg_http/coveralls.json b/apps/fg_http/coveralls.json new file mode 100644 index 000000000..3d771278d --- /dev/null +++ b/apps/fg_http/coveralls.json @@ -0,0 +1,5 @@ +{ + "skip_files": [ + "test" + ] +} diff --git a/apps/fg_http/lib/fg_http/users.ex b/apps/fg_http/lib/fg_http/users.ex index 08f0a2b85..49ddb0b1a 100644 --- a/apps/fg_http/lib/fg_http/users.ex +++ b/apps/fg_http/lib/fg_http/users.ex @@ -8,100 +8,32 @@ defmodule FgHttp.Users do alias FgHttp.Users.User - @doc """ - Returns the list of users. - - ## Examples - - iex> list_users() - [%User{}, ...] - - """ def list_users do Repo.all(User) end - @doc """ - Gets a single user. - - Raises `Ecto.NoResultsError` if the User does not exist. - - ## Examples - - iex> get_user!(123) - %User{} - - iex> get_user!(456) - ** (Ecto.NoResultsError) - - """ def get_user!(email: email) do Repo.get_by!(User, email: email) end def get_user!(id), do: Repo.get!(User, id) - @doc """ - Creates a user. - - ## Examples - - iex> create_user(%{field: value}) - {:ok, %User{}} - - iex> create_user(%{field: bad_value}) - {:error, %Ecto.Changeset{}} - - """ def create_user(attrs \\ %{}) do %User{} |> User.create_changeset(attrs) |> Repo.insert() end - @doc """ - Updates a user. - - ## Examples - - iex> update_user(user, %{field: new_value}) - {:ok, %User{}} - - iex> update_user(user, %{field: bad_value}) - {:error, %Ecto.Changeset{}} - - """ def update_user(%User{} = user, attrs) do user |> User.update_changeset(attrs) |> Repo.update() end - @doc """ - Deletes a user. - - ## Examples - - iex> delete_user(user) - {:ok, %User{}} - - iex> delete_user(user) - {:error, %Ecto.Changeset{}} - - """ def delete_user(%User{} = user) do Repo.delete(user) end - @doc """ - Returns an `%Ecto.Changeset{}` for tracking user changes. - - ## Examples - - iex> change_user(user) - %Ecto.Changeset{source: %User{}} - - """ def change_user(%User{} = user) do User.changeset(user, %{}) end diff --git a/apps/fg_http/lib/fg_http/users/user.ex b/apps/fg_http/lib/fg_http/users/user.ex index d6ed46744..e79599eb3 100644 --- a/apps/fg_http/lib/fg_http/users/user.ex +++ b/apps/fg_http/lib/fg_http/users/user.ex @@ -7,7 +7,7 @@ defmodule FgHttp.Users.User do import Ecto.Changeset import FgHttp.Users.PasswordHelpers - alias FgHttp.Devices.Device + alias FgHttp.{Devices.Device, Util.FgMap} schema "users" do field :email, :string @@ -36,6 +36,17 @@ defmodule FgHttp.Users.User do end # Password updated with user logged in + def update_changeset( + user, + %{ + "password" => nil, + "password_confirmation" => nil, + "current_password" => nil + } = attrs + ) do + update_changeset(user, FgMap.compact(attrs)) + end + def update_changeset( user, %{ @@ -47,7 +58,7 @@ defmodule FgHttp.Users.User do user |> cast(attrs, [:email, :password, :password_confirmation, :current_password]) |> validate_required([:password, :password_confirmation, :current_password]) - |> verify_current_password(attrs[:current_password]) + |> verify_current_password(user) |> validate_password_equality() |> put_password_hash() |> validate_required([:password_hash]) @@ -76,16 +87,24 @@ defmodule FgHttp.Users.User do |> validate_required([:email]) end - def changeset(%__MODULE__{} = _user, _attrs \\ %{}) do - change(%__MODULE__{}) + def changeset(user, attrs) do + user + |> cast(attrs, [:email, :confirmed_at, :last_signed_in_at]) end def authenticate_user(user, password_candidate) do Argon2.check_pass(user, password_candidate) end - defp verify_current_password(user, current_password) do - {:ok, user} = authenticate_user(user, current_password) - user + defp verify_current_password(changeset, user) do + case authenticate_user(user, changeset.changes.current_password) do + {:ok, _user} -> + changeset + |> delete_change(:current_password) + + {:error, error_msg} -> + changeset + |> add_error(:current_password, "is invalid: #{error_msg}") + end end end diff --git a/apps/fg_http/lib/fg_http/util/fg_map.ex b/apps/fg_http/lib/fg_http/util/fg_map.ex new file mode 100644 index 000000000..1e39ebb64 --- /dev/null +++ b/apps/fg_http/lib/fg_http/util/fg_map.ex @@ -0,0 +1,12 @@ +defmodule FgHttp.Util.FgMap do + @moduledoc """ + Utilities for working with Maps + """ + + @doc """ + Removes key, value pairs from a Map if the value is nil + """ + def compact(%{} = map) do + for {k, v} <- map, v != nil, into: %{}, do: {k, v} + end +end diff --git a/apps/fg_http/lib/fg_http_web/controllers/user_controller.ex b/apps/fg_http/lib/fg_http_web/controllers/user_controller.ex index 8f42ebeeb..de12f65fc 100644 --- a/apps/fg_http/lib/fg_http_web/controllers/user_controller.ex +++ b/apps/fg_http/lib/fg_http_web/controllers/user_controller.ex @@ -7,6 +7,7 @@ defmodule FgHttpWeb.UserController do alias FgHttp.{Sessions, Users, Users.User} plug FgHttpWeb.Plugs.SessionLoader when action in [:show, :edit, :update, :delete] + plug :scrub_params, "user" when action in [:update] # GET /users/new def new(conn, _params) do diff --git a/apps/fg_http/lib/fg_http_web/templates/layout/app.html.eex b/apps/fg_http/lib/fg_http_web/templates/layout/app.html.eex index 544d887a4..9a0bf8344 100644 --- a/apps/fg_http/lib/fg_http_web/templates/layout/app.html.eex +++ b/apps/fg_http/lib/fg_http_web/templates/layout/app.html.eex @@ -16,6 +16,7 @@