diff --git a/friends/lib/friends/friend.ex b/friends/lib/friends/friend.ex index 138828d..6cd7f64 100644 --- a/friends/lib/friends/friend.ex +++ b/friends/lib/friends/friend.ex @@ -100,12 +100,28 @@ defmodule Friends.Friend do } end - def commit(friend) do - friend + def commit(changeset) do + changeset + |> generate_slug |> @repo.insert! |> load_user 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 case params.id do :new -> @@ -165,7 +181,24 @@ defmodule Friends.Friend do model |> @repo.preload(:user) end - 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 diff --git a/friends/lib/helpers/helpers.ex b/friends/lib/helpers/helpers.ex index c694a9e..39a02bc 100644 --- a/friends/lib/helpers/helpers.ex +++ b/friends/lib/helpers/helpers.ex @@ -31,6 +31,8 @@ defmodule Helpers do |> String.replace(~r/[\(\)]/, "") end + def to_slug(nil), do: nil + def to_slug(name) when is_binary(name) do name |> String.replace(" ", "-") diff --git a/friends/test/friends/friend_test.exs b/friends/test/friends/friend_test.exs index 407f316..e4f9cad 100644 --- a/friends/test/friends/friend_test.exs +++ b/friends/test/friends/friend_test.exs @@ -1,34 +1,114 @@ defmodule Friends.FriendTest do use Friends.DataCase -# alias Friends.Accounts + alias Friends.Friend 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}) - } + 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 - 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 + describe "commit/1" do + test "changes id" do + f = valid_friend_attributes() + |> Friend.create() + |> Friend.commit() - assert new_user.profile.id == friend.id - assert new_friend.user.id == user.id + 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 + setup do + friend = friend_fixture() + %{ + friend: friend, + user: user_fixture(%{email: friend.email}) + } end -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 + + 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 diff --git a/friends/test/support/fixtures/friends_fixtures.ex b/friends/test/support/fixtures/friends_fixtures.ex index c399335..7d53c70 100644 --- a/friends/test/support/fixtures/friends_fixtures.ex +++ b/friends/test/support/fixtures/friends_fixtures.ex @@ -5,9 +5,9 @@ defmodule Friends.FriendsFixtures do """ def random_string(length) do :crypto.strong_rand_bytes(length) - |> String.replace("-", "") |> Base.url_encode64 |> binary_part(0, length) + |> String.replace(~r/-/, "") end def unique_friend_email, do: "user#{System.unique_integer()}@example.com"