userHttpController_test.go 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. package controller
  2. import (
  3. "testing"
  4. "github.com/gravitl/netmaker/database"
  5. "github.com/gravitl/netmaker/models"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. func deleteAllUsers() {
  9. users, _ := GetUsers()
  10. for _, user := range users {
  11. DeleteUser(user.UserName)
  12. }
  13. }
  14. func TestHasAdmin(t *testing.T) {
  15. //delete all current users
  16. database.InitializeDatabase()
  17. users, _ := GetUsers()
  18. for _, user := range users {
  19. success, err := DeleteUser(user.UserName)
  20. assert.Nil(t, err)
  21. assert.True(t, success)
  22. }
  23. t.Run("NoUser", func(t *testing.T) {
  24. found, err := HasAdmin()
  25. assert.Nil(t, err)
  26. assert.False(t, found)
  27. })
  28. t.Run("No admin user", func(t *testing.T) {
  29. var user = models.User{"noadmin", "password", nil, false}
  30. _, err := CreateUser(user)
  31. assert.Nil(t, err)
  32. found, err := HasAdmin()
  33. assert.Nil(t, err)
  34. assert.False(t, found)
  35. })
  36. t.Run("admin user", func(t *testing.T) {
  37. var user = models.User{"admin", "password", nil, true}
  38. _, err := CreateUser(user)
  39. assert.Nil(t, err)
  40. found, err := HasAdmin()
  41. assert.Nil(t, err)
  42. assert.True(t, found)
  43. })
  44. t.Run("multiple admins", func(t *testing.T) {
  45. var user = models.User{"admin1", "password", nil, true}
  46. _, err := CreateUser(user)
  47. assert.Nil(t, err)
  48. found, err := HasAdmin()
  49. assert.Nil(t, err)
  50. assert.True(t, found)
  51. })
  52. }
  53. func TestCreateUser(t *testing.T) {
  54. database.InitializeDatabase()
  55. deleteAllUsers()
  56. user := models.User{"admin", "password", nil, true}
  57. t.Run("NoUser", func(t *testing.T) {
  58. admin, err := CreateUser(user)
  59. assert.Nil(t, err)
  60. assert.Equal(t, user.UserName, admin.UserName)
  61. })
  62. t.Run("UserExists", func(t *testing.T) {
  63. _, err := CreateUser(user)
  64. assert.NotNil(t, err)
  65. assert.EqualError(t, err, "user exists")
  66. })
  67. }
  68. func TestCreateAdmin(t *testing.T) {
  69. database.InitializeDatabase()
  70. deleteAllUsers()
  71. var user models.User
  72. t.Run("NoAdmin", func(t *testing.T) {
  73. user.UserName = "admin"
  74. user.Password = "password"
  75. admin, err := CreateAdmin(user)
  76. assert.Nil(t, err)
  77. assert.Equal(t, user.UserName, admin.UserName)
  78. })
  79. t.Run("AdminExists", func(t *testing.T) {
  80. user.UserName = "admin2"
  81. user.Password = "password1"
  82. admin, err := CreateAdmin(user)
  83. assert.EqualError(t, err, "admin user already exists")
  84. assert.Equal(t, admin, models.User{})
  85. })
  86. }
  87. func TestDeleteUser(t *testing.T) {
  88. database.InitializeDatabase()
  89. deleteAllUsers()
  90. t.Run("NonExistent User", func(t *testing.T) {
  91. deleted, err := DeleteUser("admin")
  92. assert.EqualError(t, err, "user does not exist")
  93. assert.False(t, deleted)
  94. })
  95. t.Run("Existing User", func(t *testing.T) {
  96. user := models.User{"admin", "password", nil, true}
  97. CreateUser(user)
  98. deleted, err := DeleteUser("admin")
  99. assert.Nil(t, err)
  100. assert.True(t, deleted)
  101. })
  102. }
  103. func TestValidateUser(t *testing.T) {
  104. database.InitializeDatabase()
  105. var user models.User
  106. t.Run("Valid Create", func(t *testing.T) {
  107. user.UserName = "admin"
  108. user.Password = "validpass"
  109. err := ValidateUser("create", user)
  110. assert.Nil(t, err)
  111. })
  112. t.Run("Valid Update", func(t *testing.T) {
  113. user.UserName = "admin"
  114. user.Password = "password"
  115. err := ValidateUser("update", user)
  116. assert.Nil(t, err)
  117. })
  118. t.Run("Invalid UserName", func(t *testing.T) {
  119. t.Skip()
  120. user.UserName = "*invalid"
  121. err := ValidateUser("create", user)
  122. assert.Error(t, err)
  123. //assert.Contains(t, err.Error(), "Field validation for 'UserName' failed")
  124. })
  125. t.Run("Short UserName", func(t *testing.T) {
  126. t.Skip()
  127. user.UserName = "1"
  128. err := ValidateUser("create", user)
  129. assert.NotNil(t, err)
  130. //assert.Contains(t, err.Error(), "Field validation for 'UserName' failed")
  131. })
  132. t.Run("Empty UserName", func(t *testing.T) {
  133. t.Skip()
  134. user.UserName = ""
  135. err := ValidateUser("create", user)
  136. assert.EqualError(t, err, "some string")
  137. //assert.Contains(t, err.Error(), "Field validation for 'UserName' failed")
  138. })
  139. t.Run("EmptyPassword", func(t *testing.T) {
  140. user.Password = ""
  141. err := ValidateUser("create", user)
  142. assert.EqualError(t, err, "Key: 'User.Password' Error:Field validation for 'Password' failed on the 'required' tag")
  143. })
  144. t.Run("ShortPassword", func(t *testing.T) {
  145. user.Password = "123"
  146. err := ValidateUser("create", user)
  147. assert.EqualError(t, err, "Key: 'User.Password' Error:Field validation for 'Password' failed on the 'min' tag")
  148. })
  149. }
  150. func TestGetUser(t *testing.T) {
  151. database.InitializeDatabase()
  152. deleteAllUsers()
  153. t.Run("NonExistantUser", func(t *testing.T) {
  154. admin, err := GetUser("admin")
  155. assert.EqualError(t, err, "could not find any records")
  156. assert.Equal(t, "", admin.UserName)
  157. })
  158. t.Run("UserExisits", func(t *testing.T) {
  159. user := models.User{"admin", "password", nil, true}
  160. CreateUser(user)
  161. admin, err := GetUser("admin")
  162. assert.Nil(t, err)
  163. assert.Equal(t, user.UserName, admin.UserName)
  164. })
  165. }
  166. func TestGetUserInternal(t *testing.T) {
  167. database.InitializeDatabase()
  168. deleteAllUsers()
  169. t.Run("NonExistantUser", func(t *testing.T) {
  170. admin, err := GetUserInternal("admin")
  171. assert.EqualError(t, err, "could not find any records")
  172. assert.Equal(t, "", admin.UserName)
  173. })
  174. t.Run("UserExisits", func(t *testing.T) {
  175. user := models.User{"admin", "password", nil, true}
  176. CreateUser(user)
  177. admin, err := GetUserInternal("admin")
  178. assert.Nil(t, err)
  179. assert.Equal(t, user.UserName, admin.UserName)
  180. })
  181. }
  182. func TestGetUsers(t *testing.T) {
  183. database.InitializeDatabase()
  184. deleteAllUsers()
  185. t.Run("NonExistantUser", func(t *testing.T) {
  186. admin, err := GetUsers()
  187. assert.EqualError(t, err, "could not find any records")
  188. assert.Equal(t, []models.ReturnUser(nil), admin)
  189. })
  190. t.Run("UserExisits", func(t *testing.T) {
  191. user := models.User{"admin", "password", nil, true}
  192. CreateUser(user)
  193. admins, err := GetUsers()
  194. assert.Nil(t, err)
  195. assert.Equal(t, user.UserName, admins[0].UserName)
  196. })
  197. t.Run("MulipleUsers", func(t *testing.T) {
  198. user := models.User{"user", "password", nil, true}
  199. CreateUser(user)
  200. admins, err := GetUsers()
  201. assert.Nil(t, err)
  202. for _, u := range admins {
  203. if u.UserName == "admin" {
  204. assert.Equal(t, "admin", u.UserName)
  205. } else {
  206. assert.Equal(t, user.UserName, u.UserName)
  207. }
  208. }
  209. })
  210. }
  211. func TestUpdateUser(t *testing.T) {
  212. database.InitializeDatabase()
  213. deleteAllUsers()
  214. user := models.User{"admin", "password", nil, true}
  215. newuser := models.User{"hello", "world", []string{"wirecat, netmaker"}, true}
  216. t.Run("NonExistantUser", func(t *testing.T) {
  217. admin, err := UpdateUser(newuser, user)
  218. assert.EqualError(t, err, "could not find any records")
  219. assert.Equal(t, "", admin.UserName)
  220. })
  221. t.Run("UserExists", func(t *testing.T) {
  222. CreateUser(user)
  223. admin, err := UpdateUser(newuser, user)
  224. assert.Nil(t, err)
  225. assert.Equal(t, newuser.UserName, admin.UserName)
  226. })
  227. }
  228. func TestValidateUserToken(t *testing.T) {
  229. t.Run("EmptyToken", func(t *testing.T) {
  230. err := ValidateUserToken("", "", false)
  231. assert.NotNil(t, err)
  232. assert.Equal(t, "Missing Auth Token.", err.Error())
  233. })
  234. t.Run("InvalidToken", func(t *testing.T) {
  235. err := ValidateUserToken("Bearer: badtoken", "", false)
  236. assert.NotNil(t, err)
  237. assert.Equal(t, "Error Verifying Auth Token", err.Error())
  238. })
  239. t.Run("InvalidUser", func(t *testing.T) {
  240. t.Skip()
  241. err := ValidateUserToken("Bearer: secretkey", "baduser", false)
  242. assert.NotNil(t, err)
  243. assert.Equal(t, "Error Verifying Auth Token", err.Error())
  244. //need authorization
  245. })
  246. t.Run("ValidToken", func(t *testing.T) {
  247. err := ValidateUserToken("Bearer: secretkey", "", true)
  248. assert.Nil(t, err)
  249. })
  250. }
  251. func TestVerifyAuthRequest(t *testing.T) {
  252. database.InitializeDatabase()
  253. deleteAllUsers()
  254. var authRequest models.UserAuthParams
  255. t.Run("EmptyUserName", func(t *testing.T) {
  256. authRequest.UserName = ""
  257. authRequest.Password = "Password"
  258. jwt, err := VerifyAuthRequest(authRequest)
  259. assert.Equal(t, "", jwt)
  260. assert.EqualError(t, err, "username can't be empty")
  261. })
  262. t.Run("EmptyPassword", func(t *testing.T) {
  263. authRequest.UserName = "admin"
  264. authRequest.Password = ""
  265. jwt, err := VerifyAuthRequest(authRequest)
  266. assert.Equal(t, "", jwt)
  267. assert.EqualError(t, err, "password can't be empty")
  268. })
  269. t.Run("NonExistantUser", func(t *testing.T) {
  270. authRequest.UserName = "admin"
  271. authRequest.Password = "password"
  272. jwt, err := VerifyAuthRequest(authRequest)
  273. assert.Equal(t, "", jwt)
  274. assert.EqualError(t, err, "incorrect credentials")
  275. })
  276. t.Run("Non-Admin", func(t *testing.T) {
  277. user := models.User{"nonadmin", "somepass", nil, false}
  278. CreateUser(user)
  279. authRequest := models.UserAuthParams{"nonadmin", "somepass"}
  280. jwt, err := VerifyAuthRequest(authRequest)
  281. assert.NotNil(t, jwt)
  282. assert.Nil(t, err)
  283. })
  284. t.Run("WrongPassword", func(t *testing.T) {
  285. user := models.User{"admin", "password", nil, false}
  286. CreateUser(user)
  287. authRequest := models.UserAuthParams{"admin", "badpass"}
  288. jwt, err := VerifyAuthRequest(authRequest)
  289. assert.Equal(t, "", jwt)
  290. assert.EqualError(t, err, "incorrect credentials")
  291. })
  292. t.Run("Success", func(t *testing.T) {
  293. authRequest := models.UserAuthParams{"admin", "password"}
  294. jwt, err := VerifyAuthRequest(authRequest)
  295. assert.Nil(t, err)
  296. assert.NotNil(t, jwt)
  297. })
  298. }