diff --git a/.DS_Store b/.DS_Store index 241a5dd..a246cb8 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/config/dev.exs b/config/dev.exs index 5ea99cf..3c89e9b 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -19,7 +19,7 @@ config :elixir_conf_africa, ElixirConfAfrica.Repo, config :elixir_conf_africa, ElixirConfAfricaWeb.Endpoint, # Binding to loopback ipv4 address prevents access from other machines. # Change to `ip: {0, 0, 0, 0}` to allow access from other machines. - http: [ip: {127, 0, 0, 1}, port: 4100], + http: [ip: {127, 0, 0, 1}, port: 4000], check_origin: false, code_reloader: true, debug_errors: true, diff --git a/lib/elixir_conf_africa/accounts/user.ex b/lib/elixir_conf_africa/accounts/user.ex index 0bdf005..f12c7ca 100644 --- a/lib/elixir_conf_africa/accounts/user.ex +++ b/lib/elixir_conf_africa/accounts/user.ex @@ -1,4 +1,5 @@ defmodule ElixirConfAfrica.Accounts.User do + @moduledoc false use Ecto.Schema import Ecto.Changeset diff --git a/lib/elixir_conf_africa/accounts/user_notifier.ex b/lib/elixir_conf_africa/accounts/user_notifier.ex index c487d79..2652841 100644 --- a/lib/elixir_conf_africa/accounts/user_notifier.ex +++ b/lib/elixir_conf_africa/accounts/user_notifier.ex @@ -1,4 +1,5 @@ defmodule ElixirConfAfrica.Accounts.UserNotifier do + @moduledoc false import Swoosh.Email alias ElixirConfAfrica.Mailer diff --git a/lib/elixir_conf_africa/accounts/user_token.ex b/lib/elixir_conf_africa/accounts/user_token.ex index 972baab..1822922 100644 --- a/lib/elixir_conf_africa/accounts/user_token.ex +++ b/lib/elixir_conf_africa/accounts/user_token.ex @@ -1,4 +1,5 @@ defmodule ElixirConfAfrica.Accounts.UserToken do + @moduledoc false use Ecto.Schema import Ecto.Query alias ElixirConfAfrica.Accounts.UserToken diff --git a/lib/elixir_conf_africa/ticket_types/ticket_type.ex b/lib/elixir_conf_africa/ticket_types/ticket_type.ex index 489196e..a7b7243 100644 --- a/lib/elixir_conf_africa/ticket_types/ticket_type.ex +++ b/lib/elixir_conf_africa/ticket_types/ticket_type.ex @@ -1,4 +1,5 @@ defmodule ElixirConfAfrica.TicketTypes.TicketType do + @moduledoc false use Ecto.Schema import Ecto.Changeset diff --git a/lib/elixir_conf_africa/tickets/ticket.ex b/lib/elixir_conf_africa/tickets/ticket.ex index e967d42..edc1dbe 100644 --- a/lib/elixir_conf_africa/tickets/ticket.ex +++ b/lib/elixir_conf_africa/tickets/ticket.ex @@ -1,4 +1,5 @@ defmodule ElixirConfAfrica.Tickets.Ticket do + @moduledoc false use Ecto.Schema import Ecto.Changeset diff --git a/lib/elixir_conf_africa_web/live/event_live/index.html.heex b/lib/elixir_conf_africa_web/live/event_live/index.html.heex index 742c613..10fd788 100644 --- a/lib/elixir_conf_africa_web/live/event_live/index.html.heex +++ b/lib/elixir_conf_africa_web/live/event_live/index.html.heex @@ -44,8 +44,8 @@

KSH <%= ticket_type.price %>

