user_handler_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package api_test
  2. import (
  3. "net/http"
  4. "net/http/httptest"
  5. "strings"
  6. "testing"
  7. "time"
  8. "github.com/porter-dev/porter/internal/config"
  9. "github.com/porter-dev/porter/internal/models"
  10. "github.com/porter-dev/porter/internal/repository"
  11. "github.com/porter-dev/porter/internal/repository/test"
  12. "github.com/porter-dev/porter/server/api"
  13. "github.com/porter-dev/porter/server/requestlog"
  14. lr "github.com/porter-dev/porter/internal/logger"
  15. vr "github.com/porter-dev/porter/internal/validator"
  16. )
  17. func initApi(canQuery bool) (*api.App, *repository.Repository) {
  18. appConf := config.Conf{
  19. Debug: true,
  20. Server: config.ServerConf{
  21. Port: 8080,
  22. TimeoutRead: time.Second * 5,
  23. TimeoutWrite: time.Second * 10,
  24. TimeoutIdle: time.Second * 15,
  25. },
  26. // unimportant
  27. Db: config.DBConf{},
  28. }
  29. logger := lr.NewConsole(appConf.Debug)
  30. validator := vr.New()
  31. repo := test.NewRepository(canQuery)
  32. return api.New(logger, repo, validator), repo
  33. }
  34. type userTest struct {
  35. init func(repo *repository.Repository)
  36. msg,
  37. method,
  38. endpoint,
  39. body string
  40. expStatus int
  41. expBody string
  42. canQuery bool
  43. }
  44. var createUserTests = []userTest{
  45. // userTest{
  46. // msg: "Create user",
  47. // method: "POST",
  48. // endpoint: "/api/users",
  49. // body: `{
  50. // "email": "belanger@getporter.dev",
  51. // "password": "hello"
  52. // }`,
  53. // expStatus: http.StatusCreated,
  54. // expBody: "",
  55. // canQuery: true,
  56. // },
  57. // userTest{
  58. // msg: "Create user invalid email",
  59. // method: "POST",
  60. // endpoint: "/api/users",
  61. // body: `{
  62. // "email": "notanemail",
  63. // "password": "hello"
  64. // }`,
  65. // expStatus: http.StatusUnprocessableEntity,
  66. // expBody: `{"code":1,"errors":["email validation failed"]}`,
  67. // canQuery: true,
  68. // },
  69. // userTest{
  70. // msg: "Create user missing field",
  71. // method: "POST",
  72. // endpoint: "/api/users",
  73. // body: `{
  74. // "password": "hello"
  75. // }`,
  76. // expStatus: http.StatusUnprocessableEntity,
  77. // expBody: `{"code":1,"errors":["required validation failed"]}`,
  78. // canQuery: true,
  79. // },
  80. // userTest{
  81. // msg: "Create user cannot write to db",
  82. // method: "POST",
  83. // endpoint: "/api/users",
  84. // body: `{
  85. // "email": "belanger@getporter.dev",
  86. // "password": "hello"
  87. // }`,
  88. // expStatus: http.StatusInternalServerError,
  89. // expBody: `{"code":2,"errors":["data write error"]}`,
  90. // canQuery: false,
  91. // },
  92. userTest{
  93. init: func(repo *repository.Repository) {
  94. repo.User.CreateUser(&models.User{
  95. Email: "belanger@getporter.dev",
  96. Password: "hello",
  97. })
  98. },
  99. msg: "Create user same email",
  100. method: "POST",
  101. endpoint: "/api/users",
  102. body: `{
  103. "email": "belanger@getporter.dev",
  104. "password": "hello"
  105. }`,
  106. expStatus: http.StatusInternalServerError,
  107. expBody: "",
  108. canQuery: true,
  109. },
  110. }
  111. func TestHandleCreateUser(t *testing.T) {
  112. for _, c := range createUserTests {
  113. // create a mock API
  114. api, repo := initApi(c.canQuery)
  115. if c.init != nil {
  116. c.init(repo)
  117. }
  118. req, err := http.NewRequest(
  119. c.method,
  120. c.endpoint,
  121. strings.NewReader(c.body),
  122. )
  123. if err != nil {
  124. t.Fatal(err)
  125. }
  126. rr := httptest.NewRecorder()
  127. handler := requestlog.NewHandler(api.HandleCreateUser, api.Logger())
  128. handler.ServeHTTP(rr, req)
  129. if status := rr.Code; status != c.expStatus {
  130. t.Errorf("%s, handler returned wrong status code: got %v want %v",
  131. c.msg, status, c.expStatus)
  132. }
  133. if body := rr.Body.String(); body != c.expBody {
  134. t.Errorf("%s, handler returned wrong body: got %v want %v",
  135. c.msg, body, c.expBody)
  136. }
  137. }
  138. }
  139. // var readUserTests = []userTest