auth_test.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. package gorm_test
  2. import (
  3. "testing"
  4. "github.com/go-test/deep"
  5. "github.com/porter-dev/porter/api/types"
  6. ints "github.com/porter-dev/porter/internal/models/integrations"
  7. orm "gorm.io/gorm"
  8. )
  9. func TestCreateKubeIntegration(t *testing.T) {
  10. tester := &tester{
  11. dbFileName: "./porter_create_ki.db",
  12. }
  13. setupTestEnv(tester, t)
  14. initUser(tester, t)
  15. initProject(tester, t)
  16. defer cleanup(tester, t)
  17. ki := &ints.KubeIntegration{
  18. Mechanism: ints.KubeLocal,
  19. ProjectID: tester.initProjects[0].ID,
  20. UserID: tester.initUsers[0].ID,
  21. Kubeconfig: []byte("current-context: testing\n"),
  22. }
  23. expKI := *ki
  24. ki, err := tester.repo.KubeIntegration().CreateKubeIntegration(ki)
  25. if err != nil {
  26. t.Fatalf("%v\n", err)
  27. }
  28. ki, err = tester.repo.KubeIntegration().ReadKubeIntegration(tester.initProjects[0].ID, ki.Model.ID)
  29. if err != nil {
  30. t.Fatalf("%v\n", err)
  31. }
  32. // make sure id is 1
  33. if ki.Model.ID != 1 {
  34. t.Errorf("incorrect kube integration ID: expected %d, got %d\n", 1, ki.Model.ID)
  35. }
  36. // reset fields for deep.Equal
  37. ki.Model = orm.Model{}
  38. if diff := deep.Equal(expKI, *ki); diff != nil {
  39. t.Errorf("incorrect kube integration")
  40. t.Error(diff)
  41. }
  42. }
  43. func TestListKubeIntegrationsByProjectID(t *testing.T) {
  44. tester := &tester{
  45. dbFileName: "./porter_list_kis.db",
  46. }
  47. setupTestEnv(tester, t)
  48. initProject(tester, t)
  49. initKubeIntegration(tester, t)
  50. defer cleanup(tester, t)
  51. kis, err := tester.repo.KubeIntegration().ListKubeIntegrationsByProjectID(
  52. tester.initProjects[0].Model.ID,
  53. )
  54. if err != nil {
  55. t.Fatalf("%v\n", err)
  56. }
  57. if len(kis) != 1 {
  58. t.Fatalf("length of kube integrations incorrect: expected %d, got %d\n", 1, len(kis))
  59. }
  60. // make sure data is correct
  61. expKI := ints.KubeIntegration{
  62. Mechanism: ints.KubeLocal,
  63. ProjectID: tester.initProjects[0].ID,
  64. UserID: tester.initUsers[0].ID,
  65. Kubeconfig: []byte(""),
  66. }
  67. ki := kis[0]
  68. // reset fields for reflect.DeepEqual
  69. ki.Model = orm.Model{}
  70. // list methods don't decrypt, so don't check those
  71. ki.Kubeconfig = []byte("")
  72. if diff := deep.Equal(expKI, *ki); diff != nil {
  73. t.Errorf("incorrect kube integration")
  74. t.Error(diff)
  75. }
  76. }
  77. func TestCreateBasicIntegration(t *testing.T) {
  78. tester := &tester{
  79. dbFileName: "./porter_create_basic.db",
  80. }
  81. setupTestEnv(tester, t)
  82. initUser(tester, t)
  83. initProject(tester, t)
  84. defer cleanup(tester, t)
  85. basic := &ints.BasicIntegration{
  86. ProjectID: tester.initProjects[0].ID,
  87. UserID: tester.initUsers[0].ID,
  88. Username: []byte("username"),
  89. Password: []byte("password"),
  90. }
  91. expBasic := *basic
  92. basic, err := tester.repo.BasicIntegration().CreateBasicIntegration(basic)
  93. if err != nil {
  94. t.Fatalf("%v\n", err)
  95. }
  96. basic, err = tester.repo.BasicIntegration().ReadBasicIntegration(tester.initProjects[0].ID, basic.Model.ID)
  97. if err != nil {
  98. t.Fatalf("%v\n", err)
  99. }
  100. // make sure id is 1
  101. if basic.Model.ID != 1 {
  102. t.Errorf("incorrect basic integration ID: expected %d, got %d\n", 1, basic.Model.ID)
  103. }
  104. // reset fields for deep.Equal
  105. basic.Model = orm.Model{}
  106. if diff := deep.Equal(expBasic, *basic); diff != nil {
  107. t.Errorf("incorrect basic integration")
  108. t.Error(diff)
  109. }
  110. }
  111. func TestListBasicIntegrationsByProjectID(t *testing.T) {
  112. tester := &tester{
  113. dbFileName: "./porter_list_basics.db",
  114. }
  115. setupTestEnv(tester, t)
  116. initProject(tester, t)
  117. initBasicIntegration(tester, t)
  118. defer cleanup(tester, t)
  119. basics, err := tester.repo.BasicIntegration().ListBasicIntegrationsByProjectID(
  120. tester.initProjects[0].Model.ID,
  121. )
  122. if err != nil {
  123. t.Fatalf("%v\n", err)
  124. }
  125. if len(basics) != 1 {
  126. t.Fatalf("length of basic integrations incorrect: expected %d, got %d\n", 1, len(basics))
  127. }
  128. // make sure data is correct
  129. expBasic := ints.BasicIntegration{
  130. ProjectID: tester.initProjects[0].ID,
  131. UserID: tester.initUsers[0].ID,
  132. Username: []byte(""),
  133. Password: []byte(""),
  134. }
  135. basic := basics[0]
  136. // reset fields for reflect.DeepEqual
  137. basic.Model = orm.Model{}
  138. // list methods don't decrypt, so don't check those
  139. basic.Username = []byte("")
  140. basic.Password = []byte("")
  141. if diff := deep.Equal(expBasic, *basic); diff != nil {
  142. t.Errorf("incorrect basic integration")
  143. t.Error(diff)
  144. }
  145. }
  146. func TestCreateOIDCIntegration(t *testing.T) {
  147. tester := &tester{
  148. dbFileName: "./porter_create_oidc.db",
  149. }
  150. setupTestEnv(tester, t)
  151. initUser(tester, t)
  152. initProject(tester, t)
  153. defer cleanup(tester, t)
  154. oidc := &ints.OIDCIntegration{
  155. Client: ints.OIDCKube,
  156. ProjectID: tester.initProjects[0].ID,
  157. UserID: tester.initUsers[0].ID,
  158. IssuerURL: []byte("https://oidc.example.com"),
  159. ClientID: []byte("exampleclientid"),
  160. ClientSecret: []byte("exampleclientsecret"),
  161. IDToken: []byte("idtoken"),
  162. RefreshToken: []byte("refreshtoken"),
  163. }
  164. expOIDC := *oidc
  165. oidc, err := tester.repo.OIDCIntegration().CreateOIDCIntegration(oidc)
  166. if err != nil {
  167. t.Fatalf("%v\n", err)
  168. }
  169. oidc, err = tester.repo.OIDCIntegration().ReadOIDCIntegration(tester.initProjects[0].ID, oidc.Model.ID)
  170. if err != nil {
  171. t.Fatalf("%v\n", err)
  172. }
  173. // make sure id is 1
  174. if oidc.Model.ID != 1 {
  175. t.Errorf("incorrect oidc integration ID: expected %d, got %d\n", 1, oidc.Model.ID)
  176. }
  177. // reset fields for deep.Equal
  178. oidc.Model = orm.Model{}
  179. if diff := deep.Equal(expOIDC, *oidc); diff != nil {
  180. t.Errorf("incorrect oidc integration")
  181. t.Error(diff)
  182. }
  183. }
  184. func TestListOIDCIntegrationsByProjectID(t *testing.T) {
  185. tester := &tester{
  186. dbFileName: "./porter_list_oidcs.db",
  187. }
  188. setupTestEnv(tester, t)
  189. initProject(tester, t)
  190. initOIDCIntegration(tester, t)
  191. defer cleanup(tester, t)
  192. oidcs, err := tester.repo.OIDCIntegration().ListOIDCIntegrationsByProjectID(
  193. tester.initProjects[0].Model.ID,
  194. )
  195. if err != nil {
  196. t.Fatalf("%v\n", err)
  197. }
  198. if len(oidcs) != 1 {
  199. t.Fatalf("length of oidc integrations incorrect: expected %d, got %d\n", 1, len(oidcs))
  200. }
  201. // make sure data is correct
  202. expOIDC := ints.OIDCIntegration{
  203. Client: ints.OIDCKube,
  204. ProjectID: tester.initProjects[0].ID,
  205. UserID: tester.initUsers[0].ID,
  206. IssuerURL: []byte(""),
  207. ClientID: []byte(""),
  208. ClientSecret: []byte(""),
  209. IDToken: []byte(""),
  210. RefreshToken: []byte(""),
  211. }
  212. oidc := oidcs[0]
  213. // reset fields for reflect.DeepEqual
  214. oidc.Model = orm.Model{}
  215. // list methods don't decrypt, so don't check those
  216. oidc.IssuerURL = []byte("")
  217. oidc.ClientID = []byte("")
  218. oidc.ClientSecret = []byte("")
  219. oidc.IDToken = []byte("")
  220. oidc.RefreshToken = []byte("")
  221. if diff := deep.Equal(expOIDC, *oidc); diff != nil {
  222. t.Errorf("incorrect oidc integration")
  223. t.Error(diff)
  224. }
  225. }
  226. func TestCreateOAuthIntegration(t *testing.T) {
  227. tester := &tester{
  228. dbFileName: "./porter_create_oauth.db",
  229. }
  230. setupTestEnv(tester, t)
  231. initUser(tester, t)
  232. initProject(tester, t)
  233. defer cleanup(tester, t)
  234. oauth := &ints.OAuthIntegration{
  235. SharedOAuthModel: ints.SharedOAuthModel{
  236. ClientID: []byte("exampleclientid"),
  237. AccessToken: []byte("idtoken"),
  238. RefreshToken: []byte("refreshtoken"),
  239. },
  240. Client: types.OAuthGithub,
  241. ProjectID: tester.initProjects[0].ID,
  242. UserID: tester.initUsers[0].ID,
  243. }
  244. expOAuth := *oauth
  245. oauth, err := tester.repo.OAuthIntegration().CreateOAuthIntegration(oauth)
  246. if err != nil {
  247. t.Fatalf("%v\n", err)
  248. }
  249. oauth, err = tester.repo.OAuthIntegration().ReadOAuthIntegration(tester.initProjects[0].ID, oauth.Model.ID)
  250. if err != nil {
  251. t.Fatalf("%v\n", err)
  252. }
  253. // make sure id is 1
  254. if oauth.Model.ID != 1 {
  255. t.Errorf("incorrect oauth integration ID: expected %d, got %d\n", 1, oauth.Model.ID)
  256. }
  257. // reset fields for deep.Equal
  258. oauth.Model = orm.Model{}
  259. if diff := deep.Equal(expOAuth, *oauth); diff != nil {
  260. t.Errorf("incorrect oauth integration")
  261. t.Error(diff)
  262. }
  263. }
  264. func TestListOAuthIntegrationsByProjectID(t *testing.T) {
  265. tester := &tester{
  266. dbFileName: "./porter_list_oauths.db",
  267. }
  268. setupTestEnv(tester, t)
  269. initProject(tester, t)
  270. initOAuthIntegration(tester, t)
  271. defer cleanup(tester, t)
  272. oauths, err := tester.repo.OAuthIntegration().ListOAuthIntegrationsByProjectID(
  273. tester.initProjects[0].Model.ID,
  274. )
  275. if err != nil {
  276. t.Fatalf("%v\n", err)
  277. }
  278. if len(oauths) != 1 {
  279. t.Fatalf("length of oauth integrations incorrect: expected %d, got %d\n", 1, len(oauths))
  280. }
  281. // make sure data is correct
  282. expOAuth := ints.OAuthIntegration{
  283. SharedOAuthModel: ints.SharedOAuthModel{
  284. ClientID: []byte(""),
  285. AccessToken: []byte(""),
  286. RefreshToken: []byte(""),
  287. },
  288. Client: types.OAuthGithub,
  289. ProjectID: tester.initProjects[0].ID,
  290. UserID: tester.initUsers[0].ID,
  291. }
  292. oauth := oauths[0]
  293. // reset fields for reflect.DeepEqual
  294. oauth.Model = orm.Model{}
  295. // list methods don't decrypt, so don't check those
  296. oauth.SharedOAuthModel.ClientID = []byte("")
  297. oauth.SharedOAuthModel.AccessToken = []byte("")
  298. oauth.SharedOAuthModel.RefreshToken = []byte("")
  299. if diff := deep.Equal(expOAuth, *oauth); diff != nil {
  300. t.Errorf("incorrect oauth integration")
  301. t.Error(diff)
  302. }
  303. }
  304. func TestCreateGCPIntegration(t *testing.T) {
  305. tester := &tester{
  306. dbFileName: "./porter_create_gcp.db",
  307. }
  308. setupTestEnv(tester, t)
  309. initUser(tester, t)
  310. initProject(tester, t)
  311. defer cleanup(tester, t)
  312. gcp := &ints.GCPIntegration{
  313. ProjectID: tester.initProjects[0].ID,
  314. UserID: tester.initUsers[0].ID,
  315. GCPProjectID: "test-proj-123456",
  316. GCPUserEmail: "test@test.it",
  317. GCPKeyData: []byte("{\"test\":\"key\"}"),
  318. }
  319. expGCP := *gcp
  320. gcp, err := tester.repo.GCPIntegration().CreateGCPIntegration(gcp)
  321. if err != nil {
  322. t.Fatalf("%v\n", err)
  323. }
  324. gcp, err = tester.repo.GCPIntegration().ReadGCPIntegration(tester.initProjects[0].ID, gcp.Model.ID)
  325. if err != nil {
  326. t.Fatalf("%v\n", err)
  327. }
  328. // make sure id is 1
  329. if gcp.Model.ID != 1 {
  330. t.Errorf("incorrect gcp integration ID: expected %d, got %d\n", 1, gcp.Model.ID)
  331. }
  332. // reset fields for deep.Equal
  333. gcp.Model = orm.Model{}
  334. if diff := deep.Equal(expGCP, *gcp); diff != nil {
  335. t.Errorf("incorrect gcp integration")
  336. t.Error(diff)
  337. }
  338. }
  339. func TestListGCPIntegrationsByProjectID(t *testing.T) {
  340. tester := &tester{
  341. dbFileName: "./porter_list_gcps.db",
  342. }
  343. setupTestEnv(tester, t)
  344. initProject(tester, t)
  345. initGCPIntegration(tester, t)
  346. defer cleanup(tester, t)
  347. gcps, err := tester.repo.GCPIntegration().ListGCPIntegrationsByProjectID(
  348. tester.initProjects[0].Model.ID,
  349. )
  350. if err != nil {
  351. t.Fatalf("%v\n", err)
  352. }
  353. if len(gcps) != 1 {
  354. t.Fatalf("length of gcp integrations incorrect: expected %d, got %d\n", 1, len(gcps))
  355. }
  356. // make sure data is correct
  357. expGCP := ints.GCPIntegration{
  358. ProjectID: tester.initProjects[0].ID,
  359. UserID: tester.initUsers[0].ID,
  360. GCPProjectID: "test-proj-123456",
  361. GCPUserEmail: "test@test.it",
  362. GCPKeyData: []byte(""),
  363. }
  364. gcp := gcps[0]
  365. // reset fields for reflect.DeepEqual
  366. gcp.Model = orm.Model{}
  367. // list methods don't decrypt, so don't check those
  368. gcp.GCPKeyData = []byte("")
  369. if diff := deep.Equal(expGCP, *gcp); diff != nil {
  370. t.Errorf("incorrect gcp integration")
  371. t.Error(diff)
  372. }
  373. }
  374. func TestCreateAWSIntegration(t *testing.T) {
  375. tester := &tester{
  376. dbFileName: "./porter_create_aws.db",
  377. }
  378. setupTestEnv(tester, t)
  379. initUser(tester, t)
  380. initProject(tester, t)
  381. defer cleanup(tester, t)
  382. aws := &ints.AWSIntegration{
  383. ProjectID: tester.initProjects[0].ID,
  384. UserID: tester.initUsers[0].ID,
  385. AWSClusterID: []byte("example-cluster-0"),
  386. AWSAccessKeyID: []byte("accesskey"),
  387. AWSSecretAccessKey: []byte("secret"),
  388. AWSSessionToken: []byte("optional"),
  389. }
  390. expAWS := *aws
  391. aws, err := tester.repo.AWSIntegration().CreateAWSIntegration(aws)
  392. if err != nil {
  393. t.Fatalf("%v\n", err)
  394. }
  395. aws, err = tester.repo.AWSIntegration().ReadAWSIntegration(tester.initProjects[0].ID, aws.Model.ID)
  396. if err != nil {
  397. t.Fatalf("%v\n", err)
  398. }
  399. // make sure id is 1
  400. if aws.Model.ID != 1 {
  401. t.Errorf("incorrect aws integration ID: expected %d, got %d\n", 1, aws.Model.ID)
  402. }
  403. // reset fields for deep.Equal
  404. aws.Model = orm.Model{}
  405. if diff := deep.Equal(expAWS, *aws); diff != nil {
  406. t.Errorf("incorrect aws integration")
  407. t.Error(diff)
  408. }
  409. }
  410. func TestOverwriteAWSIntegration(t *testing.T) {
  411. tester := &tester{
  412. dbFileName: "./porter_overwrite_aws.db",
  413. }
  414. setupTestEnv(tester, t)
  415. initUser(tester, t)
  416. initProject(tester, t)
  417. initAWSIntegration(tester, t)
  418. defer cleanup(tester, t)
  419. aws, err := tester.repo.AWSIntegration().ReadAWSIntegration(tester.initProjects[0].ID, 1)
  420. if err != nil {
  421. t.Fatalf("%v\n", err)
  422. }
  423. aws.AWSAccessKeyID = []byte("accesskey2")
  424. aws.AWSSecretAccessKey = []byte("secret2")
  425. aws, err = tester.repo.AWSIntegration().OverwriteAWSIntegration(aws)
  426. if err != nil {
  427. t.Fatalf("%v\n", err)
  428. }
  429. gotAWS, err := tester.repo.AWSIntegration().ReadAWSIntegration(tester.initProjects[0].ID, 1)
  430. expAWS := &ints.AWSIntegration{
  431. ProjectID: tester.initProjects[0].ID,
  432. UserID: tester.initUsers[0].ID,
  433. AWSClusterID: []byte("example-cluster-0"),
  434. AWSAccessKeyID: []byte("accesskey2"),
  435. AWSSecretAccessKey: []byte("secret2"),
  436. AWSSessionToken: []byte("optional"),
  437. }
  438. // make sure id is 1
  439. if gotAWS.Model.ID != 1 {
  440. t.Errorf("incorrect aws integration ID: expected %d, got %d\n", 1, gotAWS.Model.ID)
  441. }
  442. // reset fields for deep.Equal
  443. gotAWS.Model = orm.Model{}
  444. if diff := deep.Equal(expAWS, gotAWS); diff != nil {
  445. t.Errorf("incorrect aws integration")
  446. t.Error(diff)
  447. }
  448. }
  449. func TestListAWSIntegrationsByProjectID(t *testing.T) {
  450. tester := &tester{
  451. dbFileName: "./porter_list_awss.db",
  452. }
  453. setupTestEnv(tester, t)
  454. initProject(tester, t)
  455. initAWSIntegration(tester, t)
  456. defer cleanup(tester, t)
  457. awss, err := tester.repo.AWSIntegration().ListAWSIntegrationsByProjectID(
  458. tester.initProjects[0].Model.ID,
  459. )
  460. if err != nil {
  461. t.Fatalf("%v\n", err)
  462. }
  463. if len(awss) != 1 {
  464. t.Fatalf("length of aws integrations incorrect: expected %d, got %d\n", 1, len(awss))
  465. }
  466. // make sure data is correct
  467. expAWS := ints.AWSIntegration{
  468. ProjectID: tester.initProjects[0].ID,
  469. UserID: tester.initUsers[0].ID,
  470. AWSClusterID: []byte(""),
  471. AWSAccessKeyID: []byte(""),
  472. AWSSecretAccessKey: []byte(""),
  473. AWSSessionToken: []byte(""),
  474. }
  475. aws := awss[0]
  476. // reset fields for reflect.DeepEqual
  477. aws.Model = orm.Model{}
  478. // list methods don't decrypt, so don't check those
  479. aws.AWSClusterID = []byte("")
  480. aws.AWSAccessKeyID = []byte("")
  481. aws.AWSSecretAccessKey = []byte("")
  482. aws.AWSSessionToken = []byte("")
  483. if diff := deep.Equal(expAWS, *aws); diff != nil {
  484. t.Errorf("incorrect aws integration")
  485. t.Error(diff)
  486. }
  487. }