user_test.go 7.1 KB

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