From a05a90f008a21931edc72dadb0a732ab831fe00f Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Thu, 26 Oct 2023 15:32:34 +0300 Subject: [PATCH 01/26] Added tests for extra event functions --- lib/elixir_conf_africa/events.ex | 4 +- test/elixir_conf_africa/events_test.exs | 67 +++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/lib/elixir_conf_africa/events.ex b/lib/elixir_conf_africa/events.ex index 9db0ca4..05d8b7a 100644 --- a/lib/elixir_conf_africa/events.ex +++ b/lib/elixir_conf_africa/events.ex @@ -27,7 +27,8 @@ defmodule ElixirConfAfrica.Events do |> Repo.preload(:ticket_types) end - defp get_elixir_conf_event do + @spec get_elixir_conf_event() :: any() + def get_elixir_conf_event do Repo.get_by(Event, name: "ElixirConf Africa 2024") end @@ -41,6 +42,7 @@ defmodule ElixirConfAfrica.Events do Repo.one(query) end + @spec get_event!(any()) :: any() @doc """ Gets a single event. diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index c0628ec..b4946b3 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -2,6 +2,8 @@ defmodule ElixirConfAfrica.EventsTest do use ElixirConfAfrica.DataCase alias ElixirConfAfrica.Events + alias ElixirConfAfrica.TicketTypes.TicketType + alias ElixirConfAfrica.TicketTypes describe "events" do alias ElixirConfAfrica.Events.Event @@ -22,11 +24,76 @@ defmodule ElixirConfAfrica.EventsTest do assert Events.list_events() == [event] end + test "get_elixir_conf_event /0 returns the elixir conf event" do + valid_attrs = %{ + name: "ElixirConf Africa 2024", + description: "some description", + location: "some location", + event_type: "some event_type", + start_date: ~N[2023-10-05 06:18:00], + end_date: ~N[2023-10-05 06:18:00] + } + + assert {:ok, %Event{} = event} = Events.create_event(valid_attrs) + assert Events.get_elixir_conf_event() == event + end + test "get_event!/1 returns the event with given id" do event = event_fixture() assert Events.get_event!(event.id) == event end + test "get_elixir_conf_event_and_ticket_types/0 returns the elixir conf event with ticket types" do + valid_attrs = %{ + name: "ElixirConf Africa 2024", + description: "some description", + location: "some location", + event_type: "some event_type", + start_date: ~N[2023-10-05 06:18:00], + end_date: ~N[2023-10-05 06:18:00] + } + + assert {:ok, %Event{} = event} = Events.create_event(valid_attrs) + assert Events.get_elixir_conf_event() == event + + ticket_type_attr = %{ + event_id: event.id, + name: "some name", + description: "some description", + price: "120.5", + number: "357" + } + + assert {:ok, %TicketType{} = ticket_type} = TicketTypes.create_ticket_type(ticket_type_attr) + assert Events.get_elixir_conf_event_and_ticket_types().ticket_types == [ticket_type] + end + + + test "get_all_available_tickets/0 returns the number of available tickets" do + valid_attrs = %{ + name: "ElixirConf Africa 2024", + description: "some description", + location: "some location", + event_type: "some event_type", + start_date: ~N[2023-10-05 06:18:00], + end_date: ~N[2023-10-05 06:18:00] + } + + assert {:ok, %Event{} = event} = Events.create_event(valid_attrs) + assert Events.get_elixir_conf_event() == event + + ticket_type_attr = %{ + event_id: event.id, + name: "some name", + description: "some description", + price: "120.5", + number: "357" + } + + assert {:ok, %TicketType{} = ticket_type} = TicketTypes.create_ticket_type(ticket_type_attr) + assert Events.get_all_available_tickets() == 357 + end + test "create_event/1 with valid data creates a event" do valid_attrs = %{ name: "some name", From 945f0d2e341194abf78a77108975fb2c8df54d19 Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Thu, 26 Oct 2023 15:41:09 +0300 Subject: [PATCH 02/26] added formatting to files --- test/elixir_conf_africa/events_test.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index b4946b3..a27fb61 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -68,7 +68,6 @@ defmodule ElixirConfAfrica.EventsTest do assert Events.get_elixir_conf_event_and_ticket_types().ticket_types == [ticket_type] end - test "get_all_available_tickets/0 returns the number of available tickets" do valid_attrs = %{ name: "ElixirConf Africa 2024", From efe5121d5a3a007ec878be659ee7dcc2913f3e5f Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Mon, 30 Oct 2023 07:22:02 +0300 Subject: [PATCH 03/26] Used test libraries --- test/elixir_conf_africa/events_test.exs | 58 +++--------------------- test/support/fixtures/events_fixtures.ex | 43 ++++++++++++++++++ 2 files changed, 50 insertions(+), 51 deletions(-) diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index a27fb61..f79018f 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -25,16 +25,8 @@ defmodule ElixirConfAfrica.EventsTest do end test "get_elixir_conf_event /0 returns the elixir conf event" do - valid_attrs = %{ - name: "ElixirConf Africa 2024", - description: "some description", - location: "some location", - event_type: "some event_type", - start_date: ~N[2023-10-05 06:18:00], - end_date: ~N[2023-10-05 06:18:00] - } + event = elixir_conf_event_fixture() - assert {:ok, %Event{} = event} = Events.create_event(valid_attrs) assert Events.get_elixir_conf_event() == event end @@ -44,52 +36,16 @@ defmodule ElixirConfAfrica.EventsTest do end test "get_elixir_conf_event_and_ticket_types/0 returns the elixir conf event with ticket types" do - valid_attrs = %{ - name: "ElixirConf Africa 2024", - description: "some description", - location: "some location", - event_type: "some event_type", - start_date: ~N[2023-10-05 06:18:00], - end_date: ~N[2023-10-05 06:18:00] - } + event_with_ticket_types = elixir_conf_event_with_tickets_fixture() + assert Events.get_elixir_conf_event() == hd(event_with_ticket_types) - assert {:ok, %Event{} = event} = Events.create_event(valid_attrs) - assert Events.get_elixir_conf_event() == event - - ticket_type_attr = %{ - event_id: event.id, - name: "some name", - description: "some description", - price: "120.5", - number: "357" - } - - assert {:ok, %TicketType{} = ticket_type} = TicketTypes.create_ticket_type(ticket_type_attr) - assert Events.get_elixir_conf_event_and_ticket_types().ticket_types == [ticket_type] + assert Events.get_elixir_conf_event_and_ticket_types().ticket_types != [ + tl(event_with_ticket_types) + ] end test "get_all_available_tickets/0 returns the number of available tickets" do - valid_attrs = %{ - name: "ElixirConf Africa 2024", - description: "some description", - location: "some location", - event_type: "some event_type", - start_date: ~N[2023-10-05 06:18:00], - end_date: ~N[2023-10-05 06:18:00] - } - - assert {:ok, %Event{} = event} = Events.create_event(valid_attrs) - assert Events.get_elixir_conf_event() == event - - ticket_type_attr = %{ - event_id: event.id, - name: "some name", - description: "some description", - price: "120.5", - number: "357" - } - - assert {:ok, %TicketType{} = ticket_type} = TicketTypes.create_ticket_type(ticket_type_attr) + event_with_ticket_types = elixir_conf_event_with_tickets_fixture() assert Events.get_all_available_tickets() == 357 end diff --git a/test/support/fixtures/events_fixtures.ex b/test/support/fixtures/events_fixtures.ex index c81e2eb..6fc9b53 100644 --- a/test/support/fixtures/events_fixtures.ex +++ b/test/support/fixtures/events_fixtures.ex @@ -22,4 +22,47 @@ defmodule ElixirConfAfrica.EventsFixtures do event end + + def elixir_conf_event_fixture(attrs \\ %{}) do + {:ok, event} = + attrs + |> Enum.into(%{ + name: "ElixirConf Africa 2024", + description: "some description", + location: "some location", + event_type: "some event_type", + start_date: ~N[2023-10-05 06:18:00], + end_date: ~N[2023-10-05 06:18:00] + }) + |> ElixirConfAfrica.Events.create_event() + + event + end + + def elixir_conf_event_with_tickets_fixture(attrs \\ %{}) do + {:ok, event} = + attrs + |> Enum.into(%{ + name: "ElixirConf Africa 2024", + description: "some description", + location: "some location", + event_type: "some event_type", + start_date: ~N[2023-10-05 06:18:00], + end_date: ~N[2023-10-05 06:18:00] + }) + |> ElixirConfAfrica.Events.create_event() + + {:ok, ticket_type} = + attrs + |> Enum.into(%{ + event_id: event.id, + name: "some name", + description: "some description", + price: "120.5", + number: "357" + }) + |> ElixirConfAfrica.TicketTypes.create_ticket_type() + + [event, ticket_type] + end end From aade95bafd52372bf460ba2a10eec1427d0726b5 Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Mon, 30 Oct 2023 07:24:52 +0300 Subject: [PATCH 04/26] Fixed spec error --- lib/elixir_conf_africa/events.ex | 2 +- test/elixir_conf_africa/events_test.exs | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/elixir_conf_africa/events.ex b/lib/elixir_conf_africa/events.ex index 05d8b7a..731e1a1 100644 --- a/lib/elixir_conf_africa/events.ex +++ b/lib/elixir_conf_africa/events.ex @@ -27,7 +27,7 @@ defmodule ElixirConfAfrica.Events do |> Repo.preload(:ticket_types) end - @spec get_elixir_conf_event() :: any() + @spec get_elixir_conf_event() :: nil | Event.t() def get_elixir_conf_event do Repo.get_by(Event, name: "ElixirConf Africa 2024") end diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index f79018f..ef1cb79 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -2,8 +2,6 @@ defmodule ElixirConfAfrica.EventsTest do use ElixirConfAfrica.DataCase alias ElixirConfAfrica.Events - alias ElixirConfAfrica.TicketTypes.TicketType - alias ElixirConfAfrica.TicketTypes describe "events" do alias ElixirConfAfrica.Events.Event From e39bc064716a410f6c9509d7b252cb8d9ac9a030 Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Mon, 30 Oct 2023 07:35:44 +0300 Subject: [PATCH 05/26] Fixed get elixir conf function --- lib/elixir_conf_africa/events.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/elixir_conf_africa/events.ex b/lib/elixir_conf_africa/events.ex index 731e1a1..05d8b7a 100644 --- a/lib/elixir_conf_africa/events.ex +++ b/lib/elixir_conf_africa/events.ex @@ -27,7 +27,7 @@ defmodule ElixirConfAfrica.Events do |> Repo.preload(:ticket_types) end - @spec get_elixir_conf_event() :: nil | Event.t() + @spec get_elixir_conf_event() :: any() def get_elixir_conf_event do Repo.get_by(Event, name: "ElixirConf Africa 2024") end From 473979883a485028198ef90959ec0e4b8fe462fa Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Mon, 30 Oct 2023 19:37:48 +0300 Subject: [PATCH 06/26] Added factories --- test/elixir_conf_africa/events_test.exs | 27 +++++++++++------ test/support/factory.ex | 40 +++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 9 deletions(-) create mode 100644 test/support/factory.ex diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index ef1cb79..58cb47a 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -8,6 +8,8 @@ defmodule ElixirConfAfrica.EventsTest do import ElixirConfAfrica.EventsFixtures + import ElixirConfAfrica.Factory + @invalid_attrs %{ name: nil, description: nil, @@ -23,9 +25,10 @@ defmodule ElixirConfAfrica.EventsTest do end test "get_elixir_conf_event /0 returns the elixir conf event" do - event = elixir_conf_event_fixture() + event = + insert!(:elixir_conf_event) - assert Events.get_elixir_conf_event() == event + assert Events.get_elixir_conf_event().name == event.name end test "get_event!/1 returns the event with given id" do @@ -34,17 +37,23 @@ defmodule ElixirConfAfrica.EventsTest do end test "get_elixir_conf_event_and_ticket_types/0 returns the elixir conf event with ticket types" do - event_with_ticket_types = elixir_conf_event_with_tickets_fixture() - assert Events.get_elixir_conf_event() == hd(event_with_ticket_types) + event = + insert!(:elixir_conf_event) + + ticket_type = + insert!(:elixir_conf_ticket_type, event_id: event.id) - assert Events.get_elixir_conf_event_and_ticket_types().ticket_types != [ - tl(event_with_ticket_types) - ] + assert Events.get_elixir_conf_event_and_ticket_types().ticket_types != [ ] end test "get_all_available_tickets/0 returns the number of available tickets" do - event_with_ticket_types = elixir_conf_event_with_tickets_fixture() - assert Events.get_all_available_tickets() == 357 + event = + insert!(:elixir_conf_event) + + ticket_type = + insert!(:elixir_conf_ticket_type, event_id: event.id) + + assert Events.get_all_available_tickets() == ticket_type.number end test "create_event/1 with valid data creates a event" do diff --git a/test/support/factory.ex b/test/support/factory.ex new file mode 100644 index 0000000..62a35df --- /dev/null +++ b/test/support/factory.ex @@ -0,0 +1,40 @@ +defmodule ElixirConfAfrica.Factory do + alias ElixirConfAfrica.Repo + + def build(:elixir_conf_event) do + %ElixirConfAfrica.Events.Event{ + id: 1, + name: "ElixirConf Africa 2024", + description: "some description", + location: "some location", + event_type: "some event_type", + start_date: ~N[2023-10-05 06:18:00], + end_date: ~N[2023-10-05 06:18:00] + } + end + + def build(:elixir_conf_ticket_type) do + %ElixirConfAfrica.TicketTypes.TicketType{ + name: "some name", + description: "some description", + price: 120.5, + number: 357 + } + end + + def build(factory_name, attributes) do + factory_name |> build() |> struct!(attributes) + end + + def insert!(factory_name, attributes \\ []) do + factory_name |> build(attributes) |> Repo.insert!() + end + + # def build(factory_name, attributes) do + # factory_name |> build() |> struct!(attributes) + # end + + # def insert!(factory_name, attributes \\ []) do + # factory_name |> build(attributes) |> Repo.insert!() + # end +end From e5a21875b247d6424bb3ec2b1a33aa2f070655a5 Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Mon, 30 Oct 2023 19:39:31 +0300 Subject: [PATCH 07/26] Added factories --- test/elixir_conf_africa/events_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index 58cb47a..6387ae6 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -43,7 +43,7 @@ defmodule ElixirConfAfrica.EventsTest do ticket_type = insert!(:elixir_conf_ticket_type, event_id: event.id) - assert Events.get_elixir_conf_event_and_ticket_types().ticket_types != [ ] + assert Events.get_elixir_conf_event_and_ticket_types().ticket_types != [] end test "get_all_available_tickets/0 returns the number of available tickets" do From e27e8adfe3d865fcffaeef97f4709fd87d314822 Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Mon, 30 Oct 2023 19:56:48 +0300 Subject: [PATCH 08/26] Added module doc false --- test/support/factory.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/test/support/factory.ex b/test/support/factory.ex index 62a35df..2d7bc0a 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -1,4 +1,5 @@ defmodule ElixirConfAfrica.Factory do + @moduledoc false alias ElixirConfAfrica.Repo def build(:elixir_conf_event) do From 4f0007e39bb8d19c43ab61d9562d32699ca2be71 Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Tue, 31 Oct 2023 18:22:34 +0300 Subject: [PATCH 09/26] Renamed get all available tickets and removed dead code --- lib/elixir_conf_africa/events.ex | 18 +++++++++++++++++- .../live/home_live/index.ex | 2 +- test/elixir_conf_africa/events_test.exs | 4 ++-- test/support/factory.ex | 8 -------- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/lib/elixir_conf_africa/events.ex b/lib/elixir_conf_africa/events.ex index 05d8b7a..64a14ff 100644 --- a/lib/elixir_conf_africa/events.ex +++ b/lib/elixir_conf_africa/events.ex @@ -22,17 +22,33 @@ defmodule ElixirConfAfrica.Events do Repo.all(from e in Event, order_by: [desc: e.id]) end + @doc """ + Returns the elixir conf event together with all its ticket types + + + + """ + def get_elixir_conf_event_and_ticket_types do get_elixir_conf_event() |> Repo.preload(:ticket_types) end + @doc """ + Returns the elixir conf event . + + """ @spec get_elixir_conf_event() :: any() def get_elixir_conf_event do Repo.get_by(Event, name: "ElixirConf Africa 2024") end - def get_all_available_tickets do + @doc """ + Returns the elixir conf event total available tickets got from the summation of quantity of each ticket type for the event + + """ + + def get_number_of_tickets_available_for_elixir_conf_2024 do query = from t in TicketType, join: e in Event, diff --git a/lib/elixir_conf_africa_web/live/home_live/index.ex b/lib/elixir_conf_africa_web/live/home_live/index.ex index 9dfc8d0..2f6756a 100644 --- a/lib/elixir_conf_africa_web/live/home_live/index.ex +++ b/lib/elixir_conf_africa_web/live/home_live/index.ex @@ -4,7 +4,7 @@ defmodule ElixirConfAfricaWeb.HomeLive.Index do def mount(_params, _session, socket) do elixir_conf_africa_event = Events.get_elixir_conf_event_and_ticket_types() - availabe_tickets = Events.get_all_available_tickets() + availabe_tickets = Events.get_number_of_tickets_available_for_elixir_conf_2024() {:ok, socket diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index 6387ae6..9518d26 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -40,7 +40,7 @@ defmodule ElixirConfAfrica.EventsTest do event = insert!(:elixir_conf_event) - ticket_type = + _ticket_type = insert!(:elixir_conf_ticket_type, event_id: event.id) assert Events.get_elixir_conf_event_and_ticket_types().ticket_types != [] @@ -53,7 +53,7 @@ defmodule ElixirConfAfrica.EventsTest do ticket_type = insert!(:elixir_conf_ticket_type, event_id: event.id) - assert Events.get_all_available_tickets() == ticket_type.number + assert Events.get_number_of_tickets_available_for_elixir_conf_2024() == ticket_type.number end test "create_event/1 with valid data creates a event" do diff --git a/test/support/factory.ex b/test/support/factory.ex index 2d7bc0a..64b608a 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -30,12 +30,4 @@ defmodule ElixirConfAfrica.Factory do def insert!(factory_name, attributes \\ []) do factory_name |> build(attributes) |> Repo.insert!() end - - # def build(factory_name, attributes) do - # factory_name |> build() |> struct!(attributes) - # end - - # def insert!(factory_name, attributes \\ []) do - # factory_name |> build(attributes) |> Repo.insert!() - # end end From 67ddc2333c75d99e38bf4f90eebd2ff418fae542 Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Thu, 26 Oct 2023 15:32:34 +0300 Subject: [PATCH 10/26] Added tests for extra event functions --- lib/elixir_conf_africa/events.ex | 4 +- test/elixir_conf_africa/events_test.exs | 67 +++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/lib/elixir_conf_africa/events.ex b/lib/elixir_conf_africa/events.ex index 9db0ca4..05d8b7a 100644 --- a/lib/elixir_conf_africa/events.ex +++ b/lib/elixir_conf_africa/events.ex @@ -27,7 +27,8 @@ defmodule ElixirConfAfrica.Events do |> Repo.preload(:ticket_types) end - defp get_elixir_conf_event do + @spec get_elixir_conf_event() :: any() + def get_elixir_conf_event do Repo.get_by(Event, name: "ElixirConf Africa 2024") end @@ -41,6 +42,7 @@ defmodule ElixirConfAfrica.Events do Repo.one(query) end + @spec get_event!(any()) :: any() @doc """ Gets a single event. diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index c0628ec..b4946b3 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -2,6 +2,8 @@ defmodule ElixirConfAfrica.EventsTest do use ElixirConfAfrica.DataCase alias ElixirConfAfrica.Events + alias ElixirConfAfrica.TicketTypes.TicketType + alias ElixirConfAfrica.TicketTypes describe "events" do alias ElixirConfAfrica.Events.Event @@ -22,11 +24,76 @@ defmodule ElixirConfAfrica.EventsTest do assert Events.list_events() == [event] end + test "get_elixir_conf_event /0 returns the elixir conf event" do + valid_attrs = %{ + name: "ElixirConf Africa 2024", + description: "some description", + location: "some location", + event_type: "some event_type", + start_date: ~N[2023-10-05 06:18:00], + end_date: ~N[2023-10-05 06:18:00] + } + + assert {:ok, %Event{} = event} = Events.create_event(valid_attrs) + assert Events.get_elixir_conf_event() == event + end + test "get_event!/1 returns the event with given id" do event = event_fixture() assert Events.get_event!(event.id) == event end + test "get_elixir_conf_event_and_ticket_types/0 returns the elixir conf event with ticket types" do + valid_attrs = %{ + name: "ElixirConf Africa 2024", + description: "some description", + location: "some location", + event_type: "some event_type", + start_date: ~N[2023-10-05 06:18:00], + end_date: ~N[2023-10-05 06:18:00] + } + + assert {:ok, %Event{} = event} = Events.create_event(valid_attrs) + assert Events.get_elixir_conf_event() == event + + ticket_type_attr = %{ + event_id: event.id, + name: "some name", + description: "some description", + price: "120.5", + number: "357" + } + + assert {:ok, %TicketType{} = ticket_type} = TicketTypes.create_ticket_type(ticket_type_attr) + assert Events.get_elixir_conf_event_and_ticket_types().ticket_types == [ticket_type] + end + + + test "get_all_available_tickets/0 returns the number of available tickets" do + valid_attrs = %{ + name: "ElixirConf Africa 2024", + description: "some description", + location: "some location", + event_type: "some event_type", + start_date: ~N[2023-10-05 06:18:00], + end_date: ~N[2023-10-05 06:18:00] + } + + assert {:ok, %Event{} = event} = Events.create_event(valid_attrs) + assert Events.get_elixir_conf_event() == event + + ticket_type_attr = %{ + event_id: event.id, + name: "some name", + description: "some description", + price: "120.5", + number: "357" + } + + assert {:ok, %TicketType{} = ticket_type} = TicketTypes.create_ticket_type(ticket_type_attr) + assert Events.get_all_available_tickets() == 357 + end + test "create_event/1 with valid data creates a event" do valid_attrs = %{ name: "some name", From aced2030c87815ec306847260309618c283591f6 Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Thu, 26 Oct 2023 15:41:09 +0300 Subject: [PATCH 11/26] added formatting to files --- test/elixir_conf_africa/events_test.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index b4946b3..a27fb61 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -68,7 +68,6 @@ defmodule ElixirConfAfrica.EventsTest do assert Events.get_elixir_conf_event_and_ticket_types().ticket_types == [ticket_type] end - test "get_all_available_tickets/0 returns the number of available tickets" do valid_attrs = %{ name: "ElixirConf Africa 2024", From 528819651d1db8fc0897c1666e7579e34c6c20c3 Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Mon, 30 Oct 2023 07:22:02 +0300 Subject: [PATCH 12/26] Used test libraries --- test/elixir_conf_africa/events_test.exs | 58 +++--------------------- test/support/fixtures/events_fixtures.ex | 43 ++++++++++++++++++ 2 files changed, 50 insertions(+), 51 deletions(-) diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index a27fb61..f79018f 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -25,16 +25,8 @@ defmodule ElixirConfAfrica.EventsTest do end test "get_elixir_conf_event /0 returns the elixir conf event" do - valid_attrs = %{ - name: "ElixirConf Africa 2024", - description: "some description", - location: "some location", - event_type: "some event_type", - start_date: ~N[2023-10-05 06:18:00], - end_date: ~N[2023-10-05 06:18:00] - } + event = elixir_conf_event_fixture() - assert {:ok, %Event{} = event} = Events.create_event(valid_attrs) assert Events.get_elixir_conf_event() == event end @@ -44,52 +36,16 @@ defmodule ElixirConfAfrica.EventsTest do end test "get_elixir_conf_event_and_ticket_types/0 returns the elixir conf event with ticket types" do - valid_attrs = %{ - name: "ElixirConf Africa 2024", - description: "some description", - location: "some location", - event_type: "some event_type", - start_date: ~N[2023-10-05 06:18:00], - end_date: ~N[2023-10-05 06:18:00] - } + event_with_ticket_types = elixir_conf_event_with_tickets_fixture() + assert Events.get_elixir_conf_event() == hd(event_with_ticket_types) - assert {:ok, %Event{} = event} = Events.create_event(valid_attrs) - assert Events.get_elixir_conf_event() == event - - ticket_type_attr = %{ - event_id: event.id, - name: "some name", - description: "some description", - price: "120.5", - number: "357" - } - - assert {:ok, %TicketType{} = ticket_type} = TicketTypes.create_ticket_type(ticket_type_attr) - assert Events.get_elixir_conf_event_and_ticket_types().ticket_types == [ticket_type] + assert Events.get_elixir_conf_event_and_ticket_types().ticket_types != [ + tl(event_with_ticket_types) + ] end test "get_all_available_tickets/0 returns the number of available tickets" do - valid_attrs = %{ - name: "ElixirConf Africa 2024", - description: "some description", - location: "some location", - event_type: "some event_type", - start_date: ~N[2023-10-05 06:18:00], - end_date: ~N[2023-10-05 06:18:00] - } - - assert {:ok, %Event{} = event} = Events.create_event(valid_attrs) - assert Events.get_elixir_conf_event() == event - - ticket_type_attr = %{ - event_id: event.id, - name: "some name", - description: "some description", - price: "120.5", - number: "357" - } - - assert {:ok, %TicketType{} = ticket_type} = TicketTypes.create_ticket_type(ticket_type_attr) + event_with_ticket_types = elixir_conf_event_with_tickets_fixture() assert Events.get_all_available_tickets() == 357 end diff --git a/test/support/fixtures/events_fixtures.ex b/test/support/fixtures/events_fixtures.ex index c81e2eb..6fc9b53 100644 --- a/test/support/fixtures/events_fixtures.ex +++ b/test/support/fixtures/events_fixtures.ex @@ -22,4 +22,47 @@ defmodule ElixirConfAfrica.EventsFixtures do event end + + def elixir_conf_event_fixture(attrs \\ %{}) do + {:ok, event} = + attrs + |> Enum.into(%{ + name: "ElixirConf Africa 2024", + description: "some description", + location: "some location", + event_type: "some event_type", + start_date: ~N[2023-10-05 06:18:00], + end_date: ~N[2023-10-05 06:18:00] + }) + |> ElixirConfAfrica.Events.create_event() + + event + end + + def elixir_conf_event_with_tickets_fixture(attrs \\ %{}) do + {:ok, event} = + attrs + |> Enum.into(%{ + name: "ElixirConf Africa 2024", + description: "some description", + location: "some location", + event_type: "some event_type", + start_date: ~N[2023-10-05 06:18:00], + end_date: ~N[2023-10-05 06:18:00] + }) + |> ElixirConfAfrica.Events.create_event() + + {:ok, ticket_type} = + attrs + |> Enum.into(%{ + event_id: event.id, + name: "some name", + description: "some description", + price: "120.5", + number: "357" + }) + |> ElixirConfAfrica.TicketTypes.create_ticket_type() + + [event, ticket_type] + end end From e04dd7c5add338d57842dc7099ec07e6d41ecf9f Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Mon, 30 Oct 2023 07:24:52 +0300 Subject: [PATCH 13/26] Fixed spec error --- lib/elixir_conf_africa/events.ex | 2 +- test/elixir_conf_africa/events_test.exs | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/elixir_conf_africa/events.ex b/lib/elixir_conf_africa/events.ex index 05d8b7a..731e1a1 100644 --- a/lib/elixir_conf_africa/events.ex +++ b/lib/elixir_conf_africa/events.ex @@ -27,7 +27,7 @@ defmodule ElixirConfAfrica.Events do |> Repo.preload(:ticket_types) end - @spec get_elixir_conf_event() :: any() + @spec get_elixir_conf_event() :: nil | Event.t() def get_elixir_conf_event do Repo.get_by(Event, name: "ElixirConf Africa 2024") end diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index f79018f..ef1cb79 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -2,8 +2,6 @@ defmodule ElixirConfAfrica.EventsTest do use ElixirConfAfrica.DataCase alias ElixirConfAfrica.Events - alias ElixirConfAfrica.TicketTypes.TicketType - alias ElixirConfAfrica.TicketTypes describe "events" do alias ElixirConfAfrica.Events.Event From 951f074a6705418108888742f1403424af6fe769 Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Mon, 30 Oct 2023 07:35:44 +0300 Subject: [PATCH 14/26] Fixed get elixir conf function --- lib/elixir_conf_africa/events.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/elixir_conf_africa/events.ex b/lib/elixir_conf_africa/events.ex index 731e1a1..05d8b7a 100644 --- a/lib/elixir_conf_africa/events.ex +++ b/lib/elixir_conf_africa/events.ex @@ -27,7 +27,7 @@ defmodule ElixirConfAfrica.Events do |> Repo.preload(:ticket_types) end - @spec get_elixir_conf_event() :: nil | Event.t() + @spec get_elixir_conf_event() :: any() def get_elixir_conf_event do Repo.get_by(Event, name: "ElixirConf Africa 2024") end From a5032a4d97b5263cf423232c76fab6150abebbd5 Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Mon, 30 Oct 2023 19:37:48 +0300 Subject: [PATCH 15/26] Added factories --- test/elixir_conf_africa/events_test.exs | 27 +++++++++++------ test/support/factory.ex | 40 +++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 9 deletions(-) create mode 100644 test/support/factory.ex diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index ef1cb79..58cb47a 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -8,6 +8,8 @@ defmodule ElixirConfAfrica.EventsTest do import ElixirConfAfrica.EventsFixtures + import ElixirConfAfrica.Factory + @invalid_attrs %{ name: nil, description: nil, @@ -23,9 +25,10 @@ defmodule ElixirConfAfrica.EventsTest do end test "get_elixir_conf_event /0 returns the elixir conf event" do - event = elixir_conf_event_fixture() + event = + insert!(:elixir_conf_event) - assert Events.get_elixir_conf_event() == event + assert Events.get_elixir_conf_event().name == event.name end test "get_event!/1 returns the event with given id" do @@ -34,17 +37,23 @@ defmodule ElixirConfAfrica.EventsTest do end test "get_elixir_conf_event_and_ticket_types/0 returns the elixir conf event with ticket types" do - event_with_ticket_types = elixir_conf_event_with_tickets_fixture() - assert Events.get_elixir_conf_event() == hd(event_with_ticket_types) + event = + insert!(:elixir_conf_event) + + ticket_type = + insert!(:elixir_conf_ticket_type, event_id: event.id) - assert Events.get_elixir_conf_event_and_ticket_types().ticket_types != [ - tl(event_with_ticket_types) - ] + assert Events.get_elixir_conf_event_and_ticket_types().ticket_types != [ ] end test "get_all_available_tickets/0 returns the number of available tickets" do - event_with_ticket_types = elixir_conf_event_with_tickets_fixture() - assert Events.get_all_available_tickets() == 357 + event = + insert!(:elixir_conf_event) + + ticket_type = + insert!(:elixir_conf_ticket_type, event_id: event.id) + + assert Events.get_all_available_tickets() == ticket_type.number end test "create_event/1 with valid data creates a event" do diff --git a/test/support/factory.ex b/test/support/factory.ex new file mode 100644 index 0000000..62a35df --- /dev/null +++ b/test/support/factory.ex @@ -0,0 +1,40 @@ +defmodule ElixirConfAfrica.Factory do + alias ElixirConfAfrica.Repo + + def build(:elixir_conf_event) do + %ElixirConfAfrica.Events.Event{ + id: 1, + name: "ElixirConf Africa 2024", + description: "some description", + location: "some location", + event_type: "some event_type", + start_date: ~N[2023-10-05 06:18:00], + end_date: ~N[2023-10-05 06:18:00] + } + end + + def build(:elixir_conf_ticket_type) do + %ElixirConfAfrica.TicketTypes.TicketType{ + name: "some name", + description: "some description", + price: 120.5, + number: 357 + } + end + + def build(factory_name, attributes) do + factory_name |> build() |> struct!(attributes) + end + + def insert!(factory_name, attributes \\ []) do + factory_name |> build(attributes) |> Repo.insert!() + end + + # def build(factory_name, attributes) do + # factory_name |> build() |> struct!(attributes) + # end + + # def insert!(factory_name, attributes \\ []) do + # factory_name |> build(attributes) |> Repo.insert!() + # end +end From 15531cda498d248336120392ecee7d9a9747a0c1 Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Mon, 30 Oct 2023 19:39:31 +0300 Subject: [PATCH 16/26] Added factories --- test/elixir_conf_africa/events_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index 58cb47a..6387ae6 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -43,7 +43,7 @@ defmodule ElixirConfAfrica.EventsTest do ticket_type = insert!(:elixir_conf_ticket_type, event_id: event.id) - assert Events.get_elixir_conf_event_and_ticket_types().ticket_types != [ ] + assert Events.get_elixir_conf_event_and_ticket_types().ticket_types != [] end test "get_all_available_tickets/0 returns the number of available tickets" do From 497720533fb9c8741884ad0917d07f9d1c3d66bf Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Mon, 30 Oct 2023 19:56:48 +0300 Subject: [PATCH 17/26] Added module doc false --- test/support/factory.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/test/support/factory.ex b/test/support/factory.ex index 62a35df..2d7bc0a 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -1,4 +1,5 @@ defmodule ElixirConfAfrica.Factory do + @moduledoc false alias ElixirConfAfrica.Repo def build(:elixir_conf_event) do From 8d9f09bd2157975fe7371e84c26e6bc990acd13c Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Tue, 31 Oct 2023 18:22:34 +0300 Subject: [PATCH 18/26] Renamed get all available tickets and removed dead code --- lib/elixir_conf_africa/events.ex | 18 +++++++++++++++++- .../live/home_live/index.ex | 2 +- test/elixir_conf_africa/events_test.exs | 4 ++-- test/support/factory.ex | 8 -------- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/lib/elixir_conf_africa/events.ex b/lib/elixir_conf_africa/events.ex index 05d8b7a..64a14ff 100644 --- a/lib/elixir_conf_africa/events.ex +++ b/lib/elixir_conf_africa/events.ex @@ -22,17 +22,33 @@ defmodule ElixirConfAfrica.Events do Repo.all(from e in Event, order_by: [desc: e.id]) end + @doc """ + Returns the elixir conf event together with all its ticket types + + + + """ + def get_elixir_conf_event_and_ticket_types do get_elixir_conf_event() |> Repo.preload(:ticket_types) end + @doc """ + Returns the elixir conf event . + + """ @spec get_elixir_conf_event() :: any() def get_elixir_conf_event do Repo.get_by(Event, name: "ElixirConf Africa 2024") end - def get_all_available_tickets do + @doc """ + Returns the elixir conf event total available tickets got from the summation of quantity of each ticket type for the event + + """ + + def get_number_of_tickets_available_for_elixir_conf_2024 do query = from t in TicketType, join: e in Event, diff --git a/lib/elixir_conf_africa_web/live/home_live/index.ex b/lib/elixir_conf_africa_web/live/home_live/index.ex index 9dfc8d0..2f6756a 100644 --- a/lib/elixir_conf_africa_web/live/home_live/index.ex +++ b/lib/elixir_conf_africa_web/live/home_live/index.ex @@ -4,7 +4,7 @@ defmodule ElixirConfAfricaWeb.HomeLive.Index do def mount(_params, _session, socket) do elixir_conf_africa_event = Events.get_elixir_conf_event_and_ticket_types() - availabe_tickets = Events.get_all_available_tickets() + availabe_tickets = Events.get_number_of_tickets_available_for_elixir_conf_2024() {:ok, socket diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index 6387ae6..9518d26 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -40,7 +40,7 @@ defmodule ElixirConfAfrica.EventsTest do event = insert!(:elixir_conf_event) - ticket_type = + _ticket_type = insert!(:elixir_conf_ticket_type, event_id: event.id) assert Events.get_elixir_conf_event_and_ticket_types().ticket_types != [] @@ -53,7 +53,7 @@ defmodule ElixirConfAfrica.EventsTest do ticket_type = insert!(:elixir_conf_ticket_type, event_id: event.id) - assert Events.get_all_available_tickets() == ticket_type.number + assert Events.get_number_of_tickets_available_for_elixir_conf_2024() == ticket_type.number end test "create_event/1 with valid data creates a event" do diff --git a/test/support/factory.ex b/test/support/factory.ex index 2d7bc0a..64b608a 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -30,12 +30,4 @@ defmodule ElixirConfAfrica.Factory do def insert!(factory_name, attributes \\ []) do factory_name |> build(attributes) |> Repo.insert!() end - - # def build(factory_name, attributes) do - # factory_name |> build() |> struct!(attributes) - # end - - # def insert!(factory_name, attributes \\ []) do - # factory_name |> build(attributes) |> Repo.insert!() - # end end From be7f141ddd9561a4ab860b4f6093741db31593f2 Mon Sep 17 00:00:00 2001 From: okoth Date: Tue, 14 Nov 2023 15:44:08 +0300 Subject: [PATCH 19/26] refactor: tests to accommodate factory make Events.get_number_of_tickets_available/1 more dynamic --- lib/elixir_conf_africa/events.ex | 4 +- .../live/home_live/index.ex | 2 +- test/elixir_conf_africa/events_test.exs | 58 +++++++--------- test/elixir_conf_africa/ticket_types_test.exs | 54 +++++++-------- .../live/event_live_test.exs | 4 +- .../live/ticket_type_live_test.exs | 19 ++---- test/support/fixtures/events_fixtures.ex | 68 ------------------- .../support/fixtures/ticket_types_fixtures.ex | 23 ------- 8 files changed, 59 insertions(+), 173 deletions(-) delete mode 100644 test/support/fixtures/events_fixtures.ex delete mode 100644 test/support/fixtures/ticket_types_fixtures.ex diff --git a/lib/elixir_conf_africa/events.ex b/lib/elixir_conf_africa/events.ex index 64a14ff..b626d40 100644 --- a/lib/elixir_conf_africa/events.ex +++ b/lib/elixir_conf_africa/events.ex @@ -48,11 +48,11 @@ defmodule ElixirConfAfrica.Events do """ - def get_number_of_tickets_available_for_elixir_conf_2024 do + def get_number_of_tickets_available(name) do query = from t in TicketType, join: e in Event, - on: t.event_id == e.id and e.name == "ElixirConf Africa 2024", + on: t.event_id == e.id and e.name == ^name, select: sum(t.number) Repo.one(query) diff --git a/lib/elixir_conf_africa_web/live/home_live/index.ex b/lib/elixir_conf_africa_web/live/home_live/index.ex index 2f6756a..9061db5 100644 --- a/lib/elixir_conf_africa_web/live/home_live/index.ex +++ b/lib/elixir_conf_africa_web/live/home_live/index.ex @@ -4,7 +4,7 @@ defmodule ElixirConfAfricaWeb.HomeLive.Index do def mount(_params, _session, socket) do elixir_conf_africa_event = Events.get_elixir_conf_event_and_ticket_types() - availabe_tickets = Events.get_number_of_tickets_available_for_elixir_conf_2024() + availabe_tickets = Events.get_number_of_tickets_available("ElixirConf Africa 2024") {:ok, socket diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index 9518d26..9119204 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -6,8 +6,6 @@ defmodule ElixirConfAfrica.EventsTest do describe "events" do alias ElixirConfAfrica.Events.Event - import ElixirConfAfrica.EventsFixtures - import ElixirConfAfrica.Factory @invalid_attrs %{ @@ -18,42 +16,41 @@ defmodule ElixirConfAfrica.EventsTest do start_date: nil, end_date: nil } + setup do + event = insert!(:elixir_conf_event) + [event: event] + end - test "list_events/0 returns all events" do - event = event_fixture() + test "list_events/0 returns all events", %{event: event} do assert Events.list_events() == [event] end - test "get_elixir_conf_event /0 returns the elixir conf event" do - event = - insert!(:elixir_conf_event) - - assert Events.get_elixir_conf_event().name == event.name + test "get_elixir_conf_event /0 returns the elixir conf event", %{event: event} do + assert %{name: name} = Events.get_elixir_conf_event() + assert name == event.name end - test "get_event!/1 returns the event with given id" do - event = event_fixture() + test "get_event!/1 returns the event with given id", %{event: event} do assert Events.get_event!(event.id) == event end - test "get_elixir_conf_event_and_ticket_types/0 returns the elixir conf event with ticket types" do - event = - insert!(:elixir_conf_event) + test "get_elixir_conf_event_and_ticket_types/0 returns the elixir conf event with ticket types", + %{event: event} do + ticket_type = insert!(:elixir_conf_ticket_type, event_id: event.id) - _ticket_type = - insert!(:elixir_conf_ticket_type, event_id: event.id) + assert %{ticket_types: [fetched_ticket_type]} = + Events.get_elixir_conf_event_and_ticket_types() - assert Events.get_elixir_conf_event_and_ticket_types().ticket_types != [] + assert fetched_ticket_type.id == ticket_type.id end - test "get_all_available_tickets/0 returns the number of available tickets" do - event = - insert!(:elixir_conf_event) + test "get_all_available_tickets/0 returns the number of available tickets", %{event: event} do + ticket_type = insert!(:elixir_conf_ticket_type, event_id: event.id) + ticket_type1 = insert!(:elixir_conf_ticket_type, event_id: event.id) + totat_number_of_tickets = ticket_type.number + ticket_type1.number - ticket_type = - insert!(:elixir_conf_ticket_type, event_id: event.id) - - assert Events.get_number_of_tickets_available_for_elixir_conf_2024() == ticket_type.number + assert Events.get_number_of_tickets_available("ElixirConf Africa 2024") == + totat_number_of_tickets end test "create_event/1 with valid data creates a event" do @@ -79,9 +76,7 @@ defmodule ElixirConfAfrica.EventsTest do assert {:error, %Ecto.Changeset{}} = Events.create_event(@invalid_attrs) end - test "update_event/2 with valid data updates the event" do - event = event_fixture() - + test "update_event/2 with valid data updates the event", %{event: event} do update_attrs = %{ name: "some updated name", description: "some updated description", @@ -100,20 +95,17 @@ defmodule ElixirConfAfrica.EventsTest do assert event.end_date == ~N[2023-10-06 06:18:00] end - test "update_event/2 with invalid data returns error changeset" do - event = event_fixture() + test "update_event/2 with invalid data returns error changeset", %{event: event} do assert {:error, %Ecto.Changeset{}} = Events.update_event(event, @invalid_attrs) assert event == Events.get_event!(event.id) end - test "delete_event/1 deletes the event" do - event = event_fixture() + test "delete_event/1 deletes the event", %{event: event} do assert {:ok, %Event{}} = Events.delete_event(event) assert_raise Ecto.NoResultsError, fn -> Events.get_event!(event.id) end end - test "change_event/1 returns a event changeset" do - event = event_fixture() + test "change_event/1 returns a event changeset", %{event: event} do assert %Ecto.Changeset{} = Events.change_event(event) end end diff --git a/test/elixir_conf_africa/ticket_types_test.exs b/test/elixir_conf_africa/ticket_types_test.exs index a81e992..dc3f005 100644 --- a/test/elixir_conf_africa/ticket_types_test.exs +++ b/test/elixir_conf_africa/ticket_types_test.exs @@ -6,27 +6,25 @@ defmodule ElixirConfAfrica.TicketTypesTest do describe "ticket_types" do alias ElixirConfAfrica.TicketTypes.TicketType - import ElixirConfAfrica.TicketTypesFixtures - import ElixirConfAfrica.EventsFixtures - + import ElixirConfAfrica.Factory @invalid_attrs %{name: nil, description: nil, price: nil, number: nil} - - test "list_ticket_types/0 returns all ticket_types" do - event = event_fixture() - ticket_type = ticket_type_fixture(%{event_id: event.id}) - assert TicketTypes.list_ticket_types() == [ticket_type] + setup do + event = insert!(:elixir_conf_event) + ticket_type = insert!(:elixir_conf_ticket_type, event_id: event.id) + %{ticket_type: ticket_type, event: event} end - test "get_ticket_type!/1 returns the ticket_type with given id" do - event = event_fixture() - ticket_type = ticket_type_fixture(%{event_id: event.id}) - - assert TicketTypes.get_ticket_type!(ticket_type.id) == ticket_type + test "list_ticket_types/0 returns all ticket_types", %{ticket_type: ticket_type} do + assert [fetched_ticket_type] = TicketTypes.list_ticket_types() + assert ticket_type.id == fetched_ticket_type.id end - test "create_ticket_type/1 with valid data creates a ticket_type" do - event = event_fixture() + test "get_ticket_type!/1 returns the ticket_type with given id", %{ticket_type: ticket_type} do + assert fetched_ticket_type = TicketTypes.get_ticket_type!(ticket_type.id) + assert ticket_type.id == fetched_ticket_type.id + end + test "create_ticket_type/1 with valid data creates a ticket_type", %{event: event} do valid_attrs = %{ event_id: event.id, name: "some name", @@ -45,10 +43,9 @@ defmodule ElixirConfAfrica.TicketTypesTest do assert {:error, %Ecto.Changeset{}} = TicketTypes.create_ticket_type(@invalid_attrs) end - test "update_ticket_type/2 with valid data updates the ticket_type" do - event = event_fixture() - ticket_type = ticket_type_fixture(%{event_id: event.id}) - + test "update_ticket_type/2 with valid data updates the ticket_type", %{ + ticket_type: ticket_type + } do update_attrs = %{ name: "some updated name", description: "some updated description", @@ -65,27 +62,22 @@ defmodule ElixirConfAfrica.TicketTypesTest do assert ticket_type.number == 579 end - test "update_ticket_type/2 with invalid data returns error changeset" do - event = event_fixture() - ticket_type = ticket_type_fixture(%{event_id: event.id}) - + test "update_ticket_type/2 with invalid data returns error changeset", %{ + ticket_type: ticket_type + } do assert {:error, %Ecto.Changeset{}} = TicketTypes.update_ticket_type(ticket_type, @invalid_attrs) - assert ticket_type == TicketTypes.get_ticket_type!(ticket_type.id) + assert fetched_ticket_type = TicketTypes.get_ticket_type!(ticket_type.id) + assert ticket_type.updated_at == fetched_ticket_type.updated_at end - test "delete_ticket_type/1 deletes the ticket_type" do - event = event_fixture() - ticket_type = ticket_type_fixture(%{event_id: event.id}) - + test "delete_ticket_type/1 deletes the ticket_type", %{ticket_type: ticket_type} do assert {:ok, %TicketType{}} = TicketTypes.delete_ticket_type(ticket_type) assert_raise Ecto.NoResultsError, fn -> TicketTypes.get_ticket_type!(ticket_type.id) end end - test "change_ticket_type/1 returns a ticket_type changeset" do - event = event_fixture() - ticket_type = ticket_type_fixture(%{event_id: event.id}) + test "change_ticket_type/1 returns a ticket_type changeset", %{ticket_type: ticket_type} do assert %Ecto.Changeset{} = TicketTypes.change_ticket_type(ticket_type) end end diff --git a/test/elixir_conf_africa_web/live/event_live_test.exs b/test/elixir_conf_africa_web/live/event_live_test.exs index b71c146..20782b7 100644 --- a/test/elixir_conf_africa_web/live/event_live_test.exs +++ b/test/elixir_conf_africa_web/live/event_live_test.exs @@ -2,7 +2,7 @@ defmodule ElixirConfAfricaWeb.EventLiveTest do use ElixirConfAfricaWeb.ConnCase import Phoenix.LiveViewTest - import ElixirConfAfrica.EventsFixtures + import ElixirConfAfrica.Factory @create_attrs %{ name: "some name", @@ -30,7 +30,7 @@ defmodule ElixirConfAfricaWeb.EventLiveTest do } defp create_event(_) do - event = event_fixture() + event = insert!(:elixir_conf_event) %{event: event} end diff --git a/test/elixir_conf_africa_web/live/ticket_type_live_test.exs b/test/elixir_conf_africa_web/live/ticket_type_live_test.exs index 82d1bc0..ee47ce3 100644 --- a/test/elixir_conf_africa_web/live/ticket_type_live_test.exs +++ b/test/elixir_conf_africa_web/live/ticket_type_live_test.exs @@ -2,8 +2,7 @@ defmodule ElixirConfAfricaWeb.TicketTypeLiveTest do use ElixirConfAfricaWeb.ConnCase import Phoenix.LiveViewTest - import ElixirConfAfrica.TicketTypesFixtures - import ElixirConfAfrica.EventsFixtures + import ElixirConfAfrica.Factory @create_attrs %{ name: "some name", @@ -19,15 +18,13 @@ defmodule ElixirConfAfricaWeb.TicketTypeLiveTest do } @invalid_attrs %{name: nil, description: nil, price: nil, number: nil} - defp create_ticket_type(_) do - event = event_fixture() - ticket_type = ticket_type_fixture(event_id: event.id) - %{ticket_type: ticket_type} + setup do + event = insert!(:elixir_conf_event) + ticket_type = insert!(:elixir_conf_ticket_type, event_id: event.id) + %{ticket_type: ticket_type, event: event} end describe "Index" do - setup [:create_ticket_type] - test "lists all ticket_types", %{conn: conn, ticket_type: ticket_type} do {:ok, _index_live, html} = live(conn, ~p"/ticket_types") @@ -35,9 +32,7 @@ defmodule ElixirConfAfricaWeb.TicketTypeLiveTest do assert html =~ ticket_type.name end - test "saves new ticket_type", %{conn: conn} do - event = event_fixture() - + test "saves new ticket_type", %{conn: conn, event: event} do {:ok, index_live, _html} = live(conn, ~p"/ticket_types") assert index_live |> element("a", "New Ticket type") |> render_click() =~ @@ -97,8 +92,6 @@ defmodule ElixirConfAfricaWeb.TicketTypeLiveTest do end describe "Show" do - setup [:create_ticket_type] - test "displays ticket_type", %{conn: conn, ticket_type: ticket_type} do {:ok, _show_live, html} = live(conn, ~p"/ticket_types/#{ticket_type}") diff --git a/test/support/fixtures/events_fixtures.ex b/test/support/fixtures/events_fixtures.ex deleted file mode 100644 index 6fc9b53..0000000 --- a/test/support/fixtures/events_fixtures.ex +++ /dev/null @@ -1,68 +0,0 @@ -defmodule ElixirConfAfrica.EventsFixtures do - @moduledoc """ - This module defines test helpers for creating - entities via the `ElixirConfAfrica.Events` context. - """ - - @doc """ - Generate a event. - """ - def event_fixture(attrs \\ %{}) do - {:ok, event} = - attrs - |> Enum.into(%{ - name: "some name", - description: "some description", - location: "some location", - event_type: "some event_type", - start_date: ~N[2023-10-05 06:18:00], - end_date: ~N[2023-10-05 06:18:00] - }) - |> ElixirConfAfrica.Events.create_event() - - event - end - - def elixir_conf_event_fixture(attrs \\ %{}) do - {:ok, event} = - attrs - |> Enum.into(%{ - name: "ElixirConf Africa 2024", - description: "some description", - location: "some location", - event_type: "some event_type", - start_date: ~N[2023-10-05 06:18:00], - end_date: ~N[2023-10-05 06:18:00] - }) - |> ElixirConfAfrica.Events.create_event() - - event - end - - def elixir_conf_event_with_tickets_fixture(attrs \\ %{}) do - {:ok, event} = - attrs - |> Enum.into(%{ - name: "ElixirConf Africa 2024", - description: "some description", - location: "some location", - event_type: "some event_type", - start_date: ~N[2023-10-05 06:18:00], - end_date: ~N[2023-10-05 06:18:00] - }) - |> ElixirConfAfrica.Events.create_event() - - {:ok, ticket_type} = - attrs - |> Enum.into(%{ - event_id: event.id, - name: "some name", - description: "some description", - price: "120.5", - number: "357" - }) - |> ElixirConfAfrica.TicketTypes.create_ticket_type() - - [event, ticket_type] - end -end diff --git a/test/support/fixtures/ticket_types_fixtures.ex b/test/support/fixtures/ticket_types_fixtures.ex deleted file mode 100644 index 69105fb..0000000 --- a/test/support/fixtures/ticket_types_fixtures.ex +++ /dev/null @@ -1,23 +0,0 @@ -defmodule ElixirConfAfrica.TicketTypesFixtures do - @moduledoc """ - This module defines test helpers for creating - entities via the `ElixirConfAfrica.TicketTypes` context. - """ - - @doc """ - Generate a ticket_type. - """ - def ticket_type_fixture(attrs \\ %{}) do - {:ok, ticket_type} = - attrs - |> Enum.into(%{ - name: "some name", - description: "some description", - price: "120.5", - number: "357" - }) - |> ElixirConfAfrica.TicketTypes.create_ticket_type() - - ticket_type - end -end From 1c1b516ae6d31b935c93650816ca736b9bdd4635 Mon Sep 17 00:00:00 2001 From: okoth Date: Tue, 14 Nov 2023 15:53:59 +0300 Subject: [PATCH 20/26] fix lints --- test/elixir_conf_africa_web/live/event_live_test.exs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/test/elixir_conf_africa_web/live/event_live_test.exs b/test/elixir_conf_africa_web/live/event_live_test.exs index 20782b7..23da999 100644 --- a/test/elixir_conf_africa_web/live/event_live_test.exs +++ b/test/elixir_conf_africa_web/live/event_live_test.exs @@ -29,14 +29,12 @@ defmodule ElixirConfAfricaWeb.EventLiveTest do end_date: nil } - defp create_event(_) do + setup do event = insert!(:elixir_conf_event) %{event: event} end describe "Index" do - setup [:create_event] - test "lists all events", %{conn: conn, event: event} do {:ok, _index_live, html} = live(conn, ~p"/events") @@ -99,8 +97,6 @@ defmodule ElixirConfAfricaWeb.EventLiveTest do end describe "Show" do - setup [:create_event] - test "displays event", %{conn: conn, event: event} do {:ok, _show_live, html} = live(conn, ~p"/events/#{event}") From 6daa68e3dbdc8a266a8783c1eb0159d43e91d1cc Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Tue, 14 Nov 2023 18:34:11 +0300 Subject: [PATCH 21/26] fixed linters errors --- .../live/home_live/index.ex | 3 +- test/elixir_conf_africa/events_test.exs | 179 ++++++++---------- 2 files changed, 77 insertions(+), 105 deletions(-) diff --git a/lib/elixir_conf_africa_web/live/home_live/index.ex b/lib/elixir_conf_africa_web/live/home_live/index.ex index 3064d59..3da9a32 100644 --- a/lib/elixir_conf_africa_web/live/home_live/index.ex +++ b/lib/elixir_conf_africa_web/live/home_live/index.ex @@ -4,8 +4,7 @@ defmodule ElixirConfAfricaWeb.HomeLive.Index do def mount(_params, _session, socket) do elixir_conf_africa_event = Events.get_elixir_conf_event_and_ticket_types() - availabe_tickets = Events.get_number_of_tickets_available("ElixirConf Africa 2024") - + availabe_tickets = Events.get_all_available_tickets("ElixirConf Africa 2024") {:ok, socket diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index 3fd12b0..475b33e 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -4,11 +4,8 @@ defmodule ElixirConfAfrica.EventsTest do alias ElixirConfAfrica.Events describe "events" do - alias ElixirConfAfrica.Events.Event - - import ElixirConfAfrica.Factory - import ElixirConfAfrica.Factory + alias ElixirConfAfrica.Events.Event @invalid_attrs %{ name: nil, @@ -31,104 +28,80 @@ defmodule ElixirConfAfrica.EventsTest do assert Events.get_event!(event.id) == event end - # test "get_elixir_conf_event_and_ticket_types/0 returns the elixir conf event with ticket types" do - # event = - # insert!(:elixir_conf_event) - - # _ticket_type = - # insert!(:elixir_conf_ticket_type, event_id: event.id) - - # assert Events.get_elixir_conf_event_and_ticket_types().ticket_types != [] - # end - - # test "get_all_available_tickets/0 returns the number of available tickets" do - # event = - # insert!(:elixir_conf_event) - - # ticket_type = - # insert!(:elixir_conf_ticket_type, event_id: event.id) - - # assert Events.get_number_of_tickets_available_for_elixir_conf_2024() == ticket_type.number - - # # test "get_elixir_conf_event /0 returns the elixir conf event", %{event: event} do - # # assert %{name: name} = Events.get_elixir_conf_event() - # # assert name == event.name - # # end - - # test "get_elixir_conf_event_and_ticket_types/0 returns the elixir conf event with ticket types", - # %{event: event} do - # ticket_type = insert!(:elixir_conf_ticket_type, event_id: event.id) - - # assert %{ticket_types: [fetched_ticket_type]} = - # Events.get_elixir_conf_event_and_ticket_types() - - # assert fetched_ticket_type.id == ticket_type.id - # end - - # test "get_all_available_tickets/0 returns the number of available tickets", %{event: event} do - # ticket_type = insert!(:elixir_conf_ticket_type, event_id: event.id) - # ticket_type1 = insert!(:elixir_conf_ticket_type, event_id: event.id) - # totat_number_of_tickets = ticket_type.number + ticket_type1.number - - # assert Events.get_number_of_tickets_available("ElixirConf Africa 2024") == - # totat_number_of_tickets - # end - - # test "create_event/1 with valid data creates a event" do - # valid_attrs = %{ - # name: "some name", - # description: "some description", - # location: "some location", - # event_type: "some event_type", - # start_date: ~N[2023-10-05 06:18:00], - # end_date: ~N[2023-10-05 06:18:00] - # } - - # assert {:ok, %Event{} = event} = Events.create_event(valid_attrs) - # assert event.name == "some name" - # assert event.description == "some description" - # assert event.location == "some location" - # assert event.event_type == "some event_type" - # assert event.start_date == ~N[2023-10-05 06:18:00] - # assert event.end_date == ~N[2023-10-05 06:18:00] - # end - - # test "create_event/1 with invalid data returns error changeset" do - # assert {:error, %Ecto.Changeset{}} = Events.create_event(@invalid_attrs) - # end - - # test "update_event/2 with valid data updates the event", %{event: event} do - # update_attrs = %{ - # name: "some updated name", - # description: "some updated description", - # location: "some updated location", - # event_type: "some updated event_type", - # start_date: ~N[2023-10-06 06:18:00], - # end_date: ~N[2023-10-06 06:18:00] - # } - - # assert {:ok, %Event{} = event} = Events.update_event(event, update_attrs) - # assert event.name == "some updated name" - # assert event.description == "some updated description" - # assert event.location == "some updated location" - # assert event.event_type == "some updated event_type" - # assert event.start_date == ~N[2023-10-06 06:18:00] - # assert event.end_date == ~N[2023-10-06 06:18:00] - # end - - # test "update_event/2 with invalid data returns error changeset", %{event: event} do - # assert {:error, %Ecto.Changeset{}} = Events.update_event(event, @invalid_attrs) - # assert event == Events.get_event!(event.id) - # end - - # test "delete_event/1 deletes the event", %{event: event} do - # assert {:ok, %Event{}} = Events.delete_event(event) - # assert_raise Ecto.NoResultsError, fn -> Events.get_event!(event.id) end - # end - - # test "change_event/1 returns a event changeset", %{event: event} do - # assert %Ecto.Changeset{} = Events.change_event(event) - # end - # end + test "get_elixir_conf_event_and_ticket_types/0 returns the elixir conf event with ticket types", + %{event: event} do + _ticket_type = + insert!(:elixir_conf_ticket_type, event_id: event.id) + + assert Events.get_elixir_conf_event_and_ticket_types().ticket_types != [] + end + + test "get_all_available_tickets/0 returns the number of available tickets", %{event: event} do + ticket_type = + insert!(:elixir_conf_ticket_type, event_id: event.id) + + assert Events.get_all_available_tickets(event.name) == ticket_type.number + end + + test "get_elixir_conf_event /0 returns the elixir conf event", %{event: event} do + assert %{name: name} = Events.get_elixir_conf_event() + assert name == event.name + end + + test "create_event/1 with valid data creates a event" do + valid_attrs = %{ + name: "some name", + description: "some description", + location: "some location", + event_type: "some event_type", + start_date: ~N[2023-10-05 06:18:00], + end_date: ~N[2023-10-05 06:18:00] + } + + assert {:ok, %Event{} = event} = Events.create_event(valid_attrs) + assert event.name == "some name" + assert event.description == "some description" + assert event.location == "some location" + assert event.event_type == "some event_type" + assert event.start_date == ~N[2023-10-05 06:18:00] + assert event.end_date == ~N[2023-10-05 06:18:00] + end + + test "create_event/1 with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Events.create_event(@invalid_attrs) + end + + test "update_event/2 with valid data updates the event", %{event: event} do + update_attrs = %{ + name: "some updated name", + description: "some updated description", + location: "some updated location", + event_type: "some updated event_type", + start_date: ~N[2023-10-06 06:18:00], + end_date: ~N[2023-10-06 06:18:00] + } + + assert {:ok, %Event{} = event} = Events.update_event(event, update_attrs) + assert event.name == "some updated name" + assert event.description == "some updated description" + assert event.location == "some updated location" + assert event.event_type == "some updated event_type" + assert event.start_date == ~N[2023-10-06 06:18:00] + assert event.end_date == ~N[2023-10-06 06:18:00] + end + + test "update_event/2 with invalid data returns error changeset", %{event: event} do + assert {:error, %Ecto.Changeset{}} = Events.update_event(event, @invalid_attrs) + assert event == Events.get_event!(event.id) + end + + test "delete_event/1 deletes the event", %{event: event} do + assert {:ok, %Event{}} = Events.delete_event(event) + assert_raise Ecto.NoResultsError, fn -> Events.get_event!(event.id) end + end + + test "change_event/1 returns a event changeset", %{event: event} do + assert %Ecto.Changeset{} = Events.change_event(event) + end end end From 4dfbf7c5d06a974e495e7869a03ea0cc13b7f89f Mon Sep 17 00:00:00 2001 From: MICHAELMUNAVU83 Date: Tue, 14 Nov 2023 18:46:13 +0300 Subject: [PATCH 22/26] Removed static id of 1 from event map --- test/support/factory.ex | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/test/support/factory.ex b/test/support/factory.ex index 64b608a..0a65872 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -4,11 +4,10 @@ defmodule ElixirConfAfrica.Factory do def build(:elixir_conf_event) do %ElixirConfAfrica.Events.Event{ - id: 1, name: "ElixirConf Africa 2024", - description: "some description", - location: "some location", - event_type: "some event_type", + description: "description", + location: "location", + event_type: "event_type", start_date: ~N[2023-10-05 06:18:00], end_date: ~N[2023-10-05 06:18:00] } From eb4ea01b2060fda753ef96fae1923d6ce4f12403 Mon Sep 17 00:00:00 2001 From: okoth Date: Tue, 14 Nov 2023 23:21:53 +0300 Subject: [PATCH 23/26] refactor: remove unnecessary funcs refacor other code --- lib/elixir_conf_africa/events.ex | 30 ++++--------------- .../live/home_live/index.ex | 13 +++++--- test/elixir_conf_africa/events_test.exs | 18 ++++------- test/elixir_conf_africa/ticket_types_test.exs | 6 ++-- test/support/factory.ex | 2 +- 5 files changed, 23 insertions(+), 46 deletions(-) diff --git a/lib/elixir_conf_africa/events.ex b/lib/elixir_conf_africa/events.ex index 513cacc..9d6e24f 100644 --- a/lib/elixir_conf_africa/events.ex +++ b/lib/elixir_conf_africa/events.ex @@ -7,7 +7,6 @@ defmodule ElixirConfAfrica.Events do alias ElixirConfAfrica.Repo alias ElixirConfAfrica.Events.Event - alias ElixirConfAfrica.TicketTypes.TicketType @doc """ Returns the list of events. @@ -24,31 +23,14 @@ defmodule ElixirConfAfrica.Events do @doc """ Returns the elixir conf event together with all its ticket types - - - """ - - def get_elixir_conf_event_and_ticket_types do - get_elixir_conf_event() - |> Repo.preload(:ticket_types) - end - - @doc """ - Returns the elixir conf event . - - """ - @spec get_elixir_conf_event() :: any() - def get_elixir_conf_event do - Repo.get_by(Event, name: "ElixirConf Africa 2024") - end - - def get_all_available_tickets(name) do + @spec get_event_with_ticket_types_by_event_name(String.t()) :: Event.t() + def get_event_with_ticket_types_by_event_name(name) do query = - from t in TicketType, - join: e in Event, - on: t.event_id == e.id and e.name == ^name, - select: sum(t.number) + from event in Event, + join: ticket_types in assoc(event, :ticket_types), + where: event.name == ^name, + preload: [ticket_types: ticket_types] Repo.one(query) end diff --git a/lib/elixir_conf_africa_web/live/home_live/index.ex b/lib/elixir_conf_africa_web/live/home_live/index.ex index 3da9a32..eda7b34 100644 --- a/lib/elixir_conf_africa_web/live/home_live/index.ex +++ b/lib/elixir_conf_africa_web/live/home_live/index.ex @@ -3,12 +3,17 @@ defmodule ElixirConfAfricaWeb.HomeLive.Index do alias ElixirConfAfrica.Events def mount(_params, _session, socket) do - elixir_conf_africa_event = Events.get_elixir_conf_event_and_ticket_types() - availabe_tickets = Events.get_all_available_tickets("ElixirConf Africa 2024") + # these value are more static and we should find away of display this data to home page + event = + Events.get_event_with_ticket_types_by_event_name("ElixirConf Africa #{get_current_year()}") {:ok, socket - |> assign(:available_tickets, availabe_tickets) - |> assign(:event, elixir_conf_africa_event)} + |> assign(:event, event)} + end + + defp get_current_year do + %{year: year} = DateTime.utc_now() + year end end diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index 475b33e..e74e6dd 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -28,24 +28,16 @@ defmodule ElixirConfAfrica.EventsTest do assert Events.get_event!(event.id) == event end - test "get_elixir_conf_event_and_ticket_types/0 returns the elixir conf event with ticket types", + test "get_event_with_ticket_types_by_event_name/1 returns the elixir conf event with ticket types", %{event: event} do - _ticket_type = - insert!(:elixir_conf_ticket_type, event_id: event.id) - - assert Events.get_elixir_conf_event_and_ticket_types().ticket_types != [] - end - - test "get_all_available_tickets/0 returns the number of available tickets", %{event: event} do ticket_type = insert!(:elixir_conf_ticket_type, event_id: event.id) - assert Events.get_all_available_tickets(event.name) == ticket_type.number - end + event_with_ticket_types = ElixirConfAfrica.Repo.preload(event, :ticket_types) + assert event = Events.get_event_with_ticket_types_by_event_name(event.name) - test "get_elixir_conf_event /0 returns the elixir conf event", %{event: event} do - assert %{name: name} = Events.get_elixir_conf_event() - assert name == event.name + assert event_with_ticket_types.ticket_types == [ticket_type] + assert event == event_with_ticket_types end test "create_event/1 with valid data creates a event" do diff --git a/test/elixir_conf_africa/ticket_types_test.exs b/test/elixir_conf_africa/ticket_types_test.exs index dc3f005..70dee53 100644 --- a/test/elixir_conf_africa/ticket_types_test.exs +++ b/test/elixir_conf_africa/ticket_types_test.exs @@ -15,13 +15,11 @@ defmodule ElixirConfAfrica.TicketTypesTest do end test "list_ticket_types/0 returns all ticket_types", %{ticket_type: ticket_type} do - assert [fetched_ticket_type] = TicketTypes.list_ticket_types() - assert ticket_type.id == fetched_ticket_type.id + assert [^ticket_type] = TicketTypes.list_ticket_types() end test "get_ticket_type!/1 returns the ticket_type with given id", %{ticket_type: ticket_type} do - assert fetched_ticket_type = TicketTypes.get_ticket_type!(ticket_type.id) - assert ticket_type.id == fetched_ticket_type.id + assert ^ticket_type = TicketTypes.get_ticket_type!(ticket_type.id) end test "create_ticket_type/1 with valid data creates a ticket_type", %{event: event} do diff --git a/test/support/factory.ex b/test/support/factory.ex index 0a65872..8fc7e86 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -17,7 +17,7 @@ defmodule ElixirConfAfrica.Factory do %ElixirConfAfrica.TicketTypes.TicketType{ name: "some name", description: "some description", - price: 120.5, + price: Decimal.new("120.5"), number: 357 } end From be0b05724e4123849f79529e88e41b2c5133c8c6 Mon Sep 17 00:00:00 2001 From: okoth Date: Wed, 15 Nov 2023 10:20:54 +0300 Subject: [PATCH 24/26] ensure correct specs --- lib/elixir_conf_africa/events.ex | 7 ++++++- lib/elixir_conf_africa/events/event.ex | 5 ++--- lib/elixir_conf_africa/ticket_types.ex | 7 +++++++ lib/elixir_conf_africa/ticket_types/ticket_type.ex | 4 ++-- mix.exs | 3 ++- mix.lock | 1 + test/elixir_conf_africa/ticket_types_test.exs | 14 +++++++------- 7 files changed, 27 insertions(+), 14 deletions(-) diff --git a/lib/elixir_conf_africa/events.ex b/lib/elixir_conf_africa/events.ex index 9d6e24f..0eab97e 100644 --- a/lib/elixir_conf_africa/events.ex +++ b/lib/elixir_conf_africa/events.ex @@ -17,6 +17,7 @@ defmodule ElixirConfAfrica.Events do [%Event{}, ...] """ + @spec list_events() :: list() def list_events do Repo.all(from e in Event, order_by: [desc: e.id]) end @@ -35,7 +36,6 @@ defmodule ElixirConfAfrica.Events do Repo.one(query) end - @spec get_event!(any()) :: any() @doc """ Gets a single event. @@ -50,6 +50,7 @@ defmodule ElixirConfAfrica.Events do ** (Ecto.NoResultsError) """ + @spec get_event!(non_neg_integer()) :: Event.t() | Ecto.NoResultsError def get_event!(id), do: Repo.get!(Event, id) @doc """ @@ -64,6 +65,7 @@ defmodule ElixirConfAfrica.Events do {:error, %Ecto.Changeset{}} """ + @spec create_event(map()) :: {:ok, Event.t()} | {:error, Ecto.Changeset.t()} def create_event(attrs \\ %{}) do %Event{} |> Event.changeset(attrs) @@ -82,6 +84,7 @@ defmodule ElixirConfAfrica.Events do {:error, %Ecto.Changeset{}} """ + @spec update_event(Event.t(), map()) :: {:ok, Event.t()} | {:error, Ecto.Changeset.t()} def update_event(%Event{} = event, attrs) do event |> Event.changeset(attrs) @@ -100,6 +103,7 @@ defmodule ElixirConfAfrica.Events do {:error, %Ecto.Changeset{}} """ + @spec delete_event(Event.t()) :: {:ok, Event.t()} | {:error, Ecto.Changeset.t()} def delete_event(%Event{} = event) do Repo.delete(event) end @@ -113,6 +117,7 @@ defmodule ElixirConfAfrica.Events do %Ecto.Changeset{data: %Event{}} """ + @spec change_event(Event.t(), map()) :: Ecto.Changeset.t() def change_event(%Event{} = event, attrs \\ %{}) do Event.changeset(event, attrs) end diff --git a/lib/elixir_conf_africa/events/event.ex b/lib/elixir_conf_africa/events/event.ex index b41852a..92731df 100644 --- a/lib/elixir_conf_africa/events/event.ex +++ b/lib/elixir_conf_africa/events/event.ex @@ -1,10 +1,9 @@ defmodule ElixirConfAfrica.Events.Event do @moduledoc false - - use Ecto.Schema + use TypedEctoSchema import Ecto.Changeset - schema "events" do + typed_schema "events" do field :name, :string field :description, :string field :location, :string diff --git a/lib/elixir_conf_africa/ticket_types.ex b/lib/elixir_conf_africa/ticket_types.ex index bba0b1f..cccb8ad 100644 --- a/lib/elixir_conf_africa/ticket_types.ex +++ b/lib/elixir_conf_africa/ticket_types.ex @@ -17,6 +17,7 @@ defmodule ElixirConfAfrica.TicketTypes do [%TicketType{}, ...] """ + @spec list_ticket_types() :: list() def list_ticket_types do Repo.all(TicketType) end @@ -35,6 +36,7 @@ defmodule ElixirConfAfrica.TicketTypes do ** (Ecto.NoResultsError) """ + @spec get_ticket_type!(non_neg_integer()) :: TicketType.t() | Ecto.NoResultsError def get_ticket_type!(id), do: Repo.get!(TicketType, id) @doc """ @@ -49,6 +51,7 @@ defmodule ElixirConfAfrica.TicketTypes do {:error, %Ecto.Changeset{}} """ + @spec create_ticket_type(map()) :: {:ok, TicketType.t()} | {:error, Ecto.Changeset.t()} def create_ticket_type(attrs \\ %{}) do %TicketType{} |> TicketType.changeset(attrs) @@ -67,6 +70,8 @@ defmodule ElixirConfAfrica.TicketTypes do {:error, %Ecto.Changeset{}} """ + @spec update_ticket_type(TicketType.t(), map()) :: + {:ok, TicketType.t()} | {:error, Ecto.Changeset.t()} def update_ticket_type(%TicketType{} = ticket_type, attrs) do ticket_type |> TicketType.changeset(attrs) @@ -85,6 +90,7 @@ defmodule ElixirConfAfrica.TicketTypes do {:error, %Ecto.Changeset{}} """ + @spec delete_ticket_type(TicketType.t()) :: {:ok, TicketType.t()} | {:error, Ecto.Changeset.t()} def delete_ticket_type(%TicketType{} = ticket_type) do Repo.delete(ticket_type) end @@ -98,6 +104,7 @@ defmodule ElixirConfAfrica.TicketTypes do %Ecto.Changeset{data: %TicketType{}} """ + @spec change_ticket_type(TicketType.t(), map()) :: Ecto.Changeset.t() def change_ticket_type(%TicketType{} = ticket_type, attrs \\ %{}) do TicketType.changeset(ticket_type, attrs) end diff --git a/lib/elixir_conf_africa/ticket_types/ticket_type.ex b/lib/elixir_conf_africa/ticket_types/ticket_type.ex index 8e40b1f..c89aa01 100644 --- a/lib/elixir_conf_africa/ticket_types/ticket_type.ex +++ b/lib/elixir_conf_africa/ticket_types/ticket_type.ex @@ -1,10 +1,10 @@ defmodule ElixirConfAfrica.TicketTypes.TicketType do @moduledoc false - use Ecto.Schema + use TypedEctoSchema import Ecto.Changeset - schema "ticket_types" do + typed_schema "ticket_types" do field :name, :string field :description, :string field :price, :decimal diff --git a/mix.exs b/mix.exs index 4f4281b..70b1b76 100644 --- a/mix.exs +++ b/mix.exs @@ -64,7 +64,8 @@ defmodule ElixirConfAfrica.MixProject do {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false}, {:credo, "~> 1.7", only: :dev, runtime: false}, {:excoveralls, "~> 0.18.0", only: :test}, - {:faker, "~> 0.17.0", only: [:dev, :test], runtime: false} + {:faker, "~> 0.17.0", only: [:dev, :test], runtime: false}, + {:typed_ecto_schema, "~> 0.4.1"} ] end diff --git a/mix.lock b/mix.lock index f4d268a..889fe3c 100644 --- a/mix.lock +++ b/mix.lock @@ -43,6 +43,7 @@ "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.1", "315d9163a1d4660aedc3fee73f33f1d355dcc76c5c3ab3d59e76e3edf80eef1f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7be9e0871c41732c233be71e4be11b96e56177bf15dde64a8ac9ce72ac9834c6"}, "telemetry_poller": {:hex, :telemetry_poller, "1.0.0", "db91bb424e07f2bb6e73926fcafbfcbcb295f0193e0a00e825e589a0a47e8453", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3a24eafd66c3f42da30fc3ca7dda1e9d546c12250a2d60d7b81d264fbec4f6e"}, + "typed_ecto_schema": {:hex, :typed_ecto_schema, "0.4.1", "a373ca6f693f4de84cde474a67467a9cb9051a8a7f3f615f1e23dc74b75237fa", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}], "hexpm", "85c6962f79d35bf543dd5659c6adc340fd2480cacc6f25d2cc2933ea6e8fcb3b"}, "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, "websock_adapter": {:hex, :websock_adapter, "0.5.4", "7af8408e7ed9d56578539594d1ee7d8461e2dd5c3f57b0f2a5352d610ddde757", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "d2c238c79c52cbe223fcdae22ca0bb5007a735b9e933870e241fce66afb4f4ab"}, } diff --git a/test/elixir_conf_africa/ticket_types_test.exs b/test/elixir_conf_africa/ticket_types_test.exs index 70dee53..f62cd18 100644 --- a/test/elixir_conf_africa/ticket_types_test.exs +++ b/test/elixir_conf_africa/ticket_types_test.exs @@ -51,13 +51,14 @@ defmodule ElixirConfAfrica.TicketTypesTest do number: "579" } - assert {:ok, %TicketType{} = ticket_type} = + assert {:ok, %TicketType{} = update_ticket_type} = TicketTypes.update_ticket_type(ticket_type, update_attrs) - assert ticket_type.name == "some updated name" - assert ticket_type.description == "some updated description" - assert ticket_type.price == Decimal.new("456.7") - assert ticket_type.number == 579 + refute ticket_type == update_ticket_type + assert update_ticket_type.name == "some updated name" + assert update_ticket_type.description == "some updated description" + assert update_ticket_type.price == Decimal.new("456.7") + assert update_ticket_type.number == 579 end test "update_ticket_type/2 with invalid data returns error changeset", %{ @@ -66,8 +67,7 @@ defmodule ElixirConfAfrica.TicketTypesTest do assert {:error, %Ecto.Changeset{}} = TicketTypes.update_ticket_type(ticket_type, @invalid_attrs) - assert fetched_ticket_type = TicketTypes.get_ticket_type!(ticket_type.id) - assert ticket_type.updated_at == fetched_ticket_type.updated_at + assert ^ticket_type = TicketTypes.get_ticket_type!(ticket_type.id) end test "delete_ticket_type/1 deletes the ticket_type", %{ticket_type: ticket_type} do From 1df6440def37d890f90bc9e154ebe01e395ec7e2 Mon Sep 17 00:00:00 2001 From: okoth Date: Wed, 15 Nov 2023 11:00:26 +0300 Subject: [PATCH 25/26] add removed func --- lib/elixir_conf_africa/events.ex | 21 ++++++++++++++++--- .../live/home_live/index.ex | 7 ++++++- test/elixir_conf_africa/events_test.exs | 11 ++++++++++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/lib/elixir_conf_africa/events.ex b/lib/elixir_conf_africa/events.ex index 0eab97e..65431c0 100644 --- a/lib/elixir_conf_africa/events.ex +++ b/lib/elixir_conf_africa/events.ex @@ -4,9 +4,10 @@ defmodule ElixirConfAfrica.Events do """ import Ecto.Query, warn: false - alias ElixirConfAfrica.Repo alias ElixirConfAfrica.Events.Event + alias ElixirConfAfrica.Repo + alias ElixirConfAfrica.TicketTypes.TicketType @doc """ Returns the list of events. @@ -26,16 +27,30 @@ defmodule ElixirConfAfrica.Events do Returns the elixir conf event together with all its ticket types """ @spec get_event_with_ticket_types_by_event_name(String.t()) :: Event.t() - def get_event_with_ticket_types_by_event_name(name) do + def get_event_with_ticket_types_by_event_name(event_name) do query = from event in Event, join: ticket_types in assoc(event, :ticket_types), - where: event.name == ^name, + where: event.name == ^event_name, preload: [ticket_types: ticket_types] Repo.one(query) end + @doc """ + Get totals number of available tickets for a given event + """ + @spec get_total_number_of_available_tickets(String.t()) :: Event.t() + def get_total_number_of_available_tickets(event_name) do + query = + from t in TicketType, + join: e in Event, + on: t.event_id == e.id and e.name == ^event_name, + select: sum(t.number) + + Repo.one(query) + end + @doc """ Gets a single event. diff --git a/lib/elixir_conf_africa_web/live/home_live/index.ex b/lib/elixir_conf_africa_web/live/home_live/index.ex index eda7b34..1291b04 100644 --- a/lib/elixir_conf_africa_web/live/home_live/index.ex +++ b/lib/elixir_conf_africa_web/live/home_live/index.ex @@ -4,12 +4,17 @@ defmodule ElixirConfAfricaWeb.HomeLive.Index do def mount(_params, _session, socket) do # these value are more static and we should find away of display this data to home page + event_name = "ElixirConf Africa #{get_current_year()}" + event = - Events.get_event_with_ticket_types_by_event_name("ElixirConf Africa #{get_current_year()}") + Events.get_event_with_ticket_types_by_event_name(event_name) + + available_ticket = Events.get_total_number_of_available_tickets(event_name) {:ok, socket |> assign(:event, event)} + |> assign(available_ticket: available_ticket) end defp get_current_year do diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs index e74e6dd..db27efe 100644 --- a/test/elixir_conf_africa/events_test.exs +++ b/test/elixir_conf_africa/events_test.exs @@ -95,5 +95,16 @@ defmodule ElixirConfAfrica.EventsTest do test "change_event/1 returns a event changeset", %{event: event} do assert %Ecto.Changeset{} = Events.change_event(event) end + + test "get_total_number_of_available_tickets/1 returns total number of tickets", %{ + event: event + } do + %{number: number} = insert!(:elixir_conf_ticket_type, event_id: event.id) + %{number: number1} = insert!(:elixir_conf_ticket_type, event_id: event.id) + total_number_of_available_tickets = number1 + number + + assert Events.get_total_number_of_available_tickets(event.name) == + total_number_of_available_tickets + end end end From 207c6a6add887da31f20be6db7803d002a62e567 Mon Sep 17 00:00:00 2001 From: okoth Date: Wed, 15 Nov 2023 11:00:47 +0300 Subject: [PATCH 26/26] be more stricter --- .credo.exs | 2 +- coveralls.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.credo.exs b/.credo.exs index 0700cf3..c3f69fa 100644 --- a/.credo.exs +++ b/.credo.exs @@ -81,7 +81,7 @@ # ## Readability Checks # - {Credo.Check.Readability.AliasOrder, false}, + {Credo.Check.Readability.AliasOrder, []}, {Credo.Check.Readability.FunctionNames, []}, {Credo.Check.Readability.LargeNumbers, []}, {Credo.Check.Readability.MaxLineLength, [priority: :low, max_length: 120]}, diff --git a/coveralls.json b/coveralls.json index 39b167d..4fbd07c 100644 --- a/coveralls.json +++ b/coveralls.json @@ -1,7 +1,7 @@ { "coverage_options": { - "minimum_coverage": 69.2 + "minimum_coverage": 89.5 }, "skip_files": ["lib/elixir_conf_africa_web/components/core_components.ex"] } \ No newline at end of file