group_test.go 23 KB

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