From 006a7e1fc2e861c6e341393c02398ba39264e889 Mon Sep 17 00:00:00 2001 From: Mitchell Gerber Date: Thu, 4 Jan 2018 23:04:39 -0600 Subject: [PATCH] figuring out testing - works pretty good so far --- lib/myapp/data/user.ex | 16 +++--- mix.exs | 2 +- test/myapp/battle_net/auth_test.exs | 9 ++++ test/myapp/data/thread_test.exs | 41 ++++++++++++++++ test/myapp/data/user_test.exs | 49 +++++++++++++++++++ .../controllers/user_controller_test.exs | 14 ++++++ test/support/data/test_helpers.ex | 14 ++++++ 7 files changed, 138 insertions(+), 7 deletions(-) create mode 100644 test/myapp/battle_net/auth_test.exs create mode 100644 test/myapp/data/thread_test.exs create mode 100644 test/myapp/data/user_test.exs create mode 100644 test/myapp_web/controllers/user_controller_test.exs create mode 100644 test/support/data/test_helpers.ex diff --git a/lib/myapp/data/user.ex b/lib/myapp/data/user.ex index 6fcd483..d4a4061 100644 --- a/lib/myapp/data/user.ex +++ b/lib/myapp/data/user.ex @@ -13,7 +13,7 @@ defmodule MyApp.Data.User do timestamps() end - def changeset(user, params \\ %{}) do + defp changeset(user, params \\ %{}) do user |> cast(params, [:battle_net_id, :battletag]) |> validate_required([:battle_net_id, :battletag]) @@ -29,19 +29,23 @@ defmodule MyApp.Data.User do end # insert user info in database - if not exists - update battletag if it has changed - @spec upsert_user(%{"battle_net_id": integer, "battletag": String.t} | tuple) :: {:ok, map} | {:error, any} + @spec upsert_user(%{"battle_net_id": integer, "battletag": String.t, "access_token": String.t} | tuple) :: {:ok, map} | {:error, any} def upsert_user(params) when is_map(params) do # check for current user in database - case get_user(Map.get(params, "battle_net_id")) do - nil -> insert_user(params) - user -> - # update user if battletag has changed + user = get_user(Map.get(params, "battle_net_id")) + + output = cond do + is_nil(user) -> + insert_user(params) + true -> if Map.get(user, :battletag) != Map.get(params, "battletag") do update_battletag(user, params) else {:ok, user} end end + + output |> add_access_token(Map.get(params, "access_token")) end def upsert_user({:ok, params}), do: upsert_user(params) diff --git a/mix.exs b/mix.exs index 9f3461a..0c212d2 100644 --- a/mix.exs +++ b/mix.exs @@ -60,7 +60,7 @@ defmodule MyApp.Mixfile do "ecto.setup": ["ecto.create", "ecto.migrate", "seeds"], "seeds": ["run priv/repo/seeds.exs"], "ecto.reset": ["ecto.drop", "ecto.setup"], - "test": ["ecto.create --quiet", "ecto.migrate", "test"] + "test": ["ecto.drop", "ecto.create --quiet", "ecto.migrate", "seeds", "test"] ] end end diff --git a/test/myapp/battle_net/auth_test.exs b/test/myapp/battle_net/auth_test.exs new file mode 100644 index 0000000..977dda4 --- /dev/null +++ b/test/myapp/battle_net/auth_test.exs @@ -0,0 +1,9 @@ +defmodule MyApp.BattleNet.AuthTest do + use MyAppWeb.ConnCase, async: true + import MyApp.BattleNet.Auth + + test "get access token from battle net should error out" do + assert get_access_token("123") == {:error, "invalid_request"} + end + +end diff --git a/test/myapp/data/thread_test.exs b/test/myapp/data/thread_test.exs new file mode 100644 index 0000000..d665724 --- /dev/null +++ b/test/myapp/data/thread_test.exs @@ -0,0 +1,41 @@ +defmodule MyApp.Data.ThreadTest do + use MyAppWeb.ConnCase, async: true + import MyApp.Data.Thread + import MyApp.Data.TestHelpers + + defp new_thread(userID, category_id \\ 1) do + %{ + "title" => "test title", + "category_id" => category_id, + "content" => "test content", + "user_id" => userID, + } + end + + test "insert_thread: try to insert with no parameters" do + assert insert_thread(%{}) == {:error, + [%{title: "can't be blank"}, %{category_id: "can't be blank"}, + %{content: "can't be blank"}, %{user_id: "can't be blank"}]} + end + + test "insert_thread: insert as invalid user" do + assert insert_thread(new_thread(9238748)) == {:error, [%{user_id: "does not exist"}]} + end + + test "insert_thread: insert as invalid category_id" do + {:ok, user} = new_user() + assert insert_thread(new_thread(user.id, 2342342343)) == {:error, [%{category_id: "does not exist"}]} + end + + test "new thread should be inserted" do + {:ok, user} = new_user() + {:ok, thread} = insert_thread(new_thread(user.id)) + assert thread.title == "test title" + assert thread.category_id == 1 + assert thread.user_id == user.id + assert thread.content == "test content" + end + + # TODO: update thread + +end diff --git a/test/myapp/data/user_test.exs b/test/myapp/data/user_test.exs new file mode 100644 index 0000000..78222d9 --- /dev/null +++ b/test/myapp/data/user_test.exs @@ -0,0 +1,49 @@ +defmodule MyApp.Data.UserTest do + use MyAppWeb.ConnCase, async: true + import MyApp.Data.User + import MyApp.Data.TestHelpers + + test "user is inserted into database" do + {:ok, user} = new_user() + assert user == %{ + access_token: "test_token", + battle_net_id: 1, + battletag: "mgerb42", + id: user.id, + permissions: "user", + } + end + + test "user's battletag is updated" do + {:ok, user} = new_user() + + # update user battletag + user = user + |> atom_key_to_string() + |> Map.put("battletag", "mgerb") + + {:ok, user} = upsert_user(user) + assert user == %{ + access_token: "test_token", + battle_net_id: 1, + battletag: "mgerb", + id: user.id, + permissions: "user", + } + + # call upsert again with same battletag + {:ok, user} = user + |> atom_key_to_string() + |> upsert_user() + + assert user == %{ + access_token: "test_token", + battle_net_id: 1, + battletag: "mgerb", + id: user.id, + permissions: "user", + } + + end + +end diff --git a/test/myapp_web/controllers/user_controller_test.exs b/test/myapp_web/controllers/user_controller_test.exs new file mode 100644 index 0000000..ca18932 --- /dev/null +++ b/test/myapp_web/controllers/user_controller_test.exs @@ -0,0 +1,14 @@ +defmodule MyAppWeb.UserControllerTest do + use MyAppWeb.ConnCase, async: true + + test "get user index should return unauthorized" do + conn = + build_conn() + |> get("/api/user") + + body = conn |> response(401) |> Poison.decode! + + assert body["error"]["message"] == "unauthorized" + end + +end diff --git a/test/support/data/test_helpers.ex b/test/support/data/test_helpers.ex new file mode 100644 index 0000000..7f78b3d --- /dev/null +++ b/test/support/data/test_helpers.ex @@ -0,0 +1,14 @@ +defmodule MyApp.Data.TestHelpers do + import MyApp.Data.User + + @spec new_user() :: {:ok, map} + def new_user() do + upsert_user(%{"battle_net_id" => 1, "battletag" => "mgerb42", "access_token" => "test_token"}) + end + + @spec atom_key_to_string(map) :: map + def atom_key_to_string(map) do + for {key, val} <- map, into: %{}, do: {Atom.to_string(key), val} + end + +end