More frontend tests
This commit is contained in:
parent
fc6ecbe9c8
commit
f49092a08a
@ -96,13 +96,19 @@ defmodule Friends.Accounts do
|
|||||||
"""
|
"""
|
||||||
def assign_profile(%User{} = user) do
|
def assign_profile(%User{} = user) do
|
||||||
case user.email |> Friends.Friend.get_by_email do
|
case user.email |> Friends.Friend.get_by_email do
|
||||||
nil -> nil
|
nil ->
|
||||||
|
nil
|
||||||
friend ->
|
friend ->
|
||||||
friend
|
new_friend = friend
|
||||||
|> Friends.Friend.changeset(%{
|
|> Friends.Friend.changeset(%{
|
||||||
user_id: user.id
|
user_id: user.id})
|
||||||
})
|
|
||||||
|> Friends.Repo.update!()
|
|> Friends.Repo.update!()
|
||||||
|
|> Friends.Friend.load_user
|
||||||
|
|
||||||
|
%{
|
||||||
|
friend: new_friend,
|
||||||
|
user: new_friend.user |> Friends.Accounts.User.load_profile
|
||||||
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -56,7 +56,7 @@ defmodule Friends.Friend do
|
|||||||
end
|
end
|
||||||
|
|
||||||
def new(params \\ %{}) do
|
def new(params \\ %{}) do
|
||||||
%Friend{id: "new"}
|
%Friend{id: :new}
|
||||||
|> struct(params)
|
|> struct(params)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -100,19 +100,23 @@ defmodule Friends.Friend do
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def commit(friend) do
|
||||||
|
friend
|
||||||
|
|> @repo.insert!
|
||||||
|
|> load_user
|
||||||
|
end
|
||||||
|
|
||||||
def create_or_update(params) do
|
def create_or_update(params) do
|
||||||
case params.id do
|
case params.id do
|
||||||
:new ->
|
:new ->
|
||||||
friend = create(params)
|
params
|
||||||
friend
|
|> create()
|
||||||
|> @repo.insert!
|
|> commit()
|
||||||
|> load_user
|
|
||||||
_number ->
|
_number ->
|
||||||
friend = update(params)
|
params
|
||||||
friend
|
|> update()
|
||||||
|> @repo.insert!
|
|> commit()
|
||||||
|> load_user
|
end
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_relationships(friend) do
|
def get_relationships(friend) do
|
||||||
@ -148,9 +152,20 @@ defmodule Friends.Friend do
|
|||||||
end
|
end
|
||||||
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
|
def load_user(%Friends.Friend{user: %Ecto.Association.NotLoaded{}} = model) do
|
||||||
model
|
model
|
||||||
|> @repo.preload(:user)
|
|> @repo.preload(:user)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def load_user(%Friends.Friend{} = friend), do: friend
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -7,10 +7,16 @@ defmodule FriendsWeb.PageController do
|
|||||||
def index(conn, _params) do
|
def index(conn, _params) do
|
||||||
new_friend = Friend.new() |> Friend.changeset()
|
new_friend = Friend.new() |> Friend.changeset()
|
||||||
|
|
||||||
conn
|
if(conn|> get_session(:linked)) do
|
||||||
|> assign(:new_friend, new_friend)
|
# If logged in and linked, redirect to friend_path :index
|
||||||
|> assign(:all_friends, Friend.all())
|
conn |> redirect(to: FriendsWeb.Router.Helpers.friend_path(conn, :index))
|
||||||
|> assign(:users, User |> Repo.all())
|
else
|
||||||
|> render("index.html")
|
# 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
|
||||||
end
|
end
|
||||||
|
|||||||
@ -138,10 +138,11 @@ defmodule FriendsWeb.UserAuth do
|
|||||||
case profile do
|
case profile do
|
||||||
nil ->
|
nil ->
|
||||||
# No profile linked
|
# No profile linked
|
||||||
conn |> create_or_link_profile(current_user)
|
conn
|
||||||
|
|> create_or_link_profile(current_user)
|
||||||
_profile ->
|
_profile ->
|
||||||
# Profile already linked
|
# Profile already linked
|
||||||
conn
|
conn |> put_session(:linked, true)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
# Not logged in
|
# Not logged in
|
||||||
@ -158,8 +159,12 @@ defmodule FriendsWeb.UserAuth do
|
|||||||
|> halt()
|
|> halt()
|
||||||
# Or make a new one
|
# Or make a new one
|
||||||
profile ->
|
profile ->
|
||||||
user |> Friends.Accounts.assign_profile
|
user
|
||||||
|
|> Friends.Accounts.assign_profile
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|
|> put_session(:linked, true)
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
<.form let={f} for={@changeset} action={Routes.user_registration_path(@conn, :create)}>
|
<.form let={f} for={@changeset} action={Routes.user_registration_path(@conn, :create)}>
|
||||||
<%= if @changeset.action do %>
|
<%= if @changeset.action do %>
|
||||||
<div class="alert alert-danger">
|
<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>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
<ul class="w-1/2 pl-0 flex flex-col gap-6">
|
<ul class="w-1/2 pl-0 flex flex-col gap-6">
|
||||||
@ -15,6 +15,7 @@
|
|||||||
<li class="flex flex-row gap-4">
|
<li class="flex flex-row gap-4">
|
||||||
<%= label f, :password, class: "w-1/3" %>
|
<%= label f, :password, class: "w-1/3" %>
|
||||||
<%= password_input f, :password, required: true %>
|
<%= password_input f, :password, required: true %>
|
||||||
|
<%= error_tag f, :password %>
|
||||||
</li>
|
</li>
|
||||||
<li class="flex">
|
<li class="flex">
|
||||||
<%= submit "Register", class: "btn btn-primary" %>
|
<%= submit "Register", class: "btn btn-primary" %>
|
||||||
|
|||||||
@ -3,7 +3,7 @@ defmodule Friends.AccountsTest do
|
|||||||
|
|
||||||
alias Friends.Accounts
|
alias Friends.Accounts
|
||||||
|
|
||||||
import Friends.AccountsFixtures
|
import Friends.{AccountsFixtures, FriendsFixtures}
|
||||||
alias Friends.Accounts.{User, UserToken}
|
alias Friends.Accounts.{User, UserToken}
|
||||||
|
|
||||||
describe "get_user_by_email/1" do
|
describe "get_user_by_email/1" do
|
||||||
@ -502,4 +502,29 @@ defmodule Friends.AccountsTest do
|
|||||||
refute inspect(%User{password: "123456"}) =~ "password: \"123456\""
|
refute inspect(%User{password: "123456"}) =~ "password: \"123456\""
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|||||||
@ -3,7 +3,32 @@ defmodule Friends.FriendTest do
|
|||||||
|
|
||||||
# alias Friends.Accounts
|
# alias Friends.Accounts
|
||||||
|
|
||||||
# import Friends.AccountsFixtures
|
import Friends.{AccountsFixtures,FriendsFixtures}
|
||||||
# alias Friends.Accounts.{User, UserToken}
|
# 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
|
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
|
end
|
||||||
|
|
||||||
test "redirects to the new profile flow if logged in but has no profile", %{conn: conn, user: user} do
|
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("/")
|
conn = conn |> log_in_user(user) |> get("/")
|
||||||
assert redirected_to(conn) == Routes.profile_form_path(conn, :new)
|
assert redirected_to(conn) == Routes.profile_form_path(conn, :new)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "redirects to the friends dashboard if logged in & has a profile", %{conn: conn, user: user} do
|
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("/")
|
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
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -3,9 +3,15 @@ defmodule Friends.FriendsFixtures do
|
|||||||
This module defines test helpers for creating
|
This module defines test helpers for creating
|
||||||
entities via the `Friends.Friend` context.
|
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 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_phone, do: "+1 (917) 624 2939" |> Helpers.format_phone
|
||||||
def valid_friend_birthdate, do: ~D"1990-05-05"
|
def valid_friend_birthdate, do: ~D"1990-05-05"
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user