userHttpController_test.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. package controller
  2. import (
  3. "context"
  4. "os"
  5. "testing"
  6. "time"
  7. "github.com/gravitl/netmaker/models"
  8. "github.com/gravitl/netmaker/mongoconn"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. func TestMain(m *testing.M) {
  12. mongoconn.ConnectDatabase()
  13. var gconf models.GlobalConfig
  14. gconf.ServerGRPC = "localhost:8081"
  15. gconf.PortGRPC = "50051"
  16. //err := SetGlobalConfig(gconf)
  17. collection := mongoconn.Client.Database("netmaker").Collection("config")
  18. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  19. defer cancel()
  20. //create, _, err := functions.GetGlobalConfig()
  21. _, err := collection.InsertOne(ctx, gconf)
  22. if err != nil {
  23. panic("could not create config store")
  24. }
  25. //drop network, nodes, and user collections
  26. var collections = []string{"networks", "nodes", "users", "dns"}
  27. for _, table := range collections {
  28. collection := mongoconn.Client.Database("netmaker").Collection(table)
  29. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  30. defer cancel()
  31. err := collection.Drop(ctx)
  32. if err != nil {
  33. panic("could not drop collection")
  34. }
  35. }
  36. os.Exit(m.Run())
  37. }
  38. func TestHasAdmin(t *testing.T) {
  39. _, err := DeleteUser("admin")
  40. assert.Nil(t, err)
  41. user := models.User{"admin", "password", true}
  42. _, err = CreateUser(user)
  43. assert.Nil(t, err)
  44. t.Run("AdminExists", func(t *testing.T) {
  45. found, err := HasAdmin()
  46. assert.Nil(t, err)
  47. assert.True(t, found)
  48. })
  49. t.Run("NoUser", func(t *testing.T) {
  50. _, err := DeleteUser("admin")
  51. assert.Nil(t, err)
  52. found, err := HasAdmin()
  53. assert.Nil(t, err)
  54. assert.False(t, found)
  55. })
  56. }
  57. func TestCreateUser(t *testing.T) {
  58. user := models.User{"admin", "password", true}
  59. t.Run("NoUser", func(t *testing.T) {
  60. _, err := DeleteUser("admin")
  61. assert.Nil(t, err)
  62. admin, err := CreateUser(user)
  63. assert.Nil(t, err)
  64. assert.Equal(t, user.UserName, admin.UserName)
  65. })
  66. t.Run("AdminExists", func(t *testing.T) {
  67. _, err := CreateUser(user)
  68. assert.NotNil(t, err)
  69. assert.Equal(t, "Admin already Exists", err.Error())
  70. })
  71. }
  72. func TestDeleteUser(t *testing.T) {
  73. hasadmin, err := HasAdmin()
  74. assert.Nil(t, err)
  75. if !hasadmin {
  76. user := models.User{"admin", "pasword", true}
  77. _, err := CreateUser(user)
  78. assert.Nil(t, err)
  79. }
  80. t.Run("ExistingUser", func(t *testing.T) {
  81. deleted, err := DeleteUser("admin")
  82. assert.Nil(t, err)
  83. assert.True(t, deleted)
  84. t.Log(deleted, err)
  85. })
  86. t.Run("NonExistantUser", func(t *testing.T) {
  87. deleted, err := DeleteUser("admin")
  88. assert.Nil(t, err)
  89. assert.False(t, deleted)
  90. })
  91. }
  92. func TestValidateUser(t *testing.T) {
  93. var user models.User
  94. t.Run("ValidCreate", func(t *testing.T) {
  95. user.UserName = "admin"
  96. user.Password = "validpass"
  97. err := ValidateUser("create", user)
  98. assert.Nil(t, err)
  99. })
  100. t.Run("ValidUpdate", func(t *testing.T) {
  101. user.UserName = "admin"
  102. user.Password = "password"
  103. err := ValidateUser("update", user)
  104. assert.Nil(t, err)
  105. })
  106. t.Run("InvalidUserName", func(t *testing.T) {
  107. user.UserName = "invalid*"
  108. err := ValidateUser("update", user)
  109. assert.NotNil(t, err)
  110. assert.Contains(t, err.Error(), "Field validation for 'UserName' failed")
  111. })
  112. t.Run("ShortUserName", func(t *testing.T) {
  113. user.UserName = "12"
  114. err := ValidateUser("create", user)
  115. assert.NotNil(t, err)
  116. assert.Contains(t, err.Error(), "Field validation for 'UserName' failed")
  117. })
  118. t.Run("EmptyPassword", func(t *testing.T) {
  119. user.Password = ""
  120. err := ValidateUser("create", user)
  121. assert.NotNil(t, err)
  122. assert.Contains(t, err.Error(), "Field validation for 'Password' failed")
  123. })
  124. t.Run("ShortPassword", func(t *testing.T) {
  125. user.Password = "123"
  126. err := ValidateUser("create", user)
  127. assert.NotNil(t, err)
  128. assert.Contains(t, err.Error(), "Field validation for 'Password' failed")
  129. })
  130. }
  131. func TestGetUser(t *testing.T) {
  132. t.Run("UserExisits", func(t *testing.T) {
  133. user := models.User{"admin", "password", true}
  134. hasadmin, err := HasAdmin()
  135. assert.Nil(t, err)
  136. if !hasadmin {
  137. _, err := CreateUser(user)
  138. assert.Nil(t, err)
  139. }
  140. admin, err := GetUser("admin")
  141. assert.Nil(t, err)
  142. assert.Equal(t, user.UserName, admin.UserName)
  143. })
  144. t.Run("NonExistantUser", func(t *testing.T) {
  145. _, err := DeleteUser("admin")
  146. assert.Nil(t, err)
  147. admin, err := GetUser("admin")
  148. assert.Equal(t, "mongo: no documents in result", err.Error())
  149. assert.Equal(t, "", admin.UserName)
  150. })
  151. }
  152. func TestUpdateUser(t *testing.T) {
  153. user := models.User{"admin", "password", true}
  154. newuser := models.User{"hello", "world", true}
  155. t.Run("UserExisits", func(t *testing.T) {
  156. _, err := DeleteUser("admin")
  157. _, err = CreateUser(user)
  158. assert.Nil(t, err)
  159. admin, err := UpdateUser(newuser, user)
  160. assert.Nil(t, err)
  161. assert.Equal(t, newuser.UserName, admin.UserName)
  162. })
  163. t.Run("NonExistantUser", func(t *testing.T) {
  164. _, err := DeleteUser("hello")
  165. assert.Nil(t, err)
  166. _, err = UpdateUser(newuser, user)
  167. assert.Equal(t, "mongo: no documents in result", err.Error())
  168. })
  169. }
  170. func TestValidateUserToken(t *testing.T) {
  171. t.Run("EmptyToken", func(t *testing.T) {
  172. err := ValidateUserToken("")
  173. assert.NotNil(t, err)
  174. assert.Equal(t, "Missing Auth Token.", err.Error())
  175. })
  176. t.Run("InvalidToken", func(t *testing.T) {
  177. err := ValidateUserToken("Bearer: badtoken")
  178. assert.NotNil(t, err)
  179. assert.Equal(t, "Error Verifying Auth Token", err.Error())
  180. })
  181. t.Run("InvalidUser", func(t *testing.T) {
  182. t.Skip()
  183. //need authorization
  184. })
  185. t.Run("ValidToken", func(t *testing.T) {
  186. err := ValidateUserToken("Bearer: secretkey")
  187. assert.Nil(t, err)
  188. })
  189. }
  190. func TestVerifyAuthRequest(t *testing.T) {
  191. var authRequest models.UserAuthParams
  192. t.Run("EmptyUserName", func(t *testing.T) {
  193. authRequest.UserName = ""
  194. authRequest.Password = "Password"
  195. jwt, err := VerifyAuthRequest(authRequest)
  196. assert.NotNil(t, err)
  197. assert.Equal(t, "", jwt)
  198. assert.Equal(t, "Username can't be empty", err.Error())
  199. })
  200. t.Run("EmptyPassword", func(t *testing.T) {
  201. authRequest.UserName = "admin"
  202. authRequest.Password = ""
  203. jwt, err := VerifyAuthRequest(authRequest)
  204. assert.NotNil(t, err)
  205. assert.Equal(t, "", jwt)
  206. assert.Equal(t, "Password can't be empty", err.Error())
  207. })
  208. t.Run("NonExistantUser", func(t *testing.T) {
  209. _, err := DeleteUser("admin")
  210. authRequest.UserName = "admin"
  211. authRequest.Password = "password"
  212. jwt, err := VerifyAuthRequest(authRequest)
  213. assert.NotNil(t, err)
  214. assert.Equal(t, "", jwt)
  215. assert.Equal(t, "User admin not found", err.Error())
  216. })
  217. t.Run("Non-Admin", func(t *testing.T) {
  218. //can't create a user that is not a an admin
  219. t.Skip()
  220. user := models.User{"admin", "admin", false}
  221. _, err := CreateUser(user)
  222. assert.Nil(t, err)
  223. authRequest := models.UserAuthParams{"admin", "admin"}
  224. jwt, err := VerifyAuthRequest(authRequest)
  225. assert.NotNil(t, err)
  226. assert.Equal(t, "", jwt)
  227. assert.Equal(t, "User is not an admin", err.Error())
  228. })
  229. t.Run("WrongPassword", func(t *testing.T) {
  230. _, err := DeleteUser("admin")
  231. user := models.User{"admin", "password", true}
  232. _, err = CreateUser(user)
  233. assert.Nil(t, err)
  234. authRequest := models.UserAuthParams{"admin", "badpass"}
  235. jwt, err := VerifyAuthRequest(authRequest)
  236. assert.NotNil(t, err)
  237. assert.Equal(t, "", jwt)
  238. assert.Equal(t, "Wrong Password", err.Error())
  239. })
  240. t.Run("Success", func(t *testing.T) {
  241. authRequest := models.UserAuthParams{"admin", "password"}
  242. jwt, err := VerifyAuthRequest(authRequest)
  243. assert.Nil(t, err)
  244. assert.NotNil(t, jwt)
  245. })
  246. }