Skip to content

Commit

Permalink
Generate a new context for Todo
Browse files Browse the repository at this point in the history
  • Loading branch information
sirion1987 committed Jul 9, 2021
1 parent a93137e commit 507f488
Show file tree
Hide file tree
Showing 4 changed files with 197 additions and 0 deletions.
104 changes: 104 additions & 0 deletions lib/todo_app/todos.ex
@@ -0,0 +1,104 @@
defmodule TodoApp.Todos do
@moduledoc """
The Todos context.
"""

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

alias TodoApp.Todos.Todo

@doc """
Returns the list of todos.
## Examples
iex> list_todos()
[%Todo{}, ...]
"""
def list_todos do
Repo.all(Todo)
end

@doc """
Gets a single todo.
Raises `Ecto.NoResultsError` if the Todo does not exist.
## Examples
iex> get_todo!(123)
%Todo{}
iex> get_todo!(456)
** (Ecto.NoResultsError)
"""
def get_todo!(id), do: Repo.get!(Todo, id)

@doc """
Creates a todo.
## Examples
iex> create_todo(%{field: value})
{:ok, %Todo{}}
iex> create_todo(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_todo(attrs \\ %{}) do
%Todo{}
|> Todo.changeset(attrs)
|> Repo.insert()
end

@doc """
Updates a todo.
## Examples
iex> update_todo(todo, %{field: new_value})
{:ok, %Todo{}}
iex> update_todo(todo, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_todo(%Todo{} = todo, attrs) do
todo
|> Todo.changeset(attrs)
|> Repo.update()
end

@doc """
Deletes a todo.
## Examples
iex> delete_todo(todo)
{:ok, %Todo{}}
iex> delete_todo(todo)
{:error, %Ecto.Changeset{}}
"""
def delete_todo(%Todo{} = todo) do
Repo.delete(todo)
end

@doc """
Returns an `%Ecto.Changeset{}` for tracking todo changes.
## Examples
iex> change_todo(todo)
%Ecto.Changeset{data: %Todo{}}
"""
def change_todo(%Todo{} = todo, attrs \\ %{}) do
Todo.changeset(todo, attrs)
end
end
17 changes: 17 additions & 0 deletions lib/todo_app/todos/todo.ex
@@ -0,0 +1,17 @@
defmodule TodoApp.Todos.Todo do
use Ecto.Schema
import Ecto.Changeset

schema "todos" do
field :title, :string

timestamps()
end

@doc false
def changeset(todo, attrs) do
todo
|> cast(attrs, [:title])
|> validate_required([:title])
end
end
12 changes: 12 additions & 0 deletions priv/repo/migrations/20210709105451_create_todos.exs
@@ -0,0 +1,12 @@
defmodule TodoApp.Repo.Migrations.CreateTodos do
use Ecto.Migration

def change do
create table(:todos) do
add :title, :string

timestamps()
end

end
end
64 changes: 64 additions & 0 deletions test/todo_app/todos_test.exs
@@ -0,0 +1,64 @@
defmodule TodoApp.TodosTest do
use TodoApp.DataCase

alias TodoApp.Todos

describe "todos" do
alias TodoApp.Todos.Todo

@valid_attrs %{title: "some title"}
@update_attrs %{title: "some updated title"}
@invalid_attrs %{title: nil}

def todo_fixture(attrs \\ %{}) do
{:ok, todo} =
attrs
|> Enum.into(@valid_attrs)
|> Todos.create_todo()

todo
end

test "list_todos/0 returns all todos" do
todo = todo_fixture()
assert Todos.list_todos() == [todo]
end

test "get_todo!/1 returns the todo with given id" do
todo = todo_fixture()
assert Todos.get_todo!(todo.id) == todo
end

test "create_todo/1 with valid data creates a todo" do
assert {:ok, %Todo{} = todo} = Todos.create_todo(@valid_attrs)
assert todo.title == "some title"
end

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

test "update_todo/2 with valid data updates the todo" do
todo = todo_fixture()
assert {:ok, %Todo{} = todo} = Todos.update_todo(todo, @update_attrs)
assert todo.title == "some updated title"
end

test "update_todo/2 with invalid data returns error changeset" do
todo = todo_fixture()
assert {:error, %Ecto.Changeset{}} = Todos.update_todo(todo, @invalid_attrs)
assert todo == Todos.get_todo!(todo.id)
end

test "delete_todo/1 deletes the todo" do
todo = todo_fixture()
assert {:ok, %Todo{}} = Todos.delete_todo(todo)
assert_raise Ecto.NoResultsError, fn -> Todos.get_todo!(todo.id) end
end

test "change_todo/1 returns a todo changeset" do
todo = todo_fixture()
assert %Ecto.Changeset{} = Todos.change_todo(todo)
end
end
end

0 comments on commit 507f488

Please sign in to comment.