2
0

project_test.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package authz_test
  2. import (
  3. "net/http"
  4. "testing"
  5. "github.com/porter-dev/porter/api/server/authz"
  6. "github.com/porter-dev/porter/api/server/handlers/project"
  7. "github.com/porter-dev/porter/api/server/shared/apitest"
  8. "github.com/porter-dev/porter/api/server/shared/config"
  9. "github.com/porter-dev/porter/api/types"
  10. "github.com/porter-dev/porter/internal/models"
  11. "github.com/porter-dev/porter/internal/repository/test"
  12. "github.com/stretchr/testify/assert"
  13. )
  14. func TestProjectMiddlewareSuccessful(t *testing.T) {
  15. config, handler, next := loadProjectHandlers(t)
  16. user := apitest.CreateTestUser(t, config, true)
  17. proj, _, err := project.CreateProjectWithUser(config.Repo.Project(), &models.Project{
  18. Name: "test-project",
  19. }, user)
  20. if err != nil {
  21. t.Fatal(err)
  22. }
  23. req, rr := apitest.GetRequestAndRecorder(t, string(types.HTTPVerbPost), "/api/projects/1", nil)
  24. req = apitest.WithAuthenticatedUser(t, req, user)
  25. req = apitest.WithRequestScopes(t, req, map[types.PermissionScope]*types.RequestAction{
  26. types.ProjectScope: {
  27. Verb: types.APIVerbCreate,
  28. Resource: types.NameOrUInt{
  29. UInt: 1,
  30. },
  31. },
  32. })
  33. handler.ServeHTTP(rr, req)
  34. assert.True(t, next.WasCalled, "next handler should have been called")
  35. assert.Equal(t, proj, next.Project, "project should be equal")
  36. }
  37. func TestProjectMiddlewareFailedRead(t *testing.T) {
  38. config, _, _ := loadProjectHandlers(t)
  39. user := apitest.CreateTestUser(t, config, true)
  40. _, _, err := project.CreateProjectWithUser(config.Repo.Project(), &models.Project{
  41. Name: "test-project",
  42. }, user)
  43. if err != nil {
  44. t.Fatal(err)
  45. }
  46. config, handler, next := loadProjectHandlers(t, test.ReadProjectMethod)
  47. req, rr := apitest.GetRequestAndRecorder(t, string(types.HTTPVerbPost), "/api/projects/1", nil)
  48. req = apitest.WithAuthenticatedUser(t, req, user)
  49. req = apitest.WithRequestScopes(t, req, map[types.PermissionScope]*types.RequestAction{
  50. types.ProjectScope: {
  51. Verb: types.APIVerbCreate,
  52. Resource: types.NameOrUInt{
  53. UInt: 1,
  54. },
  55. },
  56. })
  57. handler.ServeHTTP(rr, req)
  58. assert.False(t, next.WasCalled, "next handler should not have been called")
  59. apitest.AssertResponseInternalServerError(t, rr)
  60. }
  61. func loadProjectHandlers(
  62. t *testing.T,
  63. failingRepoMethods ...string,
  64. ) (*config.Config, http.Handler, *testProjectHandler) {
  65. config := apitest.LoadConfig(t, failingRepoMethods...)
  66. mwFactory := authz.NewProjectScopedFactory(config)
  67. next := &testProjectHandler{}
  68. handler := mwFactory.Middleware(next)
  69. return config, handler, next
  70. }
  71. type testProjectHandler struct {
  72. WasCalled bool
  73. Project *models.Project
  74. }
  75. func (t *testProjectHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  76. t.WasCalled = true
  77. t.Project, _ = r.Context().Value(types.ProjectScope).(*models.Project)
  78. }