From bcee6c72c0f5fff099bb7ff0b4aa7052efebe480 Mon Sep 17 00:00:00 2001 From: nelsonic Date: Thu, 25 Apr 2019 10:41:30 +0100 Subject: [PATCH] add address files afer running mix phx.gen.html command see: https://github.com/dwyl/phoenix-ecto-append-only-log-example/issues/17#issuecomment-486602169 --- lib/append/accounts.ex | 104 ++++++++++++++++++ lib/append/accounts/address.ex | 22 ++++ lib/append/address.ex | 37 ------- .../controllers/address_controller.ex | 62 +++++++++++ .../templates/address/edit.html.eex | 5 + .../templates/address/form.html.eex | 35 ++++++ .../templates/address/index.html.eex | 36 ++++++ lib/append_web/templates/address/new.html.eex | 5 + .../templates/address/show.html.eex | 38 +++++++ lib/append_web/views/address_view.ex | 3 + .../20190325043631_add_entry_id.exs | 9 -- .../migrations/20190325053624_add_deleted.exs | 9 -- ...xs => 20190425093946_create_addresses.exs} | 6 - test/append/accounts/accounts_test.exs | 74 +++++++++++++ .../controllers/address_controller_test.exs | 88 +++++++++++++++ 15 files changed, 472 insertions(+), 61 deletions(-) create mode 100644 lib/append/accounts.ex create mode 100644 lib/append/accounts/address.ex delete mode 100644 lib/append/address.ex create mode 100644 lib/append_web/controllers/address_controller.ex create mode 100644 lib/append_web/templates/address/edit.html.eex create mode 100644 lib/append_web/templates/address/form.html.eex create mode 100644 lib/append_web/templates/address/index.html.eex create mode 100644 lib/append_web/templates/address/new.html.eex create mode 100644 lib/append_web/templates/address/show.html.eex create mode 100644 lib/append_web/views/address_view.ex delete mode 100644 priv/repo/migrations/20190325043631_add_entry_id.exs delete mode 100644 priv/repo/migrations/20190325053624_add_deleted.exs rename priv/repo/migrations/{20190324204144_create_addresses.exs => 20190425093946_create_addresses.exs} (52%) create mode 100644 test/append/accounts/accounts_test.exs create mode 100644 test/append_web/controllers/address_controller_test.exs diff --git a/lib/append/accounts.ex b/lib/append/accounts.ex new file mode 100644 index 0000000..3febaad --- /dev/null +++ b/lib/append/accounts.ex @@ -0,0 +1,104 @@ +defmodule Append.Accounts do + @moduledoc """ + The Accounts context. + """ + + import Ecto.Query, warn: false + alias Append.Repo + + alias Append.Accounts.Address + + @doc """ + Returns the list of addresses. + + ## Examples + + iex> list_addresses() + [%Address{}, ...] + + """ + def list_addresses do + Repo.all(Address) + end + + @doc """ + Gets a single address. + + Raises `Ecto.NoResultsError` if the Address does not exist. + + ## Examples + + iex> get_address!(123) + %Address{} + + iex> get_address!(456) + ** (Ecto.NoResultsError) + + """ + def get_address!(id), do: Repo.get!(Address, id) + + @doc """ + Creates a address. + + ## Examples + + iex> create_address(%{field: value}) + {:ok, %Address{}} + + iex> create_address(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_address(attrs \\ %{}) do + %Address{} + |> Address.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a address. + + ## Examples + + iex> update_address(address, %{field: new_value}) + {:ok, %Address{}} + + iex> update_address(address, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_address(%Address{} = address, attrs) do + address + |> Address.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a Address. + + ## Examples + + iex> delete_address(address) + {:ok, %Address{}} + + iex> delete_address(address) + {:error, %Ecto.Changeset{}} + + """ + def delete_address(%Address{} = address) do + Repo.delete(address) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking address changes. + + ## Examples + + iex> change_address(address) + %Ecto.Changeset{source: %Address{}} + + """ + def change_address(%Address{} = address) do + Address.changeset(address, %{}) + end +end diff --git a/lib/append/accounts/address.ex b/lib/append/accounts/address.ex new file mode 100644 index 0000000..6bb91e5 --- /dev/null +++ b/lib/append/accounts/address.ex @@ -0,0 +1,22 @@ +defmodule Append.Accounts.Address do + use Ecto.Schema + import Ecto.Changeset + + schema "addresses" do + field :address_line_1, :string + field :address_line_2, :string + field :city, :string + field :name, :string + field :postcode, :string + field :tel, :string + + timestamps() + end + + @doc false + def changeset(address, attrs) do + address + |> cast(attrs, [:name, :address_line_1, :address_line_2, :city, :postcode, :tel]) + |> validate_required([:name, :address_line_1, :address_line_2, :city, :postcode, :tel]) + end +end diff --git a/lib/append/address.ex b/lib/append/address.ex deleted file mode 100644 index 0d9b009..0000000 --- a/lib/append/address.ex +++ /dev/null @@ -1,37 +0,0 @@ -defmodule Append.Address do - use Ecto.Schema - import Ecto.Changeset - - use Append.AppendOnlyLog #include the functions from module '__using__' macro. - - @timestamps_opts [type: :naive_datetime_usec] - schema "addresses" do - field :address_line_1, :string - field :address_line_2, :string - field :city, :string - field(:deleted, :boolean, default: false) - field(:entry_id, :string) - field :name, :string - field :postcode, :string - field :tel, :string - - timestamps() - end - - @doc false - def changeset(address, attrs) do - address - |> insert_entry_id() - |> cast(attrs, [:name, :address_line_1, :address_line_2, :city, - :postcode, :tel, :entry_id, :deleted]) - |> validate_required([:name, :address_line_1, :address_line_2, - :city, :postcode, :tel, :entry_id]) - end - - def insert_entry_id(address) do - case Map.fetch(address, :entry_id) do - {:ok, nil} -> %{address | entry_id: Ecto.UUID.generate()} - _ -> address - end - end -end diff --git a/lib/append_web/controllers/address_controller.ex b/lib/append_web/controllers/address_controller.ex new file mode 100644 index 0000000..978b63b --- /dev/null +++ b/lib/append_web/controllers/address_controller.ex @@ -0,0 +1,62 @@ +defmodule AppendWeb.AddressController do + use AppendWeb, :controller + + alias Append.Accounts + alias Append.Accounts.Address + + def index(conn, _params) do + addresses = Accounts.list_addresses() + render(conn, "index.html", addresses: addresses) + end + + def new(conn, _params) do + changeset = Accounts.change_address(%Address{}) + render(conn, "new.html", changeset: changeset) + end + + def create(conn, %{"address" => address_params}) do + case Accounts.create_address(address_params) do + {:ok, address} -> + conn + |> put_flash(:info, "Address created successfully.") + |> redirect(to: Routes.address_path(conn, :show, address)) + + {:error, %Ecto.Changeset{} = changeset} -> + render(conn, "new.html", changeset: changeset) + end + end + + def show(conn, %{"id" => id}) do + address = Accounts.get_address!(id) + render(conn, "show.html", address: address) + end + + def edit(conn, %{"id" => id}) do + address = Accounts.get_address!(id) + changeset = Accounts.change_address(address) + render(conn, "edit.html", address: address, changeset: changeset) + end + + def update(conn, %{"id" => id, "address" => address_params}) do + address = Accounts.get_address!(id) + + case Accounts.update_address(address, address_params) do + {:ok, address} -> + conn + |> put_flash(:info, "Address updated successfully.") + |> redirect(to: Routes.address_path(conn, :show, address)) + + {:error, %Ecto.Changeset{} = changeset} -> + render(conn, "edit.html", address: address, changeset: changeset) + end + end + + def delete(conn, %{"id" => id}) do + address = Accounts.get_address!(id) + {:ok, _address} = Accounts.delete_address(address) + + conn + |> put_flash(:info, "Address deleted successfully.") + |> redirect(to: Routes.address_path(conn, :index)) + end +end diff --git a/lib/append_web/templates/address/edit.html.eex b/lib/append_web/templates/address/edit.html.eex new file mode 100644 index 0000000..3790515 --- /dev/null +++ b/lib/append_web/templates/address/edit.html.eex @@ -0,0 +1,5 @@ +

