More frontend tests

This commit is contained in:
Ryan Pandya 2022-11-03 15:48:43 -04:00
parent 075ae78df2
commit aa0c43aeb1
10 changed files with 153 additions and 29 deletions

View File

@ -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

View File

@ -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,18 +100,22 @@ 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
@ -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

View File

@ -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()
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 conn
|> assign(:new_friend, new_friend) |> assign(:new_friend, new_friend)
|> assign(:all_friends, Friend.all()) |> assign(:all_friends, Friend.all())
|> assign(:users, User |> Repo.all()) |> assign(:users, User |> Repo.all())
|> render("index.html") |> render("index.html")
end end
end
end end

View File

@ -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

View File

@ -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" %>

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"