api_test.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. package main
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "io/ioutil"
  7. "net/http"
  8. "os"
  9. "sync"
  10. "testing"
  11. "time"
  12. controller "github.com/gravitl/netmaker/controllers"
  13. "github.com/gravitl/netmaker/models"
  14. "github.com/gravitl/netmaker/mongoconn"
  15. "github.com/stretchr/testify/assert"
  16. )
  17. type databaseError struct {
  18. Inner *int
  19. Errors int
  20. }
  21. //should be use models.SuccessResponse and models.SuccessfulUserLoginResponse
  22. //rather than creating new type but having trouble decoding that way
  23. type Auth struct {
  24. Username string
  25. AuthToken string
  26. }
  27. type Success struct {
  28. Code int
  29. Message string
  30. Response Auth
  31. }
  32. type AuthorizeTestCase struct {
  33. testname string
  34. name string
  35. password string
  36. code int
  37. tokenExpected bool
  38. errMessage string
  39. }
  40. var Networks []models.Network
  41. var baseURL string = "http://localhost:8081"
  42. func TestMain(m *testing.M) {
  43. mongoconn.ConnectDatabase()
  44. var waitgroup sync.WaitGroup
  45. waitgroup.Add(1)
  46. go controller.HandleRESTRequests(&waitgroup)
  47. var gconf models.GlobalConfig
  48. gconf.ServerGRPC = "localhost:8081"
  49. gconf.PortGRPC = "50051"
  50. //err := SetGlobalConfig(gconf)
  51. collection := mongoconn.Client.Database("netmaker").Collection("config")
  52. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  53. defer cancel()
  54. //create, _, err := functions.GetGlobalConfig()
  55. _, err := collection.InsertOne(ctx, gconf)
  56. if err != nil {
  57. panic("could not create config store")
  58. }
  59. //wait for http server to start
  60. time.Sleep(time.Second * 1)
  61. os.Exit(m.Run())
  62. }
  63. func adminExists(t *testing.T) bool {
  64. response, err := http.Get("http://localhost:8081/api/users/adm/hasadmin")
  65. assert.Nil(t, err, err)
  66. assert.Equal(t, http.StatusOK, response.StatusCode)
  67. defer response.Body.Close()
  68. var body bool
  69. json.NewDecoder(response.Body).Decode(&body)
  70. return body
  71. }
  72. func api(t *testing.T, data interface{}, method, url, authorization string) (*http.Response, error) {
  73. var request *http.Request
  74. var err error
  75. if data != "" {
  76. payload, err := json.Marshal(data)
  77. assert.Nil(t, err, err)
  78. request, err = http.NewRequest(method, url, bytes.NewBuffer(payload))
  79. assert.Nil(t, err, err)
  80. request.Header.Set("Content-Type", "application/json")
  81. } else {
  82. request, err = http.NewRequest(method, url, nil)
  83. assert.Nil(t, err, err)
  84. }
  85. if authorization != "" {
  86. request.Header.Set("authorization", "Bearer "+authorization)
  87. }
  88. client := http.Client{}
  89. //t.Log("api request", request)
  90. return client.Do(request)
  91. }
  92. func addAdmin(t *testing.T) {
  93. var admin models.User
  94. admin.UserName = "admin"
  95. admin.Password = "password"
  96. response, err := api(t, admin, http.MethodPost, baseURL+"/api/users/adm/createadmin", "secretkey")
  97. assert.Nil(t, err, err)
  98. assert.Equal(t, http.StatusOK, response.StatusCode)
  99. }
  100. func authenticate(t *testing.T) (string, error) {
  101. var admin models.User
  102. admin.UserName = "admin"
  103. admin.Password = "password"
  104. response, err := api(t, admin, http.MethodPost, baseURL+"/api/users/adm/authenticate", "secretkey")
  105. assert.Nil(t, err, err)
  106. var body Success
  107. err = json.NewDecoder(response.Body).Decode(&body)
  108. assert.Nil(t, err, err)
  109. assert.NotEmpty(t, body.Response.AuthToken, "token not returned")
  110. assert.Equal(t, "W1R3: Device admin Authorized", body.Message)
  111. return body.Response.AuthToken, nil
  112. }
  113. func deleteAdmin(t *testing.T) {
  114. if !adminExists(t) {
  115. return
  116. }
  117. token, err := authenticate(t)
  118. assert.Nil(t, err, err)
  119. _, err = api(t, "", http.MethodDelete, baseURL+"/api/users/admin", token)
  120. assert.Nil(t, err, err)
  121. }
  122. func createNetwork(t *testing.T) {
  123. network := models.Network{}
  124. network.NetID = "skynet"
  125. network.AddressRange = "10.71.0.0/16"
  126. response, err := api(t, network, http.MethodPost, baseURL+"/api/networks", "secretkey")
  127. assert.Nil(t, err, err)
  128. assert.Equal(t, http.StatusOK, response.StatusCode)
  129. }
  130. func createKey(t *testing.T) {
  131. key := models.AccessKey{}
  132. key.Name = "skynet"
  133. key.Uses = 10
  134. response, err := api(t, key, http.MethodPost, baseURL+"/api/networks/skynet/keys", "secretkey")
  135. assert.Nil(t, err, err)
  136. assert.Equal(t, http.StatusOK, response.StatusCode)
  137. defer response.Body.Close()
  138. message, err := ioutil.ReadAll(response.Body)
  139. assert.Nil(t, err, err)
  140. assert.NotNil(t, message, message)
  141. }
  142. func createAccessKey(t *testing.T) (key models.AccessKey) {
  143. createkey := models.AccessKey{}
  144. createkey.Name = "skynet"
  145. createkey.Uses = 10
  146. response, err := api(t, createkey, http.MethodPost, baseURL+"/api/networks/skynet/keys", "secretkey")
  147. assert.Nil(t, err, err)
  148. assert.Equal(t, http.StatusOK, response.StatusCode)
  149. defer response.Body.Close()
  150. err = json.NewDecoder(response.Body).Decode(&key)
  151. assert.Nil(t, err, err)
  152. return key
  153. }
  154. func getKey(t *testing.T, name string) models.AccessKey {
  155. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/skynet/keys", "secretkey")
  156. assert.Nil(t, err, err)
  157. assert.Equal(t, http.StatusOK, response.StatusCode)
  158. defer response.Body.Close()
  159. var keys []models.AccessKey
  160. err = json.NewDecoder(response.Body).Decode(&keys)
  161. assert.Nil(t, err, err)
  162. for _, key := range keys {
  163. if key.Name == name {
  164. return key
  165. }
  166. }
  167. return models.AccessKey{}
  168. }
  169. func deleteKey(t *testing.T, key, network string) {
  170. response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/"+network+"/keys/"+key, "secretkey")
  171. assert.Nil(t, err, err)
  172. //api does not return Deleted Count at this time
  173. //defer response.Body.Close()
  174. //var message mongo.DeleteResult
  175. //err = json.NewDecoder(response.Body).Decode(&message)
  176. //assert.Nil(t, err, err)
  177. assert.Equal(t, http.StatusOK, response.StatusCode)
  178. //assert.Equal(t, int64(1), message.DeletedCount)
  179. }
  180. func networkExists(t *testing.T) bool {
  181. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks", "secretkey")
  182. assert.Nil(t, err, err)
  183. defer response.Body.Close()
  184. assert.Equal(t, http.StatusOK, response.StatusCode)
  185. err = json.NewDecoder(response.Body).Decode(&Networks)
  186. assert.Nil(t, err, err)
  187. for i, network := range Networks {
  188. t.Log(i, network)
  189. if network.NetID == "" {
  190. return false
  191. } else {
  192. return true
  193. }
  194. }
  195. return false
  196. }
  197. func deleteNetworks(t *testing.T) {
  198. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks", "secretkey")
  199. assert.Nil(t, err, err)
  200. defer response.Body.Close()
  201. assert.Equal(t, http.StatusOK, response.StatusCode)
  202. err = json.NewDecoder(response.Body).Decode(&Networks)
  203. assert.Nil(t, err, err)
  204. for _, network := range Networks {
  205. name := network.NetID
  206. _, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/"+name, "secretkey")
  207. assert.Nil(t, err, err)
  208. }
  209. }
  210. func getNetworkNodes(t *testing.T) []models.ReturnNode {
  211. var nodes []models.ReturnNode
  212. var node models.ReturnNode
  213. nodes = append(nodes, node)
  214. return nodes
  215. }
  216. func deleteNode(t *testing.T, node models.ReturnNode) {
  217. }
  218. func createNode(t *testing.T) {
  219. }