user_test.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  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. if err := logic.CreateUser(&adminUser); err != nil {
  175. t.Error(err)
  176. }
  177. admins, err := logic.GetUsers()
  178. assert.Nil(t, err)
  179. assert.Equal(t, adminUser.UserName, admins[0].UserName)
  180. })
  181. t.Run("MulipleUsers", func(t *testing.T) {
  182. if err := logic.CreateUser(&user); err != nil {
  183. t.Error(err)
  184. }
  185. admins, err := logic.GetUsers()
  186. assert.Nil(t, err)
  187. for _, u := range admins {
  188. if u.UserName == "admin" {
  189. assert.Equal(t, true, u.IsAdmin)
  190. } else {
  191. assert.Equal(t, user.UserName, u.UserName)
  192. assert.Equal(t, user.IsAdmin, u.IsAdmin)
  193. }
  194. }
  195. })
  196. }
  197. func TestUpdateUser(t *testing.T) {
  198. deleteAllUsers(t)
  199. user := models.User{UserName: "admin", Password: "password", IsAdmin: true}
  200. newuser := models.User{UserName: "hello", Password: "world", Networks: []string{"wirecat, netmaker"}, IsAdmin: true, Groups: []string{}}
  201. t.Run("NonExistantUser", func(t *testing.T) {
  202. admin, err := logic.UpdateUser(&newuser, &user)
  203. assert.EqualError(t, err, "could not find any records")
  204. assert.Equal(t, "", admin.UserName)
  205. })
  206. t.Run("UserExists", func(t *testing.T) {
  207. if err := logic.CreateUser(&user); err != nil {
  208. t.Error(err)
  209. }
  210. admin, err := logic.UpdateUser(&newuser, &user)
  211. assert.Nil(t, err)
  212. assert.Equal(t, newuser.UserName, admin.UserName)
  213. })
  214. }
  215. // func TestValidateUserToken(t *testing.T) {
  216. // t.Run("EmptyToken", func(t *testing.T) {
  217. // err := ValidateUserToken("", "", false)
  218. // assert.NotNil(t, err)
  219. // assert.Equal(t, "Missing Auth Token.", err.Error())
  220. // })
  221. // t.Run("InvalidToken", func(t *testing.T) {
  222. // err := ValidateUserToken("Bearer: badtoken", "", false)
  223. // assert.NotNil(t, err)
  224. // assert.Equal(t, "Error Verifying Auth Token", err.Error())
  225. // })
  226. // t.Run("InvalidUser", func(t *testing.T) {
  227. // t.Skip()
  228. // err := ValidateUserToken("Bearer: secretkey", "baduser", false)
  229. // assert.NotNil(t, err)
  230. // assert.Equal(t, "Error Verifying Auth Token", err.Error())
  231. // //need authorization
  232. // })
  233. // t.Run("ValidToken", func(t *testing.T) {
  234. // err := ValidateUserToken("Bearer: secretkey", "", true)
  235. // assert.Nil(t, err)
  236. // })
  237. // }
  238. func TestVerifyAuthRequest(t *testing.T) {
  239. deleteAllUsers(t)
  240. user := models.User{UserName: "admin", Password: "password", Networks: nil, IsAdmin: true, Groups: nil}
  241. var authRequest models.UserAuthParams
  242. t.Run("EmptyUserName", func(t *testing.T) {
  243. authRequest.UserName = ""
  244. authRequest.Password = "Password"
  245. jwt, err := logic.VerifyAuthRequest(authRequest)
  246. assert.Equal(t, "", jwt)
  247. assert.EqualError(t, err, "username can't be empty")
  248. })
  249. t.Run("EmptyPassword", func(t *testing.T) {
  250. authRequest.UserName = "admin"
  251. authRequest.Password = ""
  252. jwt, err := logic.VerifyAuthRequest(authRequest)
  253. assert.Equal(t, "", jwt)
  254. assert.EqualError(t, err, "password can't be empty")
  255. })
  256. t.Run("NonExistantUser", func(t *testing.T) {
  257. authRequest.UserName = "admin"
  258. authRequest.Password = "password"
  259. jwt, err := logic.VerifyAuthRequest(authRequest)
  260. assert.Equal(t, "", jwt)
  261. assert.EqualError(t, err, "error retrieving user from db: could not find any records")
  262. })
  263. t.Run("Non-Admin", func(t *testing.T) {
  264. if err := logic.CreateUser(&user); err != nil {
  265. t.Error(err)
  266. }
  267. authRequest := models.UserAuthParams{UserName: "nonadmin", Password: "somepass"}
  268. jwt, err := logic.VerifyAuthRequest(authRequest)
  269. assert.NotNil(t, jwt)
  270. assert.Nil(t, err)
  271. })
  272. t.Run("WrongPassword", func(t *testing.T) {
  273. user := models.User{UserName: "admin", Password: "password", Groups: []string{}}
  274. if err := logic.CreateUser(&user); err != nil {
  275. t.Error(err)
  276. }
  277. authRequest := models.UserAuthParams{UserName: "admin", Password: "badpass"}
  278. jwt, err := logic.VerifyAuthRequest(authRequest)
  279. assert.Equal(t, "", jwt)
  280. assert.EqualError(t, err, "incorrect credentials")
  281. })
  282. t.Run("Success", func(t *testing.T) {
  283. authRequest := models.UserAuthParams{UserName: "admin", Password: "password"}
  284. jwt, err := logic.VerifyAuthRequest(authRequest)
  285. assert.Nil(t, err)
  286. assert.NotNil(t, jwt)
  287. })
  288. }