Edit Address

+ +<%= render "form.html", Map.put(assigns, :action, Routes.address_path(@conn, :update, @address)) %> + +<%= link "Back", to: Routes.address_path(@conn, :index) %> diff --git a/lib/append_web/templates/address/form.html.eex b/lib/append_web/templates/address/form.html.eex new file mode 100644 index 0000000..600b651 --- /dev/null +++ b/lib/append_web/templates/address/form.html.eex @@ -0,0 +1,35 @@ +<%= form_for @changeset, @action, fn f -> %> + <%= if @changeset.action do %> +
+

Oops, something went wrong! Please check the errors below.

+
+ <% end %> + + <%= label f, :name %> + <%= text_input f, :name %> + <%= error_tag f, :name %> + + <%= label f, :address_line_1 %> + <%= text_input f, :address_line_1 %> + <%= error_tag f, :address_line_1 %> + + <%= label f, :address_line_2 %> + <%= text_input f, :address_line_2 %> + <%= error_tag f, :address_line_2 %> + + <%= label f, :city %> + <%= text_input f, :city %> + <%= error_tag f, :city %> + + <%= label f, :postcode %> + <%= text_input f, :postcode %> + <%= error_tag f, :postcode %> + + <%= label f, :tel %> + <%= text_input f, :tel %> + <%= error_tag f, :tel %> + +
+ <%= submit "Save" %> +
+<% end %> diff --git a/lib/append_web/templates/address/index.html.eex b/lib/append_web/templates/address/index.html.eex new file mode 100644 index 0000000..531a19b --- /dev/null +++ b/lib/append_web/templates/address/index.html.eex @@ -0,0 +1,36 @@ +

