update tests
This commit is contained in:
		| @@ -1,9 +1,14 @@ | |||||||
| defmodule Lokal.AccountsTest do | defmodule Lokal.AccountsTest do | ||||||
|   use Lokal.DataCase |   @moduledoc """ | ||||||
|  |   This tests the accounts module | ||||||
|  |   """ | ||||||
|  |  | ||||||
|  |   use Lokal.DataCase | ||||||
|   alias Lokal.Accounts |   alias Lokal.Accounts | ||||||
|   import Lokal.AccountsFixtures |  | ||||||
|   alias Lokal.Accounts.{User, UserToken} |   alias Lokal.Accounts.{User, UserToken} | ||||||
|  |   alias Ecto.Changeset | ||||||
|  |  | ||||||
|  |   @moduletag :accounts_test | ||||||
|  |  | ||||||
|   describe "get_user_by_email/1" do |   describe "get_user_by_email/1" do | ||||||
|     test "does not return the user if the email does not exist" do |     test "does not return the user if the email does not exist" do | ||||||
| @@ -58,7 +63,8 @@ defmodule Lokal.AccountsTest do | |||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "validates email and password when given" do |     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" => "not valid"}) | ||||||
|  |  | ||||||
|       assert %{ |       assert %{ | ||||||
|                email: ["must have the @ sign and no spaces"], |                email: ["must have the @ sign and no spaces"], | ||||||
| @@ -68,24 +74,27 @@ defmodule Lokal.AccountsTest do | |||||||
|  |  | ||||||
|     test "validates maximum values for email and password for security" do |     test "validates maximum values for email and password for security" do | ||||||
|       too_long = String.duplicate("db", 100) |       too_long = String.duplicate("db", 100) | ||||||
|       {:error, changeset} = Accounts.register_user(%{email: too_long, password: too_long}) |       {:error, changeset} = Accounts.register_user(%{"email" => too_long, "password" => too_long}) | ||||||
|       assert "should be at most 160 character(s)" in errors_on(changeset).email |       assert "should be at most 160 character(s)" in errors_on(changeset).email | ||||||
|       assert "should be at most 80 character(s)" in errors_on(changeset).password |       assert "should be at most 80 character(s)" in errors_on(changeset).password | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "validates email uniqueness" do |     test "validates email uniqueness" do | ||||||
|       %{email: email} = user_fixture() |       %{email: email} = user_fixture() | ||||||
|       {:error, changeset} = Accounts.register_user(%{email: email}) |       {:error, changeset} = Accounts.register_user(%{"email" => email}) | ||||||
|       assert "has already been taken" in errors_on(changeset).email |       assert "has already been taken" in errors_on(changeset).email | ||||||
|  |  | ||||||
|       # Now try with the upper cased email too, to check that email case is ignored. |       # Now try with the upper cased email too, to check that email case is ignored. | ||||||
|       {:error, changeset} = Accounts.register_user(%{email: String.upcase(email)}) |       {:error, changeset} = Accounts.register_user(%{"email" => String.upcase(email)}) | ||||||
|       assert "has already been taken" in errors_on(changeset).email |       assert "has already been taken" in errors_on(changeset).email | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "registers users with a hashed password" do |     test "registers users with a hashed password" do | ||||||
|       email = unique_user_email() |       email = unique_user_email() | ||||||
|       {:ok, user} = Accounts.register_user(%{email: email, password: valid_user_password()}) |  | ||||||
|  |       {:ok, user} = | ||||||
|  |         Accounts.register_user(%{"email" => email, "password" => valid_user_password()}) | ||||||
|  |  | ||||||
|       assert user.email == email |       assert user.email == email | ||||||
|       assert is_binary(user.hashed_password) |       assert is_binary(user.hashed_password) | ||||||
|       assert is_nil(user.confirmed_at) |       assert is_nil(user.confirmed_at) | ||||||
| @@ -95,7 +104,7 @@ defmodule Lokal.AccountsTest do | |||||||
|  |  | ||||||
|   describe "change_user_registration/2" do |   describe "change_user_registration/2" do | ||||||
|     test "returns a changeset" do |     test "returns a changeset" do | ||||||
|       assert %Ecto.Changeset{} = changeset = Accounts.change_user_registration(%User{}) |       assert %Changeset{} = changeset = Accounts.change_user_registration(%User{}) | ||||||
|       assert changeset.required == [:password, :email] |       assert changeset.required == [:password, :email] | ||||||
|     end |     end | ||||||
|  |  | ||||||
| @@ -115,7 +124,7 @@ defmodule Lokal.AccountsTest do | |||||||
|  |  | ||||||
|   describe "change_user_email/2" do |   describe "change_user_email/2" do | ||||||
|     test "returns a user changeset" do |     test "returns a user changeset" do | ||||||
|       assert %Ecto.Changeset{} = changeset = Accounts.change_user_email(%User{}) |       assert %Changeset{} = changeset = Accounts.change_user_email(%User{}) | ||||||
|       assert changeset.required == [:email] |       assert changeset.required == [:email] | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| @@ -132,7 +141,7 @@ defmodule Lokal.AccountsTest do | |||||||
|  |  | ||||||
|     test "validates email", %{user: user} do |     test "validates email", %{user: user} do | ||||||
|       {:error, changeset} = |       {:error, changeset} = | ||||||
|         Accounts.apply_user_email(user, valid_user_password(), %{email: "not valid"}) |         Accounts.apply_user_email(user, valid_user_password(), %{"email" => "not valid"}) | ||||||
|  |  | ||||||
|       assert %{email: ["must have the @ sign and no spaces"]} = errors_on(changeset) |       assert %{email: ["must have the @ sign and no spaces"]} = errors_on(changeset) | ||||||
|     end |     end | ||||||
| @@ -141,7 +150,7 @@ defmodule Lokal.AccountsTest do | |||||||
|       too_long = String.duplicate("db", 100) |       too_long = String.duplicate("db", 100) | ||||||
|  |  | ||||||
|       {:error, changeset} = |       {:error, changeset} = | ||||||
|         Accounts.apply_user_email(user, valid_user_password(), %{email: too_long}) |         Accounts.apply_user_email(user, valid_user_password(), %{"email" => too_long}) | ||||||
|  |  | ||||||
|       assert "should be at most 160 character(s)" in errors_on(changeset).email |       assert "should be at most 160 character(s)" in errors_on(changeset).email | ||||||
|     end |     end | ||||||
| @@ -150,21 +159,21 @@ defmodule Lokal.AccountsTest do | |||||||
|       %{email: email} = user_fixture() |       %{email: email} = user_fixture() | ||||||
|  |  | ||||||
|       {:error, changeset} = |       {:error, changeset} = | ||||||
|         Accounts.apply_user_email(user, valid_user_password(), %{email: email}) |         Accounts.apply_user_email(user, valid_user_password(), %{"email" => email}) | ||||||
|  |  | ||||||
|       assert "has already been taken" in errors_on(changeset).email |       assert "has already been taken" in errors_on(changeset).email | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "validates current password", %{user: user} do |     test "validates current password", %{user: user} do | ||||||
|       {:error, changeset} = |       {:error, changeset} = | ||||||
|         Accounts.apply_user_email(user, "invalid", %{email: unique_user_email()}) |         Accounts.apply_user_email(user, "invalid", %{"email" => unique_user_email()}) | ||||||
|  |  | ||||||
|       assert %{current_password: ["is not valid"]} = errors_on(changeset) |       assert %{current_password: ["is not valid"]} = errors_on(changeset) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "applies the email without persisting it", %{user: user} do |     test "applies the email without persisting it", %{user: user} do | ||||||
|       email = unique_user_email() |       email = unique_user_email() | ||||||
|       {:ok, user} = Accounts.apply_user_email(user, valid_user_password(), %{email: email}) |       {:ok, user} = Accounts.apply_user_email(user, valid_user_password(), %{"email" => email}) | ||||||
|       assert user.email == email |       assert user.email == email | ||||||
|       assert Accounts.get_user!(user.id).email != email |       assert Accounts.get_user!(user.id).email != email | ||||||
|     end |     end | ||||||
| @@ -234,7 +243,7 @@ defmodule Lokal.AccountsTest do | |||||||
|  |  | ||||||
|   describe "change_user_password/2" do |   describe "change_user_password/2" do | ||||||
|     test "returns a user changeset" do |     test "returns a user changeset" do | ||||||
|       assert %Ecto.Changeset{} = changeset = Accounts.change_user_password(%User{}) |       assert %Changeset{} = changeset = Accounts.change_user_password(%User{}) | ||||||
|       assert changeset.required == [:password] |       assert changeset.required == [:password] | ||||||
|     end |     end | ||||||
|  |  | ||||||
| @@ -258,8 +267,8 @@ defmodule Lokal.AccountsTest do | |||||||
|     test "validates password", %{user: user} do |     test "validates password", %{user: user} do | ||||||
|       {:error, changeset} = |       {:error, changeset} = | ||||||
|         Accounts.update_user_password(user, valid_user_password(), %{ |         Accounts.update_user_password(user, valid_user_password(), %{ | ||||||
|           password: "not valid", |           "password" => "not valid", | ||||||
|           password_confirmation: "another" |           "password_confirmation" => "another" | ||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       assert %{ |       assert %{ | ||||||
| @@ -272,14 +281,14 @@ defmodule Lokal.AccountsTest do | |||||||
|       too_long = String.duplicate("db", 100) |       too_long = String.duplicate("db", 100) | ||||||
|  |  | ||||||
|       {:error, changeset} = |       {:error, changeset} = | ||||||
|         Accounts.update_user_password(user, valid_user_password(), %{password: too_long}) |         Accounts.update_user_password(user, valid_user_password(), %{"password" => too_long}) | ||||||
|  |  | ||||||
|       assert "should be at most 80 character(s)" in errors_on(changeset).password |       assert "should be at most 80 character(s)" in errors_on(changeset).password | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "validates current password", %{user: user} do |     test "validates current password", %{user: user} do | ||||||
|       {:error, changeset} = |       {:error, changeset} = | ||||||
|         Accounts.update_user_password(user, "invalid", %{password: valid_user_password()}) |         Accounts.update_user_password(user, "invalid", %{"password" => valid_user_password()}) | ||||||
|  |  | ||||||
|       assert %{current_password: ["is not valid"]} = errors_on(changeset) |       assert %{current_password: ["is not valid"]} = errors_on(changeset) | ||||||
|     end |     end | ||||||
| @@ -287,7 +296,7 @@ defmodule Lokal.AccountsTest do | |||||||
|     test "updates the password", %{user: user} do |     test "updates the password", %{user: user} do | ||||||
|       {:ok, user} = |       {:ok, user} = | ||||||
|         Accounts.update_user_password(user, valid_user_password(), %{ |         Accounts.update_user_password(user, valid_user_password(), %{ | ||||||
|           password: "new valid password" |           "password" => "new valid password" | ||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       assert is_nil(user.password) |       assert is_nil(user.password) | ||||||
| @@ -299,7 +308,7 @@ defmodule Lokal.AccountsTest do | |||||||
|  |  | ||||||
|       {:ok, _} = |       {:ok, _} = | ||||||
|         Accounts.update_user_password(user, valid_user_password(), %{ |         Accounts.update_user_password(user, valid_user_password(), %{ | ||||||
|           password: "new valid password" |           "password" => "new valid password" | ||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       refute Repo.get_by(UserToken, user_id: user.id) |       refute Repo.get_by(UserToken, user_id: user.id) | ||||||
| @@ -467,8 +476,8 @@ defmodule Lokal.AccountsTest do | |||||||
|     test "validates password", %{user: user} do |     test "validates password", %{user: user} do | ||||||
|       {:error, changeset} = |       {:error, changeset} = | ||||||
|         Accounts.reset_user_password(user, %{ |         Accounts.reset_user_password(user, %{ | ||||||
|           password: "not valid", |           "password" => "not valid", | ||||||
|           password_confirmation: "another" |           "password_confirmation" => "another" | ||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       assert %{ |       assert %{ | ||||||
| @@ -479,19 +488,21 @@ defmodule Lokal.AccountsTest do | |||||||
|  |  | ||||||
|     test "validates maximum values for password for security", %{user: user} do |     test "validates maximum values for password for security", %{user: user} do | ||||||
|       too_long = String.duplicate("db", 100) |       too_long = String.duplicate("db", 100) | ||||||
|       {:error, changeset} = Accounts.reset_user_password(user, %{password: too_long}) |       {:error, changeset} = Accounts.reset_user_password(user, %{"password" => too_long}) | ||||||
|       assert "should be at most 80 character(s)" in errors_on(changeset).password |       assert "should be at most 80 character(s)" in errors_on(changeset).password | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "updates the password", %{user: user} do |     test "updates the password", %{user: user} do | ||||||
|       {:ok, updated_user} = Accounts.reset_user_password(user, %{password: "new valid password"}) |       {:ok, updated_user} = | ||||||
|  |         Accounts.reset_user_password(user, %{"password" => "new valid password"}) | ||||||
|  |  | ||||||
|       assert is_nil(updated_user.password) |       assert is_nil(updated_user.password) | ||||||
|       assert Accounts.get_user_by_email_and_password(user.email, "new valid password") |       assert Accounts.get_user_by_email_and_password(user.email, "new valid password") | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "deletes all tokens for the given user", %{user: user} do |     test "deletes all tokens for the given user", %{user: user} do | ||||||
|       _ = Accounts.generate_user_session_token(user) |       _ = Accounts.generate_user_session_token(user) | ||||||
|       {:ok, _} = Accounts.reset_user_password(user, %{password: "new valid password"}) |       {:ok, _} = Accounts.reset_user_password(user, %{"password" => "new valid password"}) | ||||||
|       refute Repo.get_by(UserToken, user_id: user.id) |       refute Repo.get_by(UserToken, user_id: user.id) | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|   | |||||||
							
								
								
									
										76
									
								
								test/lokal/invites_text.exs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								test/lokal/invites_text.exs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | |||||||
|  | defmodule Lokal.InvitesTest do | ||||||
|  |   @moduledoc """ | ||||||
|  |   This module tests the Invites context | ||||||
|  |   """ | ||||||
|  |  | ||||||
|  |   use Lokal.DataCase | ||||||
|  |   alias Lokal.{Invites, Invites.Invite} | ||||||
|  |   alias Ecto.Changeset | ||||||
|  |  | ||||||
|  |   @moduletag :invites_test | ||||||
|  |  | ||||||
|  |   @valid_attrs %{ | ||||||
|  |     "name" => "some name", | ||||||
|  |     "token" => "some token" | ||||||
|  |   } | ||||||
|  |   @update_attrs %{ | ||||||
|  |     "name" => "some updated name", | ||||||
|  |     "token" => "some updated token" | ||||||
|  |   } | ||||||
|  |   @invalid_attrs %{ | ||||||
|  |     "name" => nil, | ||||||
|  |     "token" => nil | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   describe "invites" do | ||||||
|  |     setup do | ||||||
|  |       current_user = admin_fixture() | ||||||
|  |       {:ok, invite} = Invites.create_invite(current_user, @valid_attrs) | ||||||
|  |       [invite: invite, current_user: current_user] | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     test "list_invites/0 returns all invites", %{invite: invite, current_user: current_user} do | ||||||
|  |       assert Invites.list_invites(current_user) == [invite] | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     test "get_invite!/1 returns the invite with given id", | ||||||
|  |          %{invite: invite, current_user: current_user} do | ||||||
|  |       assert Invites.get_invite!(invite.id, current_user) == invite | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     test "create_invite/1 with valid data creates a invite", | ||||||
|  |          %{current_user: current_user} do | ||||||
|  |       assert {:ok, %Invite{} = invite} = Invites.create_invite(current_user, @valid_attrs) | ||||||
|  |       assert invite.name == "some name" | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     test "create_invite/1 with invalid data returns error changeset", | ||||||
|  |          %{current_user: current_user} do | ||||||
|  |       assert {:error, %Changeset{}} = Invites.create_invite(current_user, @invalid_attrs) | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     test "update_invite/2 with valid data updates the invite", | ||||||
|  |          %{invite: invite, current_user: current_user} do | ||||||
|  |       assert {:ok, %Invite{} = new_invite} = | ||||||
|  |                Invites.update_invite(invite, @update_attrs, current_user) | ||||||
|  |  | ||||||
|  |       assert new_invite.name == "some updated name" | ||||||
|  |       assert new_invite.token == new_invite.token | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     test "update_invite/2 with invalid data returns error changeset", | ||||||
|  |          %{invite: invite, current_user: current_user} do | ||||||
|  |       assert {:error, %Changeset{}} = Invites.update_invite(invite, @invalid_attrs, current_user) | ||||||
|  |       assert invite == Invites.get_invite!(invite.id, current_user) | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     test "delete_invite/1 deletes the invite", %{invite: invite, current_user: current_user} do | ||||||
|  |       assert {:ok, %Invite{}} = Invites.delete_invite(invite, current_user) | ||||||
|  |       assert_raise Ecto.NoResultsError, fn -> Invites.get_invite!(invite.id, current_user) end | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     test "change_invite/1 returns a invite changeset", %{invite: invite} do | ||||||
|  |       assert %Changeset{} = Invites.change_invite(invite) | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
							
								
								
									
										14
									
								
								test/lokal_web/controllers/home_controller_test.exs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								test/lokal_web/controllers/home_controller_test.exs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | defmodule LokalWeb.HomeControllerTest do | ||||||
|  |   @moduledoc """ | ||||||
|  |   Tests the home page | ||||||
|  |   """ | ||||||
|  |  | ||||||
|  |   use LokalWeb.ConnCase | ||||||
|  |  | ||||||
|  |   @moduletag :home_controller_test | ||||||
|  |  | ||||||
|  |   test "GET /", %{conn: conn} do | ||||||
|  |     conn = get(conn, "/") | ||||||
|  |     assert html_response(conn, 200) =~ "Welcome to Lokal" | ||||||
|  |   end | ||||||
|  | end | ||||||
| @@ -1,10 +1,14 @@ | |||||||
| defmodule LokalWeb.UserAuthTest do | defmodule LokalWeb.UserAuthTest do | ||||||
|   use LokalWeb.ConnCase, async: true |   @moduledoc """ | ||||||
|  |   Tests user auth | ||||||
|  |   """ | ||||||
|  |  | ||||||
|  |   use LokalWeb.ConnCase, async: true | ||||||
|  |   import LokalWeb.Gettext | ||||||
|   alias Lokal.Accounts |   alias Lokal.Accounts | ||||||
|   alias LokalWeb.UserAuth |   alias LokalWeb.UserAuth | ||||||
|   import Lokal.AccountsFixtures |  | ||||||
|  |  | ||||||
|  |   @moduletag :user_auth_test | ||||||
|   @remember_me_cookie "_lokal_web_user_remember_me" |   @remember_me_cookie "_lokal_web_user_remember_me" | ||||||
|  |  | ||||||
|   setup %{conn: conn} do |   setup %{conn: conn} do | ||||||
| @@ -13,30 +17,33 @@ defmodule LokalWeb.UserAuthTest do | |||||||
|       |> Map.replace!(:secret_key_base, LokalWeb.Endpoint.config(:secret_key_base)) |       |> Map.replace!(:secret_key_base, LokalWeb.Endpoint.config(:secret_key_base)) | ||||||
|       |> init_test_session(%{}) |       |> init_test_session(%{}) | ||||||
|  |  | ||||||
|     %{user: user_fixture(), conn: conn} |     [current_user: user_fixture() |> confirm_user(), conn: conn] | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   describe "log_in_user/3" do |   describe "log_in_user/3" do | ||||||
|     test "stores the user token in the session", %{conn: conn, user: user} do |     test "stores the user token in the session", %{conn: conn, current_user: current_user} do | ||||||
|       conn = UserAuth.log_in_user(conn, user) |       conn = UserAuth.log_in_user(conn, current_user) | ||||||
|       assert token = get_session(conn, :user_token) |       assert token = get_session(conn, :user_token) | ||||||
|       assert get_session(conn, :live_socket_id) == "users_sessions:#{Base.url_encode64(token)}" |       assert get_session(conn, :live_socket_id) == "users_sessions:#{Base.url_encode64(token)}" | ||||||
|       assert redirected_to(conn) == "/" |       assert redirected_to(conn) == "/" | ||||||
|       assert Accounts.get_user_by_session_token(token) |       assert Accounts.get_user_by_session_token(token) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "clears everything previously stored in the session", %{conn: conn, user: user} do |     test "clears everything previously stored in the session", | ||||||
|       conn = conn |> put_session(:to_be_removed, "value") |> UserAuth.log_in_user(user) |          %{conn: conn, current_user: current_user} do | ||||||
|  |       conn = conn |> put_session(:to_be_removed, "value") |> UserAuth.log_in_user(current_user) | ||||||
|       refute get_session(conn, :to_be_removed) |       refute get_session(conn, :to_be_removed) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "redirects to the configured path", %{conn: conn, user: user} do |     test "redirects to the configured path", %{conn: conn, current_user: current_user} do | ||||||
|       conn = conn |> put_session(:user_return_to, "/hello") |> UserAuth.log_in_user(user) |       conn = conn |> put_session(:user_return_to, "/hello") |> UserAuth.log_in_user(current_user) | ||||||
|       assert redirected_to(conn) == "/hello" |       assert redirected_to(conn) == "/hello" | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "writes a cookie if remember_me is configured", %{conn: conn, user: user} do |     test "writes a cookie if remember_me is configured", %{conn: conn, current_user: current_user} do | ||||||
|       conn = conn |> fetch_cookies() |> UserAuth.log_in_user(user, %{"remember_me" => "true"}) |       conn = | ||||||
|  |         conn |> fetch_cookies() |> UserAuth.log_in_user(current_user, %{"remember_me" => "true"}) | ||||||
|  |  | ||||||
|       assert get_session(conn, :user_token) == conn.cookies[@remember_me_cookie] |       assert get_session(conn, :user_token) == conn.cookies[@remember_me_cookie] | ||||||
|  |  | ||||||
|       assert %{value: signed_token, max_age: max_age} = conn.resp_cookies[@remember_me_cookie] |       assert %{value: signed_token, max_age: max_age} = conn.resp_cookies[@remember_me_cookie] | ||||||
| @@ -46,8 +53,8 @@ defmodule LokalWeb.UserAuthTest do | |||||||
|   end |   end | ||||||
|  |  | ||||||
|   describe "logout_user/1" do |   describe "logout_user/1" do | ||||||
|     test "erases session and cookies", %{conn: conn, user: user} do |     test "erases session and cookies", %{conn: conn, current_user: current_user} do | ||||||
|       user_token = Accounts.generate_user_session_token(user) |       user_token = Accounts.generate_user_session_token(current_user) | ||||||
|  |  | ||||||
|       conn = |       conn = | ||||||
|         conn |         conn | ||||||
| @@ -86,15 +93,15 @@ defmodule LokalWeb.UserAuthTest do | |||||||
|   end |   end | ||||||
|  |  | ||||||
|   describe "fetch_current_user/2" do |   describe "fetch_current_user/2" do | ||||||
|     test "authenticates user from session", %{conn: conn, user: user} do |     test "authenticates user from session", %{conn: conn, current_user: current_user} do | ||||||
|       user_token = Accounts.generate_user_session_token(user) |       user_token = Accounts.generate_user_session_token(current_user) | ||||||
|       conn = conn |> put_session(:user_token, user_token) |> UserAuth.fetch_current_user([]) |       conn = conn |> put_session(:user_token, user_token) |> UserAuth.fetch_current_user([]) | ||||||
|       assert conn.assigns.current_user.id == user.id |       assert conn.assigns.current_user.id == current_user.id | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "authenticates user from cookies", %{conn: conn, user: user} do |     test "authenticates user from cookies", %{conn: conn, current_user: current_user} do | ||||||
|       logged_in_conn = |       logged_in_conn = | ||||||
|         conn |> fetch_cookies() |> UserAuth.log_in_user(user, %{"remember_me" => "true"}) |         conn |> fetch_cookies() |> UserAuth.log_in_user(current_user, %{"remember_me" => "true"}) | ||||||
|  |  | ||||||
|       user_token = logged_in_conn.cookies[@remember_me_cookie] |       user_token = logged_in_conn.cookies[@remember_me_cookie] | ||||||
|       %{value: signed_token} = logged_in_conn.resp_cookies[@remember_me_cookie] |       %{value: signed_token} = logged_in_conn.resp_cookies[@remember_me_cookie] | ||||||
| @@ -105,11 +112,11 @@ defmodule LokalWeb.UserAuthTest do | |||||||
|         |> UserAuth.fetch_current_user([]) |         |> UserAuth.fetch_current_user([]) | ||||||
|  |  | ||||||
|       assert get_session(conn, :user_token) == user_token |       assert get_session(conn, :user_token) == user_token | ||||||
|       assert conn.assigns.current_user.id == user.id |       assert conn.assigns.current_user.id == current_user.id | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "does not authenticate if data is missing", %{conn: conn, user: user} do |     test "does not authenticate if data is missing", %{conn: conn, current_user: current_user} do | ||||||
|       _ = Accounts.generate_user_session_token(user) |       _ = Accounts.generate_user_session_token(current_user) | ||||||
|       conn = UserAuth.fetch_current_user(conn, []) |       conn = UserAuth.fetch_current_user(conn, []) | ||||||
|       refute get_session(conn, :user_token) |       refute get_session(conn, :user_token) | ||||||
|       refute conn.assigns.current_user |       refute conn.assigns.current_user | ||||||
| @@ -117,8 +124,12 @@ defmodule LokalWeb.UserAuthTest do | |||||||
|   end |   end | ||||||
|  |  | ||||||
|   describe "redirect_if_user_is_authenticated/2" do |   describe "redirect_if_user_is_authenticated/2" do | ||||||
|     test "redirects if user is authenticated", %{conn: conn, user: user} do |     test "redirects if user is authenticated", %{conn: conn, current_user: current_user} do | ||||||
|       conn = conn |> assign(:current_user, user) |> UserAuth.redirect_if_user_is_authenticated([]) |       conn = | ||||||
|  |         conn | ||||||
|  |         |> assign(:current_user, current_user) | ||||||
|  |         |> UserAuth.redirect_if_user_is_authenticated([]) | ||||||
|  |  | ||||||
|       assert conn.halted |       assert conn.halted | ||||||
|       assert redirected_to(conn) == "/" |       assert redirected_to(conn) == "/" | ||||||
|     end |     end | ||||||
| @@ -135,7 +146,9 @@ defmodule LokalWeb.UserAuthTest do | |||||||
|       conn = conn |> fetch_flash() |> UserAuth.require_authenticated_user([]) |       conn = conn |> fetch_flash() |> UserAuth.require_authenticated_user([]) | ||||||
|       assert conn.halted |       assert conn.halted | ||||||
|       assert redirected_to(conn) == Routes.user_session_path(conn, :new) |       assert redirected_to(conn) == Routes.user_session_path(conn, :new) | ||||||
|       assert get_flash(conn, :error) == "You must log in to access this page." |  | ||||||
|  |       assert get_flash(conn, :error) == | ||||||
|  |                dgettext("errors", "You must confirm your account and log in to access this page.") | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "stores the path to redirect to on GET", %{conn: conn} do |     test "stores the path to redirect to on GET", %{conn: conn} do | ||||||
| @@ -156,7 +169,7 @@ defmodule LokalWeb.UserAuthTest do | |||||||
|       assert get_session(halted_conn, :user_return_to) == "/foo?bar=baz" |       assert get_session(halted_conn, :user_return_to) == "/foo?bar=baz" | ||||||
|  |  | ||||||
|       halted_conn = |       halted_conn = | ||||||
|         %{conn | path_info: ["foo"], query_string: "bar", method: "POST"} |         %{conn | path_info: ["/foo?bar"], method: "POST"} | ||||||
|         |> fetch_flash() |         |> fetch_flash() | ||||||
|         |> UserAuth.require_authenticated_user([]) |         |> UserAuth.require_authenticated_user([]) | ||||||
|  |  | ||||||
| @@ -164,8 +177,10 @@ defmodule LokalWeb.UserAuthTest do | |||||||
|       refute get_session(halted_conn, :user_return_to) |       refute get_session(halted_conn, :user_return_to) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "does not redirect if user is authenticated", %{conn: conn, user: user} do |     test "does not redirect if user is authenticated", %{conn: conn, current_user: current_user} do | ||||||
|       conn = conn |> assign(:current_user, user) |> UserAuth.require_authenticated_user([]) |       conn = | ||||||
|  |         conn |> assign(:current_user, current_user) |> UserAuth.require_authenticated_user([]) | ||||||
|  |  | ||||||
|       refute conn.halted |       refute conn.halted | ||||||
|       refute conn.status |       refute conn.status | ||||||
|     end |     end | ||||||
|   | |||||||
| @@ -1,9 +1,14 @@ | |||||||
| defmodule LokalWeb.UserConfirmationControllerTest do | defmodule LokalWeb.UserConfirmationControllerTest do | ||||||
|   use LokalWeb.ConnCase, async: true |   @moduledoc """ | ||||||
|  |   Tests user confirmation | ||||||
|  |   """ | ||||||
|  |  | ||||||
|  |   use LokalWeb.ConnCase, async: true | ||||||
|  |   import LokalWeb.Gettext | ||||||
|   alias Lokal.Accounts |   alias Lokal.Accounts | ||||||
|   alias Lokal.Repo |   alias Lokal.Repo | ||||||
|   import Lokal.AccountsFixtures |  | ||||||
|  |   @moduletag :user_confirmation_controller_test | ||||||
|  |  | ||||||
|   setup do |   setup do | ||||||
|     %{user: user_fixture()} |     %{user: user_fixture()} | ||||||
| @@ -13,7 +18,7 @@ defmodule LokalWeb.UserConfirmationControllerTest do | |||||||
|     test "renders the confirmation page", %{conn: conn} do |     test "renders the confirmation page", %{conn: conn} do | ||||||
|       conn = get(conn, Routes.user_confirmation_path(conn, :new)) |       conn = get(conn, Routes.user_confirmation_path(conn, :new)) | ||||||
|       response = html_response(conn, 200) |       response = html_response(conn, 200) | ||||||
|       assert response =~ "Resend confirmation instructions" |       assert response =~ dgettext("actions", "Resend confirmation instructions") | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
| @@ -26,7 +31,14 @@ defmodule LokalWeb.UserConfirmationControllerTest do | |||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       assert redirected_to(conn) == "/" |       assert redirected_to(conn) == "/" | ||||||
|       assert get_flash(conn, :info) =~ "If your email is in our system" |  | ||||||
|  |       assert get_flash(conn, :info) =~ | ||||||
|  |                dgettext( | ||||||
|  |                  "prompts", | ||||||
|  |                  "If your email is in our system and it has not been confirmed yet, " <> | ||||||
|  |                    "you will receive an email with instructions shortly." | ||||||
|  |                ) | ||||||
|  |  | ||||||
|       assert Repo.get_by!(Accounts.UserToken, user_id: user.id).context == "confirm" |       assert Repo.get_by!(Accounts.UserToken, user_id: user.id).context == "confirm" | ||||||
|     end |     end | ||||||
|  |  | ||||||
| @@ -39,8 +51,13 @@ defmodule LokalWeb.UserConfirmationControllerTest do | |||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       assert redirected_to(conn) == "/" |       assert redirected_to(conn) == "/" | ||||||
|       assert get_flash(conn, :info) =~ "If your email is in our system" |  | ||||||
|       refute Repo.get_by(Accounts.UserToken, user_id: user.id) |       assert get_flash(conn, :info) =~ | ||||||
|  |                dgettext( | ||||||
|  |                  "prompts", | ||||||
|  |                  "If your email is in our system and it has not been confirmed yet, " <> | ||||||
|  |                    "you will receive an email with instructions shortly." | ||||||
|  |                ) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "does not send confirmation token if email is invalid", %{conn: conn} do |     test "does not send confirmation token if email is invalid", %{conn: conn} do | ||||||
| @@ -50,7 +67,14 @@ defmodule LokalWeb.UserConfirmationControllerTest do | |||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       assert redirected_to(conn) == "/" |       assert redirected_to(conn) == "/" | ||||||
|       assert get_flash(conn, :info) =~ "If your email is in our system" |  | ||||||
|  |       assert get_flash(conn, :info) =~ | ||||||
|  |                dgettext( | ||||||
|  |                  "prompts", | ||||||
|  |                  "If your email is in our system and it has not been confirmed yet, " <> | ||||||
|  |                    "you will receive an email with instructions shortly." | ||||||
|  |                ) | ||||||
|  |  | ||||||
|       assert Repo.all(Accounts.UserToken) == [] |       assert Repo.all(Accounts.UserToken) == [] | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| @@ -64,7 +88,10 @@ defmodule LokalWeb.UserConfirmationControllerTest do | |||||||
|  |  | ||||||
|       conn = get(conn, Routes.user_confirmation_path(conn, :confirm, token)) |       conn = get(conn, Routes.user_confirmation_path(conn, :confirm, token)) | ||||||
|       assert redirected_to(conn) == "/" |       assert redirected_to(conn) == "/" | ||||||
|       assert get_flash(conn, :info) =~ "User confirmed successfully" |  | ||||||
|  |       assert get_flash(conn, :info) =~ | ||||||
|  |                dgettext("prompts", "%{email} confirmed successfully", email: user.email) | ||||||
|  |  | ||||||
|       assert Accounts.get_user!(user.id).confirmed_at |       assert Accounts.get_user!(user.id).confirmed_at | ||||||
|       refute get_session(conn, :user_token) |       refute get_session(conn, :user_token) | ||||||
|       assert Repo.all(Accounts.UserToken) == [] |       assert Repo.all(Accounts.UserToken) == [] | ||||||
| @@ -72,7 +99,9 @@ defmodule LokalWeb.UserConfirmationControllerTest do | |||||||
|       # When not logged in |       # When not logged in | ||||||
|       conn = get(conn, Routes.user_confirmation_path(conn, :confirm, token)) |       conn = get(conn, Routes.user_confirmation_path(conn, :confirm, token)) | ||||||
|       assert redirected_to(conn) == "/" |       assert redirected_to(conn) == "/" | ||||||
|       assert get_flash(conn, :error) =~ "User confirmation link is invalid or it has expired" |  | ||||||
|  |       assert get_flash(conn, :error) =~ | ||||||
|  |                dgettext("errors", "User confirmation link is invalid or it has expired") | ||||||
|  |  | ||||||
|       # When logged in |       # When logged in | ||||||
|       conn = |       conn = | ||||||
| @@ -87,7 +116,10 @@ defmodule LokalWeb.UserConfirmationControllerTest do | |||||||
|     test "does not confirm email with invalid token", %{conn: conn, user: user} do |     test "does not confirm email with invalid token", %{conn: conn, user: user} do | ||||||
|       conn = get(conn, Routes.user_confirmation_path(conn, :confirm, "oops")) |       conn = get(conn, Routes.user_confirmation_path(conn, :confirm, "oops")) | ||||||
|       assert redirected_to(conn) == "/" |       assert redirected_to(conn) == "/" | ||||||
|       assert get_flash(conn, :error) =~ "User confirmation link is invalid or it has expired" |  | ||||||
|  |       assert get_flash(conn, :error) =~ | ||||||
|  |                dgettext("errors", "User confirmation link is invalid or it has expired") | ||||||
|  |  | ||||||
|       refute Accounts.get_user!(user.id).confirmed_at |       refute Accounts.get_user!(user.id).confirmed_at | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|   | |||||||
| @@ -1,15 +1,19 @@ | |||||||
| defmodule LokalWeb.UserRegistrationControllerTest do | defmodule LokalWeb.UserRegistrationControllerTest do | ||||||
|   use LokalWeb.ConnCase, async: true |   @moduledoc """ | ||||||
|  |   Tests user registration | ||||||
|  |   """ | ||||||
|  |  | ||||||
|   import Lokal.AccountsFixtures |   use LokalWeb.ConnCase, async: true | ||||||
|  |   import LokalWeb.Gettext | ||||||
|  |  | ||||||
|  |   @moduletag :user_registration_controller_test | ||||||
|  |  | ||||||
|   describe "GET /users/register" do |   describe "GET /users/register" do | ||||||
|     test "renders registration page", %{conn: conn} do |     test "renders registration page", %{conn: conn} do | ||||||
|       conn = get(conn, Routes.user_registration_path(conn, :new)) |       conn = get(conn, Routes.user_registration_path(conn, :new)) | ||||||
|       response = html_response(conn, 200) |       response = html_response(conn, 200) | ||||||
|       assert response =~ "Register" |       assert response =~ dgettext("actions", "Register") | ||||||
|       assert response =~ "Log in</a>" |       assert response =~ dgettext("actions", "Log in") | ||||||
|       assert response =~ "Register</a>" |  | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "redirects if already logged in", %{conn: conn} do |     test "redirects if already logged in", %{conn: conn} do | ||||||
| @@ -28,15 +32,17 @@ defmodule LokalWeb.UserRegistrationControllerTest do | |||||||
|           "user" => valid_user_attributes(email: email) |           "user" => valid_user_attributes(email: email) | ||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       assert get_session(conn, :user_token) |       assert get_session(conn, :phoenix_flash) == %{ | ||||||
|  |                "info" => dgettext("prompts", "Please check your email to verify your account") | ||||||
|  |              } | ||||||
|  |  | ||||||
|       assert redirected_to(conn) =~ "/" |       assert redirected_to(conn) =~ "/" | ||||||
|  |  | ||||||
|       # Now do a logged in request and assert on the menu |       # Now do a logged in request and assert on the menu | ||||||
|       conn = get(conn, "/") |       conn = get(conn, "/") | ||||||
|       response = html_response(conn, 200) |       response = html_response(conn, 200) | ||||||
|  |       # user's email is recorded as admin | ||||||
|       assert response =~ email |       assert response =~ email | ||||||
|       assert response =~ "Settings</a>" |  | ||||||
|       assert response =~ "Log out</a>" |  | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "render errors for invalid data", %{conn: conn} do |     test "render errors for invalid data", %{conn: conn} do | ||||||
| @@ -46,7 +52,7 @@ defmodule LokalWeb.UserRegistrationControllerTest do | |||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       response = html_response(conn, 200) |       response = html_response(conn, 200) | ||||||
|       assert response =~ "Register" |       assert response =~ gettext("Register") | ||||||
|       assert response =~ "must have the @ sign and no spaces" |       assert response =~ "must have the @ sign and no spaces" | ||||||
|       assert response =~ "should be at least 12 character" |       assert response =~ "should be at least 12 character" | ||||||
|     end |     end | ||||||
|   | |||||||
| @@ -1,9 +1,13 @@ | |||||||
| defmodule LokalWeb.UserResetPasswordControllerTest do | defmodule LokalWeb.UserResetPasswordControllerTest do | ||||||
|   use LokalWeb.ConnCase, async: true |   @moduledoc """ | ||||||
|  |   Tests the user reset password controller | ||||||
|  |   """ | ||||||
|  |  | ||||||
|   alias Lokal.Accounts |   use LokalWeb.ConnCase, async: true | ||||||
|   alias Lokal.Repo |   import LokalWeb.Gettext | ||||||
|   import Lokal.AccountsFixtures |   alias Lokal.{Accounts, Repo} | ||||||
|  |  | ||||||
|  |   @moduletag :user_reset_password_controller_test | ||||||
|  |  | ||||||
|   setup do |   setup do | ||||||
|     %{user: user_fixture()} |     %{user: user_fixture()} | ||||||
| @@ -13,7 +17,7 @@ defmodule LokalWeb.UserResetPasswordControllerTest do | |||||||
|     test "renders the reset password page", %{conn: conn} do |     test "renders the reset password page", %{conn: conn} do | ||||||
|       conn = get(conn, Routes.user_reset_password_path(conn, :new)) |       conn = get(conn, Routes.user_reset_password_path(conn, :new)) | ||||||
|       response = html_response(conn, 200) |       response = html_response(conn, 200) | ||||||
|       assert response =~ "Forgot your password?" |       assert response =~ dgettext("actions", "Forgot your password?") | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
| @@ -26,7 +30,13 @@ defmodule LokalWeb.UserResetPasswordControllerTest do | |||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       assert redirected_to(conn) == "/" |       assert redirected_to(conn) == "/" | ||||||
|       assert get_flash(conn, :info) =~ "If your email is in our system" |  | ||||||
|  |       assert get_flash(conn, :info) =~ | ||||||
|  |                dgettext( | ||||||
|  |                  "prompts", | ||||||
|  |                  "If your email is in our system, you will receive instructions to reset your password shortly." | ||||||
|  |                ) | ||||||
|  |  | ||||||
|       assert Repo.get_by!(Accounts.UserToken, user_id: user.id).context == "reset_password" |       assert Repo.get_by!(Accounts.UserToken, user_id: user.id).context == "reset_password" | ||||||
|     end |     end | ||||||
|  |  | ||||||
| @@ -37,7 +47,13 @@ defmodule LokalWeb.UserResetPasswordControllerTest do | |||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       assert redirected_to(conn) == "/" |       assert redirected_to(conn) == "/" | ||||||
|       assert get_flash(conn, :info) =~ "If your email is in our system" |  | ||||||
|  |       assert get_flash(conn, :info) =~ | ||||||
|  |                dgettext( | ||||||
|  |                  "prompts", | ||||||
|  |                  "If your email is in our system, you will receive instructions to reset your password shortly." | ||||||
|  |                ) | ||||||
|  |  | ||||||
|       assert Repo.all(Accounts.UserToken) == [] |       assert Repo.all(Accounts.UserToken) == [] | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| @@ -54,13 +70,15 @@ defmodule LokalWeb.UserResetPasswordControllerTest do | |||||||
|  |  | ||||||
|     test "renders reset password", %{conn: conn, token: token} do |     test "renders reset password", %{conn: conn, token: token} do | ||||||
|       conn = get(conn, Routes.user_reset_password_path(conn, :edit, token)) |       conn = get(conn, Routes.user_reset_password_path(conn, :edit, token)) | ||||||
|       assert html_response(conn, 200) =~ "Reset password" |       assert html_response(conn, 200) =~ dgettext("actions", "Reset password") | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "does not render reset password with invalid token", %{conn: conn} do |     test "does not render reset password with invalid token", %{conn: conn} do | ||||||
|       conn = get(conn, Routes.user_reset_password_path(conn, :edit, "oops")) |       conn = get(conn, Routes.user_reset_password_path(conn, :edit, "oops")) | ||||||
|       assert redirected_to(conn) == "/" |       assert redirected_to(conn) == "/" | ||||||
|       assert get_flash(conn, :error) =~ "Reset password link is invalid or it has expired" |  | ||||||
|  |       assert get_flash(conn, :error) =~ | ||||||
|  |                dgettext("errors", "Reset password link is invalid or it has expired") | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
| @@ -85,7 +103,7 @@ defmodule LokalWeb.UserResetPasswordControllerTest do | |||||||
|  |  | ||||||
|       assert redirected_to(conn) == Routes.user_session_path(conn, :new) |       assert redirected_to(conn) == Routes.user_session_path(conn, :new) | ||||||
|       refute get_session(conn, :user_token) |       refute get_session(conn, :user_token) | ||||||
|       assert get_flash(conn, :info) =~ "Password reset successfully" |       assert get_flash(conn, :info) =~ dgettext("prompts", "Password reset successfully") | ||||||
|       assert Accounts.get_user_by_email_and_password(user.email, "new valid password") |       assert Accounts.get_user_by_email_and_password(user.email, "new valid password") | ||||||
|     end |     end | ||||||
|  |  | ||||||
| @@ -99,15 +117,17 @@ defmodule LokalWeb.UserResetPasswordControllerTest do | |||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       response = html_response(conn, 200) |       response = html_response(conn, 200) | ||||||
|       assert response =~ "Reset password" |       assert response =~ gettext("Reset password") | ||||||
|       assert response =~ "should be at least 12 character(s)" |       assert response =~ dgettext("errors", "should be at least 12 character(s)") | ||||||
|       assert response =~ "does not match password" |       assert response =~ dgettext("errors", "does not match password") | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "does not reset password with invalid token", %{conn: conn} do |     test "does not reset password with invalid token", %{conn: conn} do | ||||||
|       conn = put(conn, Routes.user_reset_password_path(conn, :update, "oops")) |       conn = put(conn, Routes.user_reset_password_path(conn, :update, "oops")) | ||||||
|       assert redirected_to(conn) == "/" |       assert redirected_to(conn) == "/" | ||||||
|       assert get_flash(conn, :error) =~ "Reset password link is invalid or it has expired" |  | ||||||
|  |       assert get_flash(conn, :error) =~ | ||||||
|  |                dgettext("errors", "Reset password link is invalid or it has expired") | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,31 +1,35 @@ | |||||||
| defmodule LokalWeb.UserSessionControllerTest do | defmodule LokalWeb.UserSessionControllerTest do | ||||||
|  |   @moduledoc """ | ||||||
|  |   Tests the user session controller | ||||||
|  |   """ | ||||||
|  |  | ||||||
|   use LokalWeb.ConnCase, async: true |   use LokalWeb.ConnCase, async: true | ||||||
|  |   import LokalWeb.Gettext | ||||||
|  |  | ||||||
|   import Lokal.AccountsFixtures |   @moduletag :user_session_controller_test | ||||||
|  |  | ||||||
|   setup do |   setup %{conn: conn} do | ||||||
|     %{user: user_fixture()} |     [current_user: user_fixture() |> confirm_user(), conn: conn] | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   describe "GET /users/log_in" do |   describe "GET /users/log_in" do | ||||||
|     test "renders log in page", %{conn: conn} do |     test "renders log in page", %{conn: conn} do | ||||||
|       conn = get(conn, Routes.user_session_path(conn, :new)) |       conn = get(conn, Routes.user_session_path(conn, :new)) | ||||||
|       response = html_response(conn, 200) |       response = html_response(conn, 200) | ||||||
|       assert response =~ "Log in" |       assert response =~ dgettext("actions", "Log in") | ||||||
|       assert response =~ "Register" |  | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "redirects if already logged in", %{conn: conn, user: user} do |     test "redirects if already logged in", %{conn: conn, current_user: current_user} do | ||||||
|       conn = conn |> log_in_user(user) |> get(Routes.user_session_path(conn, :new)) |       conn = conn |> log_in_user(current_user) |> get(Routes.user_session_path(conn, :new)) | ||||||
|       assert redirected_to(conn) == "/" |       assert redirected_to(conn) == "/" | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   describe "POST /users/log_in" do |   describe "POST /users/log_in" do | ||||||
|     test "logs the user in", %{conn: conn, user: user} do |     test "logs the user in", %{conn: conn, current_user: current_user} do | ||||||
|       conn = |       conn = | ||||||
|         post(conn, Routes.user_session_path(conn, :create), %{ |         post(conn, Routes.user_session_path(conn, :create), %{ | ||||||
|           "user" => %{"email" => user.email, "password" => valid_user_password()} |           "user" => %{"email" => current_user.email, "password" => valid_user_password()} | ||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       assert get_session(conn, :user_token) |       assert get_session(conn, :user_token) | ||||||
| @@ -34,16 +38,15 @@ defmodule LokalWeb.UserSessionControllerTest do | |||||||
|       # Now do a logged in request and assert on the menu |       # Now do a logged in request and assert on the menu | ||||||
|       conn = get(conn, "/") |       conn = get(conn, "/") | ||||||
|       response = html_response(conn, 200) |       response = html_response(conn, 200) | ||||||
|       assert response =~ user.email |       assert response =~ current_user.email | ||||||
|       assert response =~ "Settings</a>" |       assert response =~ dgettext("prompts", "Are you sure you want to log out?") | ||||||
|       assert response =~ "Log out</a>" |  | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "logs the user in with remember me", %{conn: conn, user: user} do |     test "logs the user in with remember me", %{conn: conn, current_user: current_user} do | ||||||
|       conn = |       conn = | ||||||
|         post(conn, Routes.user_session_path(conn, :create), %{ |         post(conn, Routes.user_session_path(conn, :create), %{ | ||||||
|           "user" => %{ |           "user" => %{ | ||||||
|             "email" => user.email, |             "email" => current_user.email, | ||||||
|             "password" => valid_user_password(), |             "password" => valid_user_password(), | ||||||
|             "remember_me" => "true" |             "remember_me" => "true" | ||||||
|           } |           } | ||||||
| @@ -53,13 +56,13 @@ defmodule LokalWeb.UserSessionControllerTest do | |||||||
|       assert redirected_to(conn) =~ "/" |       assert redirected_to(conn) =~ "/" | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "logs the user in with return to", %{conn: conn, user: user} do |     test "logs the user in with return to", %{conn: conn, current_user: current_user} do | ||||||
|       conn = |       conn = | ||||||
|         conn |         conn | ||||||
|         |> init_test_session(user_return_to: "/foo/bar") |         |> init_test_session(user_return_to: "/foo/bar") | ||||||
|         |> post(Routes.user_session_path(conn, :create), %{ |         |> post(Routes.user_session_path(conn, :create), %{ | ||||||
|           "user" => %{ |           "user" => %{ | ||||||
|             "email" => user.email, |             "email" => current_user.email, | ||||||
|             "password" => valid_user_password() |             "password" => valid_user_password() | ||||||
|           } |           } | ||||||
|         }) |         }) | ||||||
| @@ -67,31 +70,32 @@ defmodule LokalWeb.UserSessionControllerTest do | |||||||
|       assert redirected_to(conn) == "/foo/bar" |       assert redirected_to(conn) == "/foo/bar" | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "emits error message with invalid credentials", %{conn: conn, user: user} do |     test "emits error message with invalid credentials", | ||||||
|  |          %{conn: conn, current_user: current_user} do | ||||||
|       conn = |       conn = | ||||||
|         post(conn, Routes.user_session_path(conn, :create), %{ |         post(conn, Routes.user_session_path(conn, :create), %{ | ||||||
|           "user" => %{"email" => user.email, "password" => "invalid_password"} |           "user" => %{"email" => current_user.email, "password" => "bad"} | ||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       response = html_response(conn, 200) |       response = html_response(conn, 200) | ||||||
|       assert response =~ "Log in" |       assert response =~ dgettext("actions", "Log in") | ||||||
|       assert response =~ "Invalid email or password" |       assert response =~ dgettext("errors", "Invalid email or password") | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   describe "DELETE /users/log_out" do |   describe "DELETE /users/log_out" do | ||||||
|     test "logs the user out", %{conn: conn, user: user} do |     test "logs the user out", %{conn: conn, current_user: current_user} do | ||||||
|       conn = conn |> log_in_user(user) |> delete(Routes.user_session_path(conn, :delete)) |       conn = conn |> log_in_user(current_user) |> delete(Routes.user_session_path(conn, :delete)) | ||||||
|       assert redirected_to(conn) == "/" |       assert redirected_to(conn) == "/" | ||||||
|       refute get_session(conn, :user_token) |       refute get_session(conn, :user_token) | ||||||
|       assert get_flash(conn, :info) =~ "Logged out successfully" |       assert get_flash(conn, :info) =~ gettext("Logged out successfully") | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "succeeds even if the user is not logged in", %{conn: conn} do |     test "succeeds even if the user is not logged in", %{conn: conn} do | ||||||
|       conn = delete(conn, Routes.user_session_path(conn, :delete)) |       conn = delete(conn, Routes.user_session_path(conn, :delete)) | ||||||
|       assert redirected_to(conn) == "/" |       assert redirected_to(conn) == "/" | ||||||
|       refute get_session(conn, :user_token) |       refute get_session(conn, :user_token) | ||||||
|       assert get_flash(conn, :info) =~ "Logged out successfully" |       assert get_flash(conn, :info) =~ gettext("Logged out successfully") | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,8 +1,13 @@ | |||||||
| defmodule LokalWeb.UserSettingsControllerTest do | defmodule LokalWeb.UserSettingsControllerTest do | ||||||
|   use LokalWeb.ConnCase, async: true |   @moduledoc """ | ||||||
|  |   Tests the user settings controller | ||||||
|  |   """ | ||||||
|  |  | ||||||
|  |   use LokalWeb.ConnCase, async: true | ||||||
|  |   import LokalWeb.Gettext | ||||||
|   alias Lokal.Accounts |   alias Lokal.Accounts | ||||||
|   import Lokal.AccountsFixtures |  | ||||||
|  |   @moduletag :user_settings_controller_test | ||||||
|  |  | ||||||
|   setup :register_and_log_in_user |   setup :register_and_log_in_user | ||||||
|  |  | ||||||
| @@ -10,7 +15,7 @@ defmodule LokalWeb.UserSettingsControllerTest do | |||||||
|     test "renders settings page", %{conn: conn} do |     test "renders settings page", %{conn: conn} do | ||||||
|       conn = get(conn, Routes.user_settings_path(conn, :edit)) |       conn = get(conn, Routes.user_settings_path(conn, :edit)) | ||||||
|       response = html_response(conn, 200) |       response = html_response(conn, 200) | ||||||
|       assert response =~ "Settings" |       assert response =~ gettext("Settings") | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "redirects if user is not logged in" do |     test "redirects if user is not logged in" do | ||||||
| @@ -21,7 +26,8 @@ defmodule LokalWeb.UserSettingsControllerTest do | |||||||
|   end |   end | ||||||
|  |  | ||||||
|   describe "PUT /users/settings (change password form)" do |   describe "PUT /users/settings (change password form)" do | ||||||
|     test "updates the user password and resets tokens", %{conn: conn, user: user} do |     test "updates the user password and resets tokens", | ||||||
|  |          %{conn: conn, current_user: current_user} do | ||||||
|       new_password_conn = |       new_password_conn = | ||||||
|         put(conn, Routes.user_settings_path(conn, :update), %{ |         put(conn, Routes.user_settings_path(conn, :update), %{ | ||||||
|           "action" => "update_password", |           "action" => "update_password", | ||||||
| @@ -34,8 +40,11 @@ defmodule LokalWeb.UserSettingsControllerTest do | |||||||
|  |  | ||||||
|       assert redirected_to(new_password_conn) == Routes.user_settings_path(conn, :edit) |       assert redirected_to(new_password_conn) == Routes.user_settings_path(conn, :edit) | ||||||
|       assert get_session(new_password_conn, :user_token) != get_session(conn, :user_token) |       assert get_session(new_password_conn, :user_token) != get_session(conn, :user_token) | ||||||
|       assert get_flash(new_password_conn, :info) =~ "Password updated successfully" |  | ||||||
|       assert Accounts.get_user_by_email_and_password(user.email, "new valid password") |       assert get_flash(new_password_conn, :info) =~ | ||||||
|  |                dgettext("actions", "Password updated successfully") | ||||||
|  |  | ||||||
|  |       assert Accounts.get_user_by_email_and_password(current_user.email, "new valid password") | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "does not update password on invalid data", %{conn: conn} do |     test "does not update password on invalid data", %{conn: conn} do | ||||||
| @@ -50,10 +59,10 @@ defmodule LokalWeb.UserSettingsControllerTest do | |||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       response = html_response(old_password_conn, 200) |       response = html_response(old_password_conn, 200) | ||||||
|       assert response =~ "Settings" |       assert response =~ gettext("Settings") | ||||||
|       assert response =~ "should be at least 12 character(s)" |       assert response =~ dgettext("errors", "should be at least 12 character(s)") | ||||||
|       assert response =~ "does not match password" |       assert response =~ dgettext("errors", "does not match password") | ||||||
|       assert response =~ "is not valid" |       assert response =~ dgettext("errors", "is not valid") | ||||||
|  |  | ||||||
|       assert get_session(old_password_conn, :user_token) == get_session(conn, :user_token) |       assert get_session(old_password_conn, :user_token) == get_session(conn, :user_token) | ||||||
|     end |     end | ||||||
| @@ -61,7 +70,7 @@ defmodule LokalWeb.UserSettingsControllerTest do | |||||||
|  |  | ||||||
|   describe "PUT /users/settings (change email form)" do |   describe "PUT /users/settings (change email form)" do | ||||||
|     @tag :capture_log |     @tag :capture_log | ||||||
|     test "updates the user email", %{conn: conn, user: user} do |     test "updates the user email", %{conn: conn, current_user: current_user} do | ||||||
|       conn = |       conn = | ||||||
|         put(conn, Routes.user_settings_path(conn, :update), %{ |         put(conn, Routes.user_settings_path(conn, :update), %{ | ||||||
|           "action" => "update_email", |           "action" => "update_email", | ||||||
| @@ -70,8 +79,14 @@ defmodule LokalWeb.UserSettingsControllerTest do | |||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       assert redirected_to(conn) == Routes.user_settings_path(conn, :edit) |       assert redirected_to(conn) == Routes.user_settings_path(conn, :edit) | ||||||
|       assert get_flash(conn, :info) =~ "A link to confirm your email" |  | ||||||
|       assert Accounts.get_user_by_email(user.email) |       assert get_flash(conn, :info) =~ | ||||||
|  |                dgettext( | ||||||
|  |                  "prompts", | ||||||
|  |                  "A link to confirm your email change has been sent to the new address." | ||||||
|  |                ) | ||||||
|  |  | ||||||
|  |       assert Accounts.get_user_by_email(current_user.email) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "does not update email on invalid data", %{conn: conn} do |     test "does not update email on invalid data", %{conn: conn} do | ||||||
| @@ -83,41 +98,51 @@ defmodule LokalWeb.UserSettingsControllerTest do | |||||||
|         }) |         }) | ||||||
|  |  | ||||||
|       response = html_response(conn, 200) |       response = html_response(conn, 200) | ||||||
|       assert response =~ "Settings" |       assert response =~ gettext("Settings") | ||||||
|       assert response =~ "must have the @ sign and no spaces" |       assert response =~ dgettext("errors", "must have the @ sign and no spaces") | ||||||
|       assert response =~ "is not valid" |       assert response =~ dgettext("errors", "is not valid") | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   describe "GET /users/settings/confirm_email/:token" do |   describe "GET /users/settings/confirm_email/:token" do | ||||||
|     setup %{user: user} do |     setup %{current_user: current_user} do | ||||||
|       email = unique_user_email() |       email = unique_user_email() | ||||||
|  |  | ||||||
|       token = |       token = | ||||||
|         extract_user_token(fn url -> |         extract_user_token(fn url -> | ||||||
|           Accounts.deliver_update_email_instructions(%{user | email: email}, user.email, url) |           Accounts.deliver_update_email_instructions( | ||||||
|  |             %{current_user | email: email}, | ||||||
|  |             current_user.email, | ||||||
|  |             url | ||||||
|  |           ) | ||||||
|         end) |         end) | ||||||
|  |  | ||||||
|       %{token: token, email: email} |       %{token: token, email: email} | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "updates the user email once", %{conn: conn, user: user, token: token, email: email} do |     test "updates the user email once", | ||||||
|  |          %{conn: conn, current_user: current_user, token: token, email: email} do | ||||||
|       conn = get(conn, Routes.user_settings_path(conn, :confirm_email, token)) |       conn = get(conn, Routes.user_settings_path(conn, :confirm_email, token)) | ||||||
|       assert redirected_to(conn) == Routes.user_settings_path(conn, :edit) |       assert redirected_to(conn) == Routes.user_settings_path(conn, :edit) | ||||||
|       assert get_flash(conn, :info) =~ "Email changed successfully" |       assert get_flash(conn, :info) =~ dgettext("prompts", "Email changed successfully") | ||||||
|       refute Accounts.get_user_by_email(user.email) |       refute Accounts.get_user_by_email(current_user.email) | ||||||
|       assert Accounts.get_user_by_email(email) |       assert Accounts.get_user_by_email(email) | ||||||
|  |  | ||||||
|       conn = get(conn, Routes.user_settings_path(conn, :confirm_email, token)) |       conn = get(conn, Routes.user_settings_path(conn, :confirm_email, token)) | ||||||
|       assert redirected_to(conn) == Routes.user_settings_path(conn, :edit) |       assert redirected_to(conn) == Routes.user_settings_path(conn, :edit) | ||||||
|       assert get_flash(conn, :error) =~ "Email change link is invalid or it has expired" |  | ||||||
|  |       assert get_flash(conn, :error) =~ | ||||||
|  |                dgettext("errors", "Email change link is invalid or it has expired") | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "does not update email with invalid token", %{conn: conn, user: user} do |     test "does not update email with invalid token", %{conn: conn, current_user: current_user} do | ||||||
|       conn = get(conn, Routes.user_settings_path(conn, :confirm_email, "oops")) |       conn = get(conn, Routes.user_settings_path(conn, :confirm_email, "oops")) | ||||||
|       assert redirected_to(conn) == Routes.user_settings_path(conn, :edit) |       assert redirected_to(conn) == Routes.user_settings_path(conn, :edit) | ||||||
|       assert get_flash(conn, :error) =~ "Email change link is invalid or it has expired" |  | ||||||
|       assert Accounts.get_user_by_email(user.email) |       assert get_flash(conn, :error) =~ | ||||||
|  |                dgettext("errors", "Email change link is invalid or it has expired") | ||||||
|  |  | ||||||
|  |       assert Accounts.get_user_by_email(current_user.email) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|     test "redirects if user is not logged in", %{token: token} do |     test "redirects if user is not logged in", %{token: token} do | ||||||
|   | |||||||
							
								
								
									
										85
									
								
								test/lokal_web/live/invite_live_test.exs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								test/lokal_web/live/invite_live_test.exs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | |||||||
|  | defmodule LokalWeb.InviteLiveTest do | ||||||
|  |   @moduledoc """ | ||||||
|  |   Tests the invite liveview | ||||||
|  |   """ | ||||||
|  |  | ||||||
|  |   use LokalWeb.ConnCase | ||||||
|  |   import Phoenix.LiveViewTest | ||||||
|  |   import LokalWeb.Gettext | ||||||
|  |   alias Lokal.Invites | ||||||
|  |  | ||||||
|  |   @moduletag :invite_live_test | ||||||
|  |   @create_attrs %{"name" => "some name"} | ||||||
|  |   @update_attrs %{"name" => "some updated name"} | ||||||
|  |   # @invalid_attrs %{"name" => nil} | ||||||
|  |  | ||||||
|  |   describe "Index" do | ||||||
|  |     setup [:register_and_log_in_user] | ||||||
|  |  | ||||||
|  |     setup %{current_user: current_user} do | ||||||
|  |       {:ok, invite} = Invites.create_invite(current_user, @create_attrs) | ||||||
|  |       %{invite: invite, current_user: current_user} | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     test "lists all invites", %{conn: conn, invite: invite} do | ||||||
|  |       {:ok, _index_live, html} = live(conn, Routes.invite_index_path(conn, :index)) | ||||||
|  |  | ||||||
|  |       assert html =~ gettext("Invites") | ||||||
|  |       assert html =~ invite.name | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     test "saves new invite", %{conn: conn} do | ||||||
|  |       {:ok, index_live, _html} = live(conn, Routes.invite_index_path(conn, :index)) | ||||||
|  |  | ||||||
|  |       assert index_live |> element("a", dgettext("actions", "Create Invite")) |> render_click() =~ | ||||||
|  |                gettext("New Invite") | ||||||
|  |  | ||||||
|  |       assert_patch(index_live, Routes.invite_index_path(conn, :new)) | ||||||
|  |  | ||||||
|  |       # assert index_live | ||||||
|  |       #        |> form("#invite-form", invite: @invalid_attrs) | ||||||
|  |       #        |> render_change() =~ dgettext("errors", "can't be blank") | ||||||
|  |  | ||||||
|  |       {:ok, _, html} = | ||||||
|  |         index_live | ||||||
|  |         |> form("#invite-form", invite: @create_attrs) | ||||||
|  |         |> render_submit() | ||||||
|  |         |> follow_redirect(conn, Routes.invite_index_path(conn, :index)) | ||||||
|  |  | ||||||
|  |       assert html =~ dgettext("prompts", "%{name} created successfully", name: "some name") | ||||||
|  |  | ||||||
|  |       assert html =~ "some name" | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     test "updates invite in listing", %{conn: conn, invite: invite} do | ||||||
|  |       {:ok, index_live, _html} = live(conn, Routes.invite_index_path(conn, :index)) | ||||||
|  |  | ||||||
|  |       assert index_live |> element("[data-qa=\"edit-#{invite.id}\"]") |> render_click() =~ | ||||||
|  |                gettext("Edit Invite") | ||||||
|  |  | ||||||
|  |       assert_patch(index_live, Routes.invite_index_path(conn, :edit, invite)) | ||||||
|  |  | ||||||
|  |       # assert index_live | ||||||
|  |       #        |> form("#invite-form", invite: @invalid_attrs) | ||||||
|  |       #        |> render_change() =~ dgettext("errors", "can't be blank") | ||||||
|  |  | ||||||
|  |       {:ok, _, html} = | ||||||
|  |         index_live | ||||||
|  |         |> form("#invite-form", invite: @update_attrs) | ||||||
|  |         |> render_submit() | ||||||
|  |         |> follow_redirect(conn, Routes.invite_index_path(conn, :index)) | ||||||
|  |  | ||||||
|  |       assert html =~ | ||||||
|  |                dgettext("prompts", "%{name} updated successfully", name: "some updated name") | ||||||
|  |  | ||||||
|  |       assert html =~ "some updated name" | ||||||
|  |     end | ||||||
|  |  | ||||||
|  |     test "deletes invite in listing", %{conn: conn, invite: invite} do | ||||||
|  |       {:ok, index_live, _html} = live(conn, Routes.invite_index_path(conn, :index)) | ||||||
|  |  | ||||||
|  |       assert index_live |> element("[data-qa=\"delete-#{invite.id}\"]") |> render_click() | ||||||
|  |       refute has_element?(index_live, "#invite-#{invite.id}") | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
| @@ -1,14 +1,23 @@ | |||||||
| defmodule LokalWeb.ErrorViewTest do | defmodule LokalWeb.ErrorViewTest do | ||||||
|  |   @moduledoc """ | ||||||
|  |   Tests the error view | ||||||
|  |   """ | ||||||
|  |  | ||||||
|   use LokalWeb.ConnCase, async: true |   use LokalWeb.ConnCase, async: true | ||||||
|  |   import LokalWeb.Gettext | ||||||
|  |  | ||||||
|  |   @moduletag :error_view_test | ||||||
|  |  | ||||||
|   # Bring render/3 and render_to_string/3 for testing custom views |   # Bring render/3 and render_to_string/3 for testing custom views | ||||||
|   import Phoenix.View |   import Phoenix.View | ||||||
|  |  | ||||||
|   test "renders 404.html" do |   test "renders 404.html" do | ||||||
|     assert render_to_string(LokalWeb.ErrorView, "404.html", []) == "Not Found" |     assert render_to_string(LokalWeb.ErrorView, "404.html", []) =~ | ||||||
|  |              dgettext("errors", "Not found") | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   test "renders 500.html" do |   test "renders 500.html" do | ||||||
|     assert render_to_string(LokalWeb.ErrorView, "500.html", []) == "Internal Server Error" |     assert render_to_string(LokalWeb.ErrorView, "500.html", []) =~ | ||||||
|  |              dgettext("errors", "Internal Server Error") | ||||||
|   end |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -16,14 +16,16 @@ defmodule LokalWeb.ConnCase do | |||||||
|   """ |   """ | ||||||
|  |  | ||||||
|   use ExUnit.CaseTemplate |   use ExUnit.CaseTemplate | ||||||
|  |   import Lokal.Fixtures | ||||||
|  |   alias Lokal.{Accounts, Accounts.User, Repo} | ||||||
|   alias Ecto.Adapters.SQL.Sandbox |   alias Ecto.Adapters.SQL.Sandbox | ||||||
|   alias Lokal.{Accounts, Repo} |  | ||||||
|  |  | ||||||
|   using do |   using do | ||||||
|     quote do |     quote do | ||||||
|       # Import conveniences for testing with connections |       # Import conveniences for testing with connections | ||||||
|       import Plug.Conn |       import Plug.Conn | ||||||
|       import Phoenix.ConnTest |       import Phoenix.ConnTest | ||||||
|  |       import Lokal.Fixtures | ||||||
|       import LokalWeb.ConnCase |       import LokalWeb.ConnCase | ||||||
|  |  | ||||||
|       alias LokalWeb.Router.Helpers, as: Routes |       alias LokalWeb.Router.Helpers, as: Routes | ||||||
| @@ -47,12 +49,17 @@ defmodule LokalWeb.ConnCase do | |||||||
|   It stores an updated connection and a registered user in the |   It stores an updated connection and a registered user in the | ||||||
|   test context. |   test context. | ||||||
|   """ |   """ | ||||||
|  |   @spec register_and_log_in_user(%{conn: Plug.Conn.t()}) :: | ||||||
|  |           %{conn: Plug.Conn.t(), current_user: User.t()} | ||||||
|   def register_and_log_in_user(%{conn: conn}) do |   def register_and_log_in_user(%{conn: conn}) do | ||||||
|     user = Lokal.AccountsFixtures.user_fixture() |     current_user = user_fixture() |> confirm_user() | ||||||
|  |     %{conn: log_in_user(conn, current_user), current_user: current_user} | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   @spec confirm_user(User.t()) :: User.t() | ||||||
|  |   def confirm_user(user) do | ||||||
|     {:ok, %{user: user}} = user |> Accounts.confirm_user_multi() |> Repo.transaction() |     {:ok, %{user: user}} = user |> Accounts.confirm_user_multi() |> Repo.transaction() | ||||||
|  |     user | ||||||
|     %{conn: log_in_user(conn, user), user: user} |  | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   @doc """ |   @doc """ | ||||||
|   | |||||||
| @@ -25,6 +25,7 @@ defmodule Lokal.DataCase do | |||||||
|       import Ecto.Changeset |       import Ecto.Changeset | ||||||
|       import Ecto.Query |       import Ecto.Query | ||||||
|       import Lokal.DataCase |       import Lokal.DataCase | ||||||
|  |       import Lokal.Fixtures | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										60
									
								
								test/support/fixtures.ex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								test/support/fixtures.ex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | |||||||
|  | defmodule Lokal.Fixtures do | ||||||
|  |   @moduledoc """ | ||||||
|  |   This module defines test helpers for creating entities | ||||||
|  |   """ | ||||||
|  |  | ||||||
|  |   alias Lokal.{Accounts, Accounts.User, Email} | ||||||
|  |  | ||||||
|  |   def unique_user_email, do: "user#{System.unique_integer()}@example.com" | ||||||
|  |   def valid_user_password, do: "hello world!" | ||||||
|  |  | ||||||
|  |   @spec user_fixture() :: Accounts.User.t() | ||||||
|  |   @spec user_fixture(attrs :: map()) :: Accounts.User.t() | ||||||
|  |   def user_fixture(attrs \\ %{}) do | ||||||
|  |     attrs | ||||||
|  |     |> Enum.into(%{ | ||||||
|  |       "email" => unique_user_email(), | ||||||
|  |       "password" => valid_user_password() | ||||||
|  |     }) | ||||||
|  |     |> Accounts.register_user() | ||||||
|  |     |> unwrap_ok_tuple() | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   @spec admin_fixture() :: Accounts.User.t() | ||||||
|  |   @spec admin_fixture(attrs :: map()) :: Accounts.User.t() | ||||||
|  |   def admin_fixture(attrs \\ %{}) do | ||||||
|  |     attrs | ||||||
|  |     |> Enum.into(%{ | ||||||
|  |       "email" => unique_user_email(), | ||||||
|  |       "password" => valid_user_password(), | ||||||
|  |       "role" => "admin" | ||||||
|  |     }) | ||||||
|  |     |> Accounts.register_user() | ||||||
|  |     |> unwrap_ok_tuple() | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   def extract_user_token(fun) do | ||||||
|  |     %{args: %{attrs: attrs, email: email_key, user_id: user_id}} = fun.(&"[TOKEN]#{&1}[TOKEN]") | ||||||
|  |  | ||||||
|  |     # convert atoms to string keys | ||||||
|  |     attrs = attrs |> Map.new(fn {atom_key, value} -> {atom_key |> Atom.to_string(), value} end) | ||||||
|  |  | ||||||
|  |     email = | ||||||
|  |       email_key | ||||||
|  |       |> Atom.to_string() | ||||||
|  |       |> Email.generate_email(Accounts.get_user!(user_id), attrs) | ||||||
|  |  | ||||||
|  |     [_, html_token | _] = email.html_body |> String.split("[TOKEN]") | ||||||
|  |     [_, text_token | _] = email.text_body |> String.split("[TOKEN]") | ||||||
|  |     ^text_token = html_token | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   def valid_user_attributes(attrs \\ %{}) do | ||||||
|  |     Enum.into(attrs, %{ | ||||||
|  |       email: unique_user_email(), | ||||||
|  |       password: valid_user_password() | ||||||
|  |     }) | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   defp unwrap_ok_tuple({:ok, value}), do: value | ||||||
|  | end | ||||||
| @@ -1,31 +0,0 @@ | |||||||
| defmodule Lokal.AccountsFixtures do |  | ||||||
|   @moduledoc """ |  | ||||||
|   This module defines test helpers for creating |  | ||||||
|   entities via the `Lokal.Accounts` context. |  | ||||||
|   """ |  | ||||||
|  |  | ||||||
|   def unique_user_email, do: "user#{System.unique_integer()}@example.com" |  | ||||||
|   def valid_user_password, do: "hello world!" |  | ||||||
|  |  | ||||||
|   def valid_user_attributes(attrs \\ %{}) do |  | ||||||
|     Enum.into(attrs, %{ |  | ||||||
|       email: unique_user_email(), |  | ||||||
|       password: valid_user_password() |  | ||||||
|     }) |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   def user_fixture(attrs \\ %{}) do |  | ||||||
|     {:ok, user} = |  | ||||||
|       attrs |  | ||||||
|       |> valid_user_attributes() |  | ||||||
|       |> Lokal.Accounts.register_user() |  | ||||||
|  |  | ||||||
|     user |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   def extract_user_token(fun) do |  | ||||||
|     {:ok, captured} = fun.(&"[TOKEN]#{&1}[TOKEN]") |  | ||||||
|     [_, token, _] = String.split(captured.body, "[TOKEN]") |  | ||||||
|     token |  | ||||||
|   end |  | ||||||
| end |  | ||||||
		Reference in New Issue
	
	Block a user