api_test.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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. //should be use models.SuccessResponse and models.SuccessfulUserLoginResponse
  17. //rather than creating new type but having trouble decoding that way
  18. type Auth struct {
  19. Username string
  20. AuthToken string
  21. }
  22. type Success struct {
  23. Code int
  24. Message string
  25. Response Auth
  26. }
  27. type AuthorizeTestCase struct {
  28. testname string
  29. name string
  30. password string
  31. code int
  32. tokenExpected bool
  33. errMessage string
  34. }
  35. var Networks []models.Network
  36. var baseURL string = "http://localhost:8081"
  37. func TestMain(m *testing.M) {
  38. mongoconn.ConnectDatabase()
  39. var waitgroup sync.WaitGroup
  40. waitgroup.Add(1)
  41. go controller.HandleRESTRequests(&waitgroup)
  42. time.Sleep(time.Second * 1)
  43. os.Exit(m.Run())
  44. }
  45. func adminExists(t *testing.T) bool {
  46. response, err := http.Get("http://localhost:8081/api/users/adm/hasadmin")
  47. assert.Nil(t, err, err)
  48. assert.Equal(t, http.StatusOK, response.StatusCode)
  49. defer response.Body.Close()
  50. var body bool
  51. json.NewDecoder(response.Body).Decode(&body)
  52. return body
  53. }
  54. func api(t *testing.T, data interface{}, method, url, authorization string) (*http.Response, error) {
  55. var request *http.Request
  56. var err error
  57. if data != "" {
  58. payload, err := json.Marshal(data)
  59. assert.Nil(t, err, err)
  60. request, err = http.NewRequest(method, url, bytes.NewBuffer(payload))
  61. assert.Nil(t, err, err)
  62. request.Header.Set("Content-Type", "application/json")
  63. } else {
  64. request, err = http.NewRequest(method, url, nil)
  65. assert.Nil(t, err, err)
  66. }
  67. if authorization != "" {
  68. request.Header.Set("authorization", "Bearer "+authorization)
  69. }
  70. client := http.Client{}
  71. return client.Do(request)
  72. }
  73. func addAdmin(t *testing.T) {
  74. var admin models.User
  75. admin.UserName = "admin"
  76. admin.Password = "password"
  77. response, err := api(t, admin, http.MethodPost, baseURL+"/api/users/adm/createadmin", "secretkey")
  78. assert.Nil(t, err, err)
  79. assert.Equal(t, http.StatusOK, response.StatusCode)
  80. }
  81. func authenticate(t *testing.T) (string, error) {
  82. var admin models.User
  83. admin.UserName = "admin"
  84. admin.Password = "password"
  85. response, err := api(t, admin, http.MethodPost, baseURL+"/api/users/adm/authenticate", "secretkey")
  86. assert.Nil(t, err, err)
  87. var body Success
  88. err = json.NewDecoder(response.Body).Decode(&body)
  89. assert.Nil(t, err, err)
  90. assert.NotEmpty(t, body.Response.AuthToken, "token not returned")
  91. assert.Equal(t, "W1R3: Device admin Authorized", body.Message)
  92. return body.Response.AuthToken, nil
  93. }
  94. func deleteAdmin(t *testing.T) {
  95. if !adminExists(t) {
  96. return
  97. }
  98. token, err := authenticate(t)
  99. assert.Nil(t, err, err)
  100. _, err = api(t, "", http.MethodDelete, baseURL+"/api/users/admin", token)
  101. assert.Nil(t, err, err)
  102. }
  103. func createNetwork(t *testing.T) {
  104. network := models.Network{}
  105. network.NetID = "skynet"
  106. network.AddressRange = "10.71.0.0/16"
  107. response, err := api(t, network, http.MethodPost, baseURL+"/api/networks", "secretkey")
  108. assert.Nil(t, err, err)
  109. assert.Equal(t, http.StatusOK, response.StatusCode)
  110. }
  111. func createKey(t *testing.T) {
  112. key := models.AccessKey{}
  113. key.Name = "skynet"
  114. key.Uses = 10
  115. response, err := api(t, key, http.MethodPost, baseURL+"/api/networks/skynet/keys", "secretkey")
  116. assert.Nil(t, err, err)
  117. assert.Equal(t, http.StatusOK, response.StatusCode)
  118. defer response.Body.Close()
  119. message, err := ioutil.ReadAll(response.Body)
  120. assert.Nil(t, err, err)
  121. assert.NotNil(t, message, message)
  122. }
  123. func createAccessKey(t *testing.T) (key models.AccessKey) {
  124. createkey := models.AccessKey{}
  125. createkey.Name = "skynet"
  126. createkey.Uses = 10
  127. response, err := api(t, createkey, http.MethodPost, baseURL+"/api/networks/skynet/keys", "secretkey")
  128. assert.Nil(t, err, err)
  129. assert.Equal(t, http.StatusOK, response.StatusCode)
  130. defer response.Body.Close()
  131. err = json.NewDecoder(response.Body).Decode(&key)
  132. assert.Nil(t, err, err)
  133. return key
  134. }
  135. func getKey(t *testing.T, name string) models.AccessKey {
  136. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/skynet/keys", "secretkey")
  137. assert.Nil(t, err, err)
  138. assert.Equal(t, http.StatusOK, response.StatusCode)
  139. defer response.Body.Close()
  140. var keys []models.AccessKey
  141. err = json.NewDecoder(response.Body).Decode(&keys)
  142. assert.Nil(t, err, err)
  143. for _, key := range keys {
  144. if key.Name == name {
  145. return key
  146. }
  147. }
  148. return models.AccessKey{}
  149. }
  150. func deleteKey(t *testing.T, key, network string) {
  151. response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/"+network+"/keys/"+key, "secretkey")
  152. assert.Nil(t, err, err)
  153. //api does not return Deleted Count at this time
  154. //defer response.Body.Close()
  155. //var message mongo.DeleteResult
  156. //err = json.NewDecoder(response.Body).Decode(&message)
  157. //assert.Nil(t, err, err)
  158. assert.Equal(t, http.StatusOK, response.StatusCode)
  159. //assert.Equal(t, int64(1), message.DeletedCount)
  160. }
  161. func deleteNetworks(t *testing.T) {
  162. //delete all node
  163. deleteAllNodes(t)
  164. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks", "secretkey")
  165. assert.Nil(t, err, err)
  166. if response.StatusCode == http.StatusOK {
  167. defer response.Body.Close()
  168. err = json.NewDecoder(response.Body).Decode(&Networks)
  169. assert.Nil(t, err, err)
  170. for _, network := range Networks {
  171. name := network.NetID
  172. _, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/"+name, "secretkey")
  173. assert.Nil(t, err, err)
  174. }
  175. }
  176. }
  177. func deleteNode(t *testing.T) {
  178. response, err := api(t, "", http.MethodDelete, baseURL+"/api/nodes/skynet/01:02:03:04:05:06", "secretkey")
  179. assert.Nil(t, err, err)
  180. assert.Equal(t, http.StatusOK, response.StatusCode)
  181. }
  182. func deleteAllNodes(t *testing.T) {
  183. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes", "secretkey")
  184. assert.Nil(t, err, err)
  185. assert.Equal(t, http.StatusOK, response.StatusCode)
  186. var nodes []models.ReturnNode
  187. defer response.Body.Close()
  188. json.NewDecoder(response.Body).Decode(&nodes)
  189. for _, node := range nodes {
  190. resp, err := api(t, "", http.MethodDelete, baseURL+"/api/nodes/"+node.Network+"/"+node.MacAddress, "secretkey")
  191. assert.Nil(t, err, err)
  192. assert.Equal(t, http.StatusOK, resp.StatusCode)
  193. }
  194. }
  195. func createNode(t *testing.T) {
  196. var node models.Node
  197. key := createAccessKey(t)
  198. node.Address = "10.71.0.1"
  199. node.AccessKey = key.Value
  200. node.MacAddress = "01:02:03:04:05:06"
  201. node.Name = "myNode"
  202. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  203. node.Password = "tobedetermined"
  204. node.LocalAddress = "192.168.0.1"
  205. node.Endpoint = "10.100.100.4"
  206. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  207. assert.Nil(t, err, err)
  208. assert.Equal(t, http.StatusOK, response.StatusCode)
  209. }
  210. func getNode(t *testing.T) models.Node {
  211. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes/skynet/01:02:03:04:05:06", "secretkey")
  212. assert.Nil(t, err, err)
  213. assert.Equal(t, http.StatusOK, response.StatusCode)
  214. var node models.Node
  215. defer response.Body.Close()
  216. err = json.NewDecoder(response.Body).Decode(&node)
  217. assert.Nil(t, err, err)
  218. return node
  219. }
  220. func getNetwork(t *testing.T, network string) models.Network {
  221. var net models.Network
  222. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/"+network, "secretkey")
  223. assert.Nil(t, err, err)
  224. assert.Equal(t, http.StatusOK, response.StatusCode)
  225. defer response.Body.Close()
  226. err = json.NewDecoder(response.Body).Decode(&net)
  227. assert.Nil(t, err, err)
  228. return net
  229. }
  230. func setup(t *testing.T) {
  231. deleteNetworks(t)
  232. createNetwork(t)
  233. createNode(t)
  234. }