I’m running into an error when running the User Controller test in my Phoenix application. The test is failing with the following error:
1) test create user renders errors when data is invalid (DbserviceWeb.UserControllerTest)
test/dbservice_web/controllers/user_controller_test.exs:106
** (RuntimeError) expected response with status 422, got: 201, with body:
"{\"address\":null,\"city\":null,\"country\":null,\"date_of_birth\":null,\"district\":null,\"email\":null,\"full_name\":null,\"gender\":null,\"id\":466,\"phone\":null,\"pincode\":null,\"role\":null,\"state\":null,\"whatsapp_phone\":null}"
code: assert json_response(conn, 422)["errors"] != %{}
stacktrace:
(phoenix 1.6.10) lib/phoenix/test/conn_test.ex:369: Phoenix.ConnTest.response/2
(phoenix 1.6.10) lib/phoenix/test/conn_test.ex:415: Phoenix.ConnTest.json_response/2
test/dbservice_web/controllers/user_controller_test.exs:108: (test)
It seems that the test is expecting a response with status 422, but is receiving a response with status 201 instead.
Here’s the test code:
@valid_fields [
"address",
"city",
"country",
"date_of_birth",
"district",
"email",
"full_name",
"gender",
"id",
"phone",
"pincode",
"role",
"state",
"whatsapp_phone"
]
describe "create user" do
test "renders user when data is valid", %{conn: conn} do
conn = post(conn, Routes.user_path(conn, :create), @create_attrs)
%{"id" => id} = json_response(conn, 201)
conn = get(conn, Routes.user_path(conn, :show, id))
IO.inspect(conn)
assert %{
"id" => ^id,
"address" => "some address",
"city" => "some city",
"country" => "some country",
"district" => "some district",
"email" => "some email",
"full_name" => "some full name",
"gender" => "some gender",
"phone" => "9456591269",
"pincode" => "some pincode",
"role" => "some role",
"state" => "some state",
"whatsapp_phone" => "some whatsapp phone"
} = json_response(conn, 200)
end
test "renders errors when data is invalid", %{conn: conn} do
conn = post(conn, Routes.user_path(conn, :create), user: @invalid_attrs)
assert json_response(conn, 422)["errors"] != %{}
end
And here’s the controller code:
swagger_path :create do
post("/api/user")
parameters do
body(:body, Schema.ref(:User), "User to create", required: true)
end
response(201, "Created", Schema.ref(:User))
end
def create(conn, params) do
with {:ok, %User{} = user} <- Users.create_user(params) do
conn
|> put_status(:created)
|> put_resp_header("location", Routes.user_path(conn, :show, user))
|> render("show.json", user: user)
end
end