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

Change username to email

This commit is contained in:
Daniel Barber 2018-03-03 12:28:51 -05:00
parent 4bf4c4cb45
commit 155284139e
Signed by: danbarber
GPG Key ID: 931D8112E0103DD8
19 changed files with 163 additions and 90 deletions

View File

@ -40,9 +40,9 @@ defmodule Chess.Auth do
end
@doc false
def authenticate_user(username, password) do
def authenticate_user(email, password) do
query = from u in User,
where: u.username == ^username
where: u.email == ^email
query
|> Repo.one

View File

@ -7,7 +7,7 @@ defmodule Chess.Auth.User do
schema "users" do
field :name, :string
field :username, :string
field :email, :string
field :password, :string, virtual: true
field :password_hash, :string
@ -22,7 +22,7 @@ defmodule Chess.Auth.User do
struct
|> cast(params, required_attrs())
|> validate_required(required_attrs())
|> unique_constraint(:username)
|> unique_constraint(:email)
|> hash_password()
end
@ -36,5 +36,5 @@ defmodule Chess.Auth.User do
end
end
defp required_attrs, do: ~w[name username password]a
defp required_attrs, do: ~w[name email password]a
end

View File

@ -81,7 +81,7 @@ defmodule ChessWeb.GameController do
defp get_opponents(user) do
query = from user in "users",
where: user.id != ^user.id,
select: {user.username, user.id}
select: {user.name, user.id}
query
|> Repo.all

View File

@ -12,9 +12,9 @@ defmodule ChessWeb.SessionController do
def create(
conn,
%{"user" => %{"username" => username, "password" => password}}
%{"user" => %{"email" => email, "password" => password}}
) do
case Auth.authenticate_user(username, password) do
case Auth.authenticate_user(email, password) do
{:ok, user} ->
conn
|> Guardian.Plug.sign_in(user)
@ -23,7 +23,7 @@ defmodule ChessWeb.SessionController do
{:error, _error} ->
changeset = User.changeset(%User{})
conn
|> put_flash(:error, "Bad username or password")
|> put_flash(:error, "Bad email or password")
|> render("new.html", changeset: changeset)
end
end

View File

@ -5,7 +5,7 @@
<%= for game <- @games do %>
<tr>
<td>
<%= link "Game with #{opponent(@conn, game).username}", to: game_path(@conn, :show, game), class: "btn btn-default btn-xs" %>
<%= link "Game with #{opponent(@conn, game).name}", to: game_path(@conn, :show, game), class: "btn btn-default btn-xs" %>
</td>
<td>
Started on <%= Timex.format!(game.inserted_at, "%b %e at %I:%M %P", :strftime) %>

View File

@ -1,4 +1,4 @@
<h2>Game with <%= opponent(@conn, @game).username %></h2>
<h2>Game with <%= opponent(@conn, @game).name %></h2>
<p><%= link "Back to games", to: game_path(@conn, :index) %></p>

View File

@ -16,7 +16,7 @@
<header role="banner">
<nav role="user">
<%= if current_user(@conn) do %>
<%= current_user(@conn).name %> (<%= current_user(@conn).username %>)
<%= current_user(@conn).name %> (<%= current_user(@conn).email %>)
|
<%= link("Log out", to: session_path(@conn, :delete), method: :delete) %>
<% else %>

View File

@ -12,7 +12,7 @@
<%= input f, :name %>
</div>
<div class="form-field">
<%= input f, :username %>
<%= input f, :email %>
</div>
<div class="form-field">
<%= input f, :password, as: :password %>

View File

@ -9,7 +9,7 @@
<div class="form-group">
<div class="form-field">
<%= input f, :username %>
<%= input f, :email %>
</div>
<div class="form-field">
<%= input f, :password, as: :password %>

View File

@ -0,0 +1,9 @@
defmodule Chess.Repo.Migrations.ChangeUsernameToEmail do
use Ecto.Migration
def change do
drop index(:users, [:username])
rename(table("users"), :username, to: :email)
create unique_index(:users, [:email])
end
end

View File

