group_test.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649
  1. package main
  2. import (
  3. "encoding/json"
  4. "io/ioutil"
  5. "net/http"
  6. "testing"
  7. "github.com/gravitl/netmaker/models"
  8. "github.com/stretchr/testify/assert"
  9. "go.mongodb.org/mongo-driver/mongo"
  10. )
  11. func TestCreateNetwork(t *testing.T) {
  12. network := models.Network{}
  13. network.NetID = "skynet"
  14. network.AddressRange = "10.71.0.0/16"
  15. if networkExists(t) {
  16. deleteNetworks(t)
  17. }
  18. t.Run("InvalidToken", func(t *testing.T) {
  19. response, err := api(t, network, http.MethodPost, baseURL+"/api/networks", "badkey")
  20. assert.Nil(t, err, err)
  21. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  22. defer response.Body.Close()
  23. var message models.ErrorResponse
  24. err = json.NewDecoder(response.Body).Decode(&message)
  25. assert.Nil(t, err, err)
  26. assert.Equal(t, http.StatusUnauthorized, message.Code)
  27. assert.Equal(t, "W1R3: You are unauthorized to access this endpoint.", message.Message)
  28. })
  29. t.Run("CreateNetwork", func(t *testing.T) {
  30. response, err := api(t, network, http.MethodPost, baseURL+"/api/networks", "secretkey")
  31. assert.Nil(t, err, err)
  32. assert.Equal(t, http.StatusOK, response.StatusCode)
  33. })
  34. t.Run("DuplicateNetwork", func(t *testing.T) {
  35. response, err := api(t, network, http.MethodPost, baseURL+"/api/networks", "secretkey")
  36. assert.Nil(t, err, err)
  37. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  38. })
  39. t.Run("BadName", func(t *testing.T) {
  40. network.NetID = "thisnameistoolong"
  41. response, err := api(t, network, http.MethodPost, baseURL+"/api/networks", "secretkey")
  42. assert.Nil(t, err, err)
  43. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  44. })
  45. t.Run("BadAddress", func(t *testing.T) {
  46. network.NetID = "wirecat"
  47. network.AddressRange = "10.300.20.56/36"
  48. response, err := api(t, network, http.MethodPost, baseURL+"/api/networks", "secretkey")
  49. assert.Nil(t, err, err)
  50. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  51. })
  52. }
  53. func TestGetNetworks(t *testing.T) {
  54. t.Run("ValidToken", func(t *testing.T) {
  55. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks", "secretkey")
  56. assert.Nil(t, err, err)
  57. defer response.Body.Close()
  58. assert.Equal(t, http.StatusOK, response.StatusCode)
  59. err = json.NewDecoder(response.Body).Decode(&Networks)
  60. assert.Nil(t, err, err)
  61. })
  62. t.Run("InvalidToken", func(t *testing.T) {
  63. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks", "badkey")
  64. assert.Nil(t, err, err)
  65. defer response.Body.Close()
  66. var message models.ErrorResponse
  67. err = json.NewDecoder(response.Body).Decode(&message)
  68. assert.Nil(t, err, err)
  69. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  70. assert.Equal(t, http.StatusUnauthorized, message.Code)
  71. assert.Equal(t, "W1R3: You are unauthorized to access this endpoint.", message.Message)
  72. })
  73. }
  74. func TestGetNetwork(t *testing.T) {
  75. t.Run("ValidToken", func(t *testing.T) {
  76. var network models.Network
  77. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/skynet", "secretkey")
  78. assert.Nil(t, err, err)
  79. defer response.Body.Close()
  80. assert.Equal(t, http.StatusOK, response.StatusCode)
  81. err = json.NewDecoder(response.Body).Decode(&network)
  82. assert.Nil(t, err, err)
  83. // --- needs fixing ------ returns previous name
  84. //assert.Equal(t, "skynet", network.DisplayName)
  85. })
  86. t.Run("InvalidToken", func(t *testing.T) {
  87. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/skynet", "badkey")
  88. assert.Nil(t, err, err)
  89. defer response.Body.Close()
  90. var message models.ErrorResponse
  91. err = json.NewDecoder(response.Body).Decode(&message)
  92. assert.Nil(t, err, err)
  93. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  94. assert.Equal(t, http.StatusUnauthorized, message.Code)
  95. assert.Equal(t, "W1R3: You are unauthorized to access this endpoint.", message.Message)
  96. })
  97. t.Run("InvalidNetwork", func(t *testing.T) {
  98. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/badnetwork", "secretkey")
  99. assert.Nil(t, err, err)
  100. defer response.Body.Close()
  101. var message models.ErrorResponse
  102. err = json.NewDecoder(response.Body).Decode(&message)
  103. assert.Nil(t, err, err)
  104. assert.Equal(t, "W1R3: This network does not exist.", message.Message)
  105. assert.Equal(t, http.StatusNotFound, response.StatusCode)
  106. })
  107. }
  108. func TestGetnetworkNodeNumber(t *testing.T) {
  109. //not part of api anymore
  110. t.Run("ValidKey", func(t *testing.T) {
  111. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/skynet/numnodes", "secretkey")
  112. assert.Nil(t, err, err)
  113. defer response.Body.Close()
  114. var message int
  115. err = json.NewDecoder(response.Body).Decode(&message)
  116. assert.Nil(t, err, err)
  117. //assert.Equal(t, "W1R3: This network does not exist.", message.Message)
  118. assert.Equal(t, http.StatusOK, response.StatusCode)
  119. })
  120. t.Run("InvalidKey", func(t *testing.T) {
  121. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/skynet/numnodes", "badkey")
  122. assert.Nil(t, err, err)
  123. defer response.Body.Close()
  124. var message models.ErrorResponse
  125. err = json.NewDecoder(response.Body).Decode(&message)
  126. assert.Nil(t, err, err)
  127. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  128. assert.Equal(t, http.StatusUnauthorized, message.Code)
  129. assert.Equal(t, "W1R3: You are unauthorized to access this endpoint.", message.Message)
  130. })
  131. t.Run("Badnetwork", func(t *testing.T) {
  132. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/badnetwork/numnodes", "secretkey")
  133. assert.Nil(t, err, err)
  134. defer response.Body.Close()
  135. var message models.ErrorResponse
  136. err = json.NewDecoder(response.Body).Decode(&message)
  137. assert.Nil(t, err, err)
  138. assert.Equal(t, "W1R3: This network does not exist.", message.Message)
  139. assert.Equal(t, http.StatusNotFound, response.StatusCode)
  140. })
  141. }
  142. func TestDeletenetwork(t *testing.T) {
  143. t.Run("InvalidKey", func(t *testing.T) {
  144. response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/skynet", "badkey")
  145. assert.Nil(t, err, err)
  146. defer response.Body.Close()
  147. var message models.ErrorResponse
  148. err = json.NewDecoder(response.Body).Decode(&message)
  149. assert.Nil(t, err, err)
  150. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  151. assert.Equal(t, http.StatusUnauthorized, message.Code)
  152. assert.Equal(t, "W1R3: You are unauthorized to access this endpoint.", message.Message)
  153. })
  154. t.Run("ValidKey", func(t *testing.T) {
  155. response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/skynet", "secretkey")
  156. assert.Nil(t, err, err)
  157. defer response.Body.Close()
  158. var message mongo.DeleteResult
  159. err = json.NewDecoder(response.Body).Decode(&message)
  160. assert.Nil(t, err, err)
  161. assert.Equal(t, http.StatusOK, response.StatusCode)
  162. assert.Equal(t, int64(1), message.DeletedCount)
  163. })
  164. t.Run("Badnetwork", func(t *testing.T) {
  165. response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/badnetwork", "secretkey")
  166. assert.Nil(t, err, err)
  167. defer response.Body.Close()
  168. var message models.ErrorResponse
  169. err = json.NewDecoder(response.Body).Decode(&message)
  170. assert.Nil(t, err, err)
  171. assert.Equal(t, "W1R3: This network does not exist.", message.Message)
  172. assert.Equal(t, http.StatusNotFound, response.StatusCode)
  173. })
  174. t.Run("NodesExist", func(t *testing.T) {
  175. })
  176. }
  177. func TestCreateAccessKey(t *testing.T) {
  178. if !networkExists(t) {
  179. createNetwork(t)
  180. }
  181. key := models.AccessKey{}
  182. key.Name = "skynet"
  183. key.Uses = 10
  184. t.Run("MultiUse", func(t *testing.T) {
  185. response, err := api(t, key, http.MethodPost, baseURL+"/api/networks/skynet/keys", "secretkey")
  186. assert.Nil(t, err, err)
  187. assert.Equal(t, http.StatusOK, response.StatusCode)
  188. defer response.Body.Close()
  189. message, err := ioutil.ReadAll(response.Body)
  190. assert.Nil(t, err, err)
  191. assert.NotNil(t, message, message)
  192. returnedkey := getKey(t, key.Name)
  193. assert.Equal(t, key.Name, returnedkey.Name)
  194. assert.Equal(t, key.Uses, returnedkey.Uses)
  195. })
  196. deleteKey(t, "skynet", "skynet")
  197. t.Run("ZeroUse", func(t *testing.T) {
  198. //
  199. key.Uses = 0
  200. response, err := api(t, key, http.MethodPost, baseURL+"/api/networks/skynet/keys", "secretkey")
  201. assert.Nil(t, err, err)
  202. assert.Equal(t, http.StatusOK, response.StatusCode)
  203. defer response.Body.Close()
  204. message, err := ioutil.ReadAll(response.Body)
  205. assert.Nil(t, err, err)
  206. assert.NotNil(t, message, message)
  207. returnedkey := getKey(t, key.Name)
  208. assert.Equal(t, key.Name, returnedkey.Name)
  209. assert.Equal(t, 1, returnedkey.Uses)
  210. })
  211. t.Run("DuplicateAccessKey", func(t *testing.T) {
  212. //this is allowed I think it should fail fail
  213. response, err := api(t, key, http.MethodPost, baseURL+"/api/networks/skynet/keys", "secretkey")
  214. assert.Nil(t, err, err)
  215. assert.Equal(t, http.StatusOK, response.StatusCode)
  216. deleteKey(t, key.Name, "skynet")
  217. })
  218. t.Run("InvalidToken", func(t *testing.T) {
  219. response, err := api(t, key, http.MethodPost, baseURL+"/api/networks/skynet/keys", "badkey")
  220. assert.Nil(t, err, err)
  221. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  222. defer response.Body.Close()
  223. var message models.ErrorResponse
  224. err = json.NewDecoder(response.Body).Decode(&message)
  225. assert.Nil(t, err, err)
  226. assert.Equal(t, http.StatusUnauthorized, message.Code)
  227. assert.Equal(t, "W1R3: You are unauthorized to access this endpoint.", message.Message)
  228. })
  229. t.Run("Badnetwork", func(t *testing.T) {
  230. response, err := api(t, key, http.MethodPost, baseURL+"/api/networks/badnetwork/keys", "secretkey")
  231. assert.Nil(t, err, err)
  232. defer response.Body.Close()
  233. var message models.ErrorResponse
  234. err = json.NewDecoder(response.Body).Decode(&message)
  235. assert.Nil(t, err, err)
  236. assert.Equal(t, "W1R3: This network does not exist.", message.Message)
  237. assert.Equal(t, http.StatusNotFound, response.StatusCode)
  238. })
  239. }
  240. func TestDeleteKey(t *testing.T) {
  241. t.Run("KeyValid", func(t *testing.T) {
  242. //fails -- deletecount not returned
  243. response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/skynet/keys/skynet", "secretkey")
  244. assert.Nil(t, err, err)
  245. defer response.Body.Close()
  246. //var message mongo.DeleteResult
  247. var messages []models.AccessKey
  248. err = json.NewDecoder(response.Body).Decode(&messages)
  249. assert.Nil(t, err, err)
  250. assert.Equal(t, http.StatusOK, response.StatusCode)
  251. for _, message := range messages {
  252. assert.Equal(t, "skynet", message.Name)
  253. }
  254. })
  255. t.Run("InValidKey", func(t *testing.T) {
  256. //responds ok, will nil record returned.. should be an error.
  257. response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/skynet/keys/badkey", "secretkey")
  258. assert.Nil(t, err, err)
  259. defer response.Body.Close()
  260. var message models.ErrorResponse
  261. err = json.NewDecoder(response.Body).Decode(&message)
  262. assert.Nil(t, err, err)
  263. assert.Equal(t, "W1R3: This key does not exist.", message.Message)
  264. assert.Equal(t, http.StatusNotFound, response.StatusCode)
  265. })
  266. t.Run("KeyInValidnetwork", func(t *testing.T) {
  267. response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/badnetwork/keys/skynet", "secretkey")
  268. assert.Nil(t, err, err)
  269. defer response.Body.Close()
  270. var message models.ErrorResponse
  271. err = json.NewDecoder(response.Body).Decode(&message)
  272. assert.Nil(t, err, err)
  273. assert.Equal(t, "W1R3: This network does not exist.", message.Message)
  274. assert.Equal(t, http.StatusNotFound, response.StatusCode)
  275. })
  276. t.Run("InvalidCredentials", func(t *testing.T) {
  277. response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/skynet/keys/skynet", "badkey")
  278. assert.Nil(t, err, err)
  279. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  280. defer response.Body.Close()
  281. var message models.ErrorResponse
  282. err = json.NewDecoder(response.Body).Decode(&message)
  283. assert.Nil(t, err, err)
  284. assert.Equal(t, http.StatusUnauthorized, message.Code)
  285. assert.Equal(t, "W1R3: You are unauthorized to access this endpoint.", message.Message)
  286. })
  287. }
  288. func TestGetKeys(t *testing.T) {
  289. createKey(t)
  290. t.Run("Valid", func(t *testing.T) {
  291. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/skynet/keys", "secretkey")
  292. assert.Nil(t, err, err)
  293. assert.Equal(t, http.StatusOK, response.StatusCode)
  294. defer response.Body.Close()
  295. var keys []models.AccessKey
  296. err = json.NewDecoder(response.Body).Decode(&keys)
  297. assert.Nil(t, err, err)
  298. })
  299. //deletekeys
  300. t.Run("Invalidnetwork", func(t *testing.T) {
  301. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/badnetwork/keys", "secretkey")
  302. assert.Nil(t, err, err)
  303. defer response.Body.Close()
  304. var message models.ErrorResponse
  305. err = json.NewDecoder(response.Body).Decode(&message)
  306. assert.Nil(t, err, err)
  307. assert.Equal(t, "W1R3: This network does not exist.", message.Message)
  308. assert.Equal(t, http.StatusNotFound, response.StatusCode)
  309. })
  310. t.Run("InvalidCredentials", func(t *testing.T) {
  311. response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/skynet/keys", "badkey")
  312. assert.Nil(t, err, err)
  313. assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
  314. defer response.Body.Close()
  315. var message models.ErrorResponse
  316. err = json.NewDecoder(response.Body).Decode(&message)
  317. assert.Nil(t, err, err)
  318. assert.Equal(t, http.StatusUnauthorized, message.Code)
  319. assert.Equal(t, "W1R3: You are unauthorized to access this endpoint.", message.Message)
  320. })
  321. }
  322. func TestUpdateNetwork(t *testing.T) {
  323. //ensure we are working with known networks
  324. deleteNetworks(t)
  325. createNetwork(t)
  326. var returnedNetwork models.Network
  327. t.Run("UpdateNetID", func(t *testing.T) {
  328. type Network struct {
  329. NetID string
  330. }
  331. var network Network
  332. network.NetID = "wirecat"
  333. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  334. assert.Nil(t, err, err)
  335. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  336. defer response.Body.Close()
  337. var message models.ErrorResponse
  338. err = json.NewDecoder(response.Body).Decode(&message)
  339. assert.Nil(t, err, err)
  340. assert.Equal(t, http.StatusBadRequest, message.Code)
  341. assert.Equal(t, "NetID is not editable", message.Message)
  342. })
  343. t.Run("Invalidnetwork", func(t *testing.T) {
  344. type Network struct {
  345. NetID string
  346. }
  347. var network Network
  348. network.NetID = "wirecat"
  349. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/badnetwork", "secretkey")
  350. assert.Nil(t, err, err)
  351. defer response.Body.Close()
  352. var message models.ErrorResponse
  353. err = json.NewDecoder(response.Body).Decode(&message)
  354. assert.Nil(t, err, err)
  355. assert.Equal(t, http.StatusNotFound, message.Code)
  356. assert.Equal(t, "W1R3: This network does not exist.", message.Message)
  357. assert.Equal(t, http.StatusNotFound, response.StatusCode)
  358. })
  359. t.Run("UpdateAddress", func(t *testing.T) {
  360. type Network struct {
  361. AddressRange string
  362. }
  363. var network Network
  364. network.AddressRange = "10.0.0.1/24"
  365. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  366. assert.Nil(t, err, err)
  367. assert.Equal(t, http.StatusOK, response.StatusCode)
  368. defer response.Body.Close()
  369. err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
  370. assert.Nil(t, err, err)
  371. assert.Equal(t, network.AddressRange, returnedNetwork.AddressRange)
  372. })
  373. t.Run("UpdateAddressInvalid", func(t *testing.T) {
  374. type Network struct {
  375. AddressRange string
  376. }
  377. var network Network
  378. network.AddressRange = "10.0.0.1/36"
  379. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  380. assert.Nil(t, err, err)
  381. assert.Equal(t, http.StatusBadRequest, response.StatusCode)
  382. defer response.Body.Close()
  383. var message models.ErrorResponse
  384. err = json.NewDecoder(response.Body).Decode(&message)
  385. assert.Nil(t, err, err)
  386. assert.Equal(t, http.StatusBadRequest, message.Code)
  387. assert.Contains(t, message.Message, "validation for 'AddressRange' failed")
  388. })
  389. t.Run("UpdateDisplayName", func(t *testing.T) {
  390. type Network struct {
  391. DisplayName string
  392. }
  393. var network Network
  394. network.DisplayName = "wirecat"
  395. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  396. assert.Nil(t, err, err)
  397. assert.Equal(t, http.StatusOK, response.StatusCode)
  398. defer response.Body.Close()
  399. err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
  400. assert.Nil(t, err, err)
  401. assert.Equal(t, network.DisplayName, returnedNetwork.DisplayName)
  402. })
  403. t.Run("UpdateDisplayNameInvalidName", func(t *testing.T) {
  404. // -----needs fixing ----
  405. // fails silently
  406. type Network struct {
  407. DisplayName string
  408. }
  409. var network Network
  410. //create name that is longer than 100 chars
  411. name := ""
  412. for i := 0; i < 101; i++ {
  413. name = name + "a"
  414. }
  415. network.DisplayName = name
  416. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  417. assert.Nil(t, err, err)
  418. var message models.ErrorResponse
  419. err = json.NewDecoder(response.Body).Decode(&message)
  420. assert.Nil(t, err, err)
  421. assert.Equal(t, http.StatusUnprocessableEntity, message.Code)
  422. assert.Equal(t, "W1R3: Field validation for 'DisplayName' failed.", message.Message)
  423. assert.Equal(t, http.StatusUnprocessableEntity, response.StatusCode)
  424. })
  425. t.Run("UpdateInterface", func(t *testing.T) {
  426. type Network struct {
  427. DefaultInterface string
  428. }
  429. var network Network
  430. network.DefaultInterface = "netmaker"
  431. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  432. assert.Nil(t, err, err)
  433. assert.Equal(t, http.StatusOK, response.StatusCode)
  434. defer response.Body.Close()
  435. err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
  436. assert.Nil(t, err, err)
  437. assert.Equal(t, network.DefaultInterface, returnedNetwork.DefaultInterface)
  438. })
  439. t.Run("UpdateListenPort", func(t *testing.T) {
  440. type Network struct {
  441. DefaultListenPort int32
  442. }
  443. var network Network
  444. network.DefaultListenPort = 6000
  445. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  446. assert.Nil(t, err, err)
  447. assert.Equal(t, http.StatusOK, response.StatusCode)
  448. defer response.Body.Close()
  449. err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
  450. assert.Nil(t, err, err)
  451. assert.Equal(t, network.DefaultListenPort, returnedNetwork.DefaultListenPort)
  452. })
  453. t.Run("UpdateListenPortInvalidPort", func(t *testing.T) {
  454. // ---needs fixing -----
  455. // value is updated anyways
  456. type Network struct {
  457. DefaultListenPort int32
  458. }
  459. var network Network
  460. network.DefaultListenPort = 65540
  461. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  462. assert.Nil(t, err, err)
  463. var message models.ErrorResponse
  464. err = json.NewDecoder(response.Body).Decode(&message)
  465. assert.Nil(t, err, err)
  466. assert.Equal(t, http.StatusUnprocessableEntity, message.Code)
  467. assert.Equal(t, "W1R3: Field validation for 'DefaultListenPort' failed.", message.Message)
  468. assert.Equal(t, http.StatusUnprocessableEntity, response.StatusCode)
  469. })
  470. t.Run("UpdatePostUP", func(t *testing.T) {
  471. type Network struct {
  472. DefaultPostUp string
  473. }
  474. var network Network
  475. network.DefaultPostUp = "sudo wg add-conf wc-netmaker /etc/wireguard/peers/conf"
  476. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  477. assert.Nil(t, err, err)
  478. assert.Equal(t, http.StatusOK, response.StatusCode)
  479. defer response.Body.Close()
  480. err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
  481. assert.Nil(t, err, err)
  482. assert.Equal(t, network.DefaultPostUp, returnedNetwork.DefaultPostUp)
  483. })
  484. t.Run("UpdatePreUp", func(t *testing.T) {
  485. // -------needs fixing ------
  486. // mismatch in models.Network between struc name and json/bson name
  487. // does not get updated.
  488. type Network struct {
  489. DefaultPostDown string
  490. }
  491. var network Network
  492. network.DefaultPostDown = "test string"
  493. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  494. assert.Nil(t, err, err)
  495. assert.Equal(t, http.StatusOK, response.StatusCode)
  496. defer response.Body.Close()
  497. err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
  498. assert.Nil(t, err, err)
  499. assert.Equal(t, network.DefaultPostDown, returnedNetwork.DefaultPostDown)
  500. })
  501. t.Run("UpdateKeepAlive", func(t *testing.T) {
  502. type Network struct {
  503. DefaultKeepalive int32
  504. }
  505. var network Network
  506. network.DefaultKeepalive = 60
  507. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  508. assert.Nil(t, err, err)
  509. assert.Equal(t, http.StatusOK, response.StatusCode)
  510. defer response.Body.Close()
  511. err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
  512. assert.Nil(t, err, err)
  513. assert.Equal(t, network.DefaultKeepalive, returnedNetwork.DefaultKeepalive)
  514. })
  515. t.Run("UpdateKeepAliveTooBig", func(t *testing.T) {
  516. //fails silently
  517. // ----- needs fixing -----
  518. type Network struct {
  519. DefaultKeepAlive int32
  520. }
  521. var network Network
  522. network.DefaultKeepAlive = 1001
  523. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  524. assert.Nil(t, err, err)
  525. var message models.ErrorResponse
  526. err = json.NewDecoder(response.Body).Decode(&message)
  527. assert.Nil(t, err, err)
  528. assert.Equal(t, http.StatusUnprocessableEntity, message.Code)
  529. assert.Equal(t, "W1R3: Field validation for 'DefaultKeepAlive' failed.", message.Message)
  530. assert.Equal(t, http.StatusUnprocessableEntity, response.StatusCode)
  531. })
  532. t.Run("UpdateSaveConfig", func(t *testing.T) {
  533. //causes panic
  534. type Network struct {
  535. DefaultSaveConfig *bool
  536. }
  537. var network Network
  538. value := false
  539. network.DefaultSaveConfig = &value
  540. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  541. assert.Nil(t, err, err)
  542. assert.Equal(t, http.StatusOK, response.StatusCode)
  543. defer response.Body.Close()
  544. err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
  545. assert.Nil(t, err, err)
  546. assert.Equal(t, *network.DefaultSaveConfig, *returnedNetwork.DefaultSaveConfig)
  547. })
  548. t.Run("UpdateManualSignUP", func(t *testing.T) {
  549. type Network struct {
  550. AllowManualSignUp *bool
  551. }
  552. var network Network
  553. value := true
  554. network.AllowManualSignUp = &value
  555. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  556. assert.Nil(t, err, err)
  557. assert.Equal(t, http.StatusOK, response.StatusCode)
  558. defer response.Body.Close()
  559. err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
  560. assert.Nil(t, err, err)
  561. //returns previous value not the updated value
  562. // ----- needs fixing -----
  563. //assert.Equal(t, network.NetID, returnedNetwork.NetID)
  564. })
  565. t.Run("DefaultCheckInterval", func(t *testing.T) {
  566. //value is not returned in struct ---
  567. type Network struct {
  568. DefaultCheckInInterval int32
  569. }
  570. var network Network
  571. network.DefaultCheckInInterval = 6000
  572. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  573. assert.Nil(t, err, err)
  574. assert.Equal(t, http.StatusOK, response.StatusCode)
  575. defer response.Body.Close()
  576. err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
  577. assert.Nil(t, err, err)
  578. assert.Equal(t, network.DefaultCheckInInterval, returnedNetwork.DefaultCheckInInterval)
  579. })
  580. t.Run("DefaultCheckIntervalTooBig", func(t *testing.T) {
  581. //value is not returned in struct ---
  582. type Network struct {
  583. DefaultCheckInInterval int32
  584. }
  585. var network Network
  586. network.DefaultCheckInInterval = 100001
  587. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  588. assert.Nil(t, err, err)
  589. var message models.ErrorResponse
  590. err = json.NewDecoder(response.Body).Decode(&message)
  591. assert.Nil(t, err, err)
  592. assert.Equal(t, http.StatusUnprocessableEntity, message.Code)
  593. assert.Equal(t, "W1R3: Field validation for 'DefaultCheckInInterval' failed.", message.Message)
  594. assert.Equal(t, http.StatusUnprocessableEntity, response.StatusCode)
  595. })
  596. t.Run("MultipleFields", func(t *testing.T) {
  597. type Network struct {
  598. DisplayName string
  599. DefaultListenPort int32
  600. }
  601. var network Network
  602. network.DefaultListenPort = 7777
  603. network.DisplayName = "multi"
  604. response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
  605. assert.Nil(t, err, err)
  606. assert.Equal(t, http.StatusOK, response.StatusCode)
  607. defer response.Body.Close()
  608. err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
  609. assert.Nil(t, err, err)
  610. assert.Equal(t, network.DisplayName, returnedNetwork.DisplayName)
  611. assert.Equal(t, network.DefaultListenPort, returnedNetwork.DefaultListenPort)
  612. })
  613. }