user_test.go 8.4 KB

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