@ -7,7 +7,11 @@ defmodule Chess.UserTest do
alias Chess.Auth.User
alias Chess.Repo
@valid_attrs %{name: "Zelda", username: "zelda", password: "password"}
@valid_attrs %{
name: "Zelda",
email: "zelda@hyrule.com",
password: "password"
}
@invalid_attrs %{}
test "changeset with valid attributes" do
@ -20,8 +24,8 @@ defmodule Chess.UserTest do
refute changeset.valid?
end
test "username must be unique" do
insert(:user, %{username: "zelda"})
test "email must be unique" do
insert(:user, %{email: "zelda@hyrule.com"})
changeset = User.changeset(%User{}, @valid_attrs)
{:error, changeset} = Repo.insert(changeset)

View File

@ -6,9 +6,21 @@ defmodule Chess.AuthTest do
describe "users" do
alias Chess.Auth.User
@valid_attrs %{name: "some name", password: "some password", username: "some username"}
@update_attrs %{name: "some name", password: "some updated password", username: "some updated username"}
@invalid_attrs %{name: nil, password: nil, username: nil}
@valid_attrs %{
name: "some name",
email: "some email",
password: "some password"
}
@update_attrs %{
name: "some name",
email: "some updated email",
password: "some updated password"
}
@invalid_attrs %{
name: nil,
email: nil,
password: nil
}
def user_fixture(attrs \\ %{}) do
{:ok, user} =
@ -31,7 +43,7 @@ defmodule Chess.AuthTest do
test "create_user/1 with valid data creates a user" do
assert {:ok, %User{} = user} = Auth.create_user(@valid_attrs)
assert user.username == "some username"
assert user.email == "some email"
end
test "create_user/1 with invalid data returns error changeset" do
@ -42,7 +54,7 @@ defmodule Chess.AuthTest do
user = user_fixture()
assert {:ok, user} = Auth.update_user(user, @update_attrs)
assert %User{} = user
assert user.username == "some updated username"
assert user.email == "some updated email"
end
test "update_user/2 with invalid data returns error changeset" do
@ -63,14 +75,16 @@ defmodule Chess.AuthTest do
end
test "authenticate_user/1 returns false on incorrect password " do
user_fixture(username: "link", password: "eyeofsheikah")
assert {:error, message} = Auth.authenticate_user("link", "shadowtemple")
user_fixture(email: "link@hyrule.com", password: "eyeofsheikah")
assert {:error, message} =
Auth.authenticate_user("link@hyrule.com", "shadowtemple")
assert message == "invalid password"
end
test "authenticate_user/1 returns true on correct password " do
user = user_fixture(username: "link", password: "eyeofsheikah")
assert {:ok, ^user} = Auth.authenticate_user("link", "eyeofsheikah")
user = user_fixture(email: "link@hyrule.com", password: "eyeofsheikah")
assert {:ok, ^user} =
Auth.authenticate_user("link@hyrule.com", "eyeofsheikah")
end
end
end

View File

