user_test.go 9.2 KB

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