diff --git a/apps/fz_http/lib/fz_http_web/router.ex b/apps/fz_http/lib/fz_http_web/router.ex index c25b52b97..b5e8c54b4 100644 --- a/apps/fz_http/lib/fz_http_web/router.ex +++ b/apps/fz_http/lib/fz_http_web/router.ex @@ -210,7 +210,7 @@ defmodule FzHttpWeb.Router do get "/config.xml", BrowserController, :config end - if Mix.env() == :dev do + if Mix.env() in [:dev, :test] do import Phoenix.LiveDashboard.Router scope "/dev" do diff --git a/apps/fz_http/test/fz_http_web/acceptance/authentication_test.exs b/apps/fz_http/test/fz_http_web/acceptance/authentication_test.exs index 57c3595d1..ccc0b6bc0 100644 --- a/apps/fz_http/test/fz_http_web/acceptance/authentication_test.exs +++ b/apps/fz_http/test/fz_http_web/acceptance/authentication_test.exs @@ -50,6 +50,52 @@ defmodule FzHttpWeb.Acceptance.AuthenticationTest do |> assert_path("/user_devices") |> Auth.assert_authenticated(user) end + + feature "can not reset password using invalid email", %{session: session} do + UsersFixtures.create_user_with_role(:unprivileged) + + session + |> visit(~p"/") + |> assert_el(Query.link("Sign in with email")) + |> click(Query.link("Sign in with email")) + |> assert_el(Query.link("Forgot password")) + |> click(Query.link("Forgot password")) + |> assert_el(Query.text("Reset Password")) + |> fill_form(%{"email" => "foo@bar.com"}) + |> click(Query.button("Send")) + |> assert_el(Query.text("Reset Password")) + |> visit(~p"/dev/mailbox") + |> assert_el(Query.text("Empty mailbox...")) + end + + feature "can reset password using email link", %{session: session} do + user = UsersFixtures.create_user_with_role(:unprivileged) + + session = + session + |> visit(~p"/") + |> assert_el(Query.link("Sign in with email")) + |> click(Query.link("Sign in with email")) + |> assert_el(Query.link("Forgot password")) + |> click(Query.link("Forgot password")) + |> assert_el(Query.text("Reset Password")) + |> fill_form(%{ + "email" => user.email + }) + |> click(Query.button("Send")) + |> assert_el(Query.text("Please check your inbox for the magic link.")) + |> visit(~p"/dev/mailbox") + |> click(Query.link("Firezone Magic Link")) + |> assert_el(Query.text("HTML body preview:")) + + email_text = text(session, Query.css(".body-text")) + [link] = Regex.run(~r|http://localhost[^ ]*|, email_text) + + session + |> visit(link) + |> assert_el(Query.text("Your Devices")) + |> assert_el(Query.text("Signed in as #{user.email}.")) + end end describe "using OIDC provider" do @@ -347,7 +393,9 @@ defmodule FzHttpWeb.Acceptance.AuthenticationTest do defp password_login_flow(session, email, password) do session |> visit(~p"/") + |> assert_el(Query.link("Sign in with email")) |> click(Query.link("Sign in with email")) + |> assert_el(Query.text("Sign In")) |> fill_form(%{ "Email" => email, "Password" => password diff --git a/apps/fz_http/test/support/mailer_test_adapter.ex b/apps/fz_http/test/support/mailer_test_adapter.ex new file mode 100644 index 000000000..6df57393f --- /dev/null +++ b/apps/fz_http/test/support/mailer_test_adapter.ex @@ -0,0 +1,15 @@ +defmodule FzHttpWeb.MailerTestAdapter do + use Swoosh.Adapter + + @impl true + def deliver(email, config) do + Swoosh.Adapters.Local.deliver(email, config) + Swoosh.Adapters.Test.deliver(email, config) + end + + @impl true + def deliver_many(emails, config) do + Swoosh.Adapters.Local.deliver_many(emails, config) + Swoosh.Adapters.Test.deliver_many(emails, config) + end +end diff --git a/config/test.exs b/config/test.exs index 730ce1199..387de70c2 100644 --- a/config/test.exs +++ b/config/test.exs @@ -53,7 +53,9 @@ config :ueberauth, Ueberauth, identity: {Ueberauth.Strategy.Identity, [callback_methods: ["POST"], uid_field: :email]} ] -config :fz_http, FzHttpWeb.Mailer, adapter: Swoosh.Adapters.Test, from_email: "test@firez.one" +config :fz_http, FzHttpWeb.Mailer, + adapter: FzHttpWeb.MailerTestAdapter, + from_email: "test@firez.one" config :fz_vpn, # XXX: Bump test coverage by adding a stubbed out module for FzVpn.StatsPushService