user_test.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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/users/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/users/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. //ensure admin exists
  45. if !adminExists(t) {
  46. addAdmin(t)
  47. }
  48. //authenticate
  49. t.Run("GetUserWithValidToken", func(t *testing.T) {
  50. token, err := authenticate(t)
  51. assert.Nil(t, err, err)
  52. response, err := api(t, "", http.MethodGet, "http://localhost:8081/users/admin", token)
  53. assert.Nil(t, err, err)
  54. defer response.Body.Close()
  55. var user models.User
  56. json.NewDecoder(response.Body).Decode(&user)
  57. assert.Equal(t, http.StatusOK, response.StatusCode)
  58. assert.Equal(t, "admin", user.UserName)
  59. assert.Equal(t, true, user.IsAdmin)
  60. })
  61. t.Run("GetUserWithInvalidToken", func(t *testing.T) {
  62. response, err := api(t, "", http.MethodGet, "http://localhost:8081/users/admin", "secretkey")
  63. assert.Nil(t, err, err)
  64. defer response.Body.Close()
  65. t.Log(response.Body)
  66. })
  67. }
  68. func TestUpdateUser(t *testing.T) {
  69. if !adminExists(t) {
  70. addAdmin(t)
  71. }
  72. token, err := authenticate(t)
  73. assert.Nil(t, err, err)
  74. var admin models.UserAuthParams
  75. var user models.User
  76. var message models.ErrorResponse
  77. t.Run("UpdateWrongToken", func(t *testing.T) {
  78. admin.UserName = "admin"
  79. admin.Password = "admin"
  80. response, err := api(t, admin, http.MethodPut, "http://localhost:8081/users/admin", "secretkey")
  81. assert.Nil(t, err, err)
  82. defer response.Body.Close()
  83. err = json.NewDecoder(response.Body).Decode(&message)
  84. assert.Nil(t, err, err)
  85. assert.Equal(t, "W1R3: Error Verifying Auth Token.", message.Message)
  86. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  87. })
  88. t.Run("UpdateSuccess", func(t *testing.T) {
  89. admin.UserName = "admin"
  90. admin.Password = "password"
  91. response, err := api(t, admin, http.MethodPut, "http://localhost:8081/users/admin", token)
  92. assert.Nil(t, err, err)
  93. defer response.Body.Close()
  94. err = json.NewDecoder(response.Body).Decode(&user)
  95. assert.Nil(t, err, err)
  96. assert.Equal(t, admin.UserName, user.UserName)
  97. assert.Equal(t, true, user.IsAdmin)
  98. assert.Equal(t, http.StatusOK, response.StatusCode)
  99. })
  100. }
  101. func TestDeleteUser(t *testing.T) {
  102. if !adminExists(t) {
  103. addAdmin(t)
  104. }
  105. token, err := authenticate(t)
  106. assert.Nil(t, err, err)
  107. t.Run("DeleteUser-WongAdmin", func(t *testing.T) {
  108. //skip for now ... shouldn't panic
  109. t.Skip()
  110. function := func() {
  111. _, _ = api(t, "", http.MethodDelete, "http://localhost:8081/users/xxxx", token)
  112. }
  113. assert.Panics(t, function, "")
  114. })
  115. t.Run("DeleteUser-InvalidCredentials", func(t *testing.T) {
  116. response, err := api(t, "", http.MethodDelete, "http://localhost:8081/users/admin", "secretkey")
  117. assert.Nil(t, err, err)
  118. var message models.ErrorResponse
  119. json.NewDecoder(response.Body).Decode(&message)
  120. assert.Equal(t, "W1R3: Error Verifying Auth Token.", message.Message)
  121. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  122. })
  123. t.Run("DeleteUser-ValidCredentials", func(t *testing.T) {
  124. response, err := api(t, "", http.MethodDelete, "http://localhost:8081/users/admin", token)
  125. assert.Nil(t, err, err)
  126. var body string
  127. json.NewDecoder(response.Body).Decode(&body)
  128. assert.Equal(t, "admin deleted.", body)
  129. assert.Equal(t, http.StatusOK, response.StatusCode)
  130. })
  131. t.Run("DeleteUser-NoAdmin", func(t *testing.T) {
  132. //skip for now ... shouldn't panic
  133. t.Skip()
  134. function := func() {
  135. _, _ = api(t, "", http.MethodDelete, "http://localhost:8081/users/admin", token)
  136. }
  137. assert.Panics(t, function, "")
  138. })
  139. addAdmin(t)
  140. }
  141. func TestAuthenticateUser(t *testing.T) {
  142. cases := []AuthorizeTestCase{
  143. AuthorizeTestCase{
  144. testname: "Invalid User",
  145. name: "invaliduser",
  146. password: "password",
  147. code: http.StatusBadRequest,
  148. tokenExpected: false,
  149. errMessage: "W1R3: User invaliduser not found.",
  150. },
  151. AuthorizeTestCase{
  152. testname: "empty user",
  153. name: "",
  154. password: "password",
  155. code: http.StatusBadRequest,
  156. tokenExpected: false,
  157. errMessage: "W1R3: Username can't be empty",
  158. },
  159. AuthorizeTestCase{
  160. testname: "empty password",
  161. name: "admin",
  162. password: "",
  163. code: http.StatusBadRequest,
  164. tokenExpected: false,
  165. errMessage: "W1R3: Password can't be empty",
  166. },
  167. AuthorizeTestCase{
  168. testname: "Invalid Password",
  169. name: "admin",
  170. password: "xxxxxxx",
  171. code: http.StatusUnauthorized,
  172. tokenExpected: false,
  173. errMessage: "W1R3: Wrong Password.",
  174. },
  175. AuthorizeTestCase{
  176. testname: "Valid User",
  177. name: "admin",
  178. password: "password",
  179. code: http.StatusOK,
  180. tokenExpected: true,
  181. errMessage: "W1R3: Device Admin Authorized",
  182. },
  183. }
  184. if !adminExists(t) {
  185. addAdmin(t)
  186. }
  187. for _, tc := range cases {
  188. t.Run(tc.testname, func(t *testing.T) {
  189. var admin models.User
  190. admin.UserName = tc.name
  191. admin.Password = tc.password
  192. response, err := api(t, admin, http.MethodPost, "http://localhost:8081/users/authenticate", "secretkey")
  193. assert.Nil(t, err, err)
  194. defer response.Body.Close()
  195. if tc.tokenExpected {
  196. var body Success
  197. err = json.NewDecoder(response.Body).Decode(&body)
  198. assert.Nil(t, err, err)
  199. assert.NotEmpty(t, body.Response.AuthToken, "token not returned")
  200. assert.Equal(t, "W1R3: Device admin Authorized", body.Message)
  201. } else {
  202. var bad models.ErrorResponse
  203. json.NewDecoder(response.Body).Decode(&bad)
  204. assert.Equal(t, tc.errMessage, bad.Message)
  205. }
  206. assert.Equal(t, tc.code, response.StatusCode)
  207. })
  208. }
  209. }