From 1308f691a45ded86a4b657a0e3c5b7b17f9cb5ca Mon Sep 17 00:00:00 2001 From: codevictory Date: Mon, 3 May 2021 20:28:36 +0300 Subject: [PATCH] New entity: Visitors. --- lib/runosaari/registration.ex | 96 +++++++++++++++++++ lib/runosaari/registration/visitor.ex | 25 +++++ .../controllers/visitor_controller.ex | 62 ++++++++++++ .../templates/visitor/edit.html.eex | 5 + .../templates/visitor/form.html.eex | 47 +++++++++ .../templates/visitor/index.html.eex | 42 ++++++++ .../templates/visitor/new.html.eex | 5 + .../templates/visitor/show.html.eex | 53 ++++++++++ lib/runosaari_web/views/visitor_view.ex | 3 + .../20210503172728_create_visitors.exs | 20 ++++ test/runosaari/registration_test.exs | 75 +++++++++++++++ .../controllers/visitor_controller_test.exs | 88 +++++++++++++++++ 12 files changed, 521 insertions(+) create mode 100644 lib/runosaari/registration/visitor.ex create mode 100644 lib/runosaari_web/controllers/visitor_controller.ex create mode 100644 lib/runosaari_web/templates/visitor/edit.html.eex create mode 100644 lib/runosaari_web/templates/visitor/form.html.eex create mode 100644 lib/runosaari_web/templates/visitor/index.html.eex create mode 100644 lib/runosaari_web/templates/visitor/new.html.eex create mode 100644 lib/runosaari_web/templates/visitor/show.html.eex create mode 100644 lib/runosaari_web/views/visitor_view.ex create mode 100644 priv/repo/migrations/20210503172728_create_visitors.exs create mode 100644 test/runosaari_web/controllers/visitor_controller_test.exs diff --git a/lib/runosaari/registration.ex b/lib/runosaari/registration.ex index 13009d8..f5472ed 100644 --- a/lib/runosaari/registration.ex +++ b/lib/runosaari/registration.ex @@ -114,4 +114,100 @@ defmodule Runosaari.Registration do def change_performer(%Performer{} = performer, attrs \\ %{}) do Performer.changeset(performer, attrs) end + + alias Runosaari.Registration.Visitor + + @doc """ + Returns the list of visitors. + + ## Examples + + iex> list_visitors() + [%Visitor{}, ...] + + """ + def list_visitors do + Repo.all(Visitor) + end + + @doc """ + Gets a single visitor. + + Raises `Ecto.NoResultsError` if the Visitor does not exist. + + ## Examples + + iex> get_visitor!(123) + %Visitor{} + + iex> get_visitor!(456) + ** (Ecto.NoResultsError) + + """ + def get_visitor!(id), do: Repo.get!(Visitor, id) + + @doc """ + Creates a visitor. + + ## Examples + + iex> create_visitor(%{field: value}) + {:ok, %Visitor{}} + + iex> create_visitor(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_visitor(attrs \\ %{}) do + %Visitor{} + |> Visitor.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a visitor. + + ## Examples + + iex> update_visitor(visitor, %{field: new_value}) + {:ok, %Visitor{}} + + iex> update_visitor(visitor, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_visitor(%Visitor{} = visitor, attrs) do + visitor + |> Visitor.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a visitor. + + ## Examples + + iex> delete_visitor(visitor) + {:ok, %Visitor{}} + + iex> delete_visitor(visitor) + {:error, %Ecto.Changeset{}} + + """ + def delete_visitor(%Visitor{} = visitor) do + Repo.delete(visitor) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking visitor changes. + + ## Examples + + iex> change_visitor(visitor) + %Ecto.Changeset{data: %Visitor{}} + + """ + def change_visitor(%Visitor{} = visitor, attrs \\ %{}) do + Visitor.changeset(visitor, attrs) + end end diff --git a/lib/runosaari/registration/visitor.ex b/lib/runosaari/registration/visitor.ex new file mode 100644 index 0000000..5d621f3 --- /dev/null +++ b/lib/runosaari/registration/visitor.ex @@ -0,0 +1,25 @@ +defmodule Runosaari.Registration.Visitor do + use Ecto.Schema + import Ecto.Changeset + + schema "visitors" do + field :accom, :boolean, default: false + field :bus, :boolean, default: false + field :date1, :boolean, default: false + field :date2, :boolean, default: false + field :date3, :boolean, default: false + field :email, :string + field :fname, :string + field :lname, :string + field :tel, :string + + timestamps() + end + + @doc false + def changeset(visitor, attrs) do + visitor + |> cast(attrs, [:fname, :lname, :email, :tel, :date1, :date2, :date3, :bus, :accom]) + |> validate_required([:fname, :lname, :email, :tel, :date1, :date2, :date3, :bus, :accom]) + end +end diff --git a/lib/runosaari_web/controllers/visitor_controller.ex b/lib/runosaari_web/controllers/visitor_controller.ex new file mode 100644 index 0000000..8523c82 --- /dev/null +++ b/lib/runosaari_web/controllers/visitor_controller.ex @@ -0,0 +1,62 @@ +defmodule RunosaariWeb.VisitorController do + use RunosaariWeb, :controller + + alias Runosaari.Registration + alias Runosaari.Registration.Visitor + + def index(conn, _params) do + visitors = Registration.list_visitors() + render(conn, "index.html", visitors: visitors) + end + + def new(conn, _params) do + changeset = Registration.change_visitor(%Visitor{}) + render(conn, "new.html", changeset: changeset) + end + + def create(conn, %{"visitor" => visitor_params}) do + case Registration.create_visitor(visitor_params) do + {:ok, visitor} -> + conn + |> put_flash(:info, "Visitor created successfully.") + |> redirect(to: Routes.visitor_path(conn, :show, visitor)) + + {:error, %Ecto.Changeset{} = changeset} -> + render(conn, "new.html", changeset: changeset) + end + end + + def show(conn, %{"id" => id}) do + visitor = Registration.get_visitor!(id) + render(conn, "show.html", visitor: visitor) + end + + def edit(conn, %{"id" => id}) do + visitor = Registration.get_visitor!(id) + changeset = Registration.change_visitor(visitor) + render(conn, "edit.html", visitor: visitor, changeset: changeset) + end + + def update(conn, %{"id" => id, "visitor" => visitor_params}) do + visitor = Registration.get_visitor!(id) + + case Registration.update_visitor(visitor, visitor_params) do + {:ok, visitor} -> + conn + |> put_flash(:info, "Visitor updated successfully.") + |> redirect(to: Routes.visitor_path(conn, :show, visitor)) + + {:error, %Ecto.Changeset{} = changeset} -> + render(conn, "edit.html", visitor: visitor, changeset: changeset) + end + end + + def delete(conn, %{"id" => id}) do + visitor = Registration.get_visitor!(id) + {:ok, _visitor} = Registration.delete_visitor(visitor) + + conn + |> put_flash(:info, "Visitor deleted successfully.") + |> redirect(to: Routes.visitor_path(conn, :index)) + end +end diff --git a/lib/runosaari_web/templates/visitor/edit.html.eex b/lib/runosaari_web/templates/visitor/edit.html.eex new file mode 100644 index 0000000..a45e2e9 --- /dev/null +++ b/lib/runosaari_web/templates/visitor/edit.html.eex @@ -0,0 +1,5 @@ +

