node_test.go.bak 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  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.Ranges = []string{"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("BadInterface", func(t *testing.T) {
  278. gateway.Ranges = []string{"0.0.0.0/0"}
  279. gateway.Interface = ""
  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, "Interface cannot be empty", message.Message)
  289. })
  290. }
  291. func TestDeleteEgressGateway(t *testing.T) {
  292. setup(t)
  293. response, err := api(t, "", http.MethodDelete, baseURL+"/api/nodes/skynet/01:02:03:04:05:06/deletegateway", "secretkey")
  294. assert.Nil(t, err, err)
  295. assert.Equal(t, http.StatusOK, response.StatusCode)
  296. defer response.Body.Close()
  297. var message models.Node
  298. err = json.NewDecoder(response.Body).Decode(&message)
  299. assert.Nil(t, err, err)
  300. assert.False(t, message.IsEgressGateway)
  301. }
  302. func TestUncordonNode(t *testing.T) {
  303. setup(t)
  304. response, err := api(t, "", http.MethodPost, baseURL+"/api/nodes/skynet/01:02:03:04:05:06/approve", "secretkey")
  305. assert.Nil(t, err, err)
  306. assert.Equal(t, http.StatusOK, response.StatusCode)
  307. defer response.Body.Close()
  308. var message string
  309. err = json.NewDecoder(response.Body).Decode(&message)
  310. assert.Nil(t, err, err)
  311. assert.Equal(t, "SUCCESS", message)
  312. }
  313. func TestCreateNode(t *testing.T) {
  314. setup(t)
  315. key := createAccessKey(t)
  316. t.Run("NodeExists", func(t *testing.T) {
  317. var node models.Node
  318. node.AccessKey = key.Value
  319. node.MacAddress = "01:02:03:04:05:06"
  320. node.Name = "myNode"
  321. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  322. node.Password = "tobedetermined"
  323. node.LocalAddress = "192.168.0.1"
  324. node.Endpoint = "10.100.100.4"
  325. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  326. assert.Nil(t, err, err)
  327. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  328. defer response.Body.Close()
  329. var message models.ErrorResponse
  330. err = json.NewDecoder(response.Body).Decode(&message)
  331. assert.Nil(t, err, err)
  332. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  333. assert.Contains(t, message.Message, "Field validation for 'MacAddress' failed on the 'macaddress_unique' tag")
  334. })
  335. t.Run("BadKey", func(t *testing.T) {
  336. deleteNode(t)
  337. var node models.Node
  338. node.AccessKey = "badkey"
  339. node.MacAddress = "01:02:03:04:05:06"
  340. node.Name = "myNode"
  341. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  342. node.Password = "tobedetermined"
  343. node.LocalAddress = "192.168.0.1"
  344. node.Endpoint = "10.100.100.4"
  345. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  346. assert.Nil(t, err, err)
  347. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  348. defer response.Body.Close()
  349. var message models.ErrorResponse
  350. err = json.NewDecoder(response.Body).Decode(&message)
  351. assert.Nil(t, err, err)
  352. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  353. assert.Contains(t, message.Message, "ey invalid, or none provided")
  354. })
  355. t.Run("BadMac", func(t *testing.T) {
  356. var node models.Node
  357. node.AccessKey = key.Value
  358. node.MacAddress = "badmac"
  359. node.Name = "myNode"
  360. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  361. node.Password = "tobedetermined"
  362. node.LocalAddress = "192.168.0.1"
  363. node.Endpoint = "10.100.100.4"
  364. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  365. assert.Nil(t, err, err)
  366. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  367. defer response.Body.Close()
  368. var message models.ErrorResponse
  369. err = json.NewDecoder(response.Body).Decode(&message)
  370. assert.Nil(t, err, err)
  371. assert.Equal(t, http.StatusBadRequest, message.Code)
  372. assert.Contains(t, message.Message, "Field validation for 'MacAddress' failed on the 'ma")
  373. })
  374. t.Run("BadPublicKey", func(t *testing.T) {
  375. var node models.Node
  376. node.AccessKey = key.Value
  377. node.MacAddress = "01:02:03:04:05:06"
  378. node.Name = "myNode"
  379. node.PublicKey = "xxx"
  380. node.Password = "tobedetermined"
  381. node.LocalAddress = "192.168.0.1"
  382. node.Endpoint = "10.100.100.4"
  383. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  384. assert.Nil(t, err, err)
  385. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  386. defer response.Body.Close()
  387. var message models.ErrorResponse
  388. err = json.NewDecoder(response.Body).Decode(&message)
  389. assert.Nil(t, err, err)
  390. assert.Equal(t, http.StatusBadRequest, message.Code)
  391. assert.Contains(t, message.Message, "Field validation for 'PublicKey' failed")
  392. })
  393. t.Run("BadPass", func(t *testing.T) {
  394. var node models.Node
  395. node.AccessKey = key.Value
  396. node.MacAddress = "01:02:03:04:05:06"
  397. node.Name = "myNode"
  398. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  399. node.Password = ""
  400. node.LocalAddress = "192.168.0.1"
  401. node.Endpoint = "10.100.100.4"
  402. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  403. assert.Nil(t, err, err)
  404. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  405. defer response.Body.Close()
  406. var message models.ErrorResponse
  407. err = json.NewDecoder(response.Body).Decode(&message)
  408. assert.Nil(t, err, err)
  409. assert.Equal(t, http.StatusBadRequest, message.Code)
  410. assert.Contains(t, message.Message, "Error:Field validation for 'Password' failed")
  411. })
  412. t.Run("BadLocalAddress", func(t *testing.T) {
  413. var node models.Node
  414. node.AccessKey = key.Value
  415. node.MacAddress = "01:02:03:04:05:06"
  416. node.Name = "myNode"
  417. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  418. node.Password = "tobedetermined"
  419. node.LocalAddress = "192.168.300.1"
  420. node.Endpoint = "10.100.100.4"
  421. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  422. assert.Nil(t, err, err)
  423. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  424. defer response.Body.Close()
  425. var message models.ErrorResponse
  426. err = json.NewDecoder(response.Body).Decode(&message)
  427. assert.Nil(t, err, err)
  428. assert.Equal(t, http.StatusBadRequest, message.Code)
  429. assert.Contains(t, message.Message, "Field validation for 'LocalAddress' failed")
  430. })
  431. t.Run("BadEndpoint", func(t *testing.T) {
  432. var node models.Node
  433. node.AccessKey = key.Value
  434. node.MacAddress = "01:02:03:04:05:06"
  435. node.Name = "myNode"
  436. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  437. node.Password = "tobedetermined"
  438. node.LocalAddress = "192.168.0.1"
  439. node.Endpoint = "10.100.300.4"
  440. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  441. assert.Nil(t, err, err)
  442. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  443. defer response.Body.Close()
  444. var message models.ErrorResponse
  445. err = json.NewDecoder(response.Body).Decode(&message)
  446. assert.Nil(t, err, err)
  447. assert.Equal(t, http.StatusBadRequest, message.Code)
  448. assert.Contains(t, message.Message, "Field validation for 'Endpoint' failed")
  449. })
  450. t.Run("NetworkDoesNotExist", func(t *testing.T) {
  451. deleteNetworks(t)
  452. var node models.Node
  453. node.AccessKey = key.Value
  454. node.MacAddress = "01:02:03:04:05:06"
  455. node.Name = "myNode"
  456. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  457. node.Password = "tobedetermined"
  458. node.LocalAddress = "192.168.0.1"
  459. node.Endpoint = "10.100.100.4"
  460. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  461. assert.Nil(t, err, err)
  462. assert.Equal(t, http.StatusNotFound, response.StatusCode)
  463. defer response.Body.Close()
  464. var message models.ErrorResponse
  465. err = json.NewDecoder(response.Body).Decode(&message)
  466. assert.Nil(t, err, err)
  467. assert.Equal(t, http.StatusNotFound, message.Code)
  468. assert.Contains(t, message.Message, "etwork does not exist")
  469. })
  470. t.Run("Valid", func(t *testing.T) {
  471. deleteNetworks(t)
  472. createNetwork(t)
  473. key := createAccessKey(t)
  474. var node models.Node
  475. node.AccessKey = key.Value
  476. node.Address = "10.200.200.1"
  477. node.MacAddress = "01:02:03:04:05:06"
  478. node.Name = "myNode"
  479. node.PublicKey = "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34="
  480. node.Password = "tobedetermined"
  481. node.LocalAddress = "192.168.0.1"
  482. node.Endpoint = "10.100.100.4"
  483. response, err := api(t, node, http.MethodPost, "http://localhost:8081:/api/nodes/skynet", "secretkey")
  484. assert.Nil(t, err, err)
  485. assert.Equal(t, http.StatusOK, response.StatusCode)
  486. defer response.Body.Close()
  487. var message models.Node
  488. err = json.NewDecoder(response.Body).Decode(&message)
  489. assert.Nil(t, err, err)
  490. assert.Equal(t, node.Name, message.Name)
  491. })
  492. }
  493. func TestGetLastModified(t *testing.T) {
  494. deleteNetworks(t)
  495. createNetwork(t)
  496. //t.FailNow()
  497. t.Run("Valid", func(t *testing.T) {
  498. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes/adm/skynet/lastmodified", "secretkey")
  499. assert.Nil(t, err, err)
  500. assert.Equal(t, http.StatusOK, response.StatusCode)
  501. })
  502. t.Run("NoNetwork", func(t *testing.T) {
  503. t.Skip()
  504. deleteNetworks(t)
  505. response, err := api(t, "", http.MethodGet, baseURL+"/api/nodes/adm/skynet/lastmodified", "secretkey")
  506. assert.Nil(t, err, err)
  507. assert.Equal(t, http.StatusNotFound, response.StatusCode)
  508. })
  509. }
  510. func TestNodeAuthenticate(t *testing.T) {
  511. setup(t)
  512. t.Run("Valid", func(t *testing.T) {
  513. var authRequest models.AuthParams
  514. authRequest.MacAddress = "01:02:03:04:05:06"
  515. authRequest.Password = "tobedetermined"
  516. response, err := api(t, authRequest, http.MethodPost, "http://localhost:8081:/api/nodes/adm/skynet/authenticate", "")
  517. assert.Nil(t, err, err)
  518. assert.Equal(t, http.StatusOK, response.StatusCode)
  519. defer response.Body.Close()
  520. var message models.SuccessResponse
  521. err = json.NewDecoder(response.Body).Decode(&message)
  522. assert.Nil(t, err, err)
  523. assert.Equal(t, http.StatusOK, message.Code)
  524. assert.Contains(t, message.Message, "Device 01:02:03:04:05:06 Authorized")
  525. })
  526. t.Run("MacEmpty", func(t *testing.T) {
  527. var authRequest models.AuthParams
  528. authRequest.MacAddress = ""
  529. authRequest.Password = "tobedetermined"
  530. response, err := api(t, authRequest, http.MethodPost, "http://localhost:8081:/api/nodes/adm/skynet/authenticate", "")
  531. assert.Nil(t, err, err)
  532. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  533. defer response.Body.Close()
  534. var message models.SuccessResponse
  535. err = json.NewDecoder(response.Body).Decode(&message)
  536. assert.Nil(t, err, err)
  537. assert.Equal(t, http.StatusBadRequest, message.Code)
  538. assert.Contains(t, message.Message, "acAddress can't be empty")
  539. })
  540. t.Run("EmptyPass", func(t *testing.T) {
  541. var authRequest models.AuthParams
  542. authRequest.MacAddress = "01:02:03:04:05:06"
  543. authRequest.Password = ""
  544. response, err := api(t, authRequest, http.MethodPost, "http://localhost:8081:/api/nodes/adm/skynet/authenticate", "")
  545. assert.Nil(t, err, err)
  546. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  547. defer response.Body.Close()
  548. var message models.SuccessResponse
  549. err = json.NewDecoder(response.Body).Decode(&message)
  550. assert.Nil(t, err, err)
  551. assert.Equal(t, http.StatusBadRequest, message.Code)
  552. assert.Contains(t, message.Message, "assword can't be empty")
  553. })
  554. t.Run("BadPass", func(t *testing.T) {
  555. var authRequest models.AuthParams
  556. authRequest.MacAddress = "01:02:03:04:05:06"
  557. authRequest.Password = "badpass"
  558. response, err := api(t, authRequest, http.MethodPost, "http://localhost:8081:/api/nodes/adm/skynet/authenticate", "")
  559. assert.Nil(t, err, err)
  560. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  561. defer response.Body.Close()
  562. var message models.SuccessResponse
  563. err = json.NewDecoder(response.Body).Decode(&message)
  564. assert.Nil(t, err, err)
  565. assert.Equal(t, http.StatusBadRequest, message.Code)
  566. assert.Equal(t, "crypto/bcrypt: hashedPassword is not the hash of the given password", message.Message)
  567. })
  568. t.Run("BadMac", func(t *testing.T) {
  569. var authRequest models.AuthParams
  570. authRequest.MacAddress = "01:02:03:04:05:07"
  571. authRequest.Password = "tobedetermined"
  572. response, err := api(t, authRequest, http.MethodPost, "http://localhost:8081:/api/nodes/adm/skynet/authenticate", "")
  573. assert.Nil(t, err, err)
  574. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  575. defer response.Body.Close()
  576. var message models.SuccessResponse
  577. err = json.NewDecoder(response.Body).Decode(&message)
  578. assert.Nil(t, err, err)
  579. assert.Equal(t, http.StatusBadRequest, message.Code)
  580. assert.Equal(t, "mongo: no documents in result", message.Message)
  581. })
  582. }