From e91d36b9c0afb4536da3b0e07e1c3e894e358598 Mon Sep 17 00:00:00 2001 From: Bent Witthold Date: Wed, 11 Feb 2026 11:22:40 +0100 Subject: [PATCH] After "mix phx.gen.json Accounts User users --no-context --no-schema --no-scope email:string" --- .../controllers/user_controller.ex | 43 ++++++++++ .../controllers/user_json.ex | 24 ++++++ .../controllers/user_controller_test.exs | 84 +++++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 lib/beet_round_server_web/controllers/user_controller.ex create mode 100644 lib/beet_round_server_web/controllers/user_json.ex create mode 100644 test/beet_round_server_web/controllers/user_controller_test.exs diff --git a/lib/beet_round_server_web/controllers/user_controller.ex b/lib/beet_round_server_web/controllers/user_controller.ex new file mode 100644 index 0000000..dd7a69b --- /dev/null +++ b/lib/beet_round_server_web/controllers/user_controller.ex @@ -0,0 +1,43 @@ +defmodule BeetRoundServerWeb.UserController do + use BeetRoundServerWeb, :controller + + alias BeetRoundServer.Accounts + alias BeetRoundServer.Accounts.User + + action_fallback BeetRoundServerWeb.FallbackController + + def index(conn, _params) do + users = Accounts.list_users() + render(conn, :index, users: users) + end + + def create(conn, %{"user" => user_params}) do + with {:ok, %User{} = user} <- Accounts.register_user(user_params) do + conn + |> put_status(:created) + |> put_resp_header("location", ~p"/api/users/#{user}") + |> render(:show, user: user) + end + end + + def show(conn, %{"id" => id}) do + user = Accounts.get_user!(id) + render(conn, :show, user: user) + end + + def update(conn, %{"id" => id, "user" => user_params}) do + user = Accounts.get_user!(id) + + with {:ok, %User{} = user} <- Accounts.update_user(user, user_params) do + render(conn, :show, user: user) + end + end + + def delete(conn, %{"id" => id}) do + user = Accounts.get_user!(id) + + with {:ok, %User{}} <- Accounts.delete_user(user) do + send_resp(conn, :no_content, "") + end + end +end diff --git a/lib/beet_round_server_web/controllers/user_json.ex b/lib/beet_round_server_web/controllers/user_json.ex new file mode 100644 index 0000000..83f754c --- /dev/null +++ b/lib/beet_round_server_web/controllers/user_json.ex @@ -0,0 +1,24 @@ +defmodule BeetRoundServerWeb.UserJSON do + alias BeetRoundServer.Accounts.User + + @doc """ + Renders a list of users. + """ + def index(%{users: users}) do + %{data: for(user <- users, do: data(user))} + end + + @doc """ + Renders a single user. + """ + def show(%{user: user}) do + %{data: data(user)} + end + + defp data(%User{} = user) do + %{ + id: user.id, + email: user.email + } + end +end diff --git a/test/beet_round_server_web/controllers/user_controller_test.exs b/test/beet_round_server_web/controllers/user_controller_test.exs new file mode 100644 index 0000000..020f418 --- /dev/null +++ b/test/beet_round_server_web/controllers/user_controller_test.exs @@ -0,0 +1,84 @@ +defmodule BeetRoundServerWeb.UserControllerTest do + use BeetRoundServerWeb.ConnCase + + import BeetRoundServer.AccountsFixtures + alias BeetRoundServer.Accounts.User + + @create_attrs %{ + email: "some email" + } + @update_attrs %{ + email: "some updated email" + } + @invalid_attrs %{email: nil} + + setup %{conn: conn} do + {:ok, conn: put_req_header(conn, "accept", "application/json")} + end + + describe "index" do + test "lists all users", %{conn: conn} do + conn = get(conn, ~p"/api/users") + assert json_response(conn, 200)["data"] == [] + end + end + + describe "create user" do + test "renders user when data is valid", %{conn: conn} do + conn = post(conn, ~p"/api/users", user: @create_attrs) + assert %{"id" => id} = json_response(conn, 201)["data"] + + conn = get(conn, ~p"/api/users/#{id}") + + assert %{ + "id" => ^id, + "email" => "some email" + } = json_response(conn, 200)["data"] + end + + test "renders errors when data is invalid", %{conn: conn} do + conn = post(conn, ~p"/api/users", user: @invalid_attrs) + assert json_response(conn, 422)["errors"] != %{} + end + end + + describe "update user" do + setup [:create_user] + + test "renders user when data is valid", %{conn: conn, user: %User{id: id} = user} do + conn = put(conn, ~p"/api/users/#{user}", user: @update_attrs) + assert %{"id" => ^id} = json_response(conn, 200)["data"] + + conn = get(conn, ~p"/api/users/#{id}") + + assert %{ + "id" => ^id, + "email" => "some updated email" + } = json_response(conn, 200)["data"] + end + + test "renders errors when data is invalid", %{conn: conn, user: user} do + conn = put(conn, ~p"/api/users/#{user}", user: @invalid_attrs) + assert json_response(conn, 422)["errors"] != %{} + end + end + + describe "delete user" do + setup [:create_user] + + test "deletes chosen user", %{conn: conn, user: user} do + conn = delete(conn, ~p"/api/users/#{user}") + assert response(conn, 204) + + assert_error_sent 404, fn -> + get(conn, ~p"/api/users/#{user}") + end + end + end + + defp create_user(_) do + user = user_fixture() + + %{user: user} + end +end