I have a standard uniqueness constraint for both the username and email in my Users table. Now, I'm testing my UserController for duplication during user creation and it seems that unique_constraint on my models are not working during unit testing but fine in manual testing. What am I doing wrong here?
Migration:
defmodule MyApi.Repo.Migrations.CreateUser do
use Ecto.Migration
def change do
create table(:users) do
add :username, :string, null: false
add :email, :string, null: false
add :password, :string, null: false
add :first_name, :string, null: false
add :last_name, :string, null: false
timestamps
end
create unique_index(:users, [:username])
create unique_index(:users, [:email])
end
end
Controller:
defmodule MyApi.V1.UserController do
use MyApi.Web, :controller
alias MyApi.User
def create(conn, %{"data" => data}) do
user_attrs = JaSerializer.Params.to_attributes(data)
user_changeset = User.changeset(%User{}, user_attrs)
case Repo.insert(user_changeset) do
{:ok, user} ->
conn
|> put_status(201)
|> render(:show, data: user)
{:error, user_changeset} ->
conn
|> put_status(500)
|> render(:errors, data: user_changeset)
end
end
end
Test:
...
test "User creation with non-unique username", %{conn: conn} do
user_changeset = User.changeset(%User{}, @valid_attrs)
Repo.insert(user_changeset)
conn = post(conn, v1_user_path(conn, :create), user_params(@valid_attrs))
response = json_response(conn, 500)
errors = response["errors"]
assert errors
assert Enum.count(errors) == 1
{:ok, error} = Enum.fetch(errors, 0)
assert error["title"] == "has already been taken"
refute Repo.get_by(User, username: "name1")
end
...
mix test
1) test User creation with non-unique username (MyApi.V1.UserControllerTest)
test/controllers/v1/user_controller_test.exs:57
** (RuntimeError) expected response with status 500, got: 201, with body:
{"jsonapi":{"version":"1.0"},"data":{"type":"user","id":"269","attributes":{"username":"name1","last-name":"lastname1","first-name":"first","email":"[email protected]"}}}
stacktrace:
(phoenix) lib/phoenix/test/conn_test.ex:362: Phoenix.ConnTest.response/2
(phoenix) lib/phoenix/test/conn_test.ex:408: Phoenix.ConnTest.json_response/2
test/controllers/v1/user_controller_test.exs:61: (test)
Repo.insert(user_changeset)return? Are you sure the test database is migrated correctly? (try dropping and recreating the test database) - Dogbertmix ecto.drop(create | migrate) and the problem still persists.{:ok, %SymvelApi.User{__meta__: #Ecto.Schema.Metadata<:loaded, "users">, email: "[email protected]", first_name: "Juan", id: 276, inserted_at: #Ecto.DateTime<2016-07-16 15:51:01>, last_name: "Dela Cruz", password: "$2b$04$dXmutZbRrrsCd0JaLh.p3uJlIuNf6DVqR3Wz0vR1l5ubBfL3ea03y", updated_at: #Ecto.DateTime<2016-07-16 15:51:01>, username: "juan1"}}- NeilMIX_ENV=test? - Dogbert