| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- package policy_test
- import (
- "encoding/json"
- "net/http"
- "testing"
- "github.com/porter-dev/porter/api/server/authz/policy"
- "github.com/porter-dev/porter/api/types"
- "github.com/porter-dev/porter/internal/models"
- "github.com/porter-dev/porter/internal/repository/test"
- "github.com/stretchr/testify/assert"
- )
- func TestBasicPolicyDocumentLoader(t *testing.T) {
- assert := assert.New(t)
- // use the in-memory project repo
- projRepo := test.NewProjectRepository(true)
- projRoleRepo := test.NewProjectRoleRepository(true)
- policyRepo := test.NewPolicyRepository(true)
- project, err := projRepo.CreateProject(&models.Project{
- Name: "test-project",
- })
- if err != nil {
- t.Fatalf("%v", err)
- }
- policyBytes, err := json.Marshal(types.AdminPolicy)
- if err != nil {
- t.Fatalf("%v", err)
- }
- pol, err := policyRepo.CreatePolicy(&models.Policy{
- UniqueID: "test-policy-uid",
- ProjectID: project.ID,
- Name: "test-policy",
- PolicyBytes: policyBytes,
- })
- if err != nil {
- t.Fatalf("%v", err)
- }
- role, err := projRoleRepo.CreateProjectRole(&models.ProjectRole{
- UniqueID: "1-admin",
- ProjectID: project.ID,
- PolicyUID: pol.UniqueID,
- Name: "admin",
- })
- if err != nil {
- t.Fatalf("%v", err)
- }
- err = projRoleRepo.UpdateUsersInProjectRole(project.ID, role.UniqueID, []uint{1})
- if err != nil {
- t.Fatalf("%v", err)
- }
- loader := policy.NewBasicPolicyDocumentLoader(projRoleRepo, policyRepo)
- docs, reqErr := loader.LoadPolicyDocuments(&policy.PolicyLoaderOpts{
- ProjectID: 1,
- UserID: 1,
- })
- assert.Equal(true, reqErr == nil)
- assert.Equal(1, len(docs))
- assert.Equal(types.AdminPolicy[0], docs[0])
- }
- func TestErrorForbiddenInvalidRole(t *testing.T) {
- assert := assert.New(t)
- // use the in-memory project repo
- projRepo := test.NewProjectRepository(true)
- projRoleRepo := test.NewProjectRoleRepository(true)
- policyRepo := test.NewPolicyRepository(true)
- loader := policy.NewBasicPolicyDocumentLoader(projRoleRepo, policyRepo)
- project, err := projRepo.CreateProject(&models.Project{
- Name: "test-project",
- })
- if err != nil {
- t.Fatalf("%v", err)
- }
- policyBytes, err := json.Marshal(types.RoleAdmin)
- if err != nil {
- t.Fatalf("%v", err)
- }
- pol, err := policyRepo.CreatePolicy(&models.Policy{
- UniqueID: "test-policy-uid",
- ProjectID: project.ID,
- Name: "test-policy",
- PolicyBytes: policyBytes,
- })
- if err != nil {
- t.Fatalf("%v", err)
- }
- _, err = projRoleRepo.CreateProjectRole(&models.ProjectRole{
- UniqueID: "1-admin",
- ProjectID: project.ID,
- PolicyUID: pol.UniqueID,
- Name: "admin",
- })
- if err != nil {
- t.Fatalf("%v", err)
- }
- _, reqErr := loader.LoadPolicyDocuments(&policy.PolicyLoaderOpts{
- ProjectID: 1,
- UserID: 1,
- })
- if reqErr == nil {
- t.Fatalf("Expected forbidden error for invalid project role")
- }
- // check that external and internal errors are returned as well
- assert.Equal(
- http.StatusForbidden,
- reqErr.GetStatusCode(),
- "status is not status forbidden",
- )
- assert.Equal(
- "user does not have any roles assigned in this project",
- reqErr.Error(),
- "error message is not correct",
- )
- }
- func TestErrorCannotQuery(t *testing.T) {
- assert := assert.New(t)
- // use the in-memory project repo
- projRoleRepo := test.NewProjectRoleRepository(false)
- policyRepo := test.NewPolicyRepository(false)
- loader := policy.NewBasicPolicyDocumentLoader(projRoleRepo, policyRepo)
- _, reqErr := loader.LoadPolicyDocuments(&policy.PolicyLoaderOpts{
- ProjectID: 2,
- UserID: 1,
- })
- if reqErr == nil {
- t.Fatalf("Expected internal error for failing to query")
- }
- // check that external and internal errors are returned as well
- assert.Equal(
- http.StatusInternalServerError,
- reqErr.GetStatusCode(),
- "status is not status internal",
- )
- }
|