More frontend tests
This commit is contained in:
parent
075ae78df2
commit
aa0c43aeb1
@ -96,13 +96,19 @@ defmodule Friends.Accounts do
|
||||
"""
|
||||
def assign_profile(%User{} = user) do
|
||||
case user.email |> Friends.Friend.get_by_email do
|
||||
nil -> nil
|
||||
nil ->
|
||||
nil
|
||||
friend ->
|
||||
friend
|
||||
new_friend = friend
|
||||
|> Friends.Friend.changeset(%{
|
||||
user_id: user.id
|
||||
})
|
||||
user_id: user.id})
|
||||
|> Friends.Repo.update!()
|
||||
|> Friends.Friend.load_user
|
||||
|
||||
%{
|
||||
friend: new_friend,
|
||||
user: new_friend.user |> Friends.Accounts.User.load_profile
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -56,7 +56,7 @@ defmodule Friends.Friend do
|
||||
end
|
||||
|
||||
def new(params \\ %{}) do
|
||||
%Friend{id: "new"}
|
||||
%Friend{id: :new}
|
||||
|> struct(params)
|
||||
end
|
||||
|
||||
@ -100,18 +100,22 @@ defmodule Friends.Friend do
|
||||
}
|
||||
end
|
||||
|
||||
def commit(friend) do
|
||||
friend
|
||||
|> @repo.insert!
|
||||
|> load_user
|
||||
end
|
||||
|
||||
def create_or_update(params) do
|
||||
case params.id do
|
||||
:new ->
|
||||
friend = create(params)
|
||||
friend
|
||||
|> @repo.insert!
|
||||
|> load_user
|
||||
params
|
||||
|> create()
|
||||
|> commit()
|
||||
_number ->
|
||||
friend = update(params)
|
||||
friend
|
||||
|> @repo.insert!
|
||||
|> load_user
|
||||
params
|
||||
|> update()
|
||||
|> commit()
|
||||
end
|
||||
end
|
||||
|
||||
@ -148,9 +152,20 @@ defmodule Friends.Friend do
|
||||
end
|
||||
end
|
||||
|
||||
def assign_user(%Friend{} = friend) do
|
||||
case friend.email |> Friends.Accounts.get_user_by_email do
|
||||
nil ->
|
||||
nil
|
||||
user ->
|
||||
user |> Friends.Accounts.assign_profile
|
||||
end
|
||||
end
|
||||
|
||||
def load_user(%Friends.Friend{user: %Ecto.Association.NotLoaded{}} = model) do
|
||||
model
|
||||
|> @repo.preload(:user)
|
||||
end
|
||||
|
||||
def load_user(%Friends.Friend{} = friend), do: friend
|
||||
|
||||
end
|
||||
|
||||
@ -7,10 +7,16 @@ defmodule FriendsWeb.PageController do
|
||||
def index(conn, _params) do
|
||||
new_friend = Friend.new() |> Friend.changeset()
|
||||
|
||||
if(conn|> get_session(:linked)) do
|
||||
# If logged in and linked, redirect to friend_path :index
|
||||
conn |> redirect(to: FriendsWeb.Router.Helpers.friend_path(conn, :index))
|
||||
else
|
||||
# Otherwise, show the landing page
|
||||
conn
|
||||
|> assign(:new_friend, new_friend)
|
||||
|> assign(:all_friends, Friend.all())
|
||||
|> assign(:users, User |> Repo.all())
|
||||
|> render("index.html")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -138,10 +138,11 @@ defmodule FriendsWeb.UserAuth do
|
||||
case profile do
|
||||
nil ->
|
||||
# No profile linked
|
||||
conn |> create_or_link_profile(current_user)
|
||||
conn
|
||||
|> create_or_link_profile(current_user)
|
||||
_profile ->
|
||||
# Profile already linked
|
||||
conn
|
||||
conn |> put_session(:linked, true)
|
||||
end
|
||||
else
|
||||
# Not logged in
|
||||
@ -158,8 +159,12 @@ defmodule FriendsWeb.UserAuth do
|
||||
|> halt()
|
||||
# Or make a new one
|
||||
profile ->
|
||||
user |> Friends.Accounts.assign_profile
|
||||
user
|
||||
|> Friends.Accounts.assign_profile
|
||||
|
||||
conn
|
||||
|> put_session(:linked, true)
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
<.form let={f} for={@changeset} action={Routes.user_registration_path(@conn, :create)}>
|
||||
<%= if @changeset.action do %>
|
||||
<div class="alert alert-danger">
|
||||
<p>Oops, something went wrong! Please check the errors below.</p>
|
||||
Oops, something went wrong! Please check the errors below.
|
||||
</div>
|
||||
<% end %>
|
||||
<ul class="w-1/2 pl-0 flex flex-col gap-6">
|
||||
@ -15,6 +15,7 @@
|
||||
<li class="flex flex-row gap-4">
|
||||
<%= label f, :password, class: "w-1/3" %>
|
||||
<%= password_input f, :password, required: true %>
|
||||
<%= error_tag f, :password %>
|
||||
</li>
|
||||
<li class="flex">
|
||||
<%= submit "Register", class: "btn btn-primary" %>
|
||||
|
||||
@ -3,7 +3,7 @@ defmodule Friends.AccountsTest do
|
||||
|
||||
alias Friends.Accounts
|
||||
|
||||
import Friends.AccountsFixtures
|
||||
import Friends.{AccountsFixtures, FriendsFixtures}
|
||||
alias Friends.Accounts.{User, UserToken}
|
||||
|
||||
describe "get_user_by_email/1" do
|
||||
@ -502,4 +502,29 @@ defmodule Friends.AccountsTest do
|
||||
refute inspect(%User{password: "123456"}) =~ "password: \"123456\""
|
||||
end
|
||||
end
|
||||
|
||||
describe "assign_profile/1" do
|
||||
setup do
|
||||
user = user_fixture()
|
||||
%{
|
||||
user: user,
|
||||
friend: friend_fixture(%{email: user.email})
|
||||
}
|
||||
end
|
||||
|
||||
test "links a friend to a user", %{user: user, friend: friend} do
|
||||
assert user.profile == nil
|
||||
assert friend.user == nil
|
||||
|
||||
%{
|
||||
friend: new_friend,
|
||||
user: new_user
|
||||
} = user |> Friends.Accounts.assign_profile
|
||||
|
||||
assert new_user.profile.id == friend.id
|
||||
assert new_friend.user.id == user.id
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@ -3,7 +3,32 @@ defmodule Friends.FriendTest do
|
||||
|
||||
# alias Friends.Accounts
|
||||
|
||||
# import Friends.AccountsFixtures
|
||||
import Friends.{AccountsFixtures,FriendsFixtures}
|
||||
# alias Friends.Accounts.{User, UserToken}
|
||||
|
||||
|
||||
describe "assign_user/1" do
|
||||
setup do
|
||||
friend = friend_fixture()
|
||||
%{
|
||||
friend: friend,
|
||||
user: user_fixture(%{email: friend.email})
|
||||
}
|
||||
end
|
||||
test "links a user to a friend", %{user: user, friend: friend} do
|
||||
assert user.profile == nil
|
||||
assert friend.user == nil
|
||||
|
||||
%{
|
||||
friend: new_friend,
|
||||
user: new_user
|
||||
} = friend |> Friends.Friend.assign_user
|
||||
|
||||
assert new_user.profile.id == friend.id
|
||||
assert new_friend.user.id == user.id
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
@ -0,0 +1,35 @@
|
||||
defmodule FriendsWeb.FriendControllerTest do
|
||||
use FriendsWeb.ConnCase, async: true
|
||||
import Friends.{AccountsFixtures,FriendsFixtures}
|
||||
|
||||
alias FriendsWeb.Router.Helpers, as: Routes
|
||||
|
||||
|
||||
setup do
|
||||
%{
|
||||
user: user,
|
||||
friend: friend
|
||||
} =
|
||||
friend_fixture(
|
||||
%{email: user_fixture().email}
|
||||
) |> Friends.Friend.assign_user
|
||||
end
|
||||
|
||||
describe "GET '/friends'" do
|
||||
|
||||
test "shows the friends dashboard", %{conn: conn, friend: friend} do
|
||||
conn = get(conn, "/friends")
|
||||
assert html_response(conn, 200) =~ friend.name
|
||||
assert html_response(conn, 200) =~ "Log in"
|
||||
end
|
||||
|
||||
test "shows '(you)' if logged in", %{conn: conn, friend: friend, user: user} do
|
||||
conn = conn |> log_in_user(user) |> get("/friends")
|
||||
assert html_response(conn, 200) =~ friend.name
|
||||
assert html_response(conn, 200) =~ "(you)"
|
||||
assert html_response(conn, 200) =~ "Log out"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
@ -17,15 +17,15 @@ defmodule FriendsWeb.PageControllerTest do
|
||||
end
|
||||
|
||||
test "redirects to the new profile flow if logged in but has no profile", %{conn: conn, user: user} do
|
||||
friend = friend_fixture(%{email: "random_email@invalid.biz"})
|
||||
_friend = friend_fixture(%{email: "random_email@invalid.biz"})
|
||||
conn = conn |> log_in_user(user) |> get("/")
|
||||
assert redirected_to(conn) == Routes.profile_form_path(conn, :new)
|
||||
end
|
||||
|
||||
test "redirects to the friends dashboard if logged in & has a profile", %{conn: conn, user: user} do
|
||||
friend = friend_fixture(%{email: user.email})
|
||||
_friend = friend_fixture(%{email: user.email})
|
||||
conn = conn |> log_in_user(user) |> get("/")
|
||||
assert html_response(conn, 200) =~ "Log out"
|
||||
assert redirected_to(conn) == Routes.friend_path(conn, :index)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@ -3,9 +3,15 @@ defmodule Friends.FriendsFixtures do
|
||||
This module defines test helpers for creating
|
||||
entities via the `Friends.Friend` context.
|
||||
"""
|
||||
def random_string(length) do
|
||||
:crypto.strong_rand_bytes(length)
|
||||
|> String.replace("-", "")
|
||||
|> Base.url_encode64
|
||||
|> binary_part(0, length)
|
||||
end
|
||||
|
||||
def unique_friend_email, do: "user#{System.unique_integer()}@example.com"
|
||||
def valid_friend_name, do: "Firsty-First Oldfashioned Toomany-Middlenames McLastname"
|
||||
def valid_friend_name, do: "#{random_string(5)} Mc#{random_string(5)}"
|
||||
def valid_friend_phone, do: "+1 (917) 624 2939" |> Helpers.format_phone
|
||||
def valid_friend_birthdate, do: ~D"1990-05-05"
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user