Files
upstream-corteza/server/tests/system/apigw_test.go
upstream-mirror 7e385fc126
Some checks failed
SonarQube / SonarQube (push) Failing after 5m28s
E2e test on main branch push / server and client test (map[name:admin port:8080]) (push) Failing after 3m33s
Server and lib tests / Library test (js) (push) Failing after 1m36s
Server and lib tests / Library test (vue) (push) Successful in 2m24s
Server and lib tests / Web client test (admin) (push) Successful in 2m52s
Server and lib tests / Web client test (compose) (push) Successful in 3m23s
Server and lib tests / Web client test (discovery) (push) Successful in 2m49s
Server and lib tests / Web client test (one) (push) Successful in 2m52s
Server and lib tests / Web client test (privacy) (push) Successful in 2m44s
Server and lib tests / Web client test (reporter) (push) Successful in 2m56s
Server and lib tests / Web client test (workflow) (push) Successful in 3m0s
Server and lib tests / Server tests (push) Failing after 4m55s
E2e test on main branch push / notify-failure (push) Failing after 9s
Server and lib tests / Send matrix testing notification (push) Successful in 2s
Mark stale issues and pull requests / stale (push) Successful in 40s
snapshot of https://github.com/cortezaproject/corteza.git (2024.9.x, 2026-09-18; blobs > 131072B omitted)
2026-09-18 01:22:23 +05:00

679 lines
19 KiB
Go