<.link - navigate={~p"/event/#{ticket_type.id}/buy"} - id="buy-#{ticket_type.id}-tickets" + patch={~p"/event/#{ticket_type.id}/buy"} + id={"buy-#{ticket_type.id}-tickets"} >
diff --git a/lib/elixir_conf_africa_web/live/ticket_live/form_component.html.heex b/lib/elixir_conf_africa_web/live/ticket_live/form_component.html.heex index 5df2bc2..40b6905 100644 --- a/lib/elixir_conf_africa_web/live/ticket_live/form_component.html.heex +++ b/lib/elixir_conf_africa_web/live/ticket_live/form_component.html.heex @@ -1,7 +1,7 @@
<.simple_form for={@form} - id="event-form" + id="ticket-form" phx-target={@myself} phx-change="validate" phx-submit="save" diff --git a/lib/elixir_conf_africa_web/live/ticket_type_live/form_component.ex b/lib/elixir_conf_africa_web/live/ticket_type_live/form_component.ex index 1e4e4c8..e5e2354 100644 --- a/lib/elixir_conf_africa_web/live/ticket_type_live/form_component.ex +++ b/lib/elixir_conf_africa_web/live/ticket_type_live/form_component.ex @@ -33,7 +33,7 @@ defmodule ElixirConfAfricaWeb.TicketTypeLive.FormComponent do {:noreply, socket |> put_flash(:info, "Ticket type updated successfully") - |> push_patch(to: socket.assigns.patch)} + |> push_redirect(to: socket.assigns.patch)} {:error, %Ecto.Changeset{} = changeset} -> {:noreply, assign(socket, :changeset, changeset)} @@ -46,7 +46,7 @@ defmodule ElixirConfAfricaWeb.TicketTypeLive.FormComponent do {:noreply, socket |> put_flash(:info, "Ticket type created successfully") - |> push_patch(to: socket.assigns.patch)} + |> push_redirect(to: socket.assigns.patch)} {:error, %Ecto.Changeset{} = changeset} -> {:noreply, assign(socket, changeset: changeset)} diff --git a/lib/elixir_conf_africa_web/live/ticket_type_live/index.html.heex b/lib/elixir_conf_africa_web/live/ticket_type_live/index.html.heex index 2b8ec1c..3d2653a 100644 --- a/lib/elixir_conf_africa_web/live/ticket_type_live/index.html.heex +++ b/lib/elixir_conf_africa_web/live/ticket_type_live/index.html.heex @@ -3,7 +3,7 @@ Listing Ticket types <:actions> <.link patch={~p"/ticket_types/new"}> - <.button>New Ticket type + <.button>New Ticket Type @@ -43,7 +43,12 @@
- <.link patch={~p"/ticket_types/#{ticket_type}/edit"}>Edit + <.link + id={"ticket_types-#{ticket_type.id}"} + patch={~p"/ticket_types/#{ticket_type}/edit"} + > + Edit + <.link diff --git a/lib/elixir_conf_africa_web/user_auth.ex b/lib/elixir_conf_africa_web/user_auth.ex index 2235ca7..89ec6e3 100644 --- a/lib/elixir_conf_africa_web/user_auth.ex +++ b/lib/elixir_conf_africa_web/user_auth.ex @@ -1,4 +1,5 @@ defmodule ElixirConfAfricaWeb.UserAuth do + @moduledoc false use ElixirConfAfricaWeb, :verified_routes import Plug.Conn diff --git a/mix.exs b/mix.exs index 06071da..bb2f687 100644 --- a/mix.exs +++ b/mix.exs @@ -69,7 +69,7 @@ defmodule ElixirConfAfrica.MixProject do {:typed_ecto_schema, "~> 0.4.1"}, {:ex_machina, "~> 2.7.0"}, {:httpoison, "~> 2.1"}, - {:styler, "~> 0.11", only: [:dev, :test], runtime: false}, + {:styler, "~> 0.11", only: [:dev, :test], runtime: false} ] end diff --git a/test/.DS_Store b/test/.DS_Store new file mode 100644 index 0000000..dd0df7d Binary files /dev/null and b/test/.DS_Store differ diff --git a/test/elixir_conf_africa/accounts_test.exs b/test/elixir_conf_africa/accounts_test.exs index 16e79f0..38c2f53 100644 --- a/test/elixir_conf_africa/accounts_test.exs +++ b/test/elixir_conf_africa/accounts_test.exs @@ -59,11 +59,11 @@ defmodule ElixirConfAfrica.AccountsTest do end test "validates email and password when given" do - {:error, changeset} = Accounts.register_user(%{email: "not valid", password: "not valid"}) + {:error, changeset} = Accounts.register_user(%{email: "not valid", password: "poor"}) assert %{ email: ["must have the @ sign and no spaces"], - password: ["should be at least 12 character(s)"] + password: ["should be at least 6 character(s)"] } = errors_on(changeset) end @@ -152,9 +152,9 @@ defmodule ElixirConfAfrica.AccountsTest do test "validates email uniqueness", %{user: user} do %{email: email} = user_fixture() - password = valid_user_password() - {:error, changeset} = Accounts.apply_user_email(user, password, %{email: email}) + {:error, changeset} = + Accounts.apply_user_email(user, valid_user_password(), %{email: email}) assert "has already been taken" in errors_on(changeset).email end @@ -174,7 +174,7 @@ defmodule ElixirConfAfrica.AccountsTest do end end - describe "deliver_user_update_email_instructions/3" do + describe "deliver_update_email_instructions/3" do setup do %{user: user_fixture()} end @@ -182,7 +182,7 @@ defmodule ElixirConfAfrica.AccountsTest do test "sends token through notification", %{user: user} do token = extract_user_token(fn url -> - Accounts.deliver_user_update_email_instructions(user, "current@example.com", url) + Accounts.deliver_update_email_instructions(user, "current@example.com", url) end) {:ok, token} = Base.url_decode64(token, padding: false) @@ -200,7 +200,7 @@ defmodule ElixirConfAfrica.AccountsTest do token = extract_user_token(fn url -> - Accounts.deliver_user_update_email_instructions(%{user | email: email}, user.email, url) + Accounts.deliver_update_email_instructions(%{user | email: email}, user.email, url) end) %{user: user, token: token, email: email} @@ -262,12 +262,12 @@ defmodule ElixirConfAfrica.AccountsTest do test "validates password", %{user: user} do {:error, changeset} = Accounts.update_user_password(user, valid_user_password(), %{ - password: "not valid", + password: "poor", password_confirmation: "another" }) assert %{ - password: ["should be at least 12 character(s)"], + password: ["should be at least 6 character(s)"], password_confirmation: ["does not match password"] } = errors_on(changeset) end @@ -353,11 +353,11 @@ defmodule ElixirConfAfrica.AccountsTest do end end - describe "delete_user_session_token/1" do + describe "delete_session_token/1" do test "deletes the token" do user = user_fixture() token = Accounts.generate_user_session_token(user) - assert Accounts.delete_user_session_token(token) == :ok + assert Accounts.delete_session_token(token) == :ok refute Accounts.get_user_by_session_token(token) end end @@ -471,12 +471,12 @@ defmodule ElixirConfAfrica.AccountsTest do test "validates password", %{user: user} do {:error, changeset} = Accounts.reset_user_password(user, %{ - password: "not valid", + password: "poor", password_confirmation: "another" }) assert %{ - password: ["should be at least 12 character(s)"], + password: ["should be at least 6 character(s)"], password_confirmation: ["does not match password"] } = errors_on(changeset) end @@ -500,7 +500,27 @@ defmodule ElixirConfAfrica.AccountsTest do end end - describe "inspect/2 for the User module" do + describe "update a user role/2" do + setup do + %{user: user_fixture()} + end + + test "you can update a user's role" do + {:ok, user} = Accounts.register_user(valid_user_attributes()) + assert user.role == "user" + {:ok, user} = Accounts.update_user_role(user, "admin") + assert user.role == "admin" + end + + test "you can only give the roles 'user' , 'admin' or 'scanner'" do + {:ok, user} = Accounts.register_user(valid_user_attributes()) + assert user.role == "user" + {:error, _} = Accounts.update_user_role(user, "not a role") + assert user.role == "user" + end + end + + describe "inspect/2" do test "does not include password" do refute inspect(%User{password: "123456"}) =~ "password: \"123456\"" end diff --git a/test/elixir_conf_africa/events_test.exs b/test/elixir_conf_africa/events_test.exs deleted file mode 100644 index db27efe..0000000 --- a/test/elixir_conf_africa/events_test.exs +++ /dev/null @@ -1,110 +0,0 @@ -defmodule ElixirConfAfrica.EventsTest do - use ElixirConfAfrica.DataCase - - alias ElixirConfAfrica.Events - - describe "events" do - import ElixirConfAfrica.Factory - alias ElixirConfAfrica.Events.Event - - @invalid_attrs %{ - name: nil, - description: nil, - location: nil, - event_type: nil, - start_date: nil, - end_date: nil - } - setup do - event = insert!(:elixir_conf_event) - [event: event] - end - - test "list_events/0 returns all events", %{event: event} do - assert Events.list_events() == [event] - end - - test "get_event!/1 returns the event with given id", %{event: event} do - assert Events.get_event!(event.id) == event - end - - 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) - - event_with_ticket_types = ElixirConfAfrica.Repo.preload(event, :ticket_types) - assert event = Events.get_event_with_ticket_types_by_event_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 - 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 - - 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 diff --git a/test/elixir_conf_africa/paystack_test.exs b/test/elixir_conf_africa/paystack_test.exs new file mode 100644 index 0000000..992e269 --- /dev/null +++ b/test/elixir_conf_africa/paystack_test.exs @@ -0,0 +1,43 @@ +defmodule ElixirConfAfrica.PaystackTest do + use ElixirConfAfrica.DataCase + alias ElixirConfAfrica.Paystack + + describe "Paystack initialization , transaction verification and getting all transactions" do + setup do + [email: "michaelmunavu83@gmail.com", amount: 1000] + end + + test "initialize/2 with a valid email and amount returns a map with a authorization url , transaction reference and access code", + %{email: email, amount: amount} do + assert %{ + "access_code" => _, + "authorization_url" => _, + "reference" => _ + } = + Paystack.initialize(email, amount) + end + + test "list_transactions/0 returns a list of transactions for that account and gets structured", + %{email: email, amount: amount} do + Paystack.initialize(email, amount) + assert Paystack.list_transactions() != [] + end + + test "test_verification/1 returns a map with the transaction details", %{ + email: email, + amount: amount + } do + %{ + "access_code" => _, + "authorization_url" => _, + "reference" => reference + } = + Paystack.initialize(email, amount) + + assert %{ + "amount" => _amount, + "reference" => _reference + } = Paystack.test_verification(reference) + end + end +end diff --git a/test/elixir_conf_africa/ticket_types_test.exs b/test/elixir_conf_africa/ticket_types_test.exs index f62cd18..6aa866c 100644 --- a/test/elixir_conf_africa/ticket_types_test.exs +++ b/test/elixir_conf_africa/ticket_types_test.exs @@ -1,82 +1,91 @@ defmodule ElixirConfAfrica.TicketTypesTest do use ElixirConfAfrica.DataCase - alias ElixirConfAfrica.TicketTypes + alias ElixirConfAfrica.Factory describe "ticket_types" do alias ElixirConfAfrica.TicketTypes.TicketType + alias ElixirConfAfrica.TicketTypes - import ElixirConfAfrica.Factory - @invalid_attrs %{name: nil, description: nil, price: nil, number: nil} - 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 + @invalid_attrs %{name: nil, description: nil, price: nil} + + test "list_ticket_types/0 returns all ticket_types" do + ticket_type = Factory.insert(:ticket_type) - test "list_ticket_types/0 returns all ticket_types", %{ticket_type: ticket_type} do - assert [^ticket_type] = TicketTypes.list_ticket_types() + assert TicketTypes.list_ticket_types() == [ticket_type] end - test "get_ticket_type!/1 returns the ticket_type with given id", %{ticket_type: ticket_type} do - assert ^ticket_type = TicketTypes.get_ticket_type!(ticket_type.id) + test "get_ticket_type!/1 returns the ticket_type with given id" do + ticket_type = Factory.insert(:ticket_type) + assert TicketTypes.get_ticket_type!(ticket_type.id) == ticket_type 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", - description: "some description", - price: "120.5", - number: "357" - } + test "create_ticket_type/1 with valid data creates a ticket_type" do + valid_attrs = %{name: "some name", description: "some description", price: 42, number: 49} assert {:ok, %TicketType{} = ticket_type} = TicketTypes.create_ticket_type(valid_attrs) assert ticket_type.name == "some name" assert ticket_type.description == "some description" - assert ticket_type.price == Decimal.new("120.5") + assert ticket_type.price == 42 end test "create_ticket_type/1 with invalid data returns error changeset" do assert {:error, %Ecto.Changeset{}} = TicketTypes.create_ticket_type(@invalid_attrs) end - test "update_ticket_type/2 with valid data updates the ticket_type", %{ - ticket_type: ticket_type - } do + test "update_ticket_type/2 with valid data updates the ticket_type" do + ticket_type = Factory.insert(:ticket_type) + update_attrs = %{ name: "some updated name", description: "some updated description", - price: "456.7", - number: "579" + price: 43, + number: 49 } - assert {:ok, %TicketType{} = update_ticket_type} = + assert {:ok, %TicketType{} = ticket_type} = TicketTypes.update_ticket_type(ticket_type, update_attrs) - 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 + assert ticket_type.name == "some updated name" + assert ticket_type.description == "some updated description" + assert ticket_type.price == 43 end - test "update_ticket_type/2 with invalid data returns error changeset", %{ - ticket_type: ticket_type - } do + test "update_ticket_type/2 with invalid data returns error changeset" do + ticket_type = Factory.insert(:ticket_type) + assert {:error, %Ecto.Changeset{}} = TicketTypes.update_ticket_type(ticket_type, @invalid_attrs) - assert ^ticket_type = TicketTypes.get_ticket_type!(ticket_type.id) + 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 + test "delete_ticket_type/1 deletes the ticket_type" do + ticket_type = Factory.insert(:ticket_type) 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", %{ticket_type: ticket_type} do + test "change_ticket_type/1 returns a ticket_type changeset" do + ticket_type = Factory.insert(:ticket_type) assert %Ecto.Changeset{} = TicketTypes.change_ticket_type(ticket_type) end + + test "list_ticket_types_with_remaining_tickets/0 returns all ticket_types with the remaining tickets available" do + ticket_type = Factory.insert(:ticket_type, number: 10) + + Factory.insert(:ticket, ticket_type_id: ticket_type.id, is_paid: true) + + assert TicketTypes.list_ticket_types_with_remaining_tickets() == + [ + %{ + id: ticket_type.id, + name: ticket_type.name, + remaining_tickets: 9, + description: ticket_type.description, + price: ticket_type.price + } + ] + end end end diff --git a/test/elixir_conf_africa/tickets_test.exs b/test/elixir_conf_africa/tickets_test.exs new file mode 100644 index 0000000..1a56961 --- /dev/null +++ b/test/elixir_conf_africa/tickets_test.exs @@ -0,0 +1,149 @@ +defmodule ElixirConfAfrica.TicketsTest do + use ElixirConfAfrica.DataCase + + alias ElixirConfAfrica.Tickets + alias ElixirConfAfrica.Factory + alias ElixirConfAfrica.Tickets.Ticket + + describe "ticket" do + @invalid_attrs %{name: nil, email: nil, ticketid: nil, quantity: nil} + + setup do + ticket_type = Factory.insert(:ticket_type, number: 10) + + ticket = + Factory.insert(:ticket, + ticket_type_id: ticket_type.id, + is_paid: true, + is_refunded: false, + cost: 400 + ) + + unpaid_ticket = + Factory.insert(:ticket, + ticket_type_id: ticket_type.id, + is_paid: false, + is_refunded: false, + cost: 400 + ) + + refunded_ticket = + Factory.insert(:ticket, + ticket_type_id: ticket_type.id, + is_paid: true, + is_refunded: true, + cost: 400 + ) + + [ + ticket_type: ticket_type, + ticket: ticket, + unpaid_ticket: unpaid_ticket, + refunded_ticket: refunded_ticket + ] + end + + test "list_ticket/0 returns all ticket", %{ + ticket: ticket, + unpaid_ticket: unpaid_ticket, + refunded_ticket: refunded_ticket + } do + assert Tickets.list_ticket() == [ticket, unpaid_ticket, refunded_ticket] + end + + test "list_paid_tickets/0 returns all paid tickets that are not refunded", %{ + ticket: ticket, + ticket_type: ticket_type + } do + assert Tickets.list_paid_tickets() == [ + ticket |> Map.put(:ticket_type, ticket_type) + ] + end + + test "list_unpaid_tickets/0 returns all unpaid tickets that are not refunded", %{ + unpaid_ticket: unpaid_ticket, + ticket_type: ticket_type + } do + assert Tickets.list_unpaid_tickets() == [ + unpaid_ticket |> Map.put(:ticket_type, ticket_type) + ] + end + + test "list_refunded_tickets/0 returns all refunded tickets that are paid", %{ + refunded_ticket: refunded_ticket, + ticket_type: ticket_type + } do + assert Tickets.list_refunded_tickets() == [ + refunded_ticket |> Map.put(:ticket_type, ticket_type) + ] + end + + test "get_ticket!/1 returns the ticket with given id", %{ticket: ticket} do + assert Tickets.get_ticket!(ticket.id) == ticket + end + + test "get_ticket_by_ticketid!/1 returns the ticket with given ticketid", %{ + ticket: ticket, + ticket_type: ticket_type + } do + assert Tickets.get_ticket_by_ticketid!(ticket.ticketid) == + ticket |> Map.put(:ticket_type, ticket_type) + end + + test "create_ticket/1 with valid data creates a ticket", %{ + ticket_type: ticket_type + } do + valid_attrs = %{ + name: "some name", + email: "email@gmail.com", + ticketid: "some ticketid", + quantity: 42, + ticket_type_id: ticket_type.id, + cost: 200 + } + + assert {:ok, %Ticket{} = ticket} = Tickets.create_ticket(valid_attrs) + assert ticket.name == "some name" + assert ticket.email == "email@gmail.com" + assert ticket.ticketid == "some ticketid" + assert ticket.quantity == 42 + end + + test "create_ticket/1 with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Tickets.create_ticket(@invalid_attrs) + end + + test "update_ticket/2 with valid data updates the ticket", %{ + ticket_type: ticket_type, + ticket: ticket + } do + update_attrs = %{ + name: "some updated name", + email: "someemail@gmail.com", + ticketid: "some updated ticketid", + quantity: 43, + cost: 200, + ticket_type_id: ticket_type.id + } + + assert {:ok, %Ticket{} = ticket} = Tickets.update_ticket(ticket, update_attrs) + assert ticket.name == "some updated name" + assert ticket.email == "someemail@gmail.com" + assert ticket.ticketid == "some updated ticketid" + assert ticket.quantity == 43 + end + + test "update_ticket/2 with invalid data returns error changeset", %{ticket: ticket} do + assert {:error, %Ecto.Changeset{}} = Tickets.update_ticket(ticket, @invalid_attrs) + assert ticket == Tickets.get_ticket!(ticket.id) + end + + test "delete_ticket/1 deletes the ticket", %{ticket: ticket} do + assert {:ok, %Ticket{}} = Tickets.delete_ticket(ticket) + end + + test "change_ticket/1 returns a ticket changeset", %{ticket: ticket} do + assert %Ecto.Changeset{} = Tickets.change_ticket(ticket) + end + end +end diff --git a/test/elixir_conf_africa_web/.DS_Store b/test/elixir_conf_africa_web/.DS_Store new file mode 100644 index 0000000..51293b8 Binary files /dev/null and b/test/elixir_conf_africa_web/.DS_Store differ diff --git a/test/elixir_conf_africa_web/controllers/page_controller_test.exs b/test/elixir_conf_africa_web/controllers/page_controller_test.exs deleted file mode 100644 index 566dd2b..0000000 --- a/test/elixir_conf_africa_web/controllers/page_controller_test.exs +++ /dev/null @@ -1,8 +0,0 @@ -defmodule ElixirConfAfricaWeb.PageControllerTest do - use ElixirConfAfricaWeb.ConnCase - - test "GET /", %{conn: conn} do - conn = get(conn, ~p"/") - assert html_response(conn, 200) =~ "Peace of mind from prototype to production" - end -end diff --git a/test/elixir_conf_africa_web/controllers/user_registration_controller_test.exs b/test/elixir_conf_africa_web/controllers/user_registration_controller_test.exs index 35d689c..0c6bd7b 100644 --- a/test/elixir_conf_africa_web/controllers/user_registration_controller_test.exs +++ b/test/elixir_conf_africa_web/controllers/user_registration_controller_test.exs @@ -43,13 +43,13 @@ defmodule ElixirConfAfricaWeb.UserRegistrationControllerTest do test "render errors for invalid data", %{conn: conn} do conn = post(conn, ~p"/users/register", %{ - "user" => %{"email" => "with spaces", "password" => "too short"} + "user" => %{"email" => "with spaces", "password" => "short"} }) response = html_response(conn, 200) assert response =~ "Register" assert response =~ "must have the @ sign and no spaces" - assert response =~ "should be at least 12 character" + assert response =~ "should be at least 6 character" end end end diff --git a/test/elixir_conf_africa_web/controllers/user_reset_password_controller_test.exs b/test/elixir_conf_africa_web/controllers/user_reset_password_controller_test.exs index 6b30b2e..dd0b968 100644 --- a/test/elixir_conf_africa_web/controllers/user_reset_password_controller_test.exs +++ b/test/elixir_conf_africa_web/controllers/user_reset_password_controller_test.exs @@ -104,7 +104,7 @@ defmodule ElixirConfAfricaWeb.UserResetPasswordControllerTest do conn = put(conn, ~p"/users/reset_password/#{token}", %{ "user" => %{ - "password" => "too short", + "password" => "short", "password_confirmation" => "does not match" } }) diff --git a/test/elixir_conf_africa_web/controllers/user_settings_controller_test.exs b/test/elixir_conf_africa_web/controllers/user_settings_controller_test.exs index 28a478e..933a188 100644 --- a/test/elixir_conf_africa_web/controllers/user_settings_controller_test.exs +++ b/test/elixir_conf_africa_web/controllers/user_settings_controller_test.exs @@ -48,14 +48,14 @@ defmodule ElixirConfAfricaWeb.UserSettingsControllerTest do "action" => "update_password", "current_password" => "invalid", "user" => %{ - "password" => "too short", + "password" => "short", "password_confirmation" => "does not match" } }) response = html_response(old_password_conn, 200) assert response =~ "Settings" - assert response =~ "should be at least 12 character(s)" + assert response =~ "should be at least 6 character(s)" assert response =~ "does not match password" assert response =~ "is not valid" @@ -102,7 +102,7 @@ defmodule ElixirConfAfricaWeb.UserSettingsControllerTest do token = extract_user_token(fn url -> - Accounts.deliver_user_update_email_instructions(%{user | email: email}, user.email, url) + Accounts.deliver_update_email_instructions(%{user | email: email}, user.email, url) end) %{token: token, email: email} 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 23da999..9983554 100644 --- a/test/elixir_conf_africa_web/live/event_live_test.exs +++ b/test/elixir_conf_africa_web/live/event_live_test.exs @@ -2,129 +2,118 @@ defmodule ElixirConfAfricaWeb.EventLiveTest do use ElixirConfAfricaWeb.ConnCase import Phoenix.LiveViewTest - import ElixirConfAfrica.Factory + alias ElixirConfAfrica.Factory - @create_attrs %{ + @valid_attributes %{ name: "some name", - description: "some description", - location: "some location", - event_type: "some event_type", - start_date: "2023-10-05T06:18:00", - end_date: "2023-10-05T06:18:00" + email: "michaelmunavu83@gmail.com", + quantity: 2 } - @update_attrs %{ - name: "some updated name", - description: "some updated description", - location: "some updated location", - event_type: "some updated event_type", - start_date: "2023-10-06T06:18:00", - end_date: "2023-10-06T06:18:00" - } - @invalid_attrs %{ + + @invalid_attributes %{ name: nil, - description: nil, - location: nil, - event_type: nil, - start_date: nil, - end_date: nil + email: nil, + quantity: 2 } - setup do - event = insert!(:elixir_conf_event) - %{event: event} - end - - describe "Index" do - test "lists all events", %{conn: conn, event: event} do - {:ok, _index_live, html} = live(conn, ~p"/events") - - assert html =~ "Listing Events" - assert html =~ event.name + describe "Event" do + setup do + ticket_type1 = Factory.insert(:ticket_type, number: 10, name: "Early Bird", price: 400) + ticket_type2 = Factory.insert(:ticket_type, number: 10, name: "Advanced", price: 500) + + Factory.insert(:ticket, + ticket_type_id: ticket_type1.id, + is_paid: false, + is_refunded: false, + cost: 400 + ) + + Factory.insert(:ticket, + ticket_type_id: ticket_type2.id, + is_paid: true, + is_refunded: false, + cost: 400 + ) + + Factory.insert(:ticket, + ticket_type_id: ticket_type1.id, + is_paid: true, + is_refunded: false, + cost: 400 + ) + + Factory.insert(:ticket, + ticket_type_id: ticket_type2.id, + is_paid: true, + is_refunded: true, + cost: 400 + ) + + %{ticket_type1: ticket_type1, ticket_type2: ticket_type2} end - test "saves new event", %{conn: conn} do - {:ok, index_live, _html} = live(conn, ~p"/events") - - assert index_live |> element("a", "New Event") |> render_click() =~ - "New Event" - - assert_patch(index_live, ~p"/events/new") + test "You can see available tickets with their remaining quantity", %{ + conn: conn, + ticket_type1: ticket_type1, + ticket_type2: ticket_type2 + } do + {:ok, _index_live, html} = live(conn, ~p"/event") + + assert html =~ ticket_type1.name + assert html =~ ticket_type2.name + assert html =~ "9" + assert html =~ "8" + end - assert index_live - |> form("#event-form", event: @invalid_attrs) - |> render_change() =~ "can't be blank" + test "once you click on get ticket for a particular ticket type , a form popups where you add your details", + %{ + conn: conn, + ticket_type1: ticket_type1 + } do + {:ok, index_live, _html} = live(conn, ~p"/event") - assert index_live - |> form("#event-form", event: @create_attrs) - |> render_submit() + index_live + |> element("#buy-#{ticket_type1.id}-tickets", "Get") + |> render_click() - assert_patch(index_live, ~p"/events") + assert_patch(index_live, ~p"/event/#{ticket_type1.id}/buy") - html = render(index_live) - assert html =~ "Event created successfully" - assert html =~ "some name" + assert has_element?(index_live, "#ticket-form") end - test "updates event in listing", %{conn: conn, event: event} do - {:ok, index_live, _html} = live(conn, ~p"/events") + test "adding invalid data on the form renders errors", + %{ + conn: conn, + ticket_type1: ticket_type1 + } do + {:ok, index_live, _html} = live(conn, ~p"/event") - assert index_live |> element("#events-#{event.id} a", "Edit") |> render_click() =~ - "Edit Event" + index_live + |> element("#buy-#{ticket_type1.id}-tickets", "Get") + |> render_click() - assert_patch(index_live, ~p"/events/#{event}/edit") + {:ok, index_live, _html} = + live(conn, ~p"/event/#{ticket_type1.id}/buy") assert index_live - |> form("#event-form", event: @invalid_attrs) + |> form("#ticket-form", ticket: @invalid_attributes) |> render_change() =~ "can't be blank" - - assert index_live - |> form("#event-form", event: @update_attrs) - |> render_submit() - - assert_patch(index_live, ~p"/events") - - html = render(index_live) - assert html =~ "Event updated successfully" - assert html =~ "some updated name" - end - - test "deletes event in listing", %{conn: conn, event: event} do - {:ok, index_live, _html} = live(conn, ~p"/events") - - assert index_live |> element("#events-#{event.id} a", "Delete") |> render_click() - refute has_element?(index_live, "#events-#{event.id}") end - end - - describe "Show" do - test "displays event", %{conn: conn, event: event} do - {:ok, _show_live, html} = live(conn, ~p"/events/#{event}") - - assert html =~ "Show Event" - assert html =~ event.name - end - - test "updates event within modal", %{conn: conn, event: event} do - {:ok, show_live, _html} = live(conn, ~p"/events/#{event}") - - assert show_live |> element("a", "Edit") |> render_click() =~ - "Edit Event" - - assert_patch(show_live, ~p"/events/#{event}/show/edit") - - assert show_live - |> form("#event-form", event: @invalid_attrs) - |> render_change() =~ "can't be blank" - assert show_live - |> form("#event-form", event: @update_attrs) - |> render_submit() + test "adding valid data on the form redirects to the event page", + %{ + conn: conn, + ticket_type1: ticket_type1 + } do + {:ok, index_live, _html} = live(conn, ~p"/event") - assert_patch(show_live, ~p"/events/#{event}") + index_live + |> element("#buy-#{ticket_type1.id}-tickets", "Get") + |> render_click() - html = render(show_live) - assert html =~ "Event updated successfully" - assert html =~ "some updated name" + index_live + |> form("#ticket-form", ticket: @valid_attributes) + |> render_submit() end end end diff --git a/test/elixir_conf_africa_web/live/home_live_test.exs b/test/elixir_conf_africa_web/live/home_live_test.exs new file mode 100644 index 0000000..391500c --- /dev/null +++ b/test/elixir_conf_africa_web/live/home_live_test.exs @@ -0,0 +1,21 @@ +defmodule ElixirConfAfricaWeb.HomeLiveTest do + use ElixirConfAfricaWeb.ConnCase + + import Phoenix.LiveViewTest + + describe "Home" do + test "There is a button to buy tickets", %{conn: conn} do + {:ok, _index_live, html} = live(conn, ~p"/") + + assert html =~ "Buy Tickets" + end + + test "once clicked, the button takes you to the event page", %{conn: conn} do + {:ok, index_live, _html} = live(conn, ~p"/") + + index_live |> element("a", "Buy Tickets") |> render_click() |> follow_redirect(conn) + + assert_redirect(index_live, ~p"/event") + end + end +end diff --git a/test/elixir_conf_africa_web/live/paid_ticket_live_test.exs b/test/elixir_conf_africa_web/live/paid_ticket_live_test.exs new file mode 100644 index 0000000..a169038 --- /dev/null +++ b/test/elixir_conf_africa_web/live/paid_ticket_live_test.exs @@ -0,0 +1,67 @@ +defmodule ElixirConfAfricaWeb.PaidTicketLiveTest do + use ElixirConfAfricaWeb.ConnCase + + import Phoenix.LiveViewTest + alias ElixirConfAfrica.Factory + + describe "Paid Tickets Tests" do + setup %{conn: conn} do + # sign up first + conn = + post(conn, ~p"/users/register", + method: :create, + user: %{email: "admin@gmail.com", password: "123456", role: "admin"} + ) + + ticket_type = Factory.insert(:ticket_type, name: "some name", price: 400) + + paid_ticket = + Factory.insert(:ticket, + is_paid: true, + is_refunded: false, + name: "some paid name", + ticket_type_id: ticket_type.id + ) + + unpaid_ticket = + Factory.insert(:ticket, + is_paid: false, + is_refunded: false, + name: "some unpaid name", + ticket_type_id: ticket_type.id + ) + + [ + paid_ticket: paid_ticket, + unpaid_ticket: unpaid_ticket, + conn: conn + ] + end + + test "you see the paid tickets on /tickets/paid", %{ + conn: conn, + paid_ticket: paid_ticket, + unpaid_ticket: unpaid_ticket + } do + {:ok, _index_live, html} = live(conn, ~p"/tickets/paid") + + assert html =~ "Listing Paid Tickets" + assert html =~ paid_ticket.name + refute html =~ unpaid_ticket.name + end + + test "you see a button on each record that sends a ticket email", %{ + conn: conn, + paid_ticket: paid_ticket + } do + {:ok, index_live, html} = live(conn, ~p"/tickets/paid") + + assert html =~ "Listing Paid Tickets" + assert html =~ paid_ticket.name + + assert index_live + |> element("#send-email-#{paid_ticket.id}", "Send Email") + |> render_click() =~ "Ticket sent successfully" + end + end +end diff --git a/test/elixir_conf_africa_web/live/refunded_ticket_live_test.exs b/test/elixir_conf_africa_web/live/refunded_ticket_live_test.exs new file mode 100644 index 0000000..847cf73 --- /dev/null +++ b/test/elixir_conf_africa_web/live/refunded_ticket_live_test.exs @@ -0,0 +1,53 @@ +defmodule ElixirConfAfricaWeb.RefundedTicketLiveTest do + use ElixirConfAfricaWeb.ConnCase + + import Phoenix.LiveViewTest + alias ElixirConfAfrica.Factory + + describe "Refunded Tickets Tests" do + setup %{conn: conn} do + # sign up first + conn = + post(conn, ~p"/users/register", + method: :create, + user: %{email: "admin@gmail.com", password: "123456", role: "admin"} + ) + + ticket_type = Factory.insert(:ticket_type, name: "some name", price: 400) + + paid_ticket = + Factory.insert(:ticket, + is_paid: true, + is_refunded: false, + name: "some paid name", + ticket_type_id: ticket_type.id + ) + + refunded_ticket = + Factory.insert(:ticket, + is_paid: true, + is_refunded: true, + name: "some refunded name", + ticket_type_id: ticket_type.id + ) + + [ + paid_ticket: paid_ticket, + refunded_ticket: refunded_ticket, + conn: conn + ] + end + + test "you see the refunded tickets on /tickets/refunded", %{ + conn: conn, + paid_ticket: paid_ticket, + refunded_ticket: refunded_ticket + } do + {:ok, _index_live, html} = live(conn, ~p"/tickets/refunded") + + assert html =~ "Listing Refunded Tickets" + assert html =~ refunded_ticket.name + refute html =~ paid_ticket.name + end + end +end diff --git a/test/elixir_conf_africa_web/live/success_live_test.exs b/test/elixir_conf_africa_web/live/success_live_test.exs new file mode 100644 index 0000000..ba94b5e --- /dev/null +++ b/test/elixir_conf_africa_web/live/success_live_test.exs @@ -0,0 +1,55 @@ +defmodule ElixirConfAfricaWeb.SuccessLiveTest do + use ElixirConfAfricaWeb.ConnCase + + import Phoenix.LiveViewTest + alias ElixirConfAfrica.Factory + alias ElixirConfAfrica.Paystack + + describe "Tests the Success Redirect URL that you are redirected to" do + setup do + ticket_type = Factory.insert(:ticket_type, name: "some name", price: 400) + + %{"reference" => reference} = + Paystack.initialize("michaelmunavu83@gmail.com", 400) + + Factory.insert(:ticket, + is_paid: true, + is_refunded: false, + name: "some paid name", + ticket_type_id: ticket_type.id, + ticketid: reference + ) + + [ + reference: reference + ] + end + + test "you see a button to go back to the tickets page if the payment is not successful", %{ + reference: reference, + conn: conn + } do + {:ok, _index_live, html} = + live(conn, ~p"/success?trxref=#{reference}") + + assert html =~ "Payment was unsuccessful , go back to the tickets and purchase" + assert html =~ "Back to Tickets Page" + end + + test "the button for tickets page takes you back to the tickets page", %{ + reference: reference, + conn: conn + } do + {:ok, index_live, _html} = + live(conn, ~p"/success?trxref=#{reference}") + + {:ok, _index_live, html} = + index_live + |> element("a", "Back to Tickets Page") + |> render_click() + |> follow_redirect(conn) + + assert html =~ "Available Tickets" + end + end +end diff --git a/test/elixir_conf_africa_web/live/ticket_show_live_test.exs b/test/elixir_conf_africa_web/live/ticket_show_live_test.exs new file mode 100644 index 0000000..f316f49 --- /dev/null +++ b/test/elixir_conf_africa_web/live/ticket_show_live_test.exs @@ -0,0 +1,38 @@ +defmodule ElixirConfAfricaWeb.TicketShowLiveTest do + use ElixirConfAfricaWeb.ConnCase + + import Phoenix.LiveViewTest + alias ElixirConfAfrica.Factory + + describe "Tests The Ticket Show Page" do + setup do + ticket_type = Factory.insert(:ticket_type, name: "some name", price: 400) + + ticket = + Factory.insert(:ticket, + is_paid: true, + is_refunded: false, + name: "some paid name", + ticket_type_id: ticket_type.id, + ticketid: "some-ticket-id" + ) + + [ + ticket: ticket + ] + end + + test "you see the ticket details on /tickets/:id", %{ticket: ticket, conn: conn} do + {:ok, _index_live, html} = live(conn, ~p"/tickets/#{ticket.ticketid}") + + assert html =~ ticket.name + assert html =~ ticket.email + end + + test "you see a qr code on the ticket show page", %{ticket: ticket, conn: conn} do + {:ok, index_live, _html} = live(conn, ~p"/tickets/#{ticket.ticketid}") + + assert has_element?(index_live, "#qrcode") + end + end +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 ee47ce3..e2be8ef 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,29 +2,34 @@ defmodule ElixirConfAfricaWeb.TicketTypeLiveTest do use ElixirConfAfricaWeb.ConnCase import Phoenix.LiveViewTest - import ElixirConfAfrica.Factory - @create_attrs %{ - name: "some name", - description: "some description", - price: "120.5", - number: "357" - } + alias ElixirConfAfrica.Factory + @update_attrs %{ name: "some updated name", description: "some updated description", - price: "456.7", - number: "579" + price: 43, + number: 50 } - @invalid_attrs %{name: nil, description: nil, price: nil, number: nil} - - 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 + @invalid_attrs %{name: nil, description: nil, price: nil} describe "Index" do + setup %{conn: conn} do + # sign up first + conn = + post(conn, ~p"/users/register", + method: :create, + user: %{email: "admin@gmail.com", password: "123456", role: "admin"} + ) + + ticket_type = Factory.insert(:ticket_type) + + [ + ticket_type: ticket_type, + conn: conn + ] + end + test "lists all ticket_types", %{conn: conn, ticket_type: ticket_type} do {:ok, _index_live, html} = live(conn, ~p"/ticket_types") @@ -32,11 +37,11 @@ defmodule ElixirConfAfricaWeb.TicketTypeLiveTest do assert html =~ ticket_type.name end - test "saves new ticket_type", %{conn: conn, event: event} do + test "saves new ticket_type", %{conn: conn} do {:ok, index_live, _html} = live(conn, ~p"/ticket_types") - assert index_live |> element("a", "New Ticket type") |> render_click() =~ - "New Ticket type" + assert index_live |> element("a", "New Ticket Type") |> render_click() =~ + "New Ticket Type" assert_patch(index_live, ~p"/ticket_types/new") @@ -44,24 +49,28 @@ defmodule ElixirConfAfricaWeb.TicketTypeLiveTest do |> form("#ticket_type-form", ticket_type: @invalid_attrs) |> render_change() =~ "can't be blank" - assert index_live - |> form("#ticket_type-form", - ticket_type: Map.merge(@create_attrs, %{event_id: event.id}) - ) - |> render_submit() - - assert_patch(index_live, ~p"/ticket_types") + {:ok, _, html} = + index_live + |> form("#ticket_type-form", + ticket_type: %{ + name: "early bird", + description: "some description", + price: 42, + number: 49 + } + ) + |> render_submit() + |> follow_redirect(conn, ~p"/ticket_types") - html = render(index_live) assert html =~ "Ticket type created successfully" - assert html =~ "some name" + assert html =~ "early bird" end test "updates ticket_type in listing", %{conn: conn, ticket_type: ticket_type} do {:ok, index_live, _html} = live(conn, ~p"/ticket_types") - assert index_live |> element("#ticket_types-#{ticket_type.id} a", "Edit") |> render_click() =~ - "Edit Ticket type" + assert index_live |> element("#ticket_types-#{ticket_type.id}", "Edit") |> render_click() =~ + "Edit" assert_patch(index_live, ~p"/ticket_types/#{ticket_type}/edit") @@ -69,13 +78,12 @@ defmodule ElixirConfAfricaWeb.TicketTypeLiveTest do |> form("#ticket_type-form", ticket_type: @invalid_attrs) |> render_change() =~ "can't be blank" - assert index_live - |> form("#ticket_type-form", ticket_type: @update_attrs) - |> render_submit() - - assert_patch(index_live, ~p"/ticket_types") + {:ok, _, html} = + index_live + |> form("#ticket_type-form", ticket_type: @update_attrs) + |> render_submit() + |> follow_redirect(conn, ~p"/ticket_types") - html = render(index_live) assert html =~ "Ticket type updated successfully" assert html =~ "some updated name" end @@ -83,43 +91,8 @@ defmodule ElixirConfAfricaWeb.TicketTypeLiveTest do test "deletes ticket_type in listing", %{conn: conn, ticket_type: ticket_type} do {:ok, index_live, _html} = live(conn, ~p"/ticket_types") - assert index_live - |> element("#ticket_types-#{ticket_type.id} a", "Delete") - |> render_click() - - refute has_element?(index_live, "#ticket_types-#{ticket_type.id}") - end - end - - describe "Show" do - test "displays ticket_type", %{conn: conn, ticket_type: ticket_type} do - {:ok, _show_live, html} = live(conn, ~p"/ticket_types/#{ticket_type}") - - assert html =~ "Show Ticket type" - assert html =~ ticket_type.name - end - - test "updates ticket_type within modal", %{conn: conn, ticket_type: ticket_type} do - {:ok, show_live, _html} = live(conn, ~p"/ticket_types/#{ticket_type}") - - assert show_live |> element("a", "Edit") |> render_click() =~ - "Edit Ticket type" - - assert_patch(show_live, ~p"/ticket_types/#{ticket_type}/show/edit") - - assert show_live - |> form("#ticket_type-form", ticket_type: @invalid_attrs) - |> render_change() =~ "can't be blank" - - assert show_live - |> form("#ticket_type-form", ticket_type: @update_attrs) - |> render_submit() - - assert_patch(show_live, ~p"/ticket_types/#{ticket_type}") - - html = render(show_live) - assert html =~ "Ticket type updated successfully" - assert html =~ "some updated name" + assert index_live |> element("#ticket_type-#{ticket_type.id} a", "Delete") |> render_click() + refute has_element?(index_live, "#ticket_type-#{ticket_type.id}") end end end diff --git a/test/elixir_conf_africa_web/live/transaction_live_test.exs b/test/elixir_conf_africa_web/live/transaction_live_test.exs new file mode 100644 index 0000000..cc2e753 --- /dev/null +++ b/test/elixir_conf_africa_web/live/transaction_live_test.exs @@ -0,0 +1,42 @@ +defmodule ElixirConfAfricaWeb.TransactionLiveTest do + use ElixirConfAfricaWeb.ConnCase + + import Phoenix.LiveViewTest + + alias ElixirConfAfrica.Paystack + + describe "This page lists all transactions made" do + setup %{conn: conn} do + # sign up first + conn = + post(conn, ~p"/users/register", + method: :create, + user: %{email: "admin@gmail.com", password: "123456", role: "admin"} + ) + + %{"reference" => reference1} = + Paystack.initialize("michaelmunavu83@gmail.com", 400) + + %{"reference" => reference2} = + Paystack.initialize("michaelmunavu83@gmail.com", 400) + + [ + reference1: reference1, + reference2: reference2, + conn: conn + ] + end + + test "on /transactions , you see all the transactions made", %{ + conn: conn, + reference1: reference1, + reference2: reference2 + } do + {:ok, _index_live, html} = live(conn, ~p"/transactions") + + assert html =~ "Listing Transactions" + assert html =~ reference1 + assert html =~ reference2 + end + end +end diff --git a/test/elixir_conf_africa_web/live/unpaid_ticket_live_test.exs b/test/elixir_conf_africa_web/live/unpaid_ticket_live_test.exs new file mode 100644 index 0000000..d15448b --- /dev/null +++ b/test/elixir_conf_africa_web/live/unpaid_ticket_live_test.exs @@ -0,0 +1,62 @@ +defmodule ElixirConfAfricaWeb.UnpaidTicketLiveTest do + use ElixirConfAfricaWeb.ConnCase + + import Phoenix.LiveViewTest + alias ElixirConfAfrica.Factory + alias ElixirConfAfrica.Paystack + + describe "Unpaid Tickets Tests" do + setup %{conn: conn} do + # sign up first + conn = + post(conn, ~p"/users/register", + method: :create, + user: %{email: "admin@gmail.com", password: "123456", role: "admin"} + ) + + ticket_type = Factory.insert(:ticket_type, name: "some name", price: 400) + + %{"reference" => reference} = + Paystack.initialize("michaelmunavu83@gmail.com", 400) + + paid_ticket = + Factory.insert(:ticket, + is_paid: true, + is_refunded: false, + name: "some paid name", + ticketid: reference, + ticket_type_id: ticket_type.id + ) + + %{"reference" => reference} = + Paystack.initialize("michaelmunavu83@gmail.com", 400) + + unpaid_ticket = + Factory.insert(:ticket, + is_paid: false, + is_refunded: false, + name: "some unpaid name", + ticketid: reference, + ticket_type_id: ticket_type.id + ) + + [ + paid_ticket: paid_ticket, + unpaid_ticket: unpaid_ticket, + conn: conn + ] + end + + test "you see the unpaid tickets on /tickets/unpaid", %{ + conn: conn, + paid_ticket: paid_ticket, + unpaid_ticket: unpaid_ticket + } do + {:ok, _index_live, html} = live(conn, ~p"/tickets/unpaid") + + assert html =~ "Listing Unpaid Tickets" + assert html =~ unpaid_ticket.name + refute html =~ paid_ticket.name + end + end +end diff --git a/test/elixir_conf_africa_web/live/user_live_test.exs b/test/elixir_conf_africa_web/live/user_live_test.exs new file mode 100644 index 0000000..d13c2ad --- /dev/null +++ b/test/elixir_conf_africa_web/live/user_live_test.exs @@ -0,0 +1,83 @@ +defmodule ElixirConfAfricaWeb.UserLiveTest do + use ElixirConfAfricaWeb.ConnCase + + import Phoenix.LiveViewTest + + alias ElixirConfAfrica.Factory + + describe "System Users Page" do + setup %{conn: conn} do + # sign up first + conn = + post(conn, ~p"/users/register", + method: :create, + user: %{email: "admin@gmail.com", password: "123456", role: "admin"} + ) + + user_1 = + Factory.insert(:user, email: "test1@gmail.com", hashed_password: "123456", role: "user") + + scanner_1 = + Factory.insert(:user, + email: "test2@gmail.com", + hashed_password: "123456", + role: "scanner" + ) + + admin_1 = + Factory.insert(:user, email: "admin2@gmail.com", hashed_password: "123456", role: "admin") + + [ + conn: conn, + user_1: user_1, + scanner_1: scanner_1, + admin_1: admin_1 + ] + end + + test "on /users you see all users apart from the current user", %{ + conn: conn, + user_1: user_1, + scanner_1: scanner_1, + admin_1: admin_1 + } do + {:ok, _index_live, html} = live(conn, ~p"/users") + + assert html =~ "Listing Users" + assert html =~ user_1.email + assert html =~ scanner_1.email + assert html =~ admin_1.email + end + + test "for admin users , you can only see a button to make the user a normal user or scanner and not to make them an admin", + %{ + conn: conn, + admin_1: admin_1 + } do + {:ok, index_live, _html} = live(conn, ~p"/users") + + assert has_element?(index_live, "#make-user-#{admin_1.id}") + assert has_element?(index_live, "#make-scanner-#{admin_1.id}") + refute has_element?(index_live, "#make-admin-#{admin_1.id}") + end + + test "you can change a users role when you click a button", %{ + conn: conn, + admin_1: admin_1 + } do + {:ok, index_live, _html} = live(conn, ~p"/users") + + assert has_element?(index_live, "#role-#{admin_1.id}", admin_1.role) + + html = + index_live + |> element("#make-user-#{admin_1.id}") + |> render_click() + + assert html =~ "User role changed successfully" + + assert has_element?(index_live, "#role-#{admin_1.id}", "user") + refute has_element?(index_live, "#role-#{admin_1.id}", admin_1.role) + end + end +end diff --git a/test/support/factory.ex b/test/support/factory.ex index 8fc7e86..f5da8a3 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -1,32 +1,33 @@ defmodule ElixirConfAfrica.Factory do @moduledoc false - alias ElixirConfAfrica.Repo + use ExMachina.Ecto, repo: ElixirConfAfrica.Repo - def build(:elixir_conf_event) do - %ElixirConfAfrica.Events.Event{ - name: "ElixirConf Africa 2024", - 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] - } - end + alias ElixirConfAfrica.Tickets.Ticket + alias ElixirConfAfrica.TicketTypes.TicketType + alias ElixirConfAfrica.Accounts.User - def build(:elixir_conf_ticket_type) do - %ElixirConfAfrica.TicketTypes.TicketType{ + def ticket_type_factory do + %TicketType{ name: "some name", description: "some description", - price: Decimal.new("120.5"), - number: 357 + price: 42, + number: 49 } end - def build(factory_name, attributes) do - factory_name |> build() |> struct!(attributes) + def ticket_factory do + %Ticket{ + ticketid: Integer.to_string(System.unique_integer([:positive])), + email: sequence(:email, fn n -> "email-#{n}@example" end), + cost: 400, + quantity: 1 + } end - def insert!(factory_name, attributes \\ []) do - factory_name |> build(attributes) |> Repo.insert!() + def user_factory do + %User{ + email: "some email", + password: "some password" + } end end