project_test.go 2.6 KB

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