package system
import (
"context"
"fmt"
"net/http"
"strconv"
"testing"
"time"
"github.com/cortezaproject/corteza/server/pkg/id"
"github.com/cortezaproject/corteza/server/store"
"github.com/cortezaproject/corteza/server/system/service"
"github.com/cortezaproject/corteza/server/system/types"
"github.com/cortezaproject/corteza/server/tests/helpers"
jsonpath "github.com/steinfletcher/apitest-jsonpath"
)
func (h helper) createRouteWithFilter(s string, fkind string) (*types.ApigwRoute, *types.ApigwFilter) {
return h.createRouteAndFilterWithEnabled(s, fkind, true, true)
}
func (h helper) createRouteWithFilterEnabled(s string, fkind string, enable bool) (*types.ApigwRoute, *types.ApigwFilter) {
return h.createRouteAndFilterWithEnabled(s, fkind, true, enable)
}
func (h helper) createRouteAndFilterWithEnabled(s string, fkind string, rEnable, fEnable bool) (*types.ApigwRoute, *types.ApigwFilter) {
r := h.createRoute(&types.ApigwRoute{Endpoint: "/" + s, Method: "GET", Enabled: rEnable})
f := h.createFilters(&types.ApigwFilter{Kind: fkind, Enabled: fEnable}, r.ID)
return r, f
}
func (h helper) createRoute(route *types.ApigwRoute) *types.ApigwRoute {
if route.ID == 0 {
route.ID = id.Next()
}
if route.CreatedAt.IsZero() {
route.CreatedAt = time.Now()
}
h.a.NoError(service.DefaultStore.CreateApigwRoute(context.Background(), route))
return route
}
func (h helper) createFilters(f *types.ApigwFilter, routeID uint64) *types.ApigwFilter {
f.Route = routeID
if f.ID == 0 {
f.ID = id.Next()
}
if f.CreatedAt.IsZero() {
f.CreatedAt = time.Now()
}
h.a.NoError(service.DefaultStore.CreateApigwFilter(context.Background(), f))
return f
}
func (h helper) clearRoutes() {
h.noError(store.TruncateApigwFilters(context.Background(), service.DefaultStore))
h.noError(store.TruncateApigwRoutes(context.Background(), service.DefaultStore))
}
func TestApigwRouteRead(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, _ := h.createRouteWithFilter("test", "")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "read")
h.apiInit().
Get(fmt.Sprintf("/apigw/route/%d", r.ID)).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
Assert(jsonpath.Equal(`$.response.routeID`, strconv.FormatUint(r.ID, 10))).
Assert(jsonpath.Equal(`$.response.endpoint`, "/test")).
End()
}
func TestApigwRouteRead_forbidden(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, _ := h.createRouteWithFilter("test", "")
h.apiInit().
Get(fmt.Sprintf("/apigw/route/%d", r.ID)).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertError("apigw-route.errors.notAllowedToRead")).
End()
}
func TestApigwRouteSearch(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
h.createRouteWithFilter("test1", "")
h.createRouteWithFilter("test2", "")
helpers.AllowMe(h, types.ComponentRbacResource(), "apigw-routes.search")
helpers.AllowMe(h, types.ApigwRouteRbacResource(0), "read")
h.apiInit().
Get(fmt.Sprintf("/apigw/route/")).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
Assert(jsonpath.Len(`$.response.set`, 2)).
Assert(jsonpath.Equal(`$.response.set[0].endpoint`, "/test1")).
Assert(jsonpath.Equal(`$.response.set[1].endpoint`, "/test2")).
End()
}
func TestApigwRouteSearch_includeDisabled(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
h.createRouteWithFilter("test1", "")
h.createRouteWithFilter("test2", "")
h.createRouteAndFilterWithEnabled("test3", "", false, true)
h.createRouteAndFilterWithEnabled("test4", "", false, false)
helpers.AllowMe(h, types.ComponentRbacResource(), "apigw-routes.search")
helpers.AllowMe(h, types.ApigwRouteRbacResource(0), "read")
h.apiInit().
Get(fmt.Sprintf("/apigw/route/")).
Query("disabled", "1").
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
Assert(jsonpath.Len(`$.response.set`, 4)).
Assert(jsonpath.Equal(`$.response.set[0].endpoint`, "/test1")).
Assert(jsonpath.Equal(`$.response.set[1].endpoint`, "/test2")).
End()
}
func TestApigwRouteSearch_forbidden(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
h.createRouteWithFilter("test1", "")
h.createRouteWithFilter("test2", "")
h.apiInit().
Get(fmt.Sprintf("/apigw/route/")).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertError("apigw-route.errors.notAllowedToSearch")).
End()
}
func TestApigwRouteSearch_forbiddenSpecific(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, _ := h.createRouteWithFilter("test1", "")
h.createRouteWithFilter("test2", "")
helpers.AllowMe(h, types.ComponentRbacResource(), "apigw-routes.search")
helpers.AllowMe(h, types.ApigwRouteRbacResource(0), "read")
helpers.DenyMe(h, types.ApigwRouteRbacResource(r.ID), "read")
h.apiInit().
Get(fmt.Sprintf("/apigw/route/")).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
Assert(jsonpath.Len(`$.response.set`, 1)).
Assert(jsonpath.Equal(`$.response.set[0].endpoint`, "/test2")).
End()
}
func TestApigwRouteCreate(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
helpers.AllowMe(h, types.ComponentRbacResource(), "apigw-route.create")
h.apiInit().
Post(fmt.Sprintf("/apigw/route")).
Header("Accept", "application/json").
FormData("endpoint", "/test").
FormData("method", "GET").
FormData("enabled", "false").
FormData("group", "g1").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
Assert(jsonpath.Present(`$.response.routeID`)).
Assert(jsonpath.Equal(`$.response.endpoint`, "/test")).
Assert(jsonpath.Equal(`$.response.enabled`, false)).
End()
}
func TestApigwRouteCreate_forbidden(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
h.apiInit().
Post(fmt.Sprintf("/apigw/route")).
Header("Accept", "application/json").
FormData("endpoint", "/test").
FormData("method", "GET").
FormData("enabled", "false").
FormData("group", "g1").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertError("apigw-route.errors.notAllowedToCreate")).
End()
}
func TestApigwRouteUpdate(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, _ := h.createRouteWithFilter("test", "")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "update")
h.apiInit().
Put(fmt.Sprintf("/apigw/route/%d", r.ID)).
Header("Accept", "application/json").
FormData("endpoint", "/test-edited").
FormData("enabled", "false").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
Assert(jsonpath.Present(`$.response.routeID`)).
Assert(jsonpath.Equal(`$.response.endpoint`, "/test-edited")).
Assert(jsonpath.Equal(`$.response.enabled`, false)).
Assert(jsonpath.NotPresent(`$.response.deletedBy`)).
Assert(jsonpath.NotPresent(`$.response.deletedAt`)).
End()
}
func TestApigwRouteUpdateDeleted(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
now := time.Now()
r := &types.ApigwRoute{Endpoint: "/deleted", Enabled: true, DeletedAt: &now, DeletedBy: 1}
h.createRoute(r)
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "update")
h.apiInit().
Put(fmt.Sprintf("/apigw/route/%d", r.ID)).
Header("Accept", "application/json").
FormData("endpoint", "/deleted-and-updated").
FormData("enabled", "false").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
Assert(jsonpath.Present(`$.response.routeID`)).
Assert(jsonpath.Equal(`$.response.endpoint`, "/deleted-and-updated")).
Assert(jsonpath.Present(`$.response.deletedBy`)).
Assert(jsonpath.Present(`$.response.deletedAt`)).
End()
}
func TestApigwRouteUpdate_forbidden(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, _ := h.createRouteWithFilter("test", "")
h.apiInit().
Put(fmt.Sprintf("/apigw/route/%d", r.ID)).
Header("Accept", "application/json").
FormData("endpoint", "/test-edited").
FormData("enabled", "false").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertError("apigw-route.errors.notAllowedToUpdate")).
End()
}
func TestApigwRouteDelete(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, _ := h.createRouteWithFilter("test", "")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "delete")
h.apiInit().
Delete(fmt.Sprintf("/apigw/route/%d", r.ID)).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
End()
}
func TestApigwRouteDelete_forbidden(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, _ := h.createRouteWithFilter("test", "")
h.apiInit().
Delete(fmt.Sprintf("/apigw/route/%d", r.ID)).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertError("apigw-route.errors.notAllowedToDelete")).
End()
}
func TestApigwRouteUnDelete(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, _ := h.createRouteWithFilter("test", "")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "delete")
h.apiInit().
Post(fmt.Sprintf("/apigw/route/%d/undelete", r.ID)).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
End()
}
func TestApigwRouteUnDelete_forbidden(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, _ := h.createRouteWithFilter("test", "")
h.apiInit().
Post(fmt.Sprintf("/apigw/route/%d/undelete", r.ID)).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertError("apigw-route.errors.notAllowedToUndelete")).
End()
}
// Filters
func TestApigwFilterRead(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, f := h.createRouteWithFilter("test", "test")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "read")
h.apiInit().
Get(fmt.Sprintf("/apigw/filter/%d", f.ID)).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
Assert(jsonpath.Equal(`$.response.filterID`, strconv.FormatUint(f.ID, 10))).
Assert(jsonpath.Equal(`$.response.routeID`, strconv.FormatUint(r.ID, 10))).
End()
}
func TestApigwFilterRead_forbidden(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
_, f := h.createRouteWithFilter("test", "test")
h.apiInit().
Get(fmt.Sprintf("/apigw/filter/%d", f.ID)).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertError("apigw-route.errors.notAllowedToRead")).
End()
}
func TestApigwFilterSearch(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, f := h.createRouteWithFilter("test1", "")
helpers.AllowMe(h, types.ComponentRbacResource(), "apigw-routes.search")
helpers.AllowMe(h, types.ApigwRouteRbacResource(0), "read")
h.apiInit().
Get(fmt.Sprintf("/apigw/filter/")).
Query("routeID", strconv.FormatUint(r.ID, 10)).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
Assert(jsonpath.Len(`$.response.set`, 1)).
Assert(jsonpath.Equal(`$.response.set[0].filterID`, strconv.FormatUint(f.ID, 10))).
Assert(jsonpath.Equal(`$.response.set[0].routeID`, strconv.FormatUint(r.ID, 10))).
End()
}
func TestApigwFilterSearch_includeDisabled(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, f := h.createRouteWithFilterEnabled("test1", "", false)
helpers.AllowMe(h, types.ComponentRbacResource(), "apigw-routes.search")
helpers.AllowMe(h, types.ApigwRouteRbacResource(0), "read")
h.apiInit().
Get(fmt.Sprintf("/apigw/filter/")).
Query("routeID", strconv.FormatUint(r.ID, 10)).
Query("disabled", "1").
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
Assert(jsonpath.Len(`$.response.set`, 1)).
Assert(jsonpath.Equal(`$.response.set[0].filterID`, strconv.FormatUint(f.ID, 10))).
Assert(jsonpath.Equal(`$.response.set[0].routeID`, strconv.FormatUint(r.ID, 10))).
End()
}
func TestApigwFilterSearch_forbidden(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, _ := h.createRouteWithFilter("test1", "")
h.apiInit().
Get(fmt.Sprintf("/apigw/filter/")).
Query("routeID", strconv.FormatUint(r.ID, 10)).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertError("apigw-route.errors.notAllowedToRead")).
End()
}
func TestApigwFilterCreate(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, _ := h.createRouteWithFilter("test1", "")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "read")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "update")
h.apiInit().
Put(fmt.Sprintf("/apigw/filter")).
Header("Accept", "application/json").
FormData("routeID", strconv.FormatUint(r.ID, 10)).
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
Assert(jsonpath.Present(`$.response.filterID`)).
Assert(jsonpath.Equal(`$.response.routeID`, strconv.FormatUint(r.ID, 10))).
End()
}
func TestApigwFilterCreate_enabled(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, _ := h.createRouteWithFilter("test1", "")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "read")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "update")
h.apiInit().
Put(fmt.Sprintf("/apigw/filter")).
Header("Accept", "application/json").
FormData("routeID", strconv.FormatUint(r.ID, 10)).
FormData("enabled", strconv.FormatBool(true)).
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
Assert(jsonpath.Present(`$.response.filterID`)).
Assert(jsonpath.Equal(`$.response.routeID`, strconv.FormatUint(r.ID, 10))).
Assert(jsonpath.Equal(`$.response.enabled`, true)).
End()
}
func TestApigwFilterCreate_disabled(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, _ := h.createRouteWithFilter("test1", "")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "read")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "update")
h.apiInit().
Put(fmt.Sprintf("/apigw/filter")).
Header("Accept", "application/json").
FormData("routeID", strconv.FormatUint(r.ID, 10)).
FormData("enabled", strconv.FormatBool(false)).
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
Assert(jsonpath.Present(`$.response.filterID`)).
Assert(jsonpath.Equal(`$.response.routeID`, strconv.FormatUint(r.ID, 10))).
Assert(jsonpath.NotPresent(`$.response.enabled`)).
End()
}
func TestApigwFilterCreate_forbidden(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, _ := h.createRouteWithFilter("test1", "")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "read")
h.apiInit().
Put(fmt.Sprintf("/apigw/filter")).
Header("Accept", "application/json").
FormData("routeID", strconv.FormatUint(r.ID, 10)).
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertError("apigw-route.errors.notAllowedToUpdate")).
End()
}
func TestApigwFilterUpdate(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, f := h.createRouteWithFilter("test1", "")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "read")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "update")
h.apiInit().
Post(fmt.Sprintf("/apigw/filter/%d", f.ID)).
Header("Accept", "application/json").
FormData("routeID", strconv.FormatUint(r.ID, 10)).
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
Assert(jsonpath.Equal(`$.response.filterID`, strconv.FormatUint(f.ID, 10))).
Assert(jsonpath.Equal(`$.response.routeID`, strconv.FormatUint(r.ID, 10))).
End()
}
func TestApigwFilterUpdate_enabled(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, f := h.createRouteWithFilterEnabled("test1", "", false)
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "read")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "update")
h.apiInit().
Post(fmt.Sprintf("/apigw/filter/%d", f.ID)).
Header("Accept", "application/json").
FormData("routeID", strconv.FormatUint(r.ID, 10)).
FormData("enabled", strconv.FormatBool(true)).
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
Assert(jsonpath.Equal(`$.response.filterID`, strconv.FormatUint(f.ID, 10))).
Assert(jsonpath.Equal(`$.response.routeID`, strconv.FormatUint(r.ID, 10))).
Assert(jsonpath.Equal(`$.response.enabled`, true)).
End()
}
func TestApigwFilterUpdate_disabled(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, f := h.createRouteWithFilterEnabled("test1", "", true)
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "read")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "update")
h.apiInit().
Post(fmt.Sprintf("/apigw/filter/%d", f.ID)).
Header("Accept", "application/json").
FormData("routeID", strconv.FormatUint(r.ID, 10)).
FormData("enabled", strconv.FormatBool(false)).
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
Assert(jsonpath.Equal(`$.response.filterID`, strconv.FormatUint(f.ID, 10))).
Assert(jsonpath.Equal(`$.response.routeID`, strconv.FormatUint(r.ID, 10))).
Assert(jsonpath.NotPresent(`$.response.enabled`)).
End()
}
func TestApigwFilterUpdate_forbidden(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, f := h.createRouteWithFilter("test1", "")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "read")
h.apiInit().
Post(fmt.Sprintf("/apigw/filter/%d", f.ID)).
Header("Accept", "application/json").
FormData("routeID", strconv.FormatUint(r.ID, 10)).
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertError("apigw-route.errors.notAllowedToUpdate")).
End()
}
func TestApigwFilterDelete(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, f := h.createRouteWithFilter("test1", "")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "read")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "delete")
h.apiInit().
Delete(fmt.Sprintf("/apigw/filter/%d", f.ID)).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
End()
}
func TestApigwFilterDelete_forbidden(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
_, f := h.createRouteWithFilter("test1", "")
h.apiInit().
Delete(fmt.Sprintf("/apigw/filter/%d", f.ID)).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertError("apigw-route.errors.notAllowedToDelete")).
End()
}
func TestApigwFilterUnDelete(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, f := h.createRouteWithFilter("test1", "")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "read")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "delete")
h.apiInit().
Post(fmt.Sprintf("/apigw/filter/%d/undelete", f.ID)).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertNoErrors).
End()
}
func TestApigwFilterUnDelete_forbidden(t *testing.T) {
h := newHelper(t)
h.clearRoutes()
r, f := h.createRouteWithFilter("test1", "")
helpers.AllowMe(h, types.ApigwRouteRbacResource(r.ID), "read")
h.apiInit().
Post(fmt.Sprintf("/apigw/filter/%d/undelete", f.ID)).
Header("Accept", "application/json").
Expect(t).
Status(http.StatusOK).
Assert(helpers.AssertError("apigw-route.errors.notAllowedToUndelete")).
End()
}