mirror of
https://github.com/danbee/chess
synced 2025-03-04 08:39:06 +00:00
Add uniqueness constraint
This commit is contained in:
parent
08b2684e1c
commit
d5b8f7d7c2
@ -4,7 +4,6 @@ defmodule Chess.Auth.User do
|
|||||||
use Ecto.Schema
|
use Ecto.Schema
|
||||||
import Ecto.Changeset
|
import Ecto.Changeset
|
||||||
alias Comeonin.Argon2
|
alias Comeonin.Argon2
|
||||||
alias Chess.Repo
|
|
||||||
|
|
||||||
schema "users" do
|
schema "users" do
|
||||||
field :password, :string, virtual: true
|
field :password, :string, virtual: true
|
||||||
@ -19,7 +18,7 @@ defmodule Chess.Auth.User do
|
|||||||
struct
|
struct
|
||||||
|> cast(params, [:username, :password])
|
|> cast(params, [:username, :password])
|
||||||
|> validate_required([:username, :password])
|
|> validate_required([:username, :password])
|
||||||
|> unsafe_validate_unique(:username, Repo)
|
|> unique_constraint(:username)
|
||||||
|> hash_password()
|
|> hash_password()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,7 @@
|
|||||||
|
defmodule Chess.Repo.Migrations.AddUniqueConstraintOnUsername do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
create unique_index(:users, [:username])
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -1,8 +1,11 @@
|
|||||||
defmodule Chess.UserTest do
|
defmodule Chess.UserTest do
|
||||||
use Chess.DataCase
|
use Chess.DataCase
|
||||||
|
|
||||||
|
import Chess.Factory, only: [create_user: 1]
|
||||||
|
|
||||||
describe "user" do
|
describe "user" do
|
||||||
alias Chess.Auth.User
|
alias Chess.Auth.User
|
||||||
|
alias Chess.Repo
|
||||||
|
|
||||||
@valid_attrs %{username: "zelda", password: "password"}
|
@valid_attrs %{username: "zelda", password: "password"}
|
||||||
@invalid_attrs %{}
|
@invalid_attrs %{}
|
||||||
@ -21,15 +24,9 @@ defmodule Chess.UserTest do
|
|||||||
create_user("zelda")
|
create_user("zelda")
|
||||||
|
|
||||||
changeset = User.changeset(%User{}, @valid_attrs)
|
changeset = User.changeset(%User{}, @valid_attrs)
|
||||||
refute changeset.valid?
|
{:error, changeset} = Repo.insert(changeset)
|
||||||
end
|
|
||||||
|
|
||||||
defp create_user(username) do
|
refute changeset.valid?
|
||||||
changeset = User.changeset(
|
|
||||||
%User{},
|
|
||||||
%{username: username, password: "password"}
|
|
||||||
)
|
|
||||||
Repo.insert!(changeset)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -2,7 +2,7 @@ defmodule Chess.GamesTest do
|
|||||||
use ChessWeb.FeatureCase
|
use ChessWeb.FeatureCase
|
||||||
|
|
||||||
import Wallaby.Query, only: [css: 1, css: 2, button: 1, text_field: 1]
|
import Wallaby.Query, only: [css: 1, css: 2, button: 1, text_field: 1]
|
||||||
import Chess.Factory, only: [create_user: 0]
|
import Chess.Factory, only: [create_user: 2]
|
||||||
|
|
||||||
test "visit homepage", %{session: session} do
|
test "visit homepage", %{session: session} do
|
||||||
session
|
session
|
||||||
@ -13,6 +13,7 @@ defmodule Chess.GamesTest do
|
|||||||
test "can create a new game", %{session: session} do
|
test "can create a new game", %{session: session} do
|
||||||
session
|
session
|
||||||
|> login()
|
|> login()
|
||||||
|
|> take_screenshot()
|
||||||
|> create_game()
|
|> create_game()
|
||||||
|> assert_has(css(".board"))
|
|> assert_has(css(".board"))
|
||||||
end
|
end
|
||||||
@ -34,7 +35,7 @@ defmodule Chess.GamesTest do
|
|||||||
end
|
end
|
||||||
|
|
||||||
defp login(session) do
|
defp login(session) do
|
||||||
create_user()
|
create_user("link@hyrule.kingdom", "ilovezelda")
|
||||||
|
|
||||||
session
|
session
|
||||||
|> visit("/session/new")
|
|> visit("/session/new")
|
||||||
|
|||||||
@ -2,10 +2,10 @@ defmodule Chess.SessionTest do
|
|||||||
use ChessWeb.FeatureCase
|
use ChessWeb.FeatureCase
|
||||||
|
|
||||||
import Wallaby.Query, only: [text_field: 1, link: 1, button: 1]
|
import Wallaby.Query, only: [text_field: 1, link: 1, button: 1]
|
||||||
import Chess.Factory, only: [create_user: 0]
|
import Chess.Factory, only: [create_user: 2]
|
||||||
|
|
||||||
test "user cannot log in with incorrect username", %{session: session} do
|
test "user cannot log in with incorrect username", %{session: session} do
|
||||||
create_user()
|
create_user("link@hyrule.kingdom", "ilovezelda")
|
||||||
|
|
||||||
session
|
session
|
||||||
|> visit("/")
|
|> visit("/")
|
||||||
@ -18,7 +18,7 @@ defmodule Chess.SessionTest do
|
|||||||
end
|
end
|
||||||
|
|
||||||
test "user cannot log in with incorrect password", %{session: session} do
|
test "user cannot log in with incorrect password", %{session: session} do
|
||||||
create_user()
|
create_user("link@hyrule.kingdom", "ilovezelda")
|
||||||
|
|
||||||
session
|
session
|
||||||
|> visit("/")
|
|> visit("/")
|
||||||
@ -31,7 +31,7 @@ defmodule Chess.SessionTest do
|
|||||||
end
|
end
|
||||||
|
|
||||||
test "user can log in with correct details", %{session: session} do
|
test "user can log in with correct details", %{session: session} do
|
||||||
create_user()
|
create_user("link@hyrule.kingdom", "ilovezelda")
|
||||||
|
|
||||||
session
|
session
|
||||||
|> visit("/")
|
|> visit("/")
|
||||||
@ -46,7 +46,7 @@ defmodule Chess.SessionTest do
|
|||||||
end
|
end
|
||||||
|
|
||||||
test "user can log out", %{session: session} do
|
test "user can log out", %{session: session} do
|
||||||
create_user()
|
create_user("link@hyrule.kingdom", "ilovezelda")
|
||||||
|
|
||||||
session
|
session
|
||||||
|> visit("/")
|
|> visit("/")
|
||||||
|
|||||||
@ -2,10 +2,10 @@ defmodule Chess.Factory do
|
|||||||
alias Chess.Auth.User
|
alias Chess.Auth.User
|
||||||
alias Chess.Repo
|
alias Chess.Repo
|
||||||
|
|
||||||
def create_user do
|
def create_user(username \\ "zelda", password \\ "password") do
|
||||||
User.changeset(
|
User.changeset(
|
||||||
%User{},
|
%User{},
|
||||||
%{username: "link@hyrule.kingdom", password: "ilovezelda"}
|
%{username: username, password: password}
|
||||||
)
|
)
|
||||||
|> Repo.insert!
|
|> Repo.insert!
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user