From 6027caedbca1b429cf5454a844c7d1921d65eade Mon Sep 17 00:00:00 2001 From: Denis Arh Date: Tue, 10 Sep 2019 20:44:34 +0200 Subject: [PATCH] Add compose integ. tests for module, ns, page & chart --- compose/repository/main_test.go | 23 ---- compose/repository/module_test.go | 55 --------- compose/repository/repository_test.go | 39 ------ tests/compose/chart_test.go | 165 ++++++++++++++++++++++++++ tests/compose/main_test.go | 4 + tests/compose/module_test.go | 165 ++++++++++++++++++++++++++ tests/compose/namespace_test.go | 143 ++++++++++++++++++++++ tests/compose/page_test.go | 165 ++++++++++++++++++++++++++ 8 files changed, 642 insertions(+), 117 deletions(-) delete mode 100644 compose/repository/main_test.go delete mode 100644 compose/repository/module_test.go delete mode 100644 compose/repository/repository_test.go create mode 100644 tests/compose/chart_test.go create mode 100644 tests/compose/module_test.go create mode 100644 tests/compose/namespace_test.go create mode 100644 tests/compose/page_test.go diff --git a/compose/repository/main_test.go b/compose/repository/main_test.go deleted file mode 100644 index 454d88716..000000000 --- a/compose/repository/main_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// +build integration - -package repository - -import ( - "os" - "testing" - - "github.com/titpetric/factory" - dbLogger "github.com/titpetric/factory/logger" - - "github.com/cortezaproject/corteza-server/pkg/logger" -) - -func TestMain(m *testing.M) { - logger.SetDefault(logger.MakeDebugLogger()) - - factory.Database.Add("compose", os.Getenv("COMPOSE_DB_DSN")) - db := factory.Database.MustGet("compose") - db.SetLogger(dbLogger.Default{}) - - os.Exit(m.Run()) -} diff --git a/compose/repository/module_test.go b/compose/repository/module_test.go deleted file mode 100644 index 3f0244c72..000000000 --- a/compose/repository/module_test.go +++ /dev/null @@ -1,55 +0,0 @@ -// +build integration - -package repository - -import ( - "context" - "testing" - - "github.com/cortezaproject/corteza-server/compose/types" - "github.com/cortezaproject/corteza-server/internal/test" - - "github.com/titpetric/factory" -) - -func TestModule_updateFields(t *testing.T) { - tx(t, func(ctx context.Context, db *factory.DB, ns *types.Namespace) (err error) { - var ( - m *types.Module - repo = Module(ctx, db) - ) - - m, err = repo.Create(&types.Module{ - NamespaceID: ns.ID, - Name: "test-module", - }) - - test.NoError(t, err, "unexpected error on module creation") - test.Assert(t, len(m.Fields) == 0, "unexpected fields found in the fresh module") - - m, err = repo.Create(&types.Module{ - NamespaceID: ns.ID, - Name: "test-module", - Fields: types.ModuleFieldSet{ - &types.ModuleField{Name: "one"}, - &types.ModuleField{Name: "two"}, - }, - }) - - test.NoError(t, err, "unexpected error on module creation") - test.Assert(t, len(m.Fields) == 2, "expecting to find two fields in the new module") - - m.Fields[0].Name = "one-should-not-be-renamed" - m.Fields[1] = &types.ModuleField{Name: "three"} - m, err = repo.Update(m) - - test.NoError(t, err, "unexpected error on module update") - test.Assert(t, len(m.Fields) == 2, "expecting to find two fields in the new module") - test.Assert(t, m.Fields[0].Name == "one", "expecting to find field 'one', got %q", m.Fields[0].Name) - test.Assert(t, m.Fields[0].Place == 0, "expecting Place=0") - test.Assert(t, m.Fields[1].Name == "three", "expecting to find field 'three'") - test.Assert(t, m.Fields[1].Place == 1, "expecting Place=1") - - return - }) -} diff --git a/compose/repository/repository_test.go b/compose/repository/repository_test.go deleted file mode 100644 index 5553803b5..000000000 --- a/compose/repository/repository_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// +build integration - -package repository - -import ( - "context" - "testing" - - "github.com/titpetric/factory" - - "github.com/cortezaproject/corteza-server/compose/types" - "github.com/cortezaproject/corteza-server/internal/test" -) - -func TestRepository(t *testing.T) { - repo := &repository{} - repo.With(context.Background(), nil) -} - -func tx(t *testing.T, f func(context.Context, *factory.DB, *types.Namespace) error) { - var ( - err error - ctx = context.Background() - db = DB(ctx) - ns *types.Namespace - ) - - err = db.Begin() - test.Assert(t, err == nil, "Could not begin transaction: %+v", err) - - ns, err = Namespace(ctx, db).Create(&types.Namespace{}) - test.Assert(t, err == nil, "Test transaction setup (namespace creation) resulted in an error: %+v", err) - - err = f(ctx, db, ns) - test.Assert(t, err == nil, "Test transaction resulted in an error: %+v", err) - - err = db.Quiet().Rollback() - test.Assert(t, err == nil, "Could not rollback transaction: %+v", err) -} diff --git a/tests/compose/chart_test.go b/tests/compose/chart_test.go new file mode 100644 index 000000000..e7f034d43 --- /dev/null +++ b/tests/compose/chart_test.go @@ -0,0 +1,165 @@ +package compose + +import ( + "context" + "fmt" + "net/http" + "testing" + + jsonpath "github.com/steinfletcher/apitest-jsonpath" + + "github.com/cortezaproject/corteza-server/compose/repository" + "github.com/cortezaproject/corteza-server/compose/types" + "github.com/cortezaproject/corteza-server/tests/helpers" +) + +func (h helper) repoChart() repository.ChartRepository { + return repository.Chart(context.Background(), db()) +} + +func (h helper) repoMakeChart(ns *types.Namespace, name string) *types.Chart { + m, err := h. + repoChart(). + Create(&types.Chart{Name: name, NamespaceID: ns.ID}) + h.a.NoError(err) + + return m +} + +func TestChartRead(t *testing.T) { + h := newHelper(t) + + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + h.allow(types.ChartPermissionResource.AppendWildcard(), "read") + ns := h.repoMakeNamespace("some-namespace") + m := h.repoMakeChart(ns, "some-chart") + + h.apiInit(). + Get(fmt.Sprintf("/namespace/%d/chart/%d", ns.ID, m.ID)). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + Assert(jsonpath.Equal(`$.response.name`, m.Name)). + Assert(jsonpath.Equal(`$.response.chartID`, fmt.Sprintf("%d", m.ID))). + End() +} + +func TestChartList(t *testing.T) { + h := newHelper(t) + + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + ns := h.repoMakeNamespace("some-namespace") + + h.repoMakeChart(ns, "app") + h.repoMakeChart(ns, "app") + + h.apiInit(). + Get(fmt.Sprintf("/namespace/%d/chart/", ns.ID)). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + End() +} + +func TestChartCreateForbidden(t *testing.T) { + h := newHelper(t) + + ns := h.repoMakeNamespace("some-namespace") + + h.apiInit(). + Post(fmt.Sprintf("/namespace/%d/chart/", ns.ID)). + FormData("name", "some-chart"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertError("compose.service.NoCreatePermissions")). + End() +} + +func TestChartCreate(t *testing.T) { + h := newHelper(t) + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + h.allow(types.NamespacePermissionResource.AppendWildcard(), "chart.create") + + ns := h.repoMakeNamespace("some-namespace") + + h.apiInit(). + Post(fmt.Sprintf("/namespace/%d/chart/", ns.ID)). + FormData("name", "some-chart"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + End() +} + +func TestChartUpdateForbidden(t *testing.T) { + h := newHelper(t) + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + ns := h.repoMakeNamespace("some-namespace") + m := h.repoMakeChart(ns, "some-chart") + + h.apiInit(). + Debug(). + Post(fmt.Sprintf("/namespace/%d/chart/%d", ns.ID, m.ID)). + FormData("name", "changed-name"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertError("compose.service.NoUpdatePermissions")). + End() +} + +func TestChartUpdate(t *testing.T) { + h := newHelper(t) + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + ns := h.repoMakeNamespace("some-namespace") + m := h.repoMakeChart(ns, "some-chart") + h.allow(types.ChartPermissionResource.AppendWildcard(), "update") + + h.apiInit(). + Post(fmt.Sprintf("/namespace/%d/chart/%d", ns.ID, m.ID)). + FormData("name", "changed-name"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + End() + + m, err := h.repoChart().FindByID(ns.ID, m.ID) + h.a.NoError(err) + h.a.NotNil(m) + h.a.Equal(m.Name, "changed-name") +} + +func TestChartDeleteForbidden(t *testing.T) { + h := newHelper(t) + + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + h.allow(types.ChartPermissionResource.AppendWildcard(), "read") + ns := h.repoMakeNamespace("some-namespace") + m := h.repoMakeChart(ns, "some-chart") + + h.apiInit(). + Delete(fmt.Sprintf("/namespace/%d/chart/%d", ns.ID, m.ID)). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertError("compose.service.NoDeletePermissions")). + End() +} + +func TestChartDelete(t *testing.T) { + h := newHelper(t) + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + h.allow(types.ChartPermissionResource.AppendWildcard(), "read") + h.allow(types.ChartPermissionResource.AppendWildcard(), "delete") + + ns := h.repoMakeNamespace("some-namespace") + m := h.repoMakeChart(ns, "some-chart") + + h.apiInit(). + Delete(fmt.Sprintf("/namespace/%d/chart/%d", ns.ID, m.ID)). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + End() + + m, err := h.repoChart().FindByID(ns.ID, m.ID) + h.a.Error(err, "compose.repository.ChartNotFound") +} diff --git a/tests/compose/main_test.go b/tests/compose/main_test.go index 454a385cd..a2be81aee 100644 --- a/tests/compose/main_test.go +++ b/tests/compose/main_test.go @@ -46,6 +46,10 @@ var ( p = permissions.NewTestService() ) +func db() *factory.DB { + return factory.Database.MustGet("compose").With(context.Background()) +} + func InitConfig() { var err error diff --git a/tests/compose/module_test.go b/tests/compose/module_test.go new file mode 100644 index 000000000..a68387c01 --- /dev/null +++ b/tests/compose/module_test.go @@ -0,0 +1,165 @@ +package compose + +import ( + "context" + "fmt" + "net/http" + "testing" + + jsonpath "github.com/steinfletcher/apitest-jsonpath" + + "github.com/cortezaproject/corteza-server/compose/repository" + "github.com/cortezaproject/corteza-server/compose/types" + "github.com/cortezaproject/corteza-server/tests/helpers" +) + +func (h helper) repoModule() repository.ModuleRepository { + return repository.Module(context.Background(), db()) +} + +func (h helper) repoMakeModule(ns *types.Namespace, name string) *types.Module { + m, err := h. + repoModule(). + Create(&types.Module{Name: name, NamespaceID: ns.ID}) + h.a.NoError(err) + + return m +} + +func TestModuleRead(t *testing.T) { + h := newHelper(t) + + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + h.allow(types.ModulePermissionResource.AppendWildcard(), "read") + ns := h.repoMakeNamespace("some-namespace") + m := h.repoMakeModule(ns, "some-module") + + h.apiInit(). + Get(fmt.Sprintf("/namespace/%d/module/%d", ns.ID, m.ID)). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + Assert(jsonpath.Equal(`$.response.name`, m.Name)). + Assert(jsonpath.Equal(`$.response.moduleID`, fmt.Sprintf("%d", m.ID))). + End() +} + +func TestModuleList(t *testing.T) { + h := newHelper(t) + + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + ns := h.repoMakeNamespace("some-namespace") + + h.repoMakeModule(ns, "app") + h.repoMakeModule(ns, "app") + + h.apiInit(). + Get(fmt.Sprintf("/namespace/%d/module/", ns.ID)). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + End() +} + +func TestModuleCreateForbidden(t *testing.T) { + h := newHelper(t) + + ns := h.repoMakeNamespace("some-namespace") + + h.apiInit(). + Post(fmt.Sprintf("/namespace/%d/module/", ns.ID)). + FormData("name", "some-module"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertError("compose.service.NoCreatePermissions")). + End() +} + +func TestModuleCreate(t *testing.T) { + h := newHelper(t) + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + h.allow(types.NamespacePermissionResource.AppendWildcard(), "module.create") + + ns := h.repoMakeNamespace("some-namespace") + + h.apiInit(). + Post(fmt.Sprintf("/namespace/%d/module/", ns.ID)). + FormData("name", "some-module"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + End() +} + +func TestModuleUpdateForbidden(t *testing.T) { + h := newHelper(t) + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + ns := h.repoMakeNamespace("some-namespace") + m := h.repoMakeModule(ns, "some-module") + + h.apiInit(). + Debug(). + Post(fmt.Sprintf("/namespace/%d/module/%d", ns.ID, m.ID)). + FormData("name", "changed-name"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertError("compose.service.NoUpdatePermissions")). + End() +} + +func TestModuleUpdate(t *testing.T) { + h := newHelper(t) + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + ns := h.repoMakeNamespace("some-namespace") + m := h.repoMakeModule(ns, "some-module") + h.allow(types.ModulePermissionResource.AppendWildcard(), "update") + + h.apiInit(). + Post(fmt.Sprintf("/namespace/%d/module/%d", ns.ID, m.ID)). + FormData("name", "changed-name"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + End() + + m, err := h.repoModule().FindByID(ns.ID, m.ID) + h.a.NoError(err) + h.a.NotNil(m) + h.a.Equal("changed-name", m.Name) +} + +func TestModuleDeleteForbidden(t *testing.T) { + h := newHelper(t) + + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + h.allow(types.ModulePermissionResource.AppendWildcard(), "read") + ns := h.repoMakeNamespace("some-namespace") + m := h.repoMakeModule(ns, "some-module") + + h.apiInit(). + Delete(fmt.Sprintf("/namespace/%d/module/%d", ns.ID, m.ID)). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertError("compose.service.NoDeletePermissions")). + End() +} + +func TestModuleDelete(t *testing.T) { + h := newHelper(t) + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + h.allow(types.ModulePermissionResource.AppendWildcard(), "read") + h.allow(types.ModulePermissionResource.AppendWildcard(), "delete") + + ns := h.repoMakeNamespace("some-namespace") + m := h.repoMakeModule(ns, "some-module") + + h.apiInit(). + Delete(fmt.Sprintf("/namespace/%d/module/%d", ns.ID, m.ID)). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + End() + + m, err := h.repoModule().FindByID(ns.ID, m.ID) + h.a.Error(err, "compose.repository.ModuleNotFound") +} diff --git a/tests/compose/namespace_test.go b/tests/compose/namespace_test.go new file mode 100644 index 000000000..01379b60d --- /dev/null +++ b/tests/compose/namespace_test.go @@ -0,0 +1,143 @@ +package compose + +import ( + "context" + "fmt" + "net/http" + "testing" + + jsonpath "github.com/steinfletcher/apitest-jsonpath" + + "github.com/cortezaproject/corteza-server/compose/repository" + "github.com/cortezaproject/corteza-server/compose/types" + "github.com/cortezaproject/corteza-server/tests/helpers" +) + +func (h helper) repoNamespace() repository.NamespaceRepository { + return repository.Namespace(context.Background(), db()) +} + +func (h helper) repoMakeNamespace(name string) *types.Namespace { + ns, err := h. + repoNamespace(). + Create(&types.Namespace{Name: name}) + h.a.NoError(err) + + return ns +} + +func TestNamespaceRead(t *testing.T) { + h := newHelper(t) + + ns := h.repoMakeNamespace("some-namespace") + + h.apiInit(). + Get(fmt.Sprintf("/namespace/%d", ns.ID)). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + Assert(jsonpath.Equal(`$.response.name`, ns.Name)). + Assert(jsonpath.Equal(`$.response.namespaceID`, fmt.Sprintf("%d", ns.ID))). + End() +} + +func TestNamespaceList(t *testing.T) { + h := newHelper(t) + + h.repoMakeNamespace("app") + h.repoMakeNamespace("app") + + h.apiInit(). + Get("/namespace/"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + End() +} + +func TestNamespaceCreateForbidden(t *testing.T) { + h := newHelper(t) + + h.apiInit(). + Post("/namespace/"). + FormData("name", "some-namespace"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertError("compose.service.NoCreatePermissions")). + End() +} + +func TestNamespaceCreate(t *testing.T) { + h := newHelper(t) + h.allow(types.ComposePermissionResource, "namespace.create") + + h.apiInit(). + Post("/namespace/"). + FormData("name", "some-namespace"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + End() +} + +func TestNamespaceUpdateForbidden(t *testing.T) { + h := newHelper(t) + ns := h.repoMakeNamespace("some-namespace") + + h.apiInit(). + Debug(). + Post(fmt.Sprintf("/namespace/%d", ns.ID)). + FormData("name", "changed-name"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertError("compose.service.NoUpdatePermissions")). + End() +} + +func TestNamespaceUpdate(t *testing.T) { + h := newHelper(t) + ns := h.repoMakeNamespace("some-namespace") + h.allow(types.NamespacePermissionResource.AppendWildcard(), "update") + + h.apiInit(). + Post(fmt.Sprintf("/namespace/%d", ns.ID)). + FormData("name", "changed-name"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + End() + + ns, err := h.repoNamespace().FindByID(ns.ID) + h.a.NoError(err) + h.a.NotNil(ns) + h.a.Equal("changed-name", ns.Name) +} + +func TestNamespaceDeleteForbidden(t *testing.T) { + h := newHelper(t) + ns := h.repoMakeNamespace("some-namespace") + + h.apiInit(). + Delete(fmt.Sprintf("/namespace/%d", ns.ID)). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertError("compose.service.NoDeletePermissions")). + End() +} + +func TestNamespaceDelete(t *testing.T) { + h := newHelper(t) + h.allow(types.NamespacePermissionResource.AppendWildcard(), "delete") + + ns := h.repoMakeNamespace("some-namespace") + + h.apiInit(). + Delete(fmt.Sprintf("/namespace/%d", ns.ID)). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + End() + + ns, err := h.repoNamespace().FindByID(ns.ID) + h.a.Error(err, "compose.repository.NamespaceNotFound") +} diff --git a/tests/compose/page_test.go b/tests/compose/page_test.go new file mode 100644 index 000000000..5ebc22104 --- /dev/null +++ b/tests/compose/page_test.go @@ -0,0 +1,165 @@ +package compose + +import ( + "context" + "fmt" + "net/http" + "testing" + + jsonpath "github.com/steinfletcher/apitest-jsonpath" + + "github.com/cortezaproject/corteza-server/compose/repository" + "github.com/cortezaproject/corteza-server/compose/types" + "github.com/cortezaproject/corteza-server/tests/helpers" +) + +func (h helper) repoPage() repository.PageRepository { + return repository.Page(context.Background(), db()) +} + +func (h helper) repoMakePage(ns *types.Namespace, name string) *types.Page { + m, err := h. + repoPage(). + Create(&types.Page{Title: name, NamespaceID: ns.ID}) + h.a.NoError(err) + + return m +} + +func TestPageRead(t *testing.T) { + h := newHelper(t) + + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + h.allow(types.PagePermissionResource.AppendWildcard(), "read") + ns := h.repoMakeNamespace("some-namespace") + m := h.repoMakePage(ns, "some-page") + + h.apiInit(). + Get(fmt.Sprintf("/namespace/%d/page/%d", ns.ID, m.ID)). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + Assert(jsonpath.Equal(`$.response.title`, m.Title)). + Assert(jsonpath.Equal(`$.response.pageID`, fmt.Sprintf("%d", m.ID))). + End() +} + +func TestPageList(t *testing.T) { + h := newHelper(t) + + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + ns := h.repoMakeNamespace("some-namespace") + + h.repoMakePage(ns, "app") + h.repoMakePage(ns, "app") + + h.apiInit(). + Get(fmt.Sprintf("/namespace/%d/page/", ns.ID)). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + End() +} + +func TestPageCreateForbidden(t *testing.T) { + h := newHelper(t) + + ns := h.repoMakeNamespace("some-namespace") + + h.apiInit(). + Post(fmt.Sprintf("/namespace/%d/page/", ns.ID)). + FormData("title", "some-page"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertError("compose.service.NoCreatePermissions")). + End() +} + +func TestPageCreate(t *testing.T) { + h := newHelper(t) + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + h.allow(types.NamespacePermissionResource.AppendWildcard(), "page.create") + + ns := h.repoMakeNamespace("some-namespace") + + h.apiInit(). + Post(fmt.Sprintf("/namespace/%d/page/", ns.ID)). + FormData("title", "some-page"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + End() +} + +func TestPageUpdateForbidden(t *testing.T) { + h := newHelper(t) + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + ns := h.repoMakeNamespace("some-namespace") + m := h.repoMakePage(ns, "some-page") + + h.apiInit(). + Debug(). + Post(fmt.Sprintf("/namespace/%d/page/%d", ns.ID, m.ID)). + FormData("title", "changed-name"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertError("compose.service.NoUpdatePermissions")). + End() +} + +func TestPageUpdate(t *testing.T) { + h := newHelper(t) + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + ns := h.repoMakeNamespace("some-namespace") + m := h.repoMakePage(ns, "some-page") + h.allow(types.PagePermissionResource.AppendWildcard(), "update") + + h.apiInit(). + Post(fmt.Sprintf("/namespace/%d/page/%d", ns.ID, m.ID)). + FormData("title", "changed-name"). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + End() + + m, err := h.repoPage().FindByID(ns.ID, m.ID) + h.a.NoError(err) + h.a.NotNil(m) + h.a.Equal("changed-name", m.Title) +} + +func TestPageDeleteForbidden(t *testing.T) { + h := newHelper(t) + + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + h.allow(types.PagePermissionResource.AppendWildcard(), "read") + ns := h.repoMakeNamespace("some-namespace") + m := h.repoMakePage(ns, "some-page") + + h.apiInit(). + Delete(fmt.Sprintf("/namespace/%d/page/%d", ns.ID, m.ID)). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertError("compose.service.NoDeletePermissions")). + End() +} + +func TestPageDelete(t *testing.T) { + h := newHelper(t) + h.allow(types.NamespacePermissionResource.AppendWildcard(), "read") + h.allow(types.PagePermissionResource.AppendWildcard(), "read") + h.allow(types.PagePermissionResource.AppendWildcard(), "delete") + + ns := h.repoMakeNamespace("some-namespace") + m := h.repoMakePage(ns, "some-page") + + h.apiInit(). + Delete(fmt.Sprintf("/namespace/%d/page/%d", ns.ID, m.ID)). + Expect(t). + Status(http.StatusOK). + Assert(helpers.AssertNoErrors). + End() + + m, err := h.repoPage().FindByID(ns.ID, m.ID) + h.a.Error(err, "compose.repository.PageNotFound") +}