diff --git a/lib/chess/repo/queries.ex b/lib/chess/repo/queries.ex index 3266231..cfa469b 100644 --- a/lib/chess/repo/queries.ex +++ b/lib/chess/repo/queries.ex @@ -5,6 +5,7 @@ defmodule Chess.Repo.Queries do alias Chess.Repo alias Chess.Store.Game + alias Chess.Store.User def game_for_info(user_id, game_id) do user_id @@ -19,4 +20,10 @@ defmodule Chess.Repo.Queries do |> preload(:moves) |> Repo.get!(game_id) end + + def opponents(user, query_string) do + user + |> User.opponents + |> User.matches(query_string) + end end diff --git a/lib/chess/store/user.ex b/lib/chess/store/user.ex index 1eb92c8..5989076 100644 --- a/lib/chess/store/user.ex +++ b/lib/chess/store/user.ex @@ -46,16 +46,21 @@ defmodule Chess.Store.User do |> hash_password() end - def unique_validations(struct, params \\ %{}) do + def unique_validations(struct) do struct |> unique_constraint(:name) |> unique_constraint(:email) end def opponents(user) do - from user in "users", - where: user.id != ^user.id, - select: {user.name, user.id} + from user in __MODULE__, + where: user.id != ^user.id + end + + def matches(query, query_string) do + from user in query, + where: ilike(user.name, ^"%#{query_string}%") + or user.email == ^query_string end defp hash_password(changeset) do diff --git a/test/chess/repo/queries_test.exs b/test/chess/repo/queries_test.exs new file mode 100644 index 0000000..64368d3 --- /dev/null +++ b/test/chess/repo/queries_test.exs @@ -0,0 +1,69 @@ +defmodule Chess.Repo.QueriesTest do + use Chess.DataCase + + import Chess.Factory + alias Chess.Repo + alias Chess.Repo.Queries + + describe "opponents" do + test "it finds a user on a partial name match" do + user = insert(:user, %{ + name: "Link", + email: "link@hyrule.com", + password: "ilovezelda" + }) + opponent = insert(:user, %{ + name: "Princess Zelda", + email: "zelda@hyrule.com", + password: "ganonsucks" + }) + + result = + user + |> Queries.opponents("zelda") + |> Repo.one + + assert result.id == opponent.id + end + + test "it finds a user on a complete email match" do + user = insert(:user, %{ + name: "Link", + email: "link@hyrule.com", + password: "ilovezelda" + }) + opponent = insert(:user, %{ + name: "Princess Zelda", + email: "zelda@hyrule.com", + password: "ganonsucks" + }) + + result = + user + |> Queries.opponents("zelda@hyrule.com") + |> Repo.one + + assert result.id == opponent.id + end + + test "it does not find a user on a partial email" do + user = insert(:user, %{ + name: "Link", + email: "link@hyrule.com", + password: "ilovezelda" + }) + insert(:user, %{ + name: "Princess Zelda", + email: "zelda@hyrule.com", + password: "ganonsucks" + }) + + result = + user + |> Queries.opponents("hyrule") + |> Repo.one + + assert result == nil + end + end +end