@ -8,8 +8,8 @@ defmodule Chess.GameTest do
import Chess.Factory
test "game is valid with a board and user" do
user = insert(:user, %{username: "link"})
opponent = insert(:user, %{username: "zelda"})
user = insert(:user, %{email: "link@hyrule.com"})
opponent = insert(:user, %{email: "zelda@hyrule.com"})
attrs = %{
board: %{},
@ -37,8 +37,8 @@ defmodule Chess.GameTest do
end
test "game is invalid without a board" do
user = insert(:user, %{username: "link"})
opponent = insert(:user, %{username: "zelda"})
user = insert(:user, %{email: "link@hyrule.com"})
opponent = insert(:user, %{email: "zelda@hyrule.com"})
attrs = %{board: nil, user_id: user.id, opponent_id: opponent.id}
changeset = Game.changeset(%Game{}, attrs)
@ -48,7 +48,7 @@ defmodule Chess.GameTest do
end
test "game is invalid without a user" do
opponent = insert(:user, %{username: "zelda"})
opponent = insert(:user, %{email: "zelda@hyrule.com"})
attrs = %{board: %{}, opponent_id: opponent.id}
changeset = Game.changeset(%Game{}, attrs)
@ -58,7 +58,7 @@ defmodule Chess.GameTest do
end
test "game is invalid without an opponent" do
user = insert(:user, %{username: "link"})
user = insert(:user, %{email: "link@hyrule.com"})
attrs = %{board: %{}, user_id: user.id}
changeset = Game.changeset(%Game{}, attrs)

View File

@ -7,7 +7,7 @@ defmodule Chess.ApiGameControllerTest do
test "shows chosen game", %{conn: conn} do
user = insert(:user)
opponent = insert(:user, %{username: "revali"})
opponent = insert(:user, %{email: "revali@rito.village"})
game = insert(:game, %{user_id: user.id, opponent_id: opponent.id})
conn =
@ -20,10 +20,10 @@ defmodule Chess.ApiGameControllerTest do
test "does not show a game if the user is not a player", %{conn: conn} do
user = insert(:user)
opponent = insert(:user, %{username: "revali"})
opponent = insert(:user, %{email: "revali@rito.village"})
game = insert(:game, %{user_id: user.id, opponent_id: opponent.id})
other_user = insert(:user, %{username: "mipha"})
other_user = insert(:user, %{email: "mipha@zora.domain"})
conn =
conn
@ -36,7 +36,7 @@ defmodule Chess.ApiGameControllerTest do
test "responds with 403 if user is not logged in", %{conn: conn} do
user = insert(:user)
opponent = insert(:user, %{username: "revali"})
opponent = insert(:user, %{email: "revali@rito.village"})
game = insert(:game, %{user_id: user.id, opponent_id: opponent.id})
conn =
@ -48,10 +48,10 @@ defmodule Chess.ApiGameControllerTest do
test "does not update a game if the user is not a player", %{conn: conn} do
user = insert(:user)
opponent = insert(:user, %{username: "revali"})
opponent = insert(:user, %{email: "revali@rito.village"})
game = insert(:game, %{user_id: user.id, opponent_id: opponent.id})
other_user = insert(:user, %{username: "mipha"})
other_user = insert(:user, %{email: "mipha@zora.domain"})
conn =
conn

View File

@ -18,7 +18,7 @@ defmodule Chess.GameControllerTest do
end
test "creates resource and redirects when data is valid", %{conn: conn} do
opponent = insert(:user, %{username: "daruk"})
opponent = insert(:user, %{email: "daruk@goron.city"})
attrs = %{"opponent_id" => opponent.id}
user = insert(:user)
@ -35,7 +35,7 @@ defmodule Chess.GameControllerTest do
test "shows chosen game", %{conn: conn} do
user = insert(:user)
opponent = insert(:user, %{username: "revali"})
opponent = insert(:user, %{email: "revali@rito.village"})
game = insert(:game, %{user_id: user.id, opponent_id: opponent.id})
conn =
@ -48,10 +48,10 @@ defmodule Chess.GameControllerTest do
test "does not show a game if the user is not a player", %{conn: conn} do
user = insert(:user)
opponent = insert(:user, %{username: "revali"})
opponent = insert(:user, %{email: "revali@rito.village"})
game = insert(:game, %{user_id: user.id, opponent_id: opponent.id})
other_user = insert(:user, %{username: "mipha"})
other_user = insert(:user, %{email: "mipha@zora.domain"})
conn =
conn

View File

@ -12,67 +12,89 @@ defmodule Chess.GamesTest do
end
test "can create a new game", %{session: session} do
insert(:user, %{username: "zelda", password: "ganonsucks"})
insert(:user, %{
name: "Zelda",
email: "zelda@hyrule.com",
password: "ganonsucks"
})
session
|> create_user_and_login()
|> visit("/games")
|> click(link("New game"))
|> select("game[opponent_id]", option: "zelda")
|> select("game[opponent_id]", option: "Zelda")
|> click(button("Create game"))
session
|> assert_has(css("h2", text: "Game with zelda"))
|> assert_has(css("h2", text: "Game with Zelda"))
|> assert_has(css(".board"))
end
test "can only see own games", %{session: session} do
opponent = insert(:user, %{username: "urbosa", password: "gerudoqueen"})
user = insert(:user, %{username: "zelda", password: "ganonsucks"})
opponent = insert(:user, %{
name: "Urbosa",
email: "urbosa@gerudo.town",
password: "gerudoqueen"
})
user = insert(:user, %{
name: "Zelda",
email: "zelda@hyrule.com",
password: "ganonsucks"
})
insert(:game, %{user_id: user.id, opponent_id: opponent.id})
session
|> create_user_and_login()
|> visit("/games")
|> click(link("New game"))
|> select("game[opponent_id]", option: "urbosa")
|> select("game[opponent_id]", option: "Urbosa")
|> click(button("Create game"))
|> click(link("Back to games"))
session
|> assert_has(css(".table tr", count: 1))
|> assert_has(link("Game with urbosa"))
|> assert_has(link("Game with Urbosa"))
end
test "can see games as an opponent", %{session: session} do
opponent = insert(:user, %{username: "urbosa", password: "gerudoqueen"})
user = insert(:user, %{username: "zelda", password: "ganonsucks"})
opponent = insert(:user, %{
name: "Urbosa",
email: "urbosa@gerudo.town",
password: "gerudoqueen"
})
user = insert(:user, %{
name: "Zelda",
email: "zelda@hyrule.com",
password: "ganonsucks"
})
insert(:game, %{user_id: user.id, opponent_id: opponent.id})
session
|> login("urbosa", "gerudoqueen")
|> login("urbosa@gerudo.town", "gerudoqueen")
session
|> assert_has(css(".table tr", count: 1))
|> assert_has(link("Game with zelda"))
|> assert_has(link("Game with Zelda"))
session
|> click(link("Game with zelda"))
|> click(link("Game with Zelda"))
session
|> assert_has(css("h2", text: "Game with zelda"))
|> assert_has(css("h2", text: "Game with Zelda"))
end
test "can move a piece", %{session: session} do
insert(:user, %{username: "zelda", password: "ganonsucks"})
insert(:user, %{
name: "Zelda",
email: "zelda@hyrule.com",
password: "ganonsucks"
})
session
|> create_user_and_login()
|> visit("/games")
|> click(link("New game"))
|> select("game[opponent_id]", option: "zelda")
|> select("game[opponent_id]", option: "Zelda")
|> click(button("Create game"))
session
@ -87,13 +109,17 @@ defmodule Chess.GamesTest do
end
test "cannot move the opponents pieces", %{session: session} do
insert(:user, %{username: "zelda", password: "ganonsucks"})
insert(:user, %{
name: "Zelda",
email: "zelda@hyrule.com",
password: "ganonsucks"
})
session
|> create_user_and_login()
|> visit("/games")
|> click(link("New game"))
|> select("game[opponent_id]", option: "zelda")
|> select("game[opponent_id]", option: "Zelda")
|> click(button("Create game"))
session
@ -102,20 +128,28 @@ defmodule Chess.GamesTest do
end
test "cannot move pieces when it's the opponents turn", %{session: session} do
insert(:user, %{username: "link", password: "ilovezelda"})
insert(:user, %{username: "zelda", password: "ganonsucks"})
insert(:user, %{
name: "Link",
email: "link@hyrule.com",
password: "ilovezelda"
})
insert(:user, %{
name: "Zelda",
email: "zelda@hyrule.com",
password: "ganonsucks"
})
session
|> login("link", "ilovezelda")
|> login("link@hyrule.com", "ilovezelda")
|> visit("/games")
|> click(link("New game"))
|> select("game[opponent_id]", option: "zelda")
|> select("game[opponent_id]", option: "Zelda")
|> click(button("Create game"))
{:ok, session2} = Wallaby.start_session
session2
|> login("zelda", "ganonsucks")
|> click(link("Game with link"))
|> login("zelda@hyrule.com", "ganonsucks")
|> click(link("Game with Link"))
session2
|> click(css("#f4-r6"))
@ -123,20 +157,28 @@ defmodule Chess.GamesTest do
end
test "move is reflected on opponents screen", %{session: session} do
insert(:user, %{username: "link", password: "ilovezelda"})
insert(:user, %{username: "zelda", password: "ganonsucks"})
insert(:user, %{
name: "Link",
email: "link@hyrule.com",
password: "ilovezelda"
})
insert(:user, %{
name: "Zelda",
email: "zelda@hyrule.com",
password: "ganonsucks"
})
session
|> login("link", "ilovezelda")
|> login("link@hyrule.com", "ilovezelda")
|> visit("/games")
|> click(link("New game"))
|> select("game[opponent_id]", option: "zelda")
|> select("game[opponent_id]", option: "Zelda")
|> click(button("Create game"))
{:ok, session2} = Wallaby.start_session
session2
|> login("zelda", "ganonsucks")
|> click(link("Game with link"))
|> login("zelda@hyrule.com", "ganonsucks")
|> click(link("Game with Link"))
session
|> click(css("#f4-r1"))
@ -149,16 +191,20 @@ defmodule Chess.GamesTest do
end
defp create_user_and_login(session) do
insert(:user, %{username: "link", password: "ilovezelda"})
insert(:user, %{
name: "Link",
email: "link@hyrule.com",
password: "ilovezelda"
})
session
|> login("link", "ilovezelda")
|> login("link@hyrule.com", "ilovezelda")
end
defp login(session, username, password) do
defp login(session, email, password) do
session
|> visit("/session/new")
|> fill_in(text_field("Username"), with: username)
|> fill_in(text_field("Email"), with: email)
|> fill_in(text_field("Password"), with: password)
|> click(button("Log in"))
end

View File

@ -8,7 +8,7 @@ defmodule Chess.RegistrationTest do
|> visit("/")
|> click(link("Register"))
|> fill_in(text_field("Name"), with: "Link")
|> fill_in(text_field("Username"), with: "link@example.com")
|> fill_in(text_field("Email"), with: "link@example.com")
|> fill_in(text_field("Password"), with: "ilovezelda")
|> click(button("Register"))

View File

@ -4,39 +4,39 @@ defmodule Chess.SessionTest do
import Wallaby.Query, only: [text_field: 1, link: 1, button: 1]
import Chess.Factory
test "user cannot log in with incorrect username", %{session: session} do
insert(:user, %{username: "link@hyrule.kingdom", password: "ilovezelda"})
test "user cannot log in with incorrect email", %{session: session} do
insert(:user, %{email: "link@hyrule.kingdom", password: "ilovezelda"})
session
|> visit("/")
|> click(link("Log in"))
|> fill_in(text_field("Username"), with: "link@example.com")
|> fill_in(text_field("Email"), with: "link@example.com")
|> fill_in(text_field("Password"), with: "ilovezelda")
|> click(button("Log in"))
assert session |> has_text?("Bad username or password")
assert session |> has_text?("Bad email or password")
end
test "user cannot log in with incorrect password", %{session: session} do
insert(:user, %{username: "link@hyrule.kingdom", password: "ilovezelda"})
insert(:user, %{email: "link@hyrule.kingdom", password: "ilovezelda"})
session
|> visit("/")
|> click(link("Log in"))
|> fill_in(text_field("Username"), with: "link@hyrule.kingdom")
|> fill_in(text_field("Email"), with: "link@hyrule.kingdom")
|> fill_in(text_field("Password"), with: "calamityganon")
|> click(button("Log in"))
assert session |> has_text?("Bad username or password")
assert session |> has_text?("Bad email or password")
end
test "user can log in with correct details", %{session: session} do
insert(:user, %{username: "link@hyrule.kingdom", password: "ilovezelda"})
insert(:user, %{email: "link@hyrule.kingdom", password: "ilovezelda"})
session
|> visit("/")
|> click(link("Log in"))
|> fill_in(text_field("Username"), with: "link@hyrule.kingdom")
|> fill_in(text_field("Email"), with: "link@hyrule.kingdom")
|> fill_in(text_field("Password"), with: "ilovezelda")
|> click(button("Log in"))
@ -46,12 +46,12 @@ defmodule Chess.SessionTest do
end
test "user can log out", %{session: session} do
insert(:user, %{username: "link@hyrule.kingdom", password: "ilovezelda"})
insert(:user, %{email: "link@hyrule.kingdom", password: "ilovezelda"})
session
|> visit("/")
|> click(link("Log in"))
|> fill_in(text_field("Username"), with: "link@hyrule.kingdom")
|> fill_in(text_field("Email"), with: "link@hyrule.kingdom")
|> fill_in(text_field("Password"), with: "ilovezelda")
|> click(button("Log in"))

View File

@ -10,7 +10,7 @@ defmodule Chess.Factory do
def insert(:user, params) do
attrs = %{
name: "Zelda",
username: "zelda",
email: "zelda@hyrule.com",
password: "ilovelink"
}
|> Map.merge(params)