Happy with friend tests for now

This commit is contained in:
Ryan Pandya 2022-11-03 17:47:08 -04:00
parent aa0c43aeb1
commit d331da9e17
4 changed files with 138 additions and 23 deletions

View File

@ -100,12 +100,28 @@ defmodule Friends.Friend do
} }
end end
def commit(friend) do def commit(changeset) do
friend changeset
|> generate_slug
|> @repo.insert! |> @repo.insert!
|> load_user |> load_user
end end
def generate_slug(%Ecto.Changeset{} = changeset) do
slug = changeset.changes.name |> to_slug
changeset |> changeset(%{
slug: slug
})
end
def generate_slug(%Friend{} = friend) do
%{
friend | slug: friend.name |> to_slug
}
end
def create_or_update(params) do def create_or_update(params) do
case params.id do case params.id do
:new -> :new ->
@ -165,7 +181,24 @@ defmodule Friends.Friend do
model model
|> @repo.preload(:user) |> @repo.preload(:user)
end end
def load_user(%Friends.Friend{} = friend), do: friend def load_user(%Friends.Friend{} = friend), do: friend
def load_relationships(%Friends.Friend{
relationships: %Ecto.Association.NotLoaded{},
reverse_relationships: %Ecto.Association.NotLoaded{}
} = model) do
model
|> @repo.preload([:relationships, :reverse_relationships])
end
def load_relationships(%Friends.Friend{} = friend), do: friend
def load_preloads(%Friends.Friend{
relationships: %Ecto.Association.NotLoaded{},
reverse_relationships: %Ecto.Association.NotLoaded{},
user: %Ecto.Association.NotLoaded{}} = model) do
model
|> @repo.preload([:user,:relationships, :reverse_relationships])
end
def load_preloads(%Friends.Friend{} = friend), do: friend
end end

View File

@ -31,6 +31,8 @@ defmodule Helpers do
|> String.replace(~r/[\(\)]/, "") |> String.replace(~r/[\(\)]/, "")
end end
def to_slug(nil), do: nil
def to_slug(name) when is_binary(name) do def to_slug(name) when is_binary(name) do
name name
|> String.replace(" ", "-") |> String.replace(" ", "-")

View File

@ -1,11 +1,63 @@
defmodule Friends.FriendTest do defmodule Friends.FriendTest do
use Friends.DataCase use Friends.DataCase
# alias Friends.Accounts alias Friends.Friend
import Friends.{AccountsFixtures,FriendsFixtures} import Friends.{AccountsFixtures,FriendsFixtures}
# alias Friends.Accounts.{User, UserToken} # alias Friends.Accounts.{User, UserToken}
describe "new/1" do
test "no params" do
f = Friend.new()
assert f.id == :new
end
test "with params" do
attrs = valid_friend_attributes()
f = attrs |> Friend.new()
assert f.id == :new
assert f.name == attrs |> Map.get(:name)
end
test "has no loaded preloads" do
f = Friend.new()
assert %Ecto.Association.NotLoaded{} = f.user
assert %Ecto.Association.NotLoaded{} = f.relationships
assert %Ecto.Association.NotLoaded{} = f.reverse_relationships
end
end
describe "commit/1" do
test "changes id" do
f = valid_friend_attributes()
|> Friend.create()
|> Friend.commit()
assert f.id != :new
end
test "generates slug" do
f = valid_friend_attributes()
|> Friend.create()
|> Friend.commit()
assert f.slug != :nil
assert f.slug == f.name |> Helpers.to_slug
end
end
describe "generate_slug/1" do
test "a new friend has no slug" do
f = valid_friend_attributes() |> Friend.new()
assert f.slug == nil
end
test "generate_slug generates a slug, returns a friend" do
f = valid_friend_attributes() |> Friend.new() |> Friend.generate_slug
assert f.slug == f.name |> Helpers.to_slug
end
test "generate_slug generates a slug, returns a changeset" do
c = valid_friend_attributes() |> Friend.create() |> Friend.generate_slug
f = c.data
assert f.slug == f.name |> Helpers.to_slug
end
end
describe "assign_user/1" do describe "assign_user/1" do
setup do setup do
@ -30,5 +82,33 @@ defmodule Friends.FriendTest do
end end
end end
describe "preloads" do
setup do
%{friend:
%{
Friend.new | id: 123
}
}
end
test "load user", %{friend: friend} do
f = friend |> Friend.load_user
refute f.user == %Ecto.Association.NotLoaded{}
end
test "load relationships", %{friend: friend} do
f = friend |> Friend.load_relationships
refute f.relationships == %Ecto.Association.NotLoaded{}
refute f.reverse_relationships == %Ecto.Association.NotLoaded{}
end
test "load all", %{friend: friend} do
f = friend |> Friend.load_preloads
refute f.user == %Ecto.Association.NotLoaded{}
refute f.relationships == %Ecto.Association.NotLoaded{}
refute f.reverse_relationships == %Ecto.Association.NotLoaded{}
end
end
end end

View File

@ -5,9 +5,9 @@ defmodule Friends.FriendsFixtures do
""" """
def random_string(length) do def random_string(length) do
:crypto.strong_rand_bytes(length) :crypto.strong_rand_bytes(length)
|> String.replace("-", "")
|> Base.url_encode64 |> Base.url_encode64
|> binary_part(0, length) |> binary_part(0, length)
|> String.replace(~r/-/, "")
end end
def unique_friend_email, do: "user#{System.unique_integer()}@example.com" def unique_friend_email, do: "user#{System.unique_integer()}@example.com"