Edit Visitor

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

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

+
+ <% end %> + + <%= label f, :fname %> + <%= text_input f, :fname %> + <%= error_tag f, :fname %> + + <%= label f, :lname %> + <%= text_input f, :lname %> + <%= error_tag f, :lname %> + + <%= label f, :email %> + <%= text_input f, :email %> + <%= error_tag f, :email %> + + <%= label f, :tel %> + <%= text_input f, :tel %> + <%= error_tag f, :tel %> + + <%= label f, :date1 %> + <%= checkbox f, :date1 %> + <%= error_tag f, :date1 %> + + <%= label f, :date2 %> + <%= checkbox f, :date2 %> + <%= error_tag f, :date2 %> + + <%= label f, :date3 %> + <%= checkbox f, :date3 %> + <%= error_tag f, :date3 %> + + <%= label f, :bus %> + <%= checkbox f, :bus %> + <%= error_tag f, :bus %> + + <%= label f, :accom %> + <%= checkbox f, :accom %> + <%= error_tag f, :accom %> + +
+ <%= submit "Save" %> +
+<% end %> diff --git a/lib/runosaari_web/templates/visitor/index.html.eex b/lib/runosaari_web/templates/visitor/index.html.eex new file mode 100644 index 0000000..776a6da --- /dev/null +++ b/lib/runosaari_web/templates/visitor/index.html.eex @@ -0,0 +1,42 @@ +

Listing Visitors

