user_test.go 7.2 KB

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