node_test.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. package main
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "testing"
  6. "time"
  7. "github.com/gravitl/netmaker/models"
  8. "github.com/stretchr/testify/assert"
  9. "golang.org/x/crypto/bcrypt"
  10. )
  11. func TestRainyDay(t *testing.T) {
  12. t.Run("badkey", func(t *testing.T) {
  13. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes", "badkey")
  14. assert.Nil(t, err, err)
  15. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  16. })
  17. t.Run("badURL", func(t *testing.T) {
  18. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes/adm/skynet/01:02:03:04:05:07", "secretkey")
  19. assert.Nil(t, err, err)
  20. assert.Equal(t, http.StatusNotFound, response.StatusCode)
  21. })
  22. t.Run("NonExistentNetwork", func(t *testing.T) {
  23. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes/badnet", "secretkey")
  24. assert.Nil(t, err, err)
  25. assert.Equal(t, http.StatusNotFound, response.StatusCode)
  26. })
  27. }
  28. func TestGetAllNodes(t *testing.T) {
  29. setup(t)
  30. t.Run("NodesExist", func(t *testing.T) {
  31. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes", "secretkey")
  32. assert.Nil(t, err, err)
  33. assert.Equal(t, http.StatusOK, response.StatusCode)
  34. var nodes []models.Node
  35. defer response.Body.Close()
  36. err = json.NewDecoder(response.Body).Decode(&nodes)
  37. assert.Nil(t, err, err)
  38. assert.NotEmpty(t, nodes)
  39. })
  40. t.Run("NodeDoesNotExist", func(t *testing.T) {
  41. deleteNode(t)
  42. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes", "secretkey")
  43. assert.Nil(t, err, err)
  44. assert.Equal(t, http.StatusOK, response.StatusCode)
  45. var nodes []models.Node
  46. defer response.Body.Close()
  47. err = json.NewDecoder(response.Body).Decode(&nodes)
  48. assert.Nil(t, err, err)
  49. assert.Empty(t, nodes)
  50. })
  51. }
  52. func TestGetNetworkNodes(t *testing.T) {
  53. setup(t)
  54. t.Run("NodeExists", func(t *testing.T) {
  55. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes/skynet", "secretkey")
  56. assert.Nil(t, err, err)
  57. assert.Equal(t, http.StatusOK, response.StatusCode)
  58. var nodes []models.Node
  59. defer response.Body.Close()
  60. err = json.NewDecoder(response.Body).Decode(&nodes)
  61. assert.Nil(t, err, err)
  62. assert.NotEmpty(t, nodes)
  63. })
  64. t.Run("NodeDoesNotExit", func(t *testing.T) {
  65. deleteNode(t)
  66. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes/skynet", "secretkey")
  67. assert.Nil(t, err, err)
  68. assert.Equal(t, http.StatusOK, response.StatusCode)
  69. var nodes []models.Node
  70. defer response.Body.Close()
  71. err = json.NewDecoder(response.Body).Decode(&nodes)
  72. assert.Nil(t, err, err)
  73. assert.Empty(t, nodes)
  74. })
  75. }
  76. func TestGetNode(t *testing.T) {
  77. setup(t)
  78. t.Run("NodeExists", func(t *testing.T) {
  79. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes/skynet/01:02:03:04:05:06", "secretkey")
  80. assert.Nil(t, err, err)
  81. assert.Equal(t, http.StatusOK, response.StatusCode)
  82. var node models.Node
  83. defer response.Body.Close()
  84. err = json.NewDecoder(response.Body).Decode(&node)
  85. assert.Nil(t, err, err)
  86. assert.Equal(t, "01:02:03:04:05:06", node.MacAddress)
  87. })
  88. t.Run("NodeDoesNotExist", func(t *testing.T) {
  89. deleteNode(t)
  90. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes/skynet/01:02:03:04:05:06", "secretkey")
  91. assert.Nil(t, err, err)
  92. assert.Equal(t, http.StatusInternalServerError, response.StatusCode)
  93. })
  94. }
  95. func TestUpdateNode(t *testing.T) {
  96. var data models.Node
  97. setup(t)
  98. t.Run("UpdateMulti", func(t *testing.T) {
  99. data.Address = "10.1.0.2"
  100. data.MacAddress = "01:02:03:04:05:05"
  101. data.Name = "NewName"
  102. data.PublicKey = "DM5qhLAE20PG9BbfBCgfr+Ac9D2NDOwCtY1rbYDLf34="
  103. data.Password = "newpass"
  104. data.LocalAddress = "192.168.0.2"
  105. data.Endpoint = "10.100.100.5"
  106. response, err := api(t, data, http.MethodPut, baseURL+"/api/nodes/skynet/01:02:03:04:05:06", "secretkey")
  107. assert.Nil(t, err, err)
  108. assert.Equal(t, http.StatusOK, response.StatusCode)
  109. defer response.Body.Close()
  110. var node models.Node
  111. err = json.NewDecoder(response.Body).Decode(&node)
  112. assert.Nil(t, err, err)
  113. assert.Equal(t, data.Name, node.Name)
  114. assert.Equal(t, data.PublicKey, node.PublicKey)
  115. err = bcrypt.CompareHashAndPassword([]byte(node.Password), []byte(data.Password))
  116. assert.Nil(t, err, err)
  117. assert.Equal(t, data.LocalAddress, node.LocalAddress)
  118. assert.Equal(t, data.Endpoint, node.Endpoint)
  119. })
  120. t.Run("InvalidAddress", func(t *testing.T) {
  121. data.Address = "10.300.2.0"
  122. response, err := api(t, data, http.MethodPut, baseURL+"/api/nodes/skynet/01:02:03:04:05:05", "secretkey")
  123. assert.Nil(t, err, err)
  124. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  125. var message models.ErrorResponse
  126. defer response.Body.Close()
  127. err = json.NewDecoder(response.Body).Decode(&message)
  128. assert.Nil(t, err, err)
  129. assert.Equal(t, http.StatusBadRequest, message.Code)
  130. assert.Contains(t, message.Message, "Field validation for 'Address' failed")
  131. })
  132. t.Run("InvalidMacAddress", func(t *testing.T) {
  133. data.MacAddress = "10:11:12:13:14:15:16"
  134. response, err := api(t, data, http.MethodPut, baseURL+"/api/nodes/skynet/01:02:03:04:05:05", "secretkey")
  135. assert.Nil(t, err, err)
  136. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  137. var message models.ErrorResponse
  138. defer response.Body.Close()
  139. err = json.NewDecoder(response.Body).Decode(&message)
  140. assert.Nil(t, err, err)
  141. assert.Equal(t, http.StatusBadRequest, message.Code)
  142. assert.Contains(t, message.Message, "Field validation for 'MacAddress' failed")
  143. })
  144. t.Run("InvalidEndpoint", func(t *testing.T) {
  145. data.Endpoint = "10.10.10.300"
  146. response, err := api(t, data, http.MethodPut, baseURL+"/api/nodes/skynet/01:02:03:04:05:05", "secretkey")
  147. assert.Nil(t, err, err)
  148. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  149. var message models.ErrorResponse
  150. defer response.Body.Close()
  151. err = json.NewDecoder(response.Body).Decode(&message)
  152. assert.Nil(t, err, err)
  153. assert.Equal(t, http.StatusBadRequest, message.Code)
  154. assert.Contains(t, message.Message, "Field validation for 'Endpoint' failed")
  155. })
  156. t.Run("InvalidLocalAddress", func(t *testing.T) {
  157. data.LocalAddress = "10.10.10.300"
  158. response, err := api(t, data, http.MethodPut, baseURL+"/api/nodes/skynet/01:02:03:04:05:05", "secretkey")
  159. assert.Nil(t, err, err)
  160. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  161. var message models.ErrorResponse
  162. defer response.Body.Close()
  163. err = json.NewDecoder(response.Body).Decode(&message)
  164. assert.Nil(t, err, err)
  165. assert.Equal(t, http.StatusBadRequest, message.Code)
  166. assert.Contains(t, message.Message, "Field validation for 'LocalAddress' failed")
  167. })
  168. t.Run("InvalidName", func(t *testing.T) {
  169. var data struct {
  170. Name string
  171. }
  172. data.Name = "New*Name"
  173. response, err := api(t, data, http.MethodPut, baseURL+"/api/nodes/skynet/01:02:03:04:05:05", "secretkey")
  174. assert.Nil(t, err, err)
  175. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  176. var message models.ErrorResponse
  177. defer response.Body.Close()
  178. err = json.NewDecoder(response.Body).Decode(&message)
  179. assert.Nil(t, err, err)
  180. assert.Equal(t, http.StatusBadRequest, message.Code)
  181. assert.Contains(t, message.Message, "Field validation for 'Name' failed")
  182. })
  183. t.Run("InvalidPublicKey", func(t *testing.T) {
  184. data.PublicKey = "xxx"
  185. response, err := api(t, data, http.MethodPut, baseURL+"/api/nodes/skynet/01:02:03:04:05:05", "secretkey")
  186. assert.Nil(t, err, err)
  187. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  188. var message models.ErrorResponse
  189. defer response.Body.Close()
  190. err = json.NewDecoder(response.Body).Decode(&message)
  191. assert.Nil(t, err, err)
  192. assert.Equal(t, http.StatusBadRequest, message.Code)
  193. assert.Contains(t, message.Message, "Field validation for 'PublicKey' failed")
  194. })
  195. t.Run("InvalidPassword", func(t *testing.T) {
  196. data.Password = "1234"
  197. response, err := api(t, data, http.MethodPut, baseURL+"/api/nodes/skynet/01:02:03:04:05:05", "secretkey")
  198. assert.Nil(t, err, err)
  199. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  200. var message models.ErrorResponse
  201. defer response.Body.Close()
  202. err = json.NewDecoder(response.Body).Decode(&message)
  203. assert.Nil(t, err, err)
  204. assert.Equal(t, http.StatusBadRequest, message.Code)
  205. assert.Contains(t, message.Message, "Field validation for 'Password' failed")
  206. })
  207. }
  208. func TestDeleteNode(t *testing.T) {
  209. setup(t)
  210. t.Run("ExistingNode", func(t *testing.T) {
  211. response, err := api(t, "", http.MethodDelete, 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. defer response.Body.Close()
  215. var message models.SuccessResponse
  216. err = json.NewDecoder(response.Body).Decode(&message)
  217. assert.Nil(t, err, err)
  218. assert.Equal(t, "01:02:03:04:05:06 deleted.", message.Message)
  219. assert.Equal(t, http.StatusOK, message.Code)
  220. })
  221. t.Run("NonExistantNode", func(t *testing.T) {
  222. response, err := api(t, "", http.MethodDelete, baseURL+"/api/nodes/skynet/01:02:03:04:05:06", "secretkey")
  223. assert.Nil(t, err, err)
  224. assert.Equal(t, http.StatusInternalServerError, response.StatusCode)
  225. defer response.Body.Close()
  226. var message models.ErrorResponse
  227. err = json.NewDecoder(response.Body).Decode(&message)
  228. assert.Nil(t, err, err)
  229. assert.Equal(t, http.StatusInternalServerError, message.Code)
  230. assert.Equal(t, "Could not delete node 01:02:03:04:05:06", message.Message)
  231. })
  232. }
  233. func TestCheckIn(t *testing.T) {
  234. setup(t)
  235. oldNode := getNode(t)
  236. time.Sleep(1 * time.Second)
  237. t.Run("Valid", func(t *testing.T) {
  238. response, err := api(t, "", http.MethodPost, baseURL+"/api/nodes/skynet/01:02:03:04:05:06/checkin", "secretkey")
  239. assert.Nil(t, err, err)
  240. assert.Equal(t, http.StatusOK, response.StatusCode)
  241. var node models.Node
  242. defer response.Body.Close()
  243. err = json.NewDecoder(response.Body).Decode(&node)
  244. assert.Nil(t, err, err)
  245. assert.Greater(t, node.LastCheckIn, oldNode.LastCheckIn)
  246. })
  247. t.Run("NodeDoesNotExist", func(t *testing.T) {
  248. deleteNode(t)
  249. response, err := api(t, "", http.MethodPost, baseURL+"/api/nodes/skynet/01:02:03:04:05:06/checkin", "secretkey")
  250. assert.Nil(t, err, err)
  251. assert.Equal(t, http.StatusInternalServerError, response.StatusCode)
  252. var message models.ErrorResponse
  253. defer response.Body.Close()
  254. err = json.NewDecoder(response.Body).Decode(&message)
  255. assert.Nil(t, err, err)
  256. assert.Equal(t, http.StatusInternalServerError, message.Code)
  257. assert.Equal(t, "mongo: no documents in result", message.Message)
  258. })
  259. }
  260. func TestCreateEgressGateway(t *testing.T) {
  261. setup(t)
  262. //assert.False(t, node.IsEgressGateway/g)
  263. var gateway models.EgressGatewayRequest
  264. t.Run("Valid", func(t *testing.T) {
  265. gateway.RangeString = "0.0.0.0/0"
  266. gateway.Interface = "eth0"
  267. response, err := api(t, gateway, http.MethodPost, baseURL+"/api/nodes/skynet/01:02:03:04:05:06/creategateway", "secretkey")
  268. assert.Nil(t, err, err)
  269. assert.Equal(t, http.StatusOK, response.StatusCode)
  270. defer response.Body.Close()
  271. var message models.Node
  272. err = json.NewDecoder(response.Body).Decode(&message)
  273. assert.Nil(t, err, err)
  274. assert.True(t, message.IsEgressGateway)
  275. t.Log(err)
  276. })
  277. t.Run("BadRange", func(t *testing.T) {
  278. gateway.RangeString = "0.0.0.0/36"
  279. gateway.Interface = "eth0"
  280. response, err := api(t, gateway, http.MethodPost, baseURL+"/api/nodes/skynet/01:02:03:04:05:06/creategateway", "secretkey")
  281. assert.Nil(t, err, err)
  282. assert.Equal(t, http.StatusInternalServerError, response.StatusCode)
  283. defer response.Body.Close()
  284. var message models.ErrorResponse
  285. err = json.NewDecoder(response.Body).Decode(&message)
  286. assert.Nil(t, err, err)
  287. assert.Equal(t, http.StatusInternalServerError, message.Code)
  288. assert.Equal(t, "IP Range Not Valid", message.Message)
  289. })
  290. t.Run("BadInterface", func(t *testing.T) {
  291. gateway.RangeString = "0.0.0.0/0"
  292. gateway.Interface = ""
  293. response, err := api(t, gateway, http.MethodPost, baseURL+"/api/nodes/skynet/01:02:03:04:05:06/creategateway", "secretkey")
  294. assert.Nil(t, err, err)
  295. assert.Equal(t, http.StatusInternalServerError, response.StatusCode)
  296. defer response.Body.Close()
  297. var message models.ErrorResponse
  298. err = json.NewDecoder(response.Body).Decode(&message)
  299. assert.Nil(t, err, err)
  300. assert.Equal(t, http.StatusInternalServerError, message.Code)
  301. assert.Equal(t, "Interface cannot be empty", message.Message)
  302. })
  303. }
  304. func TestDeleteEgressGateway(t *testing.T) {
  305. setup(t)
  306. response, err := api(t, "", http.MethodDelete, baseURL+"/api/nodes/skynet/01:02:03:04:05:06/deletegateway", "secretkey")
  307. assert.Nil(t, err, err)
  308. assert.Equal(t, http.StatusOK, response.StatusCode)
  309. defer response.Body.Close()
  310. var message models.Node
  311. err = json.NewDecoder(response.Body).Decode(&message)
  312. assert.Nil(t, err, err)
  313. assert.False(t, message.IsEgressGateway)
  314. }
  315. func TestUncordonNode(t *testing.T) {
  316. setup(t)
  317. response, err := api(t, "", http.MethodPost, baseURL+"/api/nodes/skynet/01:02:03:04:05:06/approve", "secretkey")
  318. assert.Nil(t, err, err)
  319. assert.Equal(t, http.StatusOK, response.StatusCode)
  320. defer response.Body.Close()
  321. var message string
  322. err = json.NewDecoder(response.Body).Decode(&message)
  323. assert.Nil(t, err, err)
  324. assert.Equal(t, "SUCCESS", message)
  325. }
  326. func TestCreateNode(t *testing.T) {
  327. setup(t)
  328. key := createAccessKey(t)
  329. t.Run("NodeExists", func(t *testing.T) {
  330. var node models.Node
  331. node.AccessKey = key.Value
  332. node.MacAddress = "01:02:03:04:05:06"
  333. node.Name = "myNode"
  334. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  335. node.Password = "tobedetermined"
  336. node.LocalAddress = "192.168.0.1"
  337. node.Endpoint = "10.100.100.4"
  338. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  339. assert.Nil(t, err, err)
  340. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  341. defer response.Body.Close()
  342. var message models.ErrorResponse
  343. err = json.NewDecoder(response.Body).Decode(&message)
  344. assert.Nil(t, err, err)
  345. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  346. assert.Contains(t, message.Message, "Field validation for 'MacAddress' failed on the 'macaddress_unique' tag")
  347. })
  348. t.Run("BadKey", func(t *testing.T) {
  349. deleteNode(t)
  350. var node models.Node
  351. node.AccessKey = "badkey"
  352. node.MacAddress = "01:02:03:04:05:06"
  353. node.Name = "myNode"
  354. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  355. node.Password = "tobedetermined"
  356. node.LocalAddress = "192.168.0.1"
  357. node.Endpoint = "10.100.100.4"
  358. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  359. assert.Nil(t, err, err)
  360. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  361. defer response.Body.Close()
  362. var message models.ErrorResponse
  363. err = json.NewDecoder(response.Body).Decode(&message)
  364. assert.Nil(t, err, err)
  365. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  366. assert.Contains(t, message.Message, "ey invalid, or none provided")
  367. })
  368. t.Run("BadMac", func(t *testing.T) {
  369. var node models.Node
  370. node.AccessKey = key.Value
  371. node.MacAddress = "badmac"
  372. node.Name = "myNode"
  373. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  374. node.Password = "tobedetermined"
  375. node.LocalAddress = "192.168.0.1"
  376. node.Endpoint = "10.100.100.4"
  377. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  378. assert.Nil(t, err, err)
  379. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  380. defer response.Body.Close()
  381. var message models.ErrorResponse
  382. err = json.NewDecoder(response.Body).Decode(&message)
  383. assert.Nil(t, err, err)
  384. assert.Equal(t, http.StatusBadRequest, message.Code)
  385. assert.Contains(t, message.Message, "Field validation for 'MacAddress' failed on the 'ma")
  386. })
  387. t.Run("BadPublicKey", func(t *testing.T) {
  388. var node models.Node
  389. node.AccessKey = key.Value
  390. node.MacAddress = "01:02:03:04:05:06"
  391. node.Name = "myNode"
  392. node.PublicKey = "xxx"
  393. node.Password = "tobedetermined"
  394. node.LocalAddress = "192.168.0.1"
  395. node.Endpoint = "10.100.100.4"
  396. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  397. assert.Nil(t, err, err)
  398. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  399. defer response.Body.Close()
  400. var message models.ErrorResponse
  401. err = json.NewDecoder(response.Body).Decode(&message)
  402. assert.Nil(t, err, err)
  403. assert.Equal(t, http.StatusBadRequest, message.Code)
  404. assert.Contains(t, message.Message, "Field validation for 'PublicKey' failed")
  405. })
  406. t.Run("BadPass", func(t *testing.T) {
  407. var node models.Node
  408. node.AccessKey = key.Value
  409. node.MacAddress = "01:02:03:04:05:06"
  410. node.Name = "myNode"
  411. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  412. node.Password = ""
  413. node.LocalAddress = "192.168.0.1"
  414. node.Endpoint = "10.100.100.4"
  415. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  416. assert.Nil(t, err, err)
  417. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  418. defer response.Body.Close()
  419. var message models.ErrorResponse
  420. err = json.NewDecoder(response.Body).Decode(&message)
  421. assert.Nil(t, err, err)
  422. assert.Equal(t, http.StatusBadRequest, message.Code)
  423. assert.Contains(t, message.Message, "Error:Field validation for 'Password' failed")
  424. })
  425. t.Run("BadLocalAddress", func(t *testing.T) {
  426. var node models.Node
  427. node.AccessKey = key.Value
  428. node.MacAddress = "01:02:03:04:05:06"
  429. node.Name = "myNode"
  430. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  431. node.Password = "tobedetermined"
  432. node.LocalAddress = "192.168.300.1"
  433. node.Endpoint = "10.100.100.4"
  434. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  435. assert.Nil(t, err, err)
  436. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  437. defer response.Body.Close()
  438. var message models.ErrorResponse
  439. err = json.NewDecoder(response.Body).Decode(&message)
  440. assert.Nil(t, err, err)
  441. assert.Equal(t, http.StatusBadRequest, message.Code)
  442. assert.Contains(t, message.Message, "Field validation for 'LocalAddress' failed")
  443. })
  444. t.Run("BadEndpoint", func(t *testing.T) {
  445. var node models.Node
  446. node.AccessKey = key.Value
  447. node.MacAddress = "01:02:03:04:05:06"
  448. node.Name = "myNode"
  449. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  450. node.Password = "tobedetermined"
  451. node.LocalAddress = "192.168.0.1"
  452. node.Endpoint = "10.100.300.4"
  453. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  454. assert.Nil(t, err, err)
  455. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  456. defer response.Body.Close()
  457. var message models.ErrorResponse
  458. err = json.NewDecoder(response.Body).Decode(&message)
  459. assert.Nil(t, err, err)
  460. assert.Equal(t, http.StatusBadRequest, message.Code)
  461. assert.Contains(t, message.Message, "Field validation for 'Endpoint' failed")
  462. })
  463. t.Run("NetworkDoesNotExist", func(t *testing.T) {
  464. deleteNetworks(t)
  465. var node models.Node
  466. node.AccessKey = key.Value
  467. node.MacAddress = "01:02:03:04:05:06"
  468. node.Name = "myNode"
  469. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  470. node.Password = "tobedetermined"
  471. node.LocalAddress = "192.168.0.1"
  472. node.Endpoint = "10.100.100.4"
  473. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  474. assert.Nil(t, err, err)
  475. assert.Equal(t, http.StatusNotFound, response.StatusCode)
  476. defer response.Body.Close()
  477. var message models.ErrorResponse
  478. err = json.NewDecoder(response.Body).Decode(&message)
  479. assert.Nil(t, err, err)
  480. assert.Equal(t, http.StatusNotFound, message.Code)
  481. assert.Contains(t, message.Message, "etwork does not exist")
  482. })
  483. t.Run("Valid", func(t *testing.T) {
  484. deleteNetworks(t)
  485. createNetwork(t)
  486. key := createAccessKey(t)
  487. var node models.Node
  488. node.AccessKey = key.Value
  489. node.Address = "10.200.200.1"
  490. node.MacAddress = "01:02:03:04:05:06"
  491. node.Name = "myNode"
  492. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  493. node.Password = "tobedetermined"
  494. node.LocalAddress = "192.168.0.1"
  495. node.Endpoint = "10.100.100.4"
  496. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  497. assert.Nil(t, err, err)
  498. assert.Equal(t, http.StatusOK, response.StatusCode)
  499. defer response.Body.Close()
  500. var message models.Node
  501. err = json.NewDecoder(response.Body).Decode(&message)
  502. assert.Nil(t, err, err)
  503. assert.Equal(t, node.Name, message.Name)
  504. })
  505. }
  506. func TestGetLastModified(t *testing.T) {
  507. deleteNetworks(t)
  508. createNetwork(t)
  509. //t.FailNow()
  510. t.Run("Valid", func(t *testing.T) {
  511. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes/adm/skynet/lastmodified", "secretkey")
  512. assert.Nil(t, err, err)
  513. assert.Equal(t, http.StatusOK, response.StatusCode)
  514. })
  515. t.Run("NoNetwork", func(t *testing.T) {
  516. t.Skip()
  517. deleteNetworks(t)
  518. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes/adm/skynet/lastmodified", "secretkey")
  519. assert.Nil(t, err, err)
  520. assert.Equal(t, http.StatusNotFound, response.StatusCode)
  521. })
  522. }
  523. func TestNodeAuthenticate(t *testing.T) {
  524. setup(t)
  525. t.Run("Valid", func(t *testing.T) {
  526. var authRequest models.AuthParams
  527. authRequest.MacAddress = "01:02:03:04:05:06"
  528. authRequest.Password = "tobedetermined"
  529. response, err := api(t, authRequest, http.MethodPost, "http://localhost:8081:/api/nodes/adm/skynet/authenticate", "")
  530. assert.Nil(t, err, err)
  531. assert.Equal(t, http.StatusOK, response.StatusCode)
  532. defer response.Body.Close()
  533. var message models.SuccessResponse
  534. err = json.NewDecoder(response.Body).Decode(&message)
  535. assert.Nil(t, err, err)
  536. assert.Equal(t, http.StatusOK, message.Code)
  537. assert.Contains(t, message.Message, "Device 01:02:03:04:05:06 Authorized")
  538. })
  539. t.Run("MacEmpty", func(t *testing.T) {
  540. var authRequest models.AuthParams
  541. authRequest.MacAddress = ""
  542. authRequest.Password = "tobedetermined"
  543. response, err := api(t, authRequest, http.MethodPost, "http://localhost:8081:/api/nodes/adm/skynet/authenticate", "")
  544. assert.Nil(t, err, err)
  545. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  546. defer response.Body.Close()
  547. var message models.SuccessResponse
  548. err = json.NewDecoder(response.Body).Decode(&message)
  549. assert.Nil(t, err, err)
  550. assert.Equal(t, http.StatusBadRequest, message.Code)
  551. assert.Contains(t, message.Message, "acAddress can't be empty")
  552. })
  553. t.Run("EmptyPass", func(t *testing.T) {
  554. var authRequest models.AuthParams
  555. authRequest.MacAddress = "01:02:03:04:05:06"
  556. authRequest.Password = ""
  557. response, err := api(t, authRequest, http.MethodPost, "http://localhost:8081:/api/nodes/adm/skynet/authenticate", "")
  558. assert.Nil(t, err, err)
  559. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  560. defer response.Body.Close()
  561. var message models.SuccessResponse
  562. err = json.NewDecoder(response.Body).Decode(&message)
  563. assert.Nil(t, err, err)
  564. assert.Equal(t, http.StatusBadRequest, message.Code)
  565. assert.Contains(t, message.Message, "assword can't be empty")
  566. })
  567. t.Run("BadPass", func(t *testing.T) {
  568. var authRequest models.AuthParams
  569. authRequest.MacAddress = "01:02:03:04:05:06"
  570. authRequest.Password = "badpass"
  571. response, err := api(t, authRequest, http.MethodPost, "http://localhost:8081:/api/nodes/adm/skynet/authenticate", "")
  572. assert.Nil(t, err, err)
  573. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  574. defer response.Body.Close()
  575. var message models.SuccessResponse
  576. err = json.NewDecoder(response.Body).Decode(&message)
  577. assert.Nil(t, err, err)
  578. assert.Equal(t, http.StatusBadRequest, message.Code)
  579. assert.Equal(t, "crypto/bcrypt: hashedPassword is not the hash of the given password", message.Message)
  580. })
  581. t.Run("BadMac", func(t *testing.T) {
  582. var authRequest models.AuthParams
  583. authRequest.MacAddress = "01:02:03:04:05:07"
  584. authRequest.Password = "tobedetermined"
  585. response, err := api(t, authRequest, http.MethodPost, "http://localhost:8081:/api/nodes/adm/skynet/authenticate", "")
  586. assert.Nil(t, err, err)
  587. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  588. defer response.Body.Close()
  589. var message models.SuccessResponse
  590. err = json.NewDecoder(response.Body).Decode(&message)
  591. assert.Nil(t, err, err)
  592. assert.Equal(t, http.StatusBadRequest, message.Code)
  593. assert.Equal(t, "mongo: no documents in result", message.Message)
  594. })
  595. }