user_test.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package main
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "testing"
  6. "github.com/gravitl/netmaker/models"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. func TestAdminCreation(t *testing.T) {
  10. var admin models.UserAuthParams
  11. var user models.User
  12. admin.UserName = "admin"
  13. admin.Password = "password"
  14. t.Run("AdminCreationSuccess", func(t *testing.T) {
  15. if adminExists(t) {
  16. deleteAdmin(t)
  17. }
  18. response, err := api(t, admin, http.MethodPost, "http://localhost:8081/api/users/adm/createadmin", "")
  19. assert.Nil(t, err, err)
  20. defer response.Body.Close()
  21. err = json.NewDecoder(response.Body).Decode(&user)
  22. assert.Nil(t, err, err)
  23. assert.Equal(t, admin.UserName, user.UserName)
  24. assert.Equal(t, true, user.IsAdmin)
  25. assert.Equal(t, http.StatusOK, response.StatusCode)
  26. assert.True(t, adminExists(t), "Admin creation failed")
  27. })
  28. t.Run("AdminCreationFailure", func(t *testing.T) {
  29. if !adminExists(t) {
  30. addAdmin(t)
  31. }
  32. response, err := api(t, admin, http.MethodPost, "http://localhost:8081/api/users/adm/createadmin", "")
  33. assert.Nil(t, err, err)
  34. defer response.Body.Close()
  35. var message models.ErrorResponse
  36. err = json.NewDecoder(response.Body).Decode(&message)
  37. assert.Nil(t, err, err)
  38. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  39. assert.Equal(t, http.StatusUnauthorized, message.Code)
  40. assert.Equal(t, "W1R3: Admin already exists! ", message.Message)
  41. })
  42. }
  43. func TestGetUser(t *testing.T) {
  44. if !adminExists(t) {
  45. addAdmin(t)
  46. }
  47. t.Run("GetUserWithValidToken", func(t *testing.T) {
  48. token, err := authenticate(t)
  49. assert.Nil(t, err, err)
  50. response, err := api(t, "", http.MethodGet, "http://localhost:8081/api/users/admin", token)
  51. assert.Nil(t, err, err)
  52. defer response.Body.Close()
  53. var user models.User
  54. json.NewDecoder(response.Body).Decode(&user)
  55. assert.Equal(t, http.StatusOK, response.StatusCode)
  56. assert.Equal(t, "admin", user.UserName)
  57. assert.Equal(t, true, user.IsAdmin)
  58. })
  59. t.Run("GetUserWithInvalidToken", func(t *testing.T) {
  60. response, err := api(t, "", http.MethodGet, "http://localhost:8081/api/users/admin", "badkey")
  61. assert.Nil(t, err, err)
  62. defer response.Body.Close()
  63. var message models.ErrorResponse
  64. err = json.NewDecoder(response.Body).Decode(&message)
  65. assert.Nil(t, err, err)
  66. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  67. assert.Equal(t, http.StatusUnauthorized, message.Code)
  68. assert.Equal(t, "W1R3: Error Verifying Auth Token.", message.Message)
  69. })
  70. }
  71. func TestUpdateUser(t *testing.T) {
  72. if !adminExists(t) {
  73. addAdmin(t)
  74. }
  75. token, err := authenticate(t)
  76. assert.Nil(t, err, err)
  77. var admin models.UserAuthParams
  78. var user models.User
  79. var message models.ErrorResponse
  80. t.Run("UpdateWrongToken", func(t *testing.T) {
  81. admin.UserName = "admin"
  82. admin.Password = "admin"
  83. response, err := api(t, admin, http.MethodPut, "http://localhost:8081/api/users/admin", "badkey")
  84. assert.Nil(t, err, err)
  85. defer response.Body.Close()
  86. err = json.NewDecoder(response.Body).Decode(&message)
  87. assert.Nil(t, err, err)
  88. assert.Equal(t, "W1R3: Error Verifying Auth Token.", message.Message)
  89. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  90. })
  91. t.Run("UpdateSuccess", func(t *testing.T) {
  92. admin.UserName = "admin"
  93. admin.Password = "password"
  94. response, err := api(t, admin, http.MethodPut, "http://localhost:8081/api/users/admin", token)
  95. assert.Nil(t, err, err)
  96. defer response.Body.Close()
  97. err = json.NewDecoder(response.Body).Decode(&user)
  98. assert.Nil(t, err, err)
  99. assert.Equal(t, admin.UserName, user.UserName)
  100. assert.Equal(t, true, user.IsAdmin)
  101. assert.Equal(t, http.StatusOK, response.StatusCode)
  102. })
  103. }
  104. func TestDeleteUser(t *testing.T) {
  105. if !adminExists(t) {
  106. t.Log("Creating Admin")
  107. addAdmin(t)
  108. }
  109. token, err := authenticate(t)
  110. assert.Nil(t, err, err)
  111. t.Run("DeleteUser-InvalidCredentials", func(t *testing.T) {
  112. response, err := api(t, "", http.MethodDelete, "http://localhost:8081/api/users/admin", "badcredentials")
  113. assert.Nil(t, err, err)
  114. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  115. var message models.ErrorResponse
  116. json.NewDecoder(response.Body).Decode(&message)
  117. assert.Equal(t, "W1R3: Error Verifying Auth Token.", message.Message)
  118. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  119. })
  120. t.Run("DeleteUser-ValidCredentials", func(t *testing.T) {
  121. response, err := api(t, "", http.MethodDelete, "http://localhost:8081/api/users/admin", token)
  122. assert.Nil(t, err, err)
  123. var body string
  124. json.NewDecoder(response.Body).Decode(&body)
  125. assert.Equal(t, "admin deleted.", body)
  126. assert.Equal(t, http.StatusOK, response.StatusCode)
  127. })
  128. t.Run("DeleteUser-NonExistantAdmin", func(t *testing.T) {
  129. response, err := api(t, "", http.MethodDelete, "http://localhost:8081/api/users/admin", token)
  130. assert.Nil(t, err, err)
  131. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  132. var message models.ErrorResponse
  133. defer response.Body.Close()
  134. json.NewDecoder(response.Body).Decode(&message)
  135. assert.Equal(t, http.StatusBadRequest, message.Code)
  136. assert.Equal(t, "Delete unsuccessful.", message.Message)
  137. })
  138. }
  139. func TestAuthenticateUser(t *testing.T) {
  140. cases := []AuthorizeTestCase{
  141. AuthorizeTestCase{
  142. testname: "Invalid User",
  143. name: "invaliduser",
  144. password: "password",
  145. code: http.StatusBadRequest,
  146. tokenExpected: false,
  147. errMessage: "W1R3: User invaliduser not found.",
  148. },
  149. AuthorizeTestCase{
  150. testname: "empty user",
  151. name: "",
  152. password: "password",
  153. code: http.StatusBadRequest,
  154. tokenExpected: false,
  155. errMessage: "W1R3: Username can't be empty",
  156. },
  157. AuthorizeTestCase{
  158. testname: "empty password",
  159. name: "admin",
  160. password: "",
  161. code: http.StatusBadRequest,
  162. tokenExpected: false,
  163. errMessage: "W1R3: Password can't be empty",
  164. },
  165. AuthorizeTestCase{
  166. testname: "Invalid Password",
  167. name: "admin",
  168. password: "xxxxxxx",
  169. code: http.StatusUnauthorized,
  170. tokenExpected: false,
  171. errMessage: "W1R3: Wrong Password.",
  172. },
  173. AuthorizeTestCase{
  174. testname: "Valid User",
  175. name: "admin",
  176. password: "password",
  177. code: http.StatusOK,
  178. tokenExpected: true,
  179. errMessage: "W1R3: Device Admin Authorized",
  180. },
  181. }
  182. if !adminExists(t) {
  183. addAdmin(t)
  184. }
  185. for _, tc := range cases {
  186. t.Run(tc.testname, func(t *testing.T) {
  187. var admin models.User
  188. admin.UserName = tc.name
  189. admin.Password = tc.password
  190. response, err := api(t, admin, http.MethodPost, "http://localhost:8081/api/users/adm/authenticate", "secretkey")
  191. assert.Nil(t, err, err)
  192. defer response.Body.Close()
  193. if tc.tokenExpected {
  194. var body Success
  195. err = json.NewDecoder(response.Body).Decode(&body)
  196. assert.Nil(t, err, err)
  197. assert.NotEmpty(t, body.Response.AuthToken, "token not returned")
  198. assert.Equal(t, "W1R3: Device admin Authorized", body.Message)
  199. } else {
  200. var bad models.ErrorResponse
  201. json.NewDecoder(response.Body).Decode(&bad)
  202. assert.Equal(t, tc.errMessage, bad.Message)
  203. }
  204. assert.Equal(t, tc.code, response.StatusCode)
  205. })
  206. }
  207. }