user_test.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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. t.Log(message)
  41. assert.Nil(t, err, err)
  42. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  43. assert.Equal(t, http.StatusUnauthorized, message.Code)
  44. assert.Equal(t, "W1R3: Admin already exists! ", message.Message)
  45. data, _ := ioutil.ReadAll(response.Body)
  46. t.Log(string(data))
  47. })
  48. }
  49. func TestGetUser(t *testing.T) {
  50. if !adminExists(t) {
  51. t.Log("no admin - creating")
  52. addAdmin(t)
  53. } else {
  54. t.Log("admin exists")
  55. }
  56. t.Run("GetUserWithValidToken", func(t *testing.T) {
  57. t.Skip()
  58. token, err := authenticate(t)
  59. assert.Nil(t, err, err)
  60. response, err := api(t, "", http.MethodGet, "http://localhost:8081/api/users/admin", token)
  61. t.Log(response)
  62. assert.Nil(t, err, err)
  63. defer response.Body.Close()
  64. var user models.User
  65. json.NewDecoder(response.Body).Decode(&user)
  66. assert.Equal(t, http.StatusOK, response.StatusCode)
  67. assert.Equal(t, "admin", user.UserName)
  68. assert.Equal(t, true, user.IsAdmin)
  69. })
  70. t.Run("GetUserWithInvalidToken", func(t *testing.T) {
  71. response, err := api(t, "", http.MethodGet, "http://localhost:8081/api/users/admin", "secretkey")
  72. assert.Nil(t, err, err)
  73. defer response.Body.Close()
  74. t.Log(response.Body)
  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", "secretkey")
  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. addAdmin(t)
  113. }
  114. token, err := authenticate(t)
  115. assert.Nil(t, err, err)
  116. t.Run("DeleteUser-WongAdmin", func(t *testing.T) {
  117. //skip for now ... shouldn't panic
  118. t.Skip()
  119. function := func() {
  120. _, _ = api(t, "", http.MethodDelete, "http://localhost:8081/api/users/xxxx", token)
  121. }
  122. assert.Panics(t, function, "")
  123. })
  124. t.Run("DeleteUser-InvalidCredentials", func(t *testing.T) {
  125. response, err := api(t, "", http.MethodDelete, "http://localhost:8081/api/users/admin", "secretkey")
  126. assert.Nil(t, err, err)
  127. var message models.ErrorResponse
  128. json.NewDecoder(response.Body).Decode(&message)
  129. assert.Equal(t, "W1R3: Error Verifying Auth Token.", message.Message)
  130. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  131. })
  132. t.Run("DeleteUser-ValidCredentials", func(t *testing.T) {
  133. response, err := api(t, "", http.MethodDelete, "http://localhost:8081/api/users/admin", token)
  134. assert.Nil(t, err, err)
  135. var body string
  136. json.NewDecoder(response.Body).Decode(&body)
  137. assert.Equal(t, "admin deleted.", body)
  138. assert.Equal(t, http.StatusOK, response.StatusCode)
  139. })
  140. t.Run("DeleteUser-NoAdmin", func(t *testing.T) {
  141. //skip for now ... shouldn't panic
  142. t.Skip()
  143. function := func() {
  144. _, _ = api(t, "", http.MethodDelete, "http://localhost:8081/api/users/admin", token)
  145. }
  146. assert.Panics(t, function, "")
  147. })
  148. }
  149. func TestAuthenticateUser(t *testing.T) {
  150. cases := []AuthorizeTestCase{
  151. AuthorizeTestCase{
  152. testname: "Invalid User",
  153. name: "invaliduser",
  154. password: "password",
  155. code: http.StatusBadRequest,
  156. tokenExpected: false,
  157. errMessage: "W1R3: User invaliduser not found.",
  158. },
  159. AuthorizeTestCase{
  160. testname: "empty user",
  161. name: "",
  162. password: "password",
  163. code: http.StatusBadRequest,
  164. tokenExpected: false,
  165. errMessage: "W1R3: Username can't be empty",
  166. },
  167. AuthorizeTestCase{
  168. testname: "empty password",
  169. name: "admin",
  170. password: "",
  171. code: http.StatusBadRequest,
  172. tokenExpected: false,
  173. errMessage: "W1R3: Password can't be empty",
  174. },
  175. AuthorizeTestCase{
  176. testname: "Invalid Password",
  177. name: "admin",
  178. password: "xxxxxxx",
  179. code: http.StatusUnauthorized,
  180. tokenExpected: false,
  181. errMessage: "W1R3: Wrong Password.",
  182. },
  183. AuthorizeTestCase{
  184. testname: "Valid User",
  185. name: "admin",
  186. password: "password",
  187. code: http.StatusOK,
  188. tokenExpected: true,
  189. errMessage: "W1R3: Device Admin Authorized",
  190. },
  191. }
  192. if !adminExists(t) {
  193. addAdmin(t)
  194. }
  195. for _, tc := range cases {
  196. t.Run(tc.testname, func(t *testing.T) {
  197. var admin models.User
  198. admin.UserName = tc.name
  199. admin.Password = tc.password
  200. response, err := api(t, admin, http.MethodPost, "http://localhost:8081/api/users/adm/authenticate", "secretkey")
  201. assert.Nil(t, err, err)
  202. defer response.Body.Close()
  203. if tc.tokenExpected {
  204. var body Success
  205. err = json.NewDecoder(response.Body).Decode(&body)
  206. assert.Nil(t, err, err)
  207. assert.NotEmpty(t, body.Response.AuthToken, "token not returned")
  208. assert.Equal(t, "W1R3: Device admin Authorized", body.Message)
  209. } else {
  210. var bad models.ErrorResponse
  211. json.NewDecoder(response.Body).Decode(&bad)
  212. assert.Equal(t, tc.errMessage, bad.Message)
  213. }
  214. assert.Equal(t, tc.code, response.StatusCode)
  215. })
  216. }
  217. }