user_handler_test.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677
  1. package api_test
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "net/http/httptest"
  6. "reflect"
  7. "strings"
  8. "testing"
  9. "github.com/porter-dev/porter/internal/models"
  10. )
  11. // ------------------------- TEST TYPES AND MAIN LOOP ------------------------- //
  12. type userTest struct {
  13. initializers []func(t *tester)
  14. msg string
  15. method string
  16. endpoint string
  17. body string
  18. expStatus int
  19. expBody string
  20. useCookie bool
  21. validators []func(c *userTest, tester *tester, t *testing.T)
  22. }
  23. func testUserRequests(t *testing.T, tests []*userTest, canQuery bool) {
  24. for _, c := range tests {
  25. // create a new tester
  26. tester := newTester(canQuery, nil)
  27. // if there's an initializer, call it
  28. for _, init := range c.initializers {
  29. init(tester)
  30. }
  31. req, err := http.NewRequest(
  32. c.method,
  33. c.endpoint,
  34. strings.NewReader(c.body),
  35. )
  36. tester.req = req
  37. if c.useCookie {
  38. req.AddCookie(tester.cookie)
  39. }
  40. if err != nil {
  41. t.Fatal(err)
  42. }
  43. tester.execute()
  44. rr := tester.rr
  45. // first, check that the status matches
  46. if status := rr.Code; status != c.expStatus {
  47. t.Errorf("%s, handler returned wrong status code: got %v want %v",
  48. c.msg, status, c.expStatus)
  49. }
  50. // if there's a validator, call it
  51. for _, validate := range c.validators {
  52. validate(c, tester, t)
  53. }
  54. }
  55. }
  56. // ------------------------- TEST FIXTURES AND FUNCTIONS ------------------------- //
  57. var createUserTests = []*userTest{
  58. &userTest{
  59. msg: "Create user",
  60. method: "POST",
  61. endpoint: "/api/users",
  62. body: `{
  63. "email": "belanger@getporter.dev",
  64. "password": "hello"
  65. }`,
  66. expStatus: http.StatusCreated,
  67. expBody: "",
  68. },
  69. &userTest{
  70. msg: "Create user invalid email",
  71. method: "POST",
  72. endpoint: "/api/users",
  73. body: `{
  74. "email": "notanemail",
  75. "password": "hello"
  76. }`,
  77. expStatus: http.StatusUnprocessableEntity,
  78. expBody: `{"code":601,"errors":["email validation failed"]}`,
  79. validators: []func(c *userTest, tester *tester, t *testing.T){
  80. userBasicBodyValidator,
  81. },
  82. },
  83. &userTest{
  84. msg: "Create user missing field",
  85. method: "POST",
  86. endpoint: "/api/users",
  87. body: `{
  88. "password": "hello"
  89. }`,
  90. expStatus: http.StatusUnprocessableEntity,
  91. expBody: `{"code":601,"errors":["required validation failed"]}`,
  92. validators: []func(c *userTest, tester *tester, t *testing.T){
  93. userBasicBodyValidator,
  94. },
  95. },
  96. &userTest{
  97. initializers: []func(tester *tester){
  98. initUserDefault,
  99. },
  100. msg: "Create user same email",
  101. method: "POST",
  102. endpoint: "/api/users",
  103. body: `{
  104. "email": "belanger@getporter.dev",
  105. "password": "hello"
  106. }`,
  107. expStatus: http.StatusUnprocessableEntity,
  108. expBody: `{"code":601,"errors":["email already taken"]}`,
  109. validators: []func(c *userTest, tester *tester, t *testing.T){
  110. userBasicBodyValidator,
  111. },
  112. },
  113. &userTest{
  114. msg: "Create user invalid field type",
  115. method: "POST",
  116. endpoint: "/api/users",
  117. body: `{
  118. "email": "belanger@getporter.dev",
  119. "password": 0
  120. }`,
  121. expStatus: http.StatusBadRequest,
  122. expBody: `{"code":600,"errors":["could not process request"]}`,
  123. validators: []func(c *userTest, tester *tester, t *testing.T){
  124. userBasicBodyValidator,
  125. },
  126. },
  127. }
  128. func TestHandleCreateUser(t *testing.T) {
  129. testUserRequests(t, createUserTests, true)
  130. }
  131. var createUserTestsWriteFail = []*userTest{
  132. &userTest{
  133. msg: "Create user db connection down",
  134. method: "POST",
  135. endpoint: "/api/users",
  136. body: `{
  137. "email": "belanger@getporter.dev",
  138. "password": "hello"
  139. }`,
  140. expStatus: http.StatusInternalServerError,
  141. expBody: `{"code":500,"errors":["could not read from database"]}`,
  142. validators: []func(c *userTest, tester *tester, t *testing.T){
  143. userBasicBodyValidator,
  144. },
  145. },
  146. }
  147. func TestHandleCreateUserWriteFail(t *testing.T) {
  148. testUserRequests(t, createUserTestsWriteFail, false)
  149. }
  150. var loginUserTests = []*userTest{
  151. &userTest{
  152. initializers: []func(tester *tester){
  153. initUserDefault,
  154. },
  155. msg: "Login user successful",
  156. method: "POST",
  157. endpoint: "/api/login",
  158. body: `{
  159. "email": "belanger@getporter.dev",
  160. "password": "hello"
  161. }`,
  162. expStatus: http.StatusOK,
  163. expBody: ``,
  164. validators: []func(c *userTest, tester *tester, t *testing.T){
  165. userBasicBodyValidator,
  166. },
  167. },
  168. &userTest{
  169. initializers: []func(tester *tester){
  170. initUserDefault,
  171. },
  172. msg: "Login user already logged in",
  173. method: "POST",
  174. endpoint: "/api/login",
  175. body: `{
  176. "email": "belanger@getporter.dev",
  177. "password": "hello"
  178. }`,
  179. expStatus: http.StatusOK,
  180. expBody: ``,
  181. useCookie: true,
  182. validators: []func(c *userTest, tester *tester, t *testing.T){
  183. userBasicBodyValidator,
  184. },
  185. },
  186. &userTest{
  187. msg: "Login user unregistered email",
  188. method: "POST",
  189. endpoint: "/api/login",
  190. body: `{
  191. "email": "belanger@getporter.dev",
  192. "password": "hello"
  193. }`,
  194. expStatus: http.StatusUnauthorized,
  195. expBody: `{"code":401,"errors":["email not registered"]}`,
  196. validators: []func(c *userTest, tester *tester, t *testing.T){
  197. userBasicBodyValidator,
  198. },
  199. },
  200. &userTest{
  201. initializers: []func(tester *tester){
  202. initUserDefault,
  203. },
  204. msg: "Login user incorrect password",
  205. method: "POST",
  206. endpoint: "/api/login",
  207. body: `{
  208. "email": "belanger@getporter.dev",
  209. "password": "notthepassword"
  210. }`,
  211. expStatus: http.StatusUnauthorized,
  212. expBody: `{"code":401,"errors":["incorrect password"]}`,
  213. useCookie: true,
  214. validators: []func(c *userTest, tester *tester, t *testing.T){
  215. userBasicBodyValidator,
  216. },
  217. },
  218. }
  219. func TestHandleLoginUser(t *testing.T) {
  220. testUserRequests(t, loginUserTests, true)
  221. }
  222. var logoutUserTests = []*userTest{
  223. &userTest{
  224. initializers: []func(tester *tester){
  225. initUserDefault,
  226. },
  227. msg: "Logout user successful",
  228. method: "POST",
  229. endpoint: "/api/logout",
  230. body: `{
  231. "email": "belanger@getporter.dev",
  232. "password": "hello"
  233. }`,
  234. expStatus: http.StatusOK,
  235. expBody: ``,
  236. useCookie: true,
  237. validators: []func(c *userTest, tester *tester, t *testing.T){
  238. func(c *userTest, tester *tester, t *testing.T) {
  239. req, err := http.NewRequest(
  240. "GET",
  241. "/api/users/1",
  242. strings.NewReader(""),
  243. )
  244. req.AddCookie(tester.cookie)
  245. if err != nil {
  246. t.Fatal(err)
  247. }
  248. rr2 := httptest.NewRecorder()
  249. tester.router.ServeHTTP(rr2, req)
  250. if status := rr2.Code; status != http.StatusForbidden {
  251. t.Errorf("%s, handler returned wrong status: got %v want %v",
  252. "validator failed", status, http.StatusForbidden)
  253. }
  254. },
  255. },
  256. },
  257. }
  258. func TestHandleLogoutUser(t *testing.T) {
  259. testUserRequests(t, logoutUserTests, true)
  260. }
  261. var readUserTests = []*userTest{
  262. &userTest{
  263. initializers: []func(tester *tester){
  264. initUserWithContexts,
  265. },
  266. msg: "Read user successful",
  267. method: "GET",
  268. endpoint: "/api/users/1",
  269. body: "",
  270. expStatus: http.StatusOK,
  271. expBody: `{"id":1,"email":"belanger@getporter.dev","contexts":["context-test"],"rawKubeConfig":"apiVersion: v1\nkind: Config\npreferences: {}\ncurrent-context: context-test\nclusters:\n- cluster:\n server: https://localhost\n name: cluster-test\ncontexts:\n- context:\n cluster: cluster-test\n user: test-admin\n name: context-test\nusers:\n- name: test-admin"}`,
  272. useCookie: true,
  273. validators: []func(c *userTest, tester *tester, t *testing.T){
  274. userModelBodyValidator,
  275. },
  276. },
  277. &userTest{
  278. initializers: []func(tester *tester){
  279. initUserDefault,
  280. },
  281. msg: "Read user unauthorized",
  282. method: "GET",
  283. endpoint: "/api/users/2",
  284. body: "",
  285. expStatus: http.StatusForbidden,
  286. expBody: http.StatusText(http.StatusForbidden) + "\n",
  287. validators: []func(c *userTest, tester *tester, t *testing.T){
  288. userBasicBodyValidator,
  289. },
  290. },
  291. }
  292. func TestHandleReadUser(t *testing.T) {
  293. testUserRequests(t, readUserTests, true)
  294. }
  295. var readUserClustersTests = []*userTest{
  296. &userTest{
  297. initializers: []func(tester *tester){
  298. initUserWithContexts,
  299. },
  300. msg: "Read user successful",
  301. method: "GET",
  302. endpoint: "/api/users/1/contexts",
  303. body: "",
  304. expStatus: http.StatusOK,
  305. useCookie: true,
  306. expBody: `[{"name":"context-test","server":"https://localhost","cluster":"cluster-test","user":"test-admin","selected":true}]`,
  307. validators: []func(c *userTest, tester *tester, t *testing.T){
  308. userContextBodyValidator,
  309. },
  310. },
  311. }
  312. func TestHandleReadUserClusters(t *testing.T) {
  313. testUserRequests(t, readUserClustersTests, true)
  314. }
  315. var updateUserTests = []*userTest{
  316. &userTest{
  317. initializers: []func(tester *tester){
  318. initUserDefault,
  319. },
  320. msg: "Update user successful",
  321. method: "PUT",
  322. endpoint: "/api/users/1",
  323. body: `{"rawKubeConfig":"apiVersion: v1\nkind: Config\npreferences: {}\ncurrent-context: context-test\nclusters:\n- cluster:\n server: https://localhost\n name: cluster-test\ncontexts:\n- context:\n cluster: cluster-test\n user: test-admin\n name: context-test\nusers:\n- name: test-admin", "allowedContexts":[]}`,
  324. expStatus: http.StatusNoContent,
  325. expBody: "",
  326. useCookie: true,
  327. validators: []func(c *userTest, tester *tester, t *testing.T){
  328. func(c *userTest, tester *tester, t *testing.T) {
  329. req, err := http.NewRequest(
  330. "GET",
  331. "/api/users/1",
  332. strings.NewReader(""),
  333. )
  334. req.AddCookie(tester.cookie)
  335. if err != nil {
  336. t.Fatal(err)
  337. }
  338. rr2 := httptest.NewRecorder()
  339. tester.router.ServeHTTP(rr2, req)
  340. gotBody := &models.UserExternal{}
  341. expBody := &models.UserExternal{}
  342. json.Unmarshal(rr2.Body.Bytes(), gotBody)
  343. json.Unmarshal([]byte(`{"id":1,"email":"belanger@getporter.dev","contexts":[],"rawKubeConfig":"apiVersion: v1\nkind: Config\npreferences: {}\ncurrent-context: context-test\nclusters:\n- cluster:\n server: https://localhost\n name: cluster-test\ncontexts:\n- context:\n cluster: cluster-test\n user: test-admin\n name: context-test\nusers:\n- name: test-admin"}`), expBody)
  344. if !reflect.DeepEqual(gotBody, expBody) {
  345. t.Errorf("%s, handler returned wrong body: got %v want %v",
  346. "validator failed", gotBody, expBody)
  347. }
  348. },
  349. },
  350. },
  351. &userTest{
  352. initializers: []func(tester *tester){
  353. initUserDefault,
  354. },
  355. msg: "Update user successful without allowedContexts parameter",
  356. method: "PUT",
  357. endpoint: "/api/users/1",
  358. body: `{"rawKubeConfig":"apiVersion: v1\nkind: Config\npreferences: {}\ncurrent-context: context-test\nclusters:\n- cluster:\n server: https://localhost\n name: cluster-test\ncontexts:\n- context:\n cluster: cluster-test\n user: test-admin\n name: context-test\nusers:\n- name: test-admin"}`,
  359. expStatus: http.StatusNoContent,
  360. expBody: "",
  361. useCookie: true,
  362. validators: []func(c *userTest, tester *tester, t *testing.T){
  363. func(c *userTest, tester *tester, t *testing.T) {
  364. req, err := http.NewRequest(
  365. "GET",
  366. "/api/users/1",
  367. strings.NewReader(""),
  368. )
  369. req.AddCookie(tester.cookie)
  370. if err != nil {
  371. t.Fatal(err)
  372. }
  373. rr2 := httptest.NewRecorder()
  374. tester.router.ServeHTTP(rr2, req)
  375. gotBody := &models.UserExternal{}
  376. expBody := &models.UserExternal{}
  377. json.Unmarshal(rr2.Body.Bytes(), gotBody)
  378. json.Unmarshal([]byte(`{"id":1,"email":"belanger@getporter.dev","contexts":[],"rawKubeConfig":"apiVersion: v1\nkind: Config\npreferences: {}\ncurrent-context: context-test\nclusters:\n- cluster:\n server: https://localhost\n name: cluster-test\ncontexts:\n- context:\n cluster: cluster-test\n user: test-admin\n name: context-test\nusers:\n- name: test-admin"}`), expBody)
  379. if !reflect.DeepEqual(gotBody, expBody) {
  380. t.Errorf("%s, handler returned wrong body: got %v want %v",
  381. "validator failed", gotBody, expBody)
  382. }
  383. },
  384. },
  385. },
  386. &userTest{
  387. initializers: []func(tester *tester){
  388. initUserDefault,
  389. },
  390. msg: "Update user successful with allowedContexts",
  391. method: "PUT",
  392. endpoint: "/api/users/1",
  393. body: `{"rawKubeConfig":"apiVersion: v1\nkind: Config\npreferences: {}\ncurrent-context: context-test\nclusters:\n- cluster:\n server: https://localhost\n name: cluster-test\ncontexts:\n- context:\n cluster: cluster-test\n user: test-admin\n name: context-test\nusers:\n- name: test-admin", "allowedContexts":["context-test"]}`,
  394. expStatus: http.StatusNoContent,
  395. expBody: "",
  396. useCookie: true,
  397. validators: []func(c *userTest, tester *tester, t *testing.T){
  398. func(c *userTest, tester *tester, t *testing.T) {
  399. req, err := http.NewRequest(
  400. "GET",
  401. "/api/users/1",
  402. strings.NewReader(""),
  403. )
  404. req.AddCookie(tester.cookie)
  405. if err != nil {
  406. t.Fatal(err)
  407. }
  408. rr2 := httptest.NewRecorder()
  409. tester.router.ServeHTTP(rr2, req)
  410. gotBody := &models.UserExternal{}
  411. expBody := &models.UserExternal{}
  412. json.Unmarshal(rr2.Body.Bytes(), gotBody)
  413. json.Unmarshal([]byte(`{"id":1,"email":"belanger@getporter.dev","contexts":["context-test"],"rawKubeConfig":"apiVersion: v1\nkind: Config\npreferences: {}\ncurrent-context: context-test\nclusters:\n- cluster:\n server: https://localhost\n name: cluster-test\ncontexts:\n- context:\n cluster: cluster-test\n user: test-admin\n name: context-test\nusers:\n- name: test-admin"}`), expBody)
  414. if !reflect.DeepEqual(gotBody, expBody) {
  415. t.Errorf("%s, handler returned wrong body: got %v want %v",
  416. "validator failed", gotBody, expBody)
  417. }
  418. },
  419. },
  420. },
  421. &userTest{
  422. initializers: []func(tester *tester){
  423. initUserWithContexts,
  424. },
  425. msg: "Update user successful without rawKubeConfig",
  426. method: "PUT",
  427. endpoint: "/api/users/1",
  428. body: `{"allowedContexts":[]}`,
  429. expStatus: http.StatusNoContent,
  430. expBody: "",
  431. useCookie: true,
  432. validators: []func(c *userTest, tester *tester, t *testing.T){
  433. func(c *userTest, tester *tester, t *testing.T) {
  434. req, err := http.NewRequest(
  435. "GET",
  436. "/api/users/1",
  437. strings.NewReader(""),
  438. )
  439. req.AddCookie(tester.cookie)
  440. if err != nil {
  441. t.Fatal(err)
  442. }
  443. rr2 := httptest.NewRecorder()
  444. tester.router.ServeHTTP(rr2, req)
  445. gotBody := &models.UserExternal{}
  446. expBody := &models.UserExternal{}
  447. json.Unmarshal(rr2.Body.Bytes(), gotBody)
  448. json.Unmarshal([]byte(`{"id":1,"email":"belanger@getporter.dev","contexts":[],"rawKubeConfig":"apiVersion: v1\nkind: Config\npreferences: {}\ncurrent-context: context-test\nclusters:\n- cluster:\n server: https://localhost\n name: cluster-test\ncontexts:\n- context:\n cluster: cluster-test\n user: test-admin\n name: context-test\nusers:\n- name: test-admin"}`), expBody)
  449. if !reflect.DeepEqual(gotBody, expBody) {
  450. t.Errorf("%s, handler returned wrong body: got %v want %v",
  451. "validator failed", gotBody, expBody)
  452. }
  453. },
  454. },
  455. },
  456. &userTest{
  457. initializers: []func(tester *tester){
  458. initUserDefault,
  459. },
  460. msg: "Update user invalid id",
  461. method: "PUT",
  462. endpoint: "/api/users/alsdfjk",
  463. body: `{"rawKubeConfig":"apiVersion: v1\nkind: Config\npreferences: {}\ncurrent-context: context-test\nclusters:\n- cluster:\n server: https://localhost\n name: cluster-test\ncontexts:\n- context:\n cluster: cluster-test\n user: test-admin\n name: context-test\nusers:\n- name: test-admin", "allowedContexts":[]}`,
  464. expStatus: http.StatusForbidden,
  465. expBody: http.StatusText(http.StatusForbidden) + "\n",
  466. validators: []func(c *userTest, tester *tester, t *testing.T){
  467. userBasicBodyValidator,
  468. },
  469. },
  470. &userTest{
  471. initializers: []func(tester *tester){
  472. initUserDefault,
  473. },
  474. msg: "Update user bad kubeconfig",
  475. method: "PUT",
  476. endpoint: "/api/users/1",
  477. body: `{"rawKubeConfig":"notvalidyaml", "allowedContexts":[]}`,
  478. expStatus: http.StatusBadRequest,
  479. expBody: `{"code":600,"errors":["could not process request"]}`,
  480. useCookie: true,
  481. validators: []func(c *userTest, tester *tester, t *testing.T){
  482. userBasicBodyValidator,
  483. },
  484. },
  485. }
  486. func TestHandleUpdateUser(t *testing.T) {
  487. testUserRequests(t, updateUserTests, true)
  488. }
  489. var deleteUserTests = []*userTest{
  490. &userTest{
  491. initializers: []func(tester *tester){
  492. initUserDefault,
  493. },
  494. msg: "Delete user successful",
  495. method: "DELETE",
  496. endpoint: "/api/users/1",
  497. body: `{"password":"hello"}`,
  498. expStatus: http.StatusNoContent,
  499. expBody: "",
  500. useCookie: true,
  501. validators: []func(c *userTest, tester *tester, t *testing.T){
  502. func(c *userTest, tester *tester, t *testing.T) {
  503. req, err := http.NewRequest(
  504. "GET",
  505. "/api/users/1",
  506. strings.NewReader(""),
  507. )
  508. req.AddCookie(tester.cookie)
  509. if err != nil {
  510. t.Fatal(err)
  511. }
  512. rr2 := httptest.NewRecorder()
  513. tester.router.ServeHTTP(rr2, req)
  514. gotBody := &models.UserExternal{}
  515. expBody := &models.UserExternal{}
  516. if status := rr2.Code; status != 404 {
  517. t.Errorf("DELETE user validation, handler returned wrong status code: got %v want %v",
  518. status, 404)
  519. }
  520. json.Unmarshal(rr2.Body.Bytes(), gotBody)
  521. json.Unmarshal([]byte(`{"code":602,"errors":["could not find requested object"]}`), expBody)
  522. if !reflect.DeepEqual(gotBody, expBody) {
  523. t.Errorf("%s, handler returned wrong body: got %v want %v",
  524. "validator failed", gotBody, expBody)
  525. }
  526. },
  527. },
  528. },
  529. &userTest{
  530. initializers: []func(tester *tester){
  531. initUserDefault,
  532. },
  533. msg: "Delete user invalid id",
  534. method: "DELETE",
  535. endpoint: "/api/users/aldkjf",
  536. body: `{"password":"hello"}`,
  537. expStatus: http.StatusForbidden,
  538. expBody: http.StatusText(http.StatusForbidden) + "\n",
  539. validators: []func(c *userTest, tester *tester, t *testing.T){
  540. userBasicBodyValidator,
  541. },
  542. },
  543. &userTest{
  544. initializers: []func(tester *tester){
  545. initUserDefault,
  546. },
  547. msg: "Delete user missing password",
  548. method: "DELETE",
  549. endpoint: "/api/users/1",
  550. body: `{}`,
  551. expStatus: http.StatusUnprocessableEntity,
  552. expBody: `{"code":601,"errors":["required validation failed"]}`,
  553. useCookie: true,
  554. validators: []func(c *userTest, tester *tester, t *testing.T){
  555. userBasicBodyValidator,
  556. },
  557. },
  558. }
  559. func TestHandleDeleteUser(t *testing.T) {
  560. testUserRequests(t, deleteUserTests, true)
  561. }
  562. // ------------------------- INITIALIZERS AND VALIDATORS ------------------------- //
  563. func initUserDefault(tester *tester) {
  564. tester.createUserSession("belanger@getporter.dev", "hello")
  565. }
  566. func initUserWithContexts(tester *tester) {
  567. initUserDefault(tester)
  568. user, _ := tester.repo.User.ReadUserByEmail("belanger@getporter.dev")
  569. user.Contexts = []string{"context-test"}
  570. user.RawKubeConfig = []byte("apiVersion: v1\nkind: Config\npreferences: {}\ncurrent-context: context-test\nclusters:\n- cluster:\n server: https://localhost\n name: cluster-test\ncontexts:\n- context:\n cluster: cluster-test\n user: test-admin\n name: context-test\nusers:\n- name: test-admin")
  571. tester.repo.User.UpdateUser(user)
  572. }
  573. func userBasicBodyValidator(c *userTest, tester *tester, t *testing.T) {
  574. if body := tester.rr.Body.String(); body != c.expBody {
  575. t.Errorf("%s, handler returned wrong body: got %v want %v",
  576. c.msg, body, c.expBody)
  577. }
  578. }
  579. func userModelBodyValidator(c *userTest, tester *tester, t *testing.T) {
  580. gotBody := &models.UserExternal{}
  581. expBody := &models.UserExternal{}
  582. json.Unmarshal(tester.rr.Body.Bytes(), gotBody)
  583. json.Unmarshal([]byte(c.expBody), expBody)
  584. if !reflect.DeepEqual(gotBody, expBody) {
  585. t.Errorf("%s, handler returned wrong body: got %v want %v",
  586. c.msg, gotBody, expBody)
  587. }
  588. }
  589. func userContextBodyValidator(c *userTest, tester *tester, t *testing.T) {
  590. gotBody := &[]models.Context{}
  591. expBody := &[]models.Context{}
  592. json.Unmarshal(tester.rr.Body.Bytes(), gotBody)
  593. json.Unmarshal([]byte(c.expBody), expBody)
  594. if !reflect.DeepEqual(gotBody, expBody) {
  595. t.Errorf("%s, handler returned wrong body: got %v want %v",
  596. c.msg, gotBody, expBody)
  597. }
  598. }