/test/controllers/user_controller_test.exs

https://github.com/healthlocker/healthlocker · Elixir · 160 lines · 143 code · 17 blank · 0 comment · 45 complexity · 5dcbc0f9b9111a9b092ac5dcca5b4c62 MD5 · raw file

  1. defmodule Healthlocker.UserControllerTest do
  2. use Healthlocker.ConnCase
  3. alias Healthlocker.User
  4. @step1_attrs %{
  5. email: "me@example.com",
  6. first_name: "My",
  7. last_name: "Name",
  8. }
  9. @step1_caps_attrs %{
  10. email: "User@example.com",
  11. first_name: "My",
  12. last_name: "Name",
  13. }
  14. @step2_attrs %{
  15. password: "abc123",
  16. password_confirmation: "abc123",
  17. security_answer: "B658H",
  18. security_question: "4"
  19. }
  20. @step3_attrs %{
  21. terms_conditions: true,
  22. privacy: true,
  23. data_access: true
  24. }
  25. @invalid_attrs %{}
  26. test "loads index.html on /users", %{conn: conn} do
  27. Repo.insert %User{
  28. id: 123456,
  29. first_name: "My",
  30. last_name: "Name",
  31. email: "abc@gmail.com",
  32. password_hash: Comeonin.Bcrypt.hashpwsalt("password"),
  33. security_question: "Question?",
  34. security_answer: "Answer"
  35. }
  36. conn = build_conn()
  37. |> assign(:current_user, Repo.get(User, 123456))
  38. |> get(user_path(conn, :index))
  39. assert html_response(conn, 200) =~ "Welcome! Get started by adding new content"
  40. end
  41. test "renders form for new name and email", %{conn: conn} do
  42. conn = get conn, user_path(conn, :new)
  43. assert html_response(conn, 200) =~ "Sign up"
  44. end
  45. test "renders form for new user password and security Q&A", %{conn: conn} do
  46. conn =
  47. case Repo.insert %User{
  48. email: "me@example.com",
  49. first_name: "My",
  50. last_name: "Name",
  51. } do
  52. {:ok, user} ->
  53. get conn, "/users/#{user.id}/signup2"
  54. end
  55. assert html_response(conn, 200) =~ "Password"
  56. end
  57. test "renders form for accepting T&Cs, privacy, and data access request", %{conn: conn} do
  58. conn =
  59. case Repo.insert %User{
  60. email: "me@example.com",
  61. password: "password",
  62. security_question: "Favourite food?",
  63. security_answer: "pizza"
  64. } do
  65. {:ok, user} ->
  66. get conn, "/users/#{user.id}/signup3"
  67. end
  68. assert html_response(conn, 200) =~ "terms of service"
  69. end
  70. test "creates resource and redirects when data is valid and not duplicate", %{conn: conn} do
  71. conn = post conn, user_path(conn, :create), user: @step1_attrs
  72. user = Repo.get_by(User, email: "me@example.com")
  73. assert redirected_to(conn) == "/users/#{user.id}/signup2"
  74. assert user
  75. end
  76. test "converts email to lowercase, creates resource and redirects with valid non-duplicate data", %{conn: conn} do
  77. conn = post conn, user_path(conn, :create), user: @step1_caps_attrs
  78. user = Repo.get_by(User, email: "user@example.com")
  79. assert redirected_to(conn) == "/users/#{user.id}/signup2"
  80. assert user
  81. end
  82. test "does not create duplicate resource and redirects when email is duplicate", %{conn: conn} do
  83. Repo.insert %User{email: "me@example.com"}
  84. conn = post conn, user_path(conn, :create), user: @step1_attrs
  85. user = Repo.get_by(User, email: "me@example.com")
  86. assert redirected_to(conn) == "/users/#{user.id}/signup2"
  87. end
  88. test "does not create duplicate resource and redirects when user has completed step1 & 2 of signup", %{conn: conn} do
  89. Repo.insert %User{email: "me@example.com", password_hash: Comeonin.Bcrypt.hashpwsalt("password"), data_access: nil}
  90. conn = post conn, user_path(conn, :create), user: @step1_attrs
  91. user = Repo.get_by(User, email: "me@example.com")
  92. assert redirected_to(conn) == "/users/#{user.id}/signup3"
  93. end
  94. test "does not create duplicate resource and redirects when user has previously signed up with false data_access", %{conn: conn} do
  95. Repo.insert %User{email: "me@example.com", password_hash: Comeonin.Bcrypt.hashpwsalt("password"), data_access: false}
  96. conn = post conn, user_path(conn, :create), user: @step1_attrs
  97. assert html_response(conn, 200) =~ "Sign up"
  98. end
  99. test "does not create duplicate resource and redirects when user has previously signed up with true data_access", %{conn: conn} do
  100. Repo.insert %User{email: "me@example.com", password_hash: Comeonin.Bcrypt.hashpwsalt("password"), data_access: true}
  101. conn = post conn, user_path(conn, :create), user: @step1_attrs
  102. assert html_response(conn, 200) =~ "Sign up"
  103. end
  104. test "creates resource and redirects when only email is input", %{conn: conn} do
  105. conn = post conn, user_path(conn, :create), user: %{email: "user@mail.com"}
  106. user = Repo.get_by(User, email: "user@mail.com")
  107. assert redirected_to(conn) == "/users/#{user.id}/signup2"
  108. assert user
  109. end
  110. test "does not create resource and renders errors when data is invalid", %{conn: conn} do
  111. conn = post conn, user_path(conn, :create), user: @invalid_attrs
  112. assert html_response(conn, 200) =~ "Sign up"
  113. end
  114. test "update resourse with password, security Q&A and redirects when data is valid", %{conn: conn} do
  115. Repo.insert %User{email: "me@example.com"}
  116. user = Repo.get_by(User, email: "me@example.com")
  117. conn = put conn, "/users/#{user.id}/#{:create2}", user: @step2_attrs
  118. assert redirected_to(conn) == "/users/#{user.id}/signup3"
  119. end
  120. test "does not update resource with password, security Q&A and renders errors when data is invalid", %{conn: conn} do
  121. Repo.insert %User{email: "me@example.com"}
  122. user = Repo.get_by(User, email: "me@example.com")
  123. conn = put conn, "/users/#{user.id}/#{:create2}", user: @invalid_attrs
  124. assert html_response(conn, 200) =~ "Password"
  125. end
  126. test "update resourse with data_access and redirects when data is valid", %{conn: conn} do
  127. Repo.insert %User{
  128. email: "me@example.com",
  129. password: "password",
  130. security_question: "Favourite food?",
  131. security_answer: "pizza"
  132. }
  133. user = Repo.get_by(User, email: "me@example.com")
  134. conn = put conn, "/users/#{user.id}/#{:create3}", user: @step3_attrs
  135. assert redirected_to(conn) == toolkit_path(conn, :index)
  136. end
  137. test "does not update resource with data_access and renders errors when data is invalid", %{conn: conn} do
  138. Repo.insert %User{email: "me@example.com"}
  139. user = Repo.get_by(User, email: "me@example.com")
  140. conn = put conn, "/users/#{user.id}/#{:create3}", user: @invalid_attrs
  141. assert html_response(conn, 200) =~ "terms of service"
  142. end
  143. end