user_test.go 9.3 KB

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