-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
a93137e
commit 507f488
Showing
4 changed files
with
197 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |