group_test.go 23 KB

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