loader_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package policy_test
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "testing"
  6. "github.com/porter-dev/porter/api/server/authz/policy"
  7. "github.com/porter-dev/porter/api/types"
  8. "github.com/porter-dev/porter/internal/models"
  9. "github.com/porter-dev/porter/internal/repository/test"
  10. "github.com/stretchr/testify/assert"
  11. )
  12. func TestBasicPolicyDocumentLoader(t *testing.T) {
  13. assert := assert.New(t)
  14. // use the in-memory project repo
  15. projRepo := test.NewProjectRepository(true)
  16. projRoleRepo := test.NewProjectRoleRepository(true)
  17. policyRepo := test.NewPolicyRepository(true)
  18. project, err := projRepo.CreateProject(&models.Project{
  19. Name: "test-project",
  20. })
  21. if err != nil {
  22. t.Fatalf("%v", err)
  23. }
  24. policyBytes, err := json.Marshal(types.AdminPolicy)
  25. if err != nil {
  26. t.Fatalf("%v", err)
  27. }
  28. pol, err := policyRepo.CreatePolicy(&models.Policy{
  29. UniqueID: "test-policy-uid",
  30. ProjectID: project.ID,
  31. Name: "test-policy",
  32. PolicyBytes: policyBytes,
  33. })
  34. if err != nil {
  35. t.Fatalf("%v", err)
  36. }
  37. role, err := projRoleRepo.CreateProjectRole(&models.ProjectRole{
  38. UniqueID: "1-admin",
  39. ProjectID: project.ID,
  40. PolicyUID: pol.UniqueID,
  41. Name: "admin",
  42. })
  43. if err != nil {
  44. t.Fatalf("%v", err)
  45. }
  46. err = projRoleRepo.UpdateUsersInProjectRole(project.ID, role.UniqueID, []uint{1})
  47. if err != nil {
  48. t.Fatalf("%v", err)
  49. }
  50. loader := policy.NewBasicPolicyDocumentLoader(projRoleRepo, policyRepo)
  51. docs, reqErr := loader.LoadPolicyDocuments(&policy.PolicyLoaderOpts{
  52. ProjectID: 1,
  53. UserID: 1,
  54. })
  55. assert.Equal(true, reqErr == nil)
  56. assert.Equal(1, len(docs))
  57. assert.Equal(types.AdminPolicy[0], docs[0])
  58. }
  59. func TestErrorForbiddenInvalidRole(t *testing.T) {
  60. assert := assert.New(t)
  61. // use the in-memory project repo
  62. projRepo := test.NewProjectRepository(true)
  63. projRoleRepo := test.NewProjectRoleRepository(true)
  64. policyRepo := test.NewPolicyRepository(true)
  65. loader := policy.NewBasicPolicyDocumentLoader(projRoleRepo, policyRepo)
  66. project, err := projRepo.CreateProject(&models.Project{
  67. Name: "test-project",
  68. })
  69. if err != nil {
  70. t.Fatalf("%v", err)
  71. }
  72. policyBytes, err := json.Marshal(types.RoleAdmin)
  73. if err != nil {
  74. t.Fatalf("%v", err)
  75. }
  76. pol, err := policyRepo.CreatePolicy(&models.Policy{
  77. UniqueID: "test-policy-uid",
  78. ProjectID: project.ID,
  79. Name: "test-policy",
  80. PolicyBytes: policyBytes,
  81. })
  82. if err != nil {
  83. t.Fatalf("%v", err)
  84. }
  85. _, err = projRoleRepo.CreateProjectRole(&models.ProjectRole{
  86. UniqueID: "1-admin",
  87. ProjectID: project.ID,
  88. PolicyUID: pol.UniqueID,
  89. Name: "admin",
  90. })
  91. if err != nil {
  92. t.Fatalf("%v", err)
  93. }
  94. _, reqErr := loader.LoadPolicyDocuments(&policy.PolicyLoaderOpts{
  95. ProjectID: 1,
  96. UserID: 1,
  97. })
  98. if reqErr == nil {
  99. t.Fatalf("Expected forbidden error for invalid project role")
  100. }
  101. // check that external and internal errors are returned as well
  102. assert.Equal(
  103. http.StatusForbidden,
  104. reqErr.GetStatusCode(),
  105. "status is not status forbidden",
  106. )
  107. assert.Equal(
  108. "user does not have any roles assigned in this project",
  109. reqErr.Error(),
  110. "error message is not correct",
  111. )
  112. }
  113. func TestErrorCannotQuery(t *testing.T) {
  114. assert := assert.New(t)
  115. // use the in-memory project repo
  116. projRoleRepo := test.NewProjectRoleRepository(false)
  117. policyRepo := test.NewPolicyRepository(false)
  118. loader := policy.NewBasicPolicyDocumentLoader(projRoleRepo, policyRepo)
  119. _, reqErr := loader.LoadPolicyDocuments(&policy.PolicyLoaderOpts{
  120. ProjectID: 2,
  121. UserID: 1,
  122. })
  123. if reqErr == nil {
  124. t.Fatalf("Expected internal error for failing to query")
  125. }
  126. // check that external and internal errors are returned as well
  127. assert.Equal(
  128. http.StatusInternalServerError,
  129. reqErr.GetStatusCode(),
  130. "status is not status internal",
  131. )
  132. }