user_handler_test.go 3.2 KB

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