auth_test.go 13 KB

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