Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 104 additions & 0 deletions lib/todo_test/account.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
defmodule TodoTest.Account do
@moduledoc """
The Account context.
"""

import Ecto.Query, warn: false
alias TodoTest.Repo

alias TodoTest.Account.User

@doc """
Returns the list of users.

## Examples

iex> list_users()
[%User{}, ...]

"""
def list_users do
Repo.all(User)
end

@doc """
Gets a single user.

Raises `Ecto.NoResultsError` if the User does not exist.

## Examples

iex> get_user!(123)
%User{}

iex> get_user!(456)
** (Ecto.NoResultsError)

"""
def get_user!(id), do: Repo.get!(User, id)

@doc """
Creates a user.

## Examples

iex> create_user(%{field: value})
{:ok, %User{}}

iex> create_user(%{field: bad_value})
{:error, %Ecto.Changeset{}}

"""
def create_user(attrs \\ %{}) do
%User{}
|> User.changeset(attrs)
|> Repo.insert()
end

@doc """
Updates a user.

## Examples

iex> update_user(user, %{field: new_value})
{:ok, %User{}}

iex> update_user(user, %{field: bad_value})
{:error, %Ecto.Changeset{}}

"""
def update_user(%User{} = user, attrs) do
user
|> User.changeset(attrs)
|> Repo.update()
end

@doc """
Deletes a user.

## Examples

iex> delete_user(user)
{:ok, %User{}}

iex> delete_user(user)
{:error, %Ecto.Changeset{}}

"""
def delete_user(%User{} = user) do
Repo.delete(user)
end

@doc """
Returns an `%Ecto.Changeset{}` for tracking user changes.

## Examples

iex> change_user(user)
%Ecto.Changeset{data: %User{}}

"""
def change_user(%User{} = user, attrs \\ %{}) do
User.changeset(user, attrs)
end
end
19 changes: 19 additions & 0 deletions lib/todo_test/account/user.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
defmodule TodoTest.Account.User do
use Ecto.Schema
import Ecto.Changeset

schema "users" do
field :email, :string
field :name, :string
field :password, :string

timestamps()
end

@doc false
def changeset(user, attrs) do
user
|> cast(attrs, [:name, :email, :password])
|> validate_required([:name, :email, :password])
end
end
64 changes: 64 additions & 0 deletions lib/todo_test_web/controllers/user_controller.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
defmodule TodoTestWeb.UserController do
use TodoTestWeb, :controller

alias TodoTest.Account
alias TodoTest.Account.User

def index(conn, _params) do
users = Account.list_users()

IO.inspect(users, label: "Look rut!")
render(conn, "index.html", users: users)
end

def new(conn, _params) do
changeset = Account.change_user(%User{})
render(conn, "new.html", changeset: changeset)
end

def create(conn, %{"user" => user_params}) do
case Account.create_user(user_params) do
{:ok, user} ->
conn
|> put_flash(:info, "User created successfully.")
|> redirect(to: Routes.user_path(conn, :show, user))

{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "new.html", changeset: changeset)
end
end

def show(conn, %{"id" => id}) do
user = Account.get_user!(id)
render(conn, "show.html", user: user)
end

def edit(conn, %{"id" => id}) do
user = Account.get_user!(id)
changeset = Account.change_user(user)
render(conn, "edit.html", user: user, changeset: changeset)
end

def update(conn, %{"id" => id, "user" => user_params}) do
user = Account.get_user!(id)

case Account.update_user(user, user_params) do
{:ok, user} ->
conn
|> put_flash(:info, "User updated successfully.")
|> redirect(to: Routes.user_path(conn, :show, user))

{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "edit.html", user: user, changeset: changeset)
end
end

def delete(conn, %{"id" => id}) do
user = Account.get_user!(id)
{:ok, _user} = Account.delete_user(user)

conn
|> put_flash(:info, "User deleted successfully.")
|> redirect(to: Routes.user_path(conn, :index))
end
end
1 change: 1 addition & 0 deletions lib/todo_test_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ defmodule TodoTestWeb.Router do

get "/price", PageController, :price

resources "/users", UserController
end

# Other scopes may use custom stacks.
Expand Down
5 changes: 5 additions & 0 deletions lib/todo_test_web/templates/user/edit.html.heex
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<h1>Edit User</h1>

<%= render "form.html", Map.put(assigns, :action, Routes.user_path(@conn, :update, @user)) %>

<span><%= link "Back", to: Routes.user_path(@conn, :index) %></span>
23 changes: 23 additions & 0 deletions lib/todo_test_web/templates/user/form.html.heex
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<.form let={f} for={@changeset} action={@action}>
<%= if @changeset.action do %>
<div class="alert alert-danger">
<p>Oops, something went wrong! Please check the errors below.</p>
</div>
<% end %>

<%= label f, :name %>
<%= text_input f, :name %>
<%= error_tag f, :name %>

