1
0
mirror of https://github.com/danbee/chess synced 2025-03-04 08:39:06 +00:00

Add queries for finding opponents

This commit is contained in:
Daniel Barber 2018-09-29 12:24:50 -04:00
parent 9349af64a0
commit ecf87aa632
Signed by: danbarber
GPG Key ID: 931D8112E0103DD8
3 changed files with 85 additions and 4 deletions

View File

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

View File

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

View File

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