login_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package user_test
  2. import (
  3. "fmt"
  4. "net/http"
  5. "testing"
  6. "github.com/porter-dev/porter/api/server/handlers/user"
  7. "github.com/porter-dev/porter/api/server/shared"
  8. "github.com/porter-dev/porter/api/server/shared/apitest"
  9. "github.com/porter-dev/porter/api/types"
  10. "github.com/porter-dev/porter/internal/repository/test"
  11. )
  12. func TestLoginUserSuccessful(t *testing.T) {
  13. req, rr := apitest.GetRequestAndRecorder(
  14. t,
  15. string(types.HTTPVerbPost),
  16. "/api/login",
  17. &types.LoginUserRequest{
  18. Email: "mrp@porter.run",
  19. Password: "hello",
  20. },
  21. )
  22. config := apitest.LoadConfig(t)
  23. apitest.CreateTestUser(t, config, true)
  24. handler := user.NewUserLoginHandler(
  25. config,
  26. shared.NewDefaultRequestDecoderValidator(config.Logger, config.Alerter),
  27. shared.NewDefaultResultWriter(config.Logger, config.Alerter),
  28. )
  29. handler.ServeHTTP(rr, req)
  30. expUser := &types.LoginUserResponse{
  31. ID: 1,
  32. FirstName: "Mister",
  33. LastName: "Porter",
  34. CompanyName: "Porter Technologies, Inc.",
  35. Email: "mrp@porter.run",
  36. EmailVerified: true,
  37. }
  38. gotUser := &types.LoginUserResponse{}
  39. apitest.AssertResponseExpected(t, rr, expUser, gotUser)
  40. }
  41. func TestLoginUserIncorrectPassword(t *testing.T) {
  42. req, rr := apitest.GetRequestAndRecorder(
  43. t,
  44. string(types.HTTPVerbPost),
  45. "/api/login",
  46. &types.LoginUserRequest{
  47. Email: "mrp@porter.run",
  48. Password: "hello1",
  49. },
  50. )
  51. config := apitest.LoadConfig(t)
  52. apitest.CreateTestUser(t, config, true)
  53. handler := user.NewUserLoginHandler(
  54. config,
  55. shared.NewDefaultRequestDecoderValidator(config.Logger, config.Alerter),
  56. shared.NewDefaultResultWriter(config.Logger, config.Alerter),
  57. )
  58. handler.ServeHTTP(rr, req)
  59. apitest.AssertResponseError(t, rr, http.StatusUnauthorized, &types.ExternalError{
  60. Error: fmt.Sprintf("incorrect password"),
  61. })
  62. }
  63. func TestLoginUserBadEmail(t *testing.T) {
  64. req, rr := apitest.GetRequestAndRecorder(
  65. t,
  66. string(types.HTTPVerbPost),
  67. "/api/login",
  68. &types.LoginUserRequest{
  69. Email: "test",
  70. Password: "hello1",
  71. },
  72. )
  73. config := apitest.LoadConfig(t)
  74. apitest.CreateTestUser(t, config, true)
  75. handler := user.NewUserLoginHandler(
  76. config,
  77. shared.NewDefaultRequestDecoderValidator(config.Logger, config.Alerter),
  78. shared.NewDefaultResultWriter(config.Logger, config.Alerter),
  79. )
  80. handler.ServeHTTP(rr, req)
  81. apitest.AssertResponseError(t, rr, http.StatusBadRequest, &types.ExternalError{
  82. Error: fmt.Sprintf("validation failed on field 'Email' on condition 'email'"),
  83. })
  84. }
  85. func TestLoginUserEmptyPassword(t *testing.T) {
  86. req, rr := apitest.GetRequestAndRecorder(
  87. t,
  88. string(types.HTTPVerbPost),
  89. "/api/login",
  90. &types.LoginUserRequest{
  91. Email: "mrp@porter.run",
  92. Password: "",
  93. },
  94. )
  95. config := apitest.LoadConfig(t)
  96. apitest.CreateTestUser(t, config, true)
  97. handler := user.NewUserLoginHandler(
  98. config,
  99. shared.NewDefaultRequestDecoderValidator(config.Logger, config.Alerter),
  100. shared.NewDefaultResultWriter(config.Logger, config.Alerter),
  101. )
  102. handler.ServeHTTP(rr, req)
  103. apitest.AssertResponseError(t, rr, http.StatusBadRequest, &types.ExternalError{
  104. Error: fmt.Sprintf("validation failed on field 'Password' on condition 'required'"),
  105. })
  106. }
  107. func TestLoginUserNotExist(t *testing.T) {
  108. req, rr := apitest.GetRequestAndRecorder(
  109. t,
  110. string(types.HTTPVerbPost),
  111. "/api/login",
  112. &types.LoginUserRequest{
  113. Email: "test@example.com",
  114. Password: "hello",
  115. },
  116. )
  117. config := apitest.LoadConfig(t)
  118. apitest.CreateTestUser(t, config, true)
  119. handler := user.NewUserLoginHandler(
  120. config,
  121. shared.NewDefaultRequestDecoderValidator(config.Logger, config.Alerter),
  122. shared.NewDefaultResultWriter(config.Logger, config.Alerter),
  123. )
  124. handler.ServeHTTP(rr, req)
  125. apitest.AssertResponseForbidden(t, rr)
  126. }
  127. func TestLoginUserFailingReadUserByEmailMethod(t *testing.T) {
  128. req, rr := apitest.GetRequestAndRecorder(
  129. t,
  130. string(types.HTTPVerbPost),
  131. "/api/login",
  132. &types.LoginUserRequest{
  133. Email: "mrp@porter.run",
  134. Password: "hello",
  135. },
  136. )
  137. config := apitest.LoadConfig(t, test.ReadUserByEmailMethod)
  138. apitest.CreateTestUser(t, config, true)
  139. handler := user.NewUserLoginHandler(
  140. config,
  141. shared.NewDefaultRequestDecoderValidator(config.Logger, config.Alerter),
  142. shared.NewDefaultResultWriter(config.Logger, config.Alerter),
  143. )
  144. handler.ServeHTTP(rr, req)
  145. apitest.AssertResponseInternalServerError(t, rr)
  146. }