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

Games are now associated to a user

This commit is contained in:
Daniel Barber 2018-02-10 20:35:43 -05:00
parent ac33ed49aa
commit ea79ba962a
Signed by: danbarber
GPG Key ID: 931D8112E0103DD8
8 changed files with 88 additions and 24 deletions

View File

@ -10,6 +10,8 @@ defmodule Chess.Auth.User do
field :password_hash, :string
field :username, :string
has_many :games, Chess.Store.Game
timestamps()
end

View File

@ -5,35 +5,39 @@ defmodule Chess.Store.Game do
import Ecto.Changeset
import Ecto.Query
alias Chess.Board
schema "games" do
field :board, :map
belongs_to :user, Chess.Auth.User
timestamps()
end
@doc """
Builds a changeset based on the `struct` and `params`.
"""
def changeset(struct) do
def create_changeset(struct, params \\ %{}) do
struct
|> cast(%{}, [:board])
|> set_default_board
|> validate_required([:board])
|> cast(params, [:board, :user_id])
|> put_change(:board, Board.default)
|> validate_required([:board, :user_id])
end
def changeset(struct, params) do
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:board])
|> validate_required([:board])
|> cast(params, [:board, :user_id])
|> validate_required([:board, :user_id])
end
def for_user(query, user) do
query
|> where([game], user_id: ^user.id)
end
def ordered(query) do
query
|> order_by([game], desc: game.inserted_at)
end
def set_default_board(changeset) do
changeset
|> put_change(:board, Chess.Board.default)
end
end

View File

@ -5,12 +5,18 @@ defmodule ChessWeb.GameController do
def index(conn, _params) do
changeset = Game.changeset(%Game{})
games = Game |> Game.ordered |> Repo.all
games = Game
|> Game.for_user(current_user(conn))
|> Game.ordered
|> Repo.all
render(conn, "index.html", games: games, changeset: changeset)
end
def create(conn, _params) do
changeset = Game.changeset(%Game{})
changeset = Game.create_changeset(
%Game{},
%{user_id: current_user(conn).id}
)
case Repo.insert(changeset) do
{:ok, game} ->
@ -38,4 +44,8 @@ defmodule ChessWeb.GameController do
|> put_flash(:info, "Game deleted successfully.")
|> redirect(to: game_path(conn, :index))
end
defp current_user(conn) do
Guardian.Plug.current_resource(conn)
end
end

View File

@ -0,0 +1,9 @@
defmodule Chess.Repo.Migrations.AddUserIdToGames do
use Ecto.Migration
def change do
alter table("games") do
add :user_id, references(:users)
end
end
end

View File

@ -4,16 +4,30 @@ defmodule Chess.GameTest do
describe "game" do
alias Chess.Store.Game
@valid_attrs %{board: %{}}
@invalid_attrs %{}
test "game is valid with a board and user" do
attrs = %{board: %{}, user_id: 1}
changeset = Game.changeset(%Game{}, attrs)
test "changeset with valid attributes" do
changeset = Game.changeset(%Game{}, @valid_attrs)
assert changeset.valid?
end
test "changeset with invalid attributes" do
changeset = Game.changeset(%Game{}, @invalid_attrs)
test "game is invalid without a board" do
attrs = %{user_id: 1}
changeset = Game.changeset(%Game{}, attrs)
refute changeset.valid?
end
test "game is invalid without a user" do
attrs = %{board: %{}}
changeset = Game.changeset(%Game{}, attrs)
refute changeset.valid?
end
test "game is invalid without a board or user" do
changeset = Game.changeset(%Game{}, %{})
refute changeset.valid?
end
end

View File

@ -1,8 +1,14 @@
defmodule Chess.GamesTest do
use ChessWeb.FeatureCase
import Wallaby.Query, only: [css: 1, css: 2, button: 1, text_field: 1]
import Chess.Factory, only: [create_user: 2]
import Wallaby.Query, only: [
css: 1,
css: 2,
button: 1,
text_field: 1,
link: 1,
]
import Chess.Factory, only: [create_user: 2, create_game_for: 1]
test "visit homepage", %{session: session} do
session
@ -13,11 +19,21 @@ defmodule Chess.GamesTest do
test "can create a new game", %{session: session} do
session
|> login()
|> take_screenshot()
|> create_game()
|> assert_has(css(".board"))
end
test "can only see own games", %{session: session} do
user = create_user("zelda@hyrule.kingdom", "ganonsucks")
create_game_for(user)
session
|> login()
|> create_game()
|> click(link("Back to games"))
|> assert_has(css(".table tr", count: 1))
end
test "can move a piece", %{session: session} do
session
|> login()

View File

@ -1,5 +1,6 @@
defmodule Chess.Factory do
alias Chess.Auth.User
alias Chess.Store.Game
alias Chess.Repo
def create_user(username \\ "zelda", password \\ "password") do
@ -9,4 +10,12 @@ defmodule Chess.Factory do
)
|> Repo.insert!
end
def create_game_for(user) do
Game.create_changeset(
%Game{},
%{user_id: user.id}
)
|> Repo.insert!
end
end

View File

@ -2,6 +2,6 @@
ExUnit.start()
Ecto.Adapters.SQL.Sandbox.mode(Chess.Repo, :manual)
Ecto.Adapters.SQL.Sandbox.mode(Chess.Repo, {:shared, self()})
Application.put_env(:wallaby, :base_url, ChessWeb.Endpoint.url)