+ + + + + + + + + + + + + + + + + + +<%= for visitor <- @visitors do %> + + + + + + + + + + + + + +<% end %> + +
FnameLnameEmailTelDate1Date2Date3BusAccom
<%= visitor.fname %><%= visitor.lname %><%= visitor.email %><%= visitor.tel %><%= visitor.date1 %><%= visitor.date2 %><%= visitor.date3 %><%= visitor.bus %><%= visitor.accom %> + <%= link "Show", to: Routes.visitor_path(@conn, :show, visitor) %> + <%= link "Edit", to: Routes.visitor_path(@conn, :edit, visitor) %> + <%= link "Delete", to: Routes.visitor_path(@conn, :delete, visitor), method: :delete, data: [confirm: "Are you sure?"] %> +
+ +<%= link "New Visitor", to: Routes.visitor_path(@conn, :new) %> diff --git a/lib/runosaari_web/templates/visitor/new.html.eex b/lib/runosaari_web/templates/visitor/new.html.eex new file mode 100644 index 0000000..70ab951 --- /dev/null +++ b/lib/runosaari_web/templates/visitor/new.html.eex @@ -0,0 +1,5 @@ +

New Visitor

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

Show Visitor

+ + + +<%= link "Edit", to: Routes.visitor_path(@conn, :edit, @visitor) %> +<%= link "Back", to: Routes.visitor_path(@conn, :index) %> diff --git a/lib/runosaari_web/views/visitor_view.ex b/lib/runosaari_web/views/visitor_view.ex new file mode 100644 index 0000000..60fc629 --- /dev/null +++ b/lib/runosaari_web/views/visitor_view.ex @@ -0,0 +1,3 @@ +defmodule RunosaariWeb.VisitorView do + use RunosaariWeb, :view +end diff --git a/priv/repo/migrations/20210503172728_create_visitors.exs b/priv/repo/migrations/20210503172728_create_visitors.exs new file mode 100644 index 0000000..07043ee --- /dev/null +++ b/priv/repo/migrations/20210503172728_create_visitors.exs @@ -0,0 +1,20 @@ +defmodule Runosaari.Repo.Migrations.CreateVisitors do + use Ecto.Migration + + def change do + create table(:visitors) do + add :fname, :string + add :lname, :string + add :email, :string + add :tel, :string + add :date1, :boolean, default: false, null: false + add :date2, :boolean, default: false, null: false + add :date3, :boolean, default: false, null: false + add :bus, :boolean, default: false, null: false + add :accom, :boolean, default: false, null: false + + timestamps() + end + + end +end diff --git a/test/runosaari/registration_test.exs b/test/runosaari/registration_test.exs index 1dc7f73..a604b49 100644 --- a/test/runosaari/registration_test.exs +++ b/test/runosaari/registration_test.exs @@ -128,4 +128,79 @@ defmodule Runosaari.RegistrationTest do assert %Ecto.Changeset{} = Registration.change_performer(performer) end end + + describe "visitors" do + alias Runosaari.Registration.Visitor + + @valid_attrs %{accom: true, bus: true, date1: true, date2: true, date3: true, email: "some email", fname: "some fname", lname: "some lname", tel: "some tel"} + @update_attrs %{accom: false, bus: false, date1: false, date2: false, date3: false, email: "some updated email", fname: "some updated fname", lname: "some updated lname", tel: "some updated tel"} + @invalid_attrs %{accom: nil, bus: nil, date1: nil, date2: nil, date3: nil, email: nil, fname: nil, lname: nil, tel: nil} + + def visitor_fixture(attrs \\ %{}) do + {:ok, visitor} = + attrs + |> Enum.into(@valid_attrs) + |> Registration.create_visitor() + + visitor + end + + test "list_visitors/0 returns all visitors" do + visitor = visitor_fixture() + assert Registration.list_visitors() == [visitor] + end + + test "get_visitor!/1 returns the visitor with given id" do + visitor = visitor_fixture() + assert Registration.get_visitor!(visitor.id) == visitor + end + + test "create_visitor/1 with valid data creates a visitor" do + assert {:ok, %Visitor{} = visitor} = Registration.create_visitor(@valid_attrs) + assert visitor.accom == true + assert visitor.bus == true + assert visitor.date1 == true + assert visitor.date2 == true + assert visitor.date3 == true + assert visitor.email == "some email" + assert visitor.fname == "some fname" + assert visitor.lname == "some lname" + assert visitor.tel == "some tel" + end + + test "create_visitor/1 with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Registration.create_visitor(@invalid_attrs) + end + + test "update_visitor/2 with valid data updates the visitor" do + visitor = visitor_fixture() + assert {:ok, %Visitor{} = visitor} = Registration.update_visitor(visitor, @update_attrs) + assert visitor.accom == false + assert visitor.bus == false + assert visitor.date1 == false + assert visitor.date2 == false + assert visitor.date3 == false + assert visitor.email == "some updated email" + assert visitor.fname == "some updated fname" + assert visitor.lname == "some updated lname" + assert visitor.tel == "some updated tel" + end + + test "update_visitor/2 with invalid data returns error changeset" do + visitor = visitor_fixture() + assert {:error, %Ecto.Changeset{}} = Registration.update_visitor(visitor, @invalid_attrs) + assert visitor == Registration.get_visitor!(visitor.id) + end + + test "delete_visitor/1 deletes the visitor" do + visitor = visitor_fixture() + assert {:ok, %Visitor{}} = Registration.delete_visitor(visitor) + assert_raise Ecto.NoResultsError, fn -> Registration.get_visitor!(visitor.id) end + end + + test "change_visitor/1 returns a visitor changeset" do + visitor = visitor_fixture() + assert %Ecto.Changeset{} = Registration.change_visitor(visitor) + end + end end diff --git a/test/runosaari_web/controllers/visitor_controller_test.exs b/test/runosaari_web/controllers/visitor_controller_test.exs new file mode 100644 index 0000000..ed61fe3 --- /dev/null +++ b/test/runosaari_web/controllers/visitor_controller_test.exs @@ -0,0 +1,88 @@ +defmodule RunosaariWeb.VisitorControllerTest do + use RunosaariWeb.ConnCase + + alias Runosaari.Registration + + @create_attrs %{accom: true, bus: true, date1: true, date2: true, date3: true, email: "some email", fname: "some fname", lname: "some lname", tel: "some tel"} + @update_attrs %{accom: false, bus: false, date1: false, date2: false, date3: false, email: "some updated email", fname: "some updated fname", lname: "some updated lname", tel: "some updated tel"} + @invalid_attrs %{accom: nil, bus: nil, date1: nil, date2: nil, date3: nil, email: nil, fname: nil, lname: nil, tel: nil} + + def fixture(:visitor) do + {:ok, visitor} = Registration.create_visitor(@create_attrs) + visitor + end + + describe "index" do + test "lists all visitors", %{conn: conn} do + conn = get(conn, Routes.visitor_path(conn, :index)) + assert html_response(conn, 200) =~ "Listing Visitors" + end + end + + describe "new visitor" do + test "renders form", %{conn: conn} do + conn = get(conn, Routes.visitor_path(conn, :new)) + assert html_response(conn, 200) =~ "New Visitor" + end + end + + describe "create visitor" do + test "redirects to show when data is valid", %{conn: conn} do + conn = post(conn, Routes.visitor_path(conn, :create), visitor: @create_attrs) + + assert %{id: id} = redirected_params(conn) + assert redirected_to(conn) == Routes.visitor_path(conn, :show, id) + + conn = get(conn, Routes.visitor_path(conn, :show, id)) + assert html_response(conn, 200) =~ "Show Visitor" + end + + test "renders errors when data is invalid", %{conn: conn} do + conn = post(conn, Routes.visitor_path(conn, :create), visitor: @invalid_attrs) + assert html_response(conn, 200) =~ "New Visitor" + end + end + + describe "edit visitor" do + setup [:create_visitor] + + test "renders form for editing chosen visitor", %{conn: conn, visitor: visitor} do + conn = get(conn, Routes.visitor_path(conn, :edit, visitor)) + assert html_response(conn, 200) =~ "Edit Visitor" + end + end + + describe "update visitor" do + setup [:create_visitor] + + test "redirects when data is valid", %{conn: conn, visitor: visitor} do + conn = put(conn, Routes.visitor_path(conn, :update, visitor), visitor: @update_attrs) + assert redirected_to(conn) == Routes.visitor_path(conn, :show, visitor) + + conn = get(conn, Routes.visitor_path(conn, :show, visitor)) + assert html_response(conn, 200) =~ "some updated email" + end + + test "renders errors when data is invalid", %{conn: conn, visitor: visitor} do + conn = put(conn, Routes.visitor_path(conn, :update, visitor), visitor: @invalid_attrs) + assert html_response(conn, 200) =~ "Edit Visitor" + end + end + + describe "delete visitor" do + setup [:create_visitor] + + test "deletes chosen visitor", %{conn: conn, visitor: visitor} do + conn = delete(conn, Routes.visitor_path(conn, :delete, visitor)) + assert redirected_to(conn) == Routes.visitor_path(conn, :index) + assert_error_sent 404, fn -> + get(conn, Routes.visitor_path(conn, :show, visitor)) + end + end + end + + defp create_visitor(_) do + visitor = fixture(:visitor) + %{visitor: visitor} + end +end