<%= label f, :email %>
<%= text_input f, :email %>
<%= error_tag f, :email %>

<%= label f, :password %>
<%= text_input f, :password %>
<%= error_tag f, :password %>

<div>
<%= submit "Save" %>
</div>
</.form>
30 changes: 30 additions & 0 deletions lib/todo_test_web/templates/user/index.html.heex
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<h1>Listing Users</h1>

<table>
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Password</th>

<th></th>
</tr>
</thead>
<tbody>
<%= for user <- @users do %>
<tr>
<td><%= user.name %></td>
<td><%= user.email %></td>
<td><%= user.password %></td>

<td>
<span><%= link "Show", to: Routes.user_path(@conn, :show, user) %></span>
<span><%= link "Edit", to: Routes.user_path(@conn, :edit, user) %></span>
<span><%= link "Delete", to: Routes.user_path(@conn, :delete, user), method: :delete, data: [confirm: "Are you sure?"] %></span>
</td>
</tr>
<% end %>
</tbody>
</table>

<span><%= link "New User", to: Routes.user_path(@conn, :new) %></span>
5 changes: 5 additions & 0 deletions lib/todo_test_web/templates/user/new.html.heex
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<h1>New User</h1>

<%= render "form.html", Map.put(assigns, :action, Routes.user_path(@conn, :create)) %>

<span><%= link "Back", to: Routes.user_path(@conn, :index) %></span>
23 changes: 23 additions & 0 deletions lib/todo_test_web/templates/user/show.html.heex
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<h1>Show User</h1>

<ul>

<li>
<strong>Name:</strong>
<%= @user.name %>
</li>

<li>
<strong>Email:</strong>
<%= @user.email %>
</li>

<li>
<strong>Password:</strong>
<%= @user.password %>
</li>

</ul>

<span><%= link "Edit", to: Routes.user_path(@conn, :edit, @user) %></span> |
<span><%= link "Back", to: Routes.user_path(@conn, :index) %></span>
3 changes: 3 additions & 0 deletions lib/todo_test_web/views/user_view.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
defmodule TodoTestWeb.UserView do
use TodoTestWeb, :view
end
13 changes: 13 additions & 0 deletions priv/repo/migrations/20211230151820_create_users.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
defmodule TodoTest.Repo.Migrations.CreateUsers do
use Ecto.Migration

def change do
create table(:users) do
add :name, :string
add :email, :string
add :password, :string

timestamps()
end
end
end
22 changes: 22 additions & 0 deletions test/support/fixtures/account_fixtures.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
defmodule TodoTest.AccountFixtures do
@moduledoc """
This module defines test helpers for creating
entities via the `TodoTest.Account` context.
"""

@doc """
Generate a user.
"""
def user_fixture(attrs \\ %{}) do
{:ok, user} =
attrs
|> Enum.into(%{
email: "some email",
name: "some name",
password: "some password"
})
|> TodoTest.Account.create_user()

user
end
end
63 changes: 63 additions & 0 deletions test/todo_test/account_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
defmodule TodoTest.AccountTest do
use TodoTest.DataCase

alias TodoTest.Account

describe "users" do
alias TodoTest.Account.User

import TodoTest.AccountFixtures

@invalid_attrs %{email: nil, name: nil, password: nil}

test "list_users/0 returns all users" do
user = user_fixture()
assert Account.list_users() == [user]
end

test "get_user!/1 returns the user with given id" do
user = user_fixture()
assert Account.get_user!(user.id) == user
end

test "create_user/1 with valid data creates a user" do
valid_attrs = %{email: "some email", name: "some name", password: "some password"}

assert {:ok, %User{} = user} = Account.create_user(valid_attrs)
assert user.email == "some email"
assert user.name == "some name"
assert user.password == "some password"
end

test "create_user/1 with invalid data returns error changeset" do
assert {:error, %Ecto.Changeset{}} = Account.create_user(@invalid_attrs)
end

test "update_user/2 with valid data updates the user" do
user = user_fixture()
update_attrs = %{email: "some updated email", name: "some updated name", password: "some updated password"}

assert {:ok, %User{} = user} = Account.update_user(user, update_attrs)
assert user.email == "some updated email"
assert user.name == "some updated name"
assert user.password == "some updated password"
end

test "update_user/2 with invalid data returns error changeset" do
user = user_fixture()
assert {:error, %Ecto.Changeset{}} = Account.update_user(user, @invalid_attrs)
assert user == Account.get_user!(user.id)
end

test "delete_user/1 deletes the user" do
user = user_fixture()
assert {:ok, %User{}} = Account.delete_user(user)
assert_raise Ecto.NoResultsError, fn -> Account.get_user!(user.id) end
end

test "change_user/1 returns a user changeset" do
user = user_fixture()
assert %Ecto.Changeset{} = Account.change_user(user)
end
end
end
Loading