api_test.go 5.5 KB

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