Listing Addresses

+ + + + + + + + + + + + + + + +<%= for address <- @addresses do %> + + + + + + + + + + +<% end %> + +
NameAddress line 1Address line 2CityPostcodeTel
<%= address.name %><%= address.address_line_1 %><%= address.address_line_2 %><%= address.city %><%= address.postcode %><%= address.tel %> + <%= link "Show", to: Routes.address_path(@conn, :show, address) %> + <%= link "Edit", to: Routes.address_path(@conn, :edit, address) %> + <%= link "Delete", to: Routes.address_path(@conn, :delete, address), method: :delete, data: [confirm: "Are you sure?"] %> +
+ +<%= link "New Address", to: Routes.address_path(@conn, :new) %> diff --git a/lib/append_web/templates/address/new.html.eex b/lib/append_web/templates/address/new.html.eex new file mode 100644 index 0000000..03c2bee --- /dev/null +++ b/lib/append_web/templates/address/new.html.eex @@ -0,0 +1,5 @@ +

New Address

+ +<%= render "form.html", Map.put(assigns, :action, Routes.address_path(@conn, :create)) %> + +<%= link "Back", to: Routes.address_path(@conn, :index) %> diff --git a/lib/append_web/templates/address/show.html.eex b/lib/append_web/templates/address/show.html.eex new file mode 100644 index 0000000..9505914 --- /dev/null +++ b/lib/append_web/templates/address/show.html.eex @@ -0,0 +1,38 @@ +

Show Address

+ + + +<%= link "Edit", to: Routes.address_path(@conn, :edit, @address) %> +<%= link "Back", to: Routes.address_path(@conn, :index) %> diff --git a/lib/append_web/views/address_view.ex b/lib/append_web/views/address_view.ex new file mode 100644 index 0000000..7325f46 --- /dev/null +++ b/lib/append_web/views/address_view.ex @@ -0,0 +1,3 @@ +defmodule AppendWeb.AddressView do + use AppendWeb, :view +end diff --git a/priv/repo/migrations/20190325043631_add_entry_id.exs b/priv/repo/migrations/20190325043631_add_entry_id.exs deleted file mode 100644 index f80e2b7..0000000 --- a/priv/repo/migrations/20190325043631_add_entry_id.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule Append.Repo.Migrations.AddEntryId do - use Ecto.Migration - - def change do - alter table("addresses") do - add :entry_id, :string - end - end -end diff --git a/priv/repo/migrations/20190325053624_add_deleted.exs b/priv/repo/migrations/20190325053624_add_deleted.exs deleted file mode 100644 index e6656cb..0000000 --- a/priv/repo/migrations/20190325053624_add_deleted.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule Append.Repo.Migrations.AddDeleted do - use Ecto.Migration - - def change do - alter table("addresses") do - add(:deleted, :boolean, default: false) - end - end -end diff --git a/priv/repo/migrations/20190324204144_create_addresses.exs b/priv/repo/migrations/20190425093946_create_addresses.exs similarity index 52% rename from priv/repo/migrations/20190324204144_create_addresses.exs rename to priv/repo/migrations/20190425093946_create_addresses.exs index 7768946..f39fff7 100644 --- a/priv/repo/migrations/20190324204144_create_addresses.exs +++ b/priv/repo/migrations/20190425093946_create_addresses.exs @@ -1,11 +1,6 @@ defmodule Append.Repo.Migrations.CreateAddresses do use Ecto.Migration - # Get name of our Ecto Repo module from our config - @repo :append |> Application.get_env(:ecto_repos) |> List.first() - # Get username of Ecto Repo from our config - @db_user Application.get_env(:append, @repo)[:username] - def change do create table(:addresses) do add :name, :string @@ -18,6 +13,5 @@ defmodule Append.Repo.Migrations.CreateAddresses do timestamps() end - execute("REVOKE UPDATE, DELETE ON TABLE addresses FROM #{@db_user}") end end diff --git a/test/append/accounts/accounts_test.exs b/test/append/accounts/accounts_test.exs new file mode 100644 index 0000000..f734e68 --- /dev/null +++ b/test/append/accounts/accounts_test.exs @@ -0,0 +1,74 @@ +defmodule Append.AccountsTest do + use Append.DataCase + + alias Append.Accounts + + describe "addresses" do + alias Append.Accounts.Address + + @valid_attrs %{address_line_1: "some address_line_1", address_line_2: "some address_line_2", city: "some city", name: "some name", postcode: "some postcode", tel: "some tel"} + @update_attrs %{address_line_1: "some updated address_line_1", address_line_2: "some updated address_line_2", city: "some updated city", name: "some updated name", postcode: "some updated postcode", tel: "some updated tel"} + @invalid_attrs %{address_line_1: nil, address_line_2: nil, city: nil, name: nil, postcode: nil, tel: nil} + + def address_fixture(attrs \\ %{}) do + {:ok, address} = + attrs + |> Enum.into(@valid_attrs) + |> Accounts.create_address() + + address + end + + test "list_addresses/0 returns all addresses" do + address = address_fixture() + assert Accounts.list_addresses() == [address] + end + + test "get_address!/1 returns the address with given id" do + address = address_fixture() + assert Accounts.get_address!(address.id) == address + end + + test "create_address/1 with valid data creates a address" do + assert {:ok, %Address{} = address} = Accounts.create_address(@valid_attrs) + assert address.address_line_1 == "some address_line_1" + assert address.address_line_2 == "some address_line_2" + assert address.city == "some city" + assert address.name == "some name" + assert address.postcode == "some postcode" + assert address.tel == "some tel" + end + + test "create_address/1 with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Accounts.create_address(@invalid_attrs) + end + + test "update_address/2 with valid data updates the address" do + address = address_fixture() + assert {:ok, %Address{} = address} = Accounts.update_address(address, @update_attrs) + assert address.address_line_1 == "some updated address_line_1" + assert address.address_line_2 == "some updated address_line_2" + assert address.city == "some updated city" + assert address.name == "some updated name" + assert address.postcode == "some updated postcode" + assert address.tel == "some updated tel" + end + + test "update_address/2 with invalid data returns error changeset" do + address = address_fixture() + assert {:error, %Ecto.Changeset{}} = Accounts.update_address(address, @invalid_attrs) + assert address == Accounts.get_address!(address.id) + end + + test "delete_address/1 deletes the address" do + address = address_fixture() + assert {:ok, %Address{}} = Accounts.delete_address(address) + assert_raise Ecto.NoResultsError, fn -> Accounts.get_address!(address.id) end + end + + test "change_address/1 returns a address changeset" do + address = address_fixture() + assert %Ecto.Changeset{} = Accounts.change_address(address) + end + end +end diff --git a/test/append_web/controllers/address_controller_test.exs b/test/append_web/controllers/address_controller_test.exs new file mode 100644 index 0000000..f3955fa --- /dev/null +++ b/test/append_web/controllers/address_controller_test.exs @@ -0,0 +1,88 @@ +defmodule AppendWeb.AddressControllerTest do + use AppendWeb.ConnCase + + alias Append.Accounts + + @create_attrs %{address_line_1: "some address_line_1", address_line_2: "some address_line_2", city: "some city", name: "some name", postcode: "some postcode", tel: "some tel"} + @update_attrs %{address_line_1: "some updated address_line_1", address_line_2: "some updated address_line_2", city: "some updated city", name: "some updated name", postcode: "some updated postcode", tel: "some updated tel"} + @invalid_attrs %{address_line_1: nil, address_line_2: nil, city: nil, name: nil, postcode: nil, tel: nil} + + def fixture(:address) do + {:ok, address} = Accounts.create_address(@create_attrs) + address + end + + describe "index" do + test "lists all addresses", %{conn: conn} do + conn = get(conn, Routes.address_path(conn, :index)) + assert html_response(conn, 200) =~ "Listing Addresses" + end + end + + describe "new address" do + test "renders form", %{conn: conn} do + conn = get(conn, Routes.address_path(conn, :new)) + assert html_response(conn, 200) =~ "New Address" + end + end + + describe "create address" do + test "redirects to show when data is valid", %{conn: conn} do + conn = post(conn, Routes.address_path(conn, :create), address: @create_attrs) + + assert %{id: id} = redirected_params(conn) + assert redirected_to(conn) == Routes.address_path(conn, :show, id) + + conn = get(conn, Routes.address_path(conn, :show, id)) + assert html_response(conn, 200) =~ "Show Address" + end + + test "renders errors when data is invalid", %{conn: conn} do + conn = post(conn, Routes.address_path(conn, :create), address: @invalid_attrs) + assert html_response(conn, 200) =~ "New Address" + end + end + + describe "edit address" do + setup [:create_address] + + test "renders form for editing chosen address", %{conn: conn, address: address} do + conn = get(conn, Routes.address_path(conn, :edit, address)) + assert html_response(conn, 200) =~ "Edit Address" + end + end + + describe "update address" do + setup [:create_address] + + test "redirects when data is valid", %{conn: conn, address: address} do + conn = put(conn, Routes.address_path(conn, :update, address), address: @update_attrs) + assert redirected_to(conn) == Routes.address_path(conn, :show, address) + + conn = get(conn, Routes.address_path(conn, :show, address)) + assert html_response(conn, 200) =~ "some updated address_line_1" + end + + test "renders errors when data is invalid", %{conn: conn, address: address} do + conn = put(conn, Routes.address_path(conn, :update, address), address: @invalid_attrs) + assert html_response(conn, 200) =~ "Edit Address" + end + end + + describe "delete address" do + setup [:create_address] + + test "deletes chosen address", %{conn: conn, address: address} do + conn = delete(conn, Routes.address_path(conn, :delete, address)) + assert redirected_to(conn) == Routes.address_path(conn, :index) + assert_error_sent 404, fn -> + get(conn, Routes.address_path(conn, :show, address)) + end + end + end + + defp create_address(_) do + address = fixture(:address) + {:ok, address: address} + end +end