diff --git a/lib/chess/auth/user.ex b/lib/chess/auth/user.ex index 546bd82..00d7ca7 100644 --- a/lib/chess/auth/user.ex +++ b/lib/chess/auth/user.ex @@ -4,7 +4,6 @@ defmodule Chess.Auth.User do use Ecto.Schema import Ecto.Changeset alias Comeonin.Argon2 - alias Chess.Repo schema "users" do field :password, :string, virtual: true @@ -19,7 +18,7 @@ defmodule Chess.Auth.User do struct |> cast(params, [:username, :password]) |> validate_required([:username, :password]) - |> unsafe_validate_unique(:username, Repo) + |> unique_constraint(:username) |> hash_password() end diff --git a/priv/repo/migrations/20180202195257_add_unique_constraint_on_username.exs b/priv/repo/migrations/20180202195257_add_unique_constraint_on_username.exs new file mode 100644 index 0000000..1b7094c --- /dev/null +++ b/priv/repo/migrations/20180202195257_add_unique_constraint_on_username.exs @@ -0,0 +1,7 @@ +defmodule Chess.Repo.Migrations.AddUniqueConstraintOnUsername do + use Ecto.Migration + + def change do + create unique_index(:users, [:username]) + end +end diff --git a/test/chess/auth/user_test.exs b/test/chess/auth/user_test.exs index ea65a3d..594a372 100644 --- a/test/chess/auth/user_test.exs +++ b/test/chess/auth/user_test.exs @@ -1,8 +1,11 @@ defmodule Chess.UserTest do use Chess.DataCase + import Chess.Factory, only: [create_user: 1] + describe "user" do alias Chess.Auth.User + alias Chess.Repo @valid_attrs %{username: "zelda", password: "password"} @invalid_attrs %{} @@ -21,15 +24,9 @@ defmodule Chess.UserTest do create_user("zelda") changeset = User.changeset(%User{}, @valid_attrs) - refute changeset.valid? - end + {:error, changeset} = Repo.insert(changeset) - defp create_user(username) do - changeset = User.changeset( - %User{}, - %{username: username, password: "password"} - ) - Repo.insert!(changeset) + refute changeset.valid? end end end diff --git a/test/features/games_test.exs b/test/features/games_test.exs index 2773872..c14f455 100644 --- a/test/features/games_test.exs +++ b/test/features/games_test.exs @@ -2,7 +2,7 @@ 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: 0] + import Chess.Factory, only: [create_user: 2] test "visit homepage", %{session: session} do session @@ -13,6 +13,7 @@ defmodule Chess.GamesTest do test "can create a new game", %{session: session} do session |> login() + |> take_screenshot() |> create_game() |> assert_has(css(".board")) end @@ -34,7 +35,7 @@ defmodule Chess.GamesTest do end defp login(session) do - create_user() + create_user("link@hyrule.kingdom", "ilovezelda") session |> visit("/session/new") diff --git a/test/features/session_test.exs b/test/features/session_test.exs index 8fa73fe..6a24850 100644 --- a/test/features/session_test.exs +++ b/test/features/session_test.exs @@ -2,10 +2,10 @@ defmodule Chess.SessionTest do use ChessWeb.FeatureCase 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 - create_user() + create_user("link@hyrule.kingdom", "ilovezelda") session |> visit("/") @@ -18,7 +18,7 @@ defmodule Chess.SessionTest do end test "user cannot log in with incorrect password", %{session: session} do - create_user() + create_user("link@hyrule.kingdom", "ilovezelda") session |> visit("/") @@ -31,7 +31,7 @@ defmodule Chess.SessionTest do end test "user can log in with correct details", %{session: session} do - create_user() + create_user("link@hyrule.kingdom", "ilovezelda") session |> visit("/") @@ -46,7 +46,7 @@ defmodule Chess.SessionTest do end test "user can log out", %{session: session} do - create_user() + create_user("link@hyrule.kingdom", "ilovezelda") session |> visit("/") diff --git a/test/support/factory.ex b/test/support/factory.ex index 1ca19af..5389c5a 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -2,10 +2,10 @@ defmodule Chess.Factory do alias Chess.Auth.User alias Chess.Repo - def create_user do + def create_user(username \\ "zelda", password \\ "password") do User.changeset( %User{}, - %{username: "link@hyrule.kingdom", password: "ilovezelda"} + %{username: username, password: password} ) |> Repo.insert! end