auth_test.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  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. Client: ints.OAuthGithub,
  224. ProjectID: tester.initProjects[0].ID,
  225. UserID: tester.initUsers[0].ID,
  226. ClientID: []byte("exampleclientid"),
  227. AccessToken: []byte("idtoken"),
  228. RefreshToken: []byte("refreshtoken"),
  229. }
  230. expOAuth := *oauth
  231. oauth, err := tester.repo.OAuthIntegration.CreateOAuthIntegration(oauth)
  232. if err != nil {
  233. t.Fatalf("%v\n", err)
  234. }
  235. oauth, err = tester.repo.OAuthIntegration.ReadOAuthIntegration(oauth.Model.ID)
  236. if err != nil {
  237. t.Fatalf("%v\n", err)
  238. }
  239. // make sure id is 1
  240. if oauth.Model.ID != 1 {
  241. t.Errorf("incorrect oauth integration ID: expected %d, got %d\n", 1, oauth.Model.ID)
  242. }
  243. // reset fields for deep.Equal
  244. oauth.Model = orm.Model{}
  245. if diff := deep.Equal(expOAuth, *oauth); diff != nil {
  246. t.Errorf("incorrect oauth integration")
  247. t.Error(diff)
  248. }
  249. }
  250. func TestListOAuthIntegrationsByProjectID(t *testing.T) {
  251. tester := &tester{
  252. dbFileName: "./porter_list_oauths.db",
  253. }
  254. setupTestEnv(tester, t)
  255. initProject(tester, t)
  256. initOAuthIntegration(tester, t)
  257. defer cleanup(tester, t)
  258. oauths, err := tester.repo.OAuthIntegration.ListOAuthIntegrationsByProjectID(
  259. tester.initProjects[0].Model.ID,
  260. )
  261. if err != nil {
  262. t.Fatalf("%v\n", err)
  263. }
  264. if len(oauths) != 1 {
  265. t.Fatalf("length of oauth integrations incorrect: expected %d, got %d\n", 1, len(oauths))
  266. }
  267. // make sure data is correct
  268. expOAuth := ints.OAuthIntegration{
  269. Client: ints.OAuthGithub,
  270. ProjectID: tester.initProjects[0].ID,
  271. UserID: tester.initUsers[0].ID,
  272. ClientID: []byte("exampleclientid"),
  273. AccessToken: []byte("idtoken"),
  274. RefreshToken: []byte("refreshtoken"),
  275. }
  276. oauth := oauths[0]
  277. // reset fields for reflect.DeepEqual
  278. oauth.Model = orm.Model{}
  279. if diff := deep.Equal(expOAuth, *oauth); diff != nil {
  280. t.Errorf("incorrect oauth integration")
  281. t.Error(diff)
  282. }
  283. }
  284. func TestCreateGCPIntegration(t *testing.T) {
  285. tester := &tester{
  286. dbFileName: "./porter_create_gcp.db",
  287. }
  288. setupTestEnv(tester, t)
  289. initUser(tester, t)
  290. initProject(tester, t)
  291. defer cleanup(tester, t)
  292. gcp := &ints.GCPIntegration{
  293. ProjectID: tester.initProjects[0].ID,
  294. UserID: tester.initUsers[0].ID,
  295. GCPProjectID: "test-proj-123456",
  296. GCPUserEmail: "test@test.it",
  297. GCPKeyData: []byte("{\"test\":\"key\"}"),
  298. }
  299. expGCP := *gcp
  300. gcp, err := tester.repo.GCPIntegration.CreateGCPIntegration(gcp)
  301. if err != nil {
  302. t.Fatalf("%v\n", err)
  303. }
  304. gcp, err = tester.repo.GCPIntegration.ReadGCPIntegration(gcp.Model.ID)
  305. if err != nil {
  306. t.Fatalf("%v\n", err)
  307. }
  308. // make sure id is 1
  309. if gcp.Model.ID != 1 {
  310. t.Errorf("incorrect gcp integration ID: expected %d, got %d\n", 1, gcp.Model.ID)
  311. }
  312. // reset fields for deep.Equal
  313. gcp.Model = orm.Model{}
  314. if diff := deep.Equal(expGCP, *gcp); diff != nil {
  315. t.Errorf("incorrect gcp integration")
  316. t.Error(diff)
  317. }
  318. }
  319. func TestListGCPIntegrationsByProjectID(t *testing.T) {
  320. tester := &tester{
  321. dbFileName: "./porter_list_gcps.db",
  322. }
  323. setupTestEnv(tester, t)
  324. initProject(tester, t)
  325. initGCPIntegration(tester, t)
  326. defer cleanup(tester, t)
  327. gcps, err := tester.repo.GCPIntegration.ListGCPIntegrationsByProjectID(
  328. tester.initProjects[0].Model.ID,
  329. )
  330. if err != nil {
  331. t.Fatalf("%v\n", err)
  332. }
  333. if len(gcps) != 1 {
  334. t.Fatalf("length of gcp integrations incorrect: expected %d, got %d\n", 1, len(gcps))
  335. }
  336. // make sure data is correct
  337. expGCP := ints.GCPIntegration{
  338. ProjectID: tester.initProjects[0].ID,
  339. UserID: tester.initUsers[0].ID,
  340. GCPProjectID: "test-proj-123456",
  341. GCPUserEmail: "test@test.it",
  342. GCPKeyData: []byte("{\"test\":\"key\"}"),
  343. }
  344. gcp := gcps[0]
  345. // reset fields for reflect.DeepEqual
  346. gcp.Model = orm.Model{}
  347. if diff := deep.Equal(expGCP, *gcp); diff != nil {
  348. t.Errorf("incorrect gcp integration")
  349. t.Error(diff)
  350. }
  351. }
  352. func TestCreateAWSIntegration(t *testing.T) {
  353. tester := &tester{
  354. dbFileName: "./porter_create_aws.db",
  355. }
  356. setupTestEnv(tester, t)
  357. initUser(tester, t)
  358. initProject(tester, t)
  359. defer cleanup(tester, t)
  360. aws := &ints.AWSIntegration{
  361. ProjectID: tester.initProjects[0].ID,
  362. UserID: tester.initUsers[0].ID,
  363. AWSClusterID: []byte("example-cluster-0"),
  364. AWSAccessKeyID: []byte("accesskey"),
  365. AWSSecretAccessKey: []byte("secret"),
  366. AWSSessionToken: []byte("optional"),
  367. }
  368. expAWS := *aws
  369. aws, err := tester.repo.AWSIntegration.CreateAWSIntegration(aws)
  370. if err != nil {
  371. t.Fatalf("%v\n", err)
  372. }
  373. aws, err = tester.repo.AWSIntegration.ReadAWSIntegration(aws.Model.ID)
  374. if err != nil {
  375. t.Fatalf("%v\n", err)
  376. }
  377. // make sure id is 1
  378. if aws.Model.ID != 1 {
  379. t.Errorf("incorrect aws integration ID: expected %d, got %d\n", 1, aws.Model.ID)
  380. }
  381. // reset fields for deep.Equal
  382. aws.Model = orm.Model{}
  383. if diff := deep.Equal(expAWS, *aws); diff != nil {
  384. t.Errorf("incorrect aws integration")
  385. t.Error(diff)
  386. }
  387. }
  388. func TestListAWSIntegrationsByProjectID(t *testing.T) {
  389. tester := &tester{
  390. dbFileName: "./porter_list_awss.db",
  391. }
  392. setupTestEnv(tester, t)
  393. initProject(tester, t)
  394. initAWSIntegration(tester, t)
  395. defer cleanup(tester, t)
  396. awss, err := tester.repo.AWSIntegration.ListAWSIntegrationsByProjectID(
  397. tester.initProjects[0].Model.ID,
  398. )
  399. if err != nil {
  400. t.Fatalf("%v\n", err)
  401. }
  402. if len(awss) != 1 {
  403. t.Fatalf("length of aws integrations incorrect: expected %d, got %d\n", 1, len(awss))
  404. }
  405. // make sure data is correct
  406. expAWS := ints.AWSIntegration{
  407. ProjectID: tester.initProjects[0].ID,
  408. UserID: tester.initUsers[0].ID,
  409. AWSClusterID: []byte("example-cluster-0"),
  410. AWSAccessKeyID: []byte("accesskey"),
  411. AWSSecretAccessKey: []byte("secret"),
  412. AWSSessionToken: []byte("optional"),
  413. }
  414. aws := awss[0]
  415. // reset fields for reflect.DeepEqual
  416. aws.Model = orm.Model{}
  417. if diff := deep.Equal(expAWS, *aws); diff != nil {
  418. t.Errorf("incorrect aws integration")
  419. t.Error(diff)
  420. }
  421. }