added after hooks error response tests
This commit is contained in:
parent
610a948dcc
commit
939653ecc0
|
@ -1,6 +1,7 @@
|
||||||
package apis_test
|
package apis_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -8,6 +9,7 @@ import (
|
||||||
|
|
||||||
"github.com/labstack/echo/v5"
|
"github.com/labstack/echo/v5"
|
||||||
"github.com/pocketbase/dbx"
|
"github.com/pocketbase/dbx"
|
||||||
|
"github.com/pocketbase/pocketbase/core"
|
||||||
"github.com/pocketbase/pocketbase/daos"
|
"github.com/pocketbase/pocketbase/daos"
|
||||||
"github.com/pocketbase/pocketbase/models"
|
"github.com/pocketbase/pocketbase/models"
|
||||||
"github.com/pocketbase/pocketbase/tests"
|
"github.com/pocketbase/pocketbase/tests"
|
||||||
|
@ -89,6 +91,26 @@ func TestAdminAuthWithPassword(t *testing.T) {
|
||||||
"OnAdminAuthRequest": 1,
|
"OnAdminAuthRequest": 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnAdminAfterAuthWithPasswordRequest error response",
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Url: "/api/admins/auth-with-password",
|
||||||
|
Body: strings.NewReader(`{"identity":"test@example.com","password":"1234567890"}`),
|
||||||
|
RequestHeaders: map[string]string{
|
||||||
|
"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InN5d2JoZWNuaDQ2cmhtMCIsInR5cGUiOiJhZG1pbiIsImV4cCI6MjIwODk4MTYwMH0.han3_sG65zLddpcX2ic78qgy7FKecuPfOpFa8Dvi5Bg",
|
||||||
|
},
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnAdminAfterAuthWithPasswordRequest().Add(func(e *core.AdminAuthWithPasswordEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnAdminBeforeAuthWithPasswordRequest": 1,
|
||||||
|
"OnAdminAfterAuthWithPasswordRequest": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
|
@ -224,6 +246,29 @@ func TestAdminConfirmPasswordReset(t *testing.T) {
|
||||||
"OnAdminAfterConfirmPasswordResetRequest": 1,
|
"OnAdminAfterConfirmPasswordResetRequest": 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnAdminAfterConfirmPasswordResetRequest error response",
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Url: "/api/admins/confirm-password-reset",
|
||||||
|
Body: strings.NewReader(`{
|
||||||
|
"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InN5d2JoZWNuaDQ2cmhtMCIsInR5cGUiOiJhZG1pbiIsImVtYWlsIjoidGVzdEBleGFtcGxlLmNvbSIsImV4cCI6MjIwODk4MTYwMH0.kwFEler6KSMKJNstuaSDvE1QnNdCta5qSnjaIQ0hhhc",
|
||||||
|
"password":"1234567891",
|
||||||
|
"passwordConfirm":"1234567891"
|
||||||
|
}`),
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnAdminAfterConfirmPasswordResetRequest().Add(func(e *core.AdminConfirmPasswordResetEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnModelBeforeUpdate": 1,
|
||||||
|
"OnModelAfterUpdate": 1,
|
||||||
|
"OnAdminBeforeConfirmPasswordResetRequest": 1,
|
||||||
|
"OnAdminAfterConfirmPasswordResetRequest": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
|
@ -278,6 +323,25 @@ func TestAdminRefresh(t *testing.T) {
|
||||||
"OnAdminAfterAuthRefreshRequest": 1,
|
"OnAdminAfterAuthRefreshRequest": 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnAdminAfterAuthRefreshRequest error response",
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Url: "/api/admins/auth-refresh",
|
||||||
|
RequestHeaders: map[string]string{
|
||||||
|
"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InN5d2JoZWNuaDQ2cmhtMCIsInR5cGUiOiJhZG1pbiIsImV4cCI6MjIwODk4NTI2MX0.M1m--VOqGyv0d23eeUc0r9xE8ZzHaYVmVFw1VZW6gT8",
|
||||||
|
},
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnAdminAfterAuthRefreshRequest().Add(func(e *core.AdminAuthRefreshEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnAdminBeforeAuthRefreshRequest": 1,
|
||||||
|
"OnAdminAfterAuthRefreshRequest": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
|
@ -510,6 +574,27 @@ func TestAdminDelete(t *testing.T) {
|
||||||
"OnAdminBeforeDeleteRequest": 1,
|
"OnAdminBeforeDeleteRequest": 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnAdminAfterDeleteRequest error response",
|
||||||
|
Method: http.MethodDelete,
|
||||||
|
Url: "/api/admins/sbmbsdb40jyxf7h",
|
||||||
|
RequestHeaders: map[string]string{
|
||||||
|
"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InN5d2JoZWNuaDQ2cmhtMCIsInR5cGUiOiJhZG1pbiIsImV4cCI6MjIwODk4NTI2MX0.M1m--VOqGyv0d23eeUc0r9xE8ZzHaYVmVFw1VZW6gT8",
|
||||||
|
},
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnAdminAfterDeleteRequest().Add(func(e *core.AdminDeleteEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnModelBeforeDelete": 1,
|
||||||
|
"OnModelAfterDelete": 1,
|
||||||
|
"OnAdminBeforeDeleteRequest": 1,
|
||||||
|
"OnAdminAfterDeleteRequest": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
|
@ -637,6 +722,33 @@ func TestAdminCreate(t *testing.T) {
|
||||||
"OnAdminAfterCreateRequest": 1,
|
"OnAdminAfterCreateRequest": 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnAdminAfterCreateRequest error response",
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Url: "/api/admins",
|
||||||
|
Body: strings.NewReader(`{
|
||||||
|
"email":"testnew@example.com",
|
||||||
|
"password":"1234567890",
|
||||||
|
"passwordConfirm":"1234567890",
|
||||||
|
"avatar":3
|
||||||
|
}`),
|
||||||
|
RequestHeaders: map[string]string{
|
||||||
|
"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InN5d2JoZWNuaDQ2cmhtMCIsInR5cGUiOiJhZG1pbiIsImV4cCI6MjIwODk4NTI2MX0.M1m--VOqGyv0d23eeUc0r9xE8ZzHaYVmVFw1VZW6gT8",
|
||||||
|
},
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnAdminAfterCreateRequest().Add(func(e *core.AdminCreateEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnModelBeforeCreate": 1,
|
||||||
|
"OnModelAfterCreate": 1,
|
||||||
|
"OnAdminBeforeCreateRequest": 1,
|
||||||
|
"OnAdminAfterCreateRequest": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
|
@ -729,6 +841,7 @@ func TestAdminUpdate(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
Name: "authorized as admin + valid data",
|
||||||
Method: http.MethodPatch,
|
Method: http.MethodPatch,
|
||||||
Url: "/api/admins/sbmbsdb40jyxf7h",
|
Url: "/api/admins/sbmbsdb40jyxf7h",
|
||||||
Body: strings.NewReader(`{
|
Body: strings.NewReader(`{
|
||||||
|
@ -759,6 +872,33 @@ func TestAdminUpdate(t *testing.T) {
|
||||||
"OnAdminAfterUpdateRequest": 1,
|
"OnAdminAfterUpdateRequest": 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnAdminAfterUpdateRequest error response",
|
||||||
|
Method: http.MethodPatch,
|
||||||
|
Url: "/api/admins/sbmbsdb40jyxf7h",
|
||||||
|
Body: strings.NewReader(`{
|
||||||
|
"email":"testnew@example.com",
|
||||||
|
"password":"1234567891",
|
||||||
|
"passwordConfirm":"1234567891",
|
||||||
|
"avatar":5
|
||||||
|
}`),
|
||||||
|
RequestHeaders: map[string]string{
|
||||||
|
"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InN5d2JoZWNuaDQ2cmhtMCIsInR5cGUiOiJhZG1pbiIsImV4cCI6MjIwODk4NTI2MX0.M1m--VOqGyv0d23eeUc0r9xE8ZzHaYVmVFw1VZW6gT8",
|
||||||
|
},
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnAdminAfterUpdateRequest().Add(func(e *core.AdminUpdateEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnModelBeforeUpdate": 1,
|
||||||
|
"OnModelAfterUpdate": 1,
|
||||||
|
"OnAdminBeforeUpdateRequest": 1,
|
||||||
|
"OnAdminAfterUpdateRequest": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package apis_test
|
package apis_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
@ -9,6 +10,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/labstack/echo/v5"
|
"github.com/labstack/echo/v5"
|
||||||
|
"github.com/pocketbase/pocketbase/core"
|
||||||
"github.com/pocketbase/pocketbase/models"
|
"github.com/pocketbase/pocketbase/models"
|
||||||
"github.com/pocketbase/pocketbase/models/schema"
|
"github.com/pocketbase/pocketbase/models/schema"
|
||||||
"github.com/pocketbase/pocketbase/tests"
|
"github.com/pocketbase/pocketbase/tests"
|
||||||
|
@ -299,7 +301,6 @@ func TestCollectionDelete(t *testing.T) {
|
||||||
RequestHeaders: map[string]string{
|
RequestHeaders: map[string]string{
|
||||||
"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InN5d2JoZWNuaDQ2cmhtMCIsInR5cGUiOiJhZG1pbiIsImV4cCI6MjIwODk4NTI2MX0.M1m--VOqGyv0d23eeUc0r9xE8ZzHaYVmVFw1VZW6gT8",
|
"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InN5d2JoZWNuaDQ2cmhtMCIsInR5cGUiOiJhZG1pbiIsImV4cCI6MjIwODk4NTI2MX0.M1m--VOqGyv0d23eeUc0r9xE8ZzHaYVmVFw1VZW6gT8",
|
||||||
},
|
},
|
||||||
Delay: 100 * time.Millisecond,
|
|
||||||
ExpectedStatus: 204,
|
ExpectedStatus: 204,
|
||||||
ExpectedEvents: map[string]int{
|
ExpectedEvents: map[string]int{
|
||||||
"OnModelBeforeDelete": 1,
|
"OnModelBeforeDelete": 1,
|
||||||
|
@ -308,6 +309,27 @@ func TestCollectionDelete(t *testing.T) {
|
||||||
"OnCollectionAfterDeleteRequest": 1,
|
"OnCollectionAfterDeleteRequest": 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnCollectionAfterDeleteRequest error response",
|
||||||
|
Method: http.MethodDelete,
|
||||||
|
Url: "/api/collections/view2",
|
||||||
|
RequestHeaders: map[string]string{
|
||||||
|
"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InN5d2JoZWNuaDQ2cmhtMCIsInR5cGUiOiJhZG1pbiIsImV4cCI6MjIwODk4NTI2MX0.M1m--VOqGyv0d23eeUc0r9xE8ZzHaYVmVFw1VZW6gT8",
|
||||||
|
},
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnCollectionAfterDeleteRequest().Add(func(e *core.CollectionDeleteEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnModelBeforeDelete": 1,
|
||||||
|
"OnModelAfterDelete": 1,
|
||||||
|
"OnCollectionBeforeDeleteRequest": 1,
|
||||||
|
"OnCollectionAfterDeleteRequest": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
|
@ -536,6 +558,28 @@ func TestCollectionCreate(t *testing.T) {
|
||||||
`"options":{"minPasswordLength":{"code":"validation_required"`,
|
`"options":{"minPasswordLength":{"code":"validation_required"`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnCollectionAfterCreateRequest error response",
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Url: "/api/collections",
|
||||||
|
Body: strings.NewReader(`{"name":"new","type":"base","schema":[{"type":"text","id":"12345789","name":"test"}]}`),
|
||||||
|
RequestHeaders: map[string]string{
|
||||||
|
"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InN5d2JoZWNuaDQ2cmhtMCIsInR5cGUiOiJhZG1pbiIsImV4cCI6MjIwODk4NTI2MX0.M1m--VOqGyv0d23eeUc0r9xE8ZzHaYVmVFw1VZW6gT8",
|
||||||
|
},
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnCollectionAfterCreateRequest().Add(func(e *core.CollectionCreateEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnModelBeforeCreate": 1,
|
||||||
|
"OnModelAfterCreate": 1,
|
||||||
|
"OnCollectionBeforeCreateRequest": 1,
|
||||||
|
"OnCollectionAfterCreateRequest": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
// view
|
// view
|
||||||
// -----------------------------------------------------------
|
// -----------------------------------------------------------
|
||||||
|
@ -720,6 +764,28 @@ func TestCollectionUpdate(t *testing.T) {
|
||||||
"OnModelBeforeUpdate": 1,
|
"OnModelBeforeUpdate": 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnCollectionAfterUpdateRequest error response",
|
||||||
|
Method: http.MethodPatch,
|
||||||
|
Url: "/api/collections/demo1",
|
||||||
|
Body: strings.NewReader(`{}`),
|
||||||
|
RequestHeaders: map[string]string{
|
||||||
|
"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InN5d2JoZWNuaDQ2cmhtMCIsInR5cGUiOiJhZG1pbiIsImV4cCI6MjIwODk4NTI2MX0.M1m--VOqGyv0d23eeUc0r9xE8ZzHaYVmVFw1VZW6gT8",
|
||||||
|
},
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnCollectionAfterUpdateRequest().Add(func(e *core.CollectionUpdateEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnCollectionAfterUpdateRequest": 1,
|
||||||
|
"OnCollectionBeforeUpdateRequest": 1,
|
||||||
|
"OnModelAfterUpdate": 1,
|
||||||
|
"OnModelBeforeUpdate": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "authorized as admin + invalid data (eg. existing name)",
|
Name: "authorized as admin + invalid data (eg. existing name)",
|
||||||
Method: http.MethodPatch,
|
Method: http.MethodPatch,
|
||||||
|
@ -1373,6 +1439,58 @@ func TestCollectionsImport(t *testing.T) {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "authorized as admin + successful collections save",
|
||||||
|
Method: http.MethodPut,
|
||||||
|
Url: "/api/collections/import",
|
||||||
|
Body: strings.NewReader(`{
|
||||||
|
"collections":[
|
||||||
|
{
|
||||||
|
"name": "import1",
|
||||||
|
"schema": [
|
||||||
|
{
|
||||||
|
"id": "koih1lqx",
|
||||||
|
"name": "test",
|
||||||
|
"type": "text"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "import2",
|
||||||
|
"schema": [
|
||||||
|
{
|
||||||
|
"id": "koih1lqx",
|
||||||
|
"name": "test",
|
||||||
|
"type": "text"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"indexes": [
|
||||||
|
"create index idx_test on import2 (test)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "auth_without_schema",
|
||||||
|
"type": "auth"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}`),
|
||||||
|
RequestHeaders: map[string]string{
|
||||||
|
"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InN5d2JoZWNuaDQ2cmhtMCIsInR5cGUiOiJhZG1pbiIsImV4cCI6MjIwODk4NTI2MX0.M1m--VOqGyv0d23eeUc0r9xE8ZzHaYVmVFw1VZW6gT8",
|
||||||
|
},
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnCollectionsAfterImportRequest().Add(func(e *core.CollectionsImportEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnCollectionsBeforeImportRequest": 1,
|
||||||
|
"OnCollectionsAfterImportRequest": 1,
|
||||||
|
"OnModelBeforeCreate": 3,
|
||||||
|
"OnModelAfterCreate": 3,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
|
|
|
@ -2,12 +2,14 @@ package apis_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/labstack/echo/v5"
|
"github.com/labstack/echo/v5"
|
||||||
|
"github.com/pocketbase/pocketbase/core"
|
||||||
"github.com/pocketbase/pocketbase/daos"
|
"github.com/pocketbase/pocketbase/daos"
|
||||||
"github.com/pocketbase/pocketbase/tests"
|
"github.com/pocketbase/pocketbase/tests"
|
||||||
"github.com/pocketbase/pocketbase/tools/subscriptions"
|
"github.com/pocketbase/pocketbase/tools/subscriptions"
|
||||||
|
@ -280,6 +282,28 @@ func TestRecordAuthWithPassword(t *testing.T) {
|
||||||
"OnRecordAuthRequest": 1,
|
"OnRecordAuthRequest": 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// after hooks error checks
|
||||||
|
{
|
||||||
|
Name: "OnRecordAfterAuthWithPasswordRequest error response",
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Url: "/api/collections/users/auth-with-password",
|
||||||
|
Body: strings.NewReader(`{
|
||||||
|
"identity":"test2_username",
|
||||||
|
"password":"1234567890"
|
||||||
|
}`),
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnRecordAfterAuthWithPasswordRequest().Add(func(e *core.RecordAuthWithPasswordEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnRecordBeforeAuthWithPasswordRequest": 1,
|
||||||
|
"OnRecordAfterAuthWithPasswordRequest": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
|
@ -353,6 +377,25 @@ func TestRecordAuthRefresh(t *testing.T) {
|
||||||
"OnRecordAfterAuthRefreshRequest": 1,
|
"OnRecordAfterAuthRefreshRequest": 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnRecordAfterAuthRefreshRequest error response",
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Url: "/api/collections/users/auth-refresh?expand=rel,missing",
|
||||||
|
RequestHeaders: map[string]string{
|
||||||
|
"Authorization": "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjRxMXhsY2xtZmxva3UzMyIsInR5cGUiOiJhdXRoUmVjb3JkIiwiY29sbGVjdGlvbklkIjoiX3BiX3VzZXJzX2F1dGhfIiwiZXhwIjoyMjA4OTg1MjYxfQ.UwD8JvkbQtXpymT09d7J6fdA0aP9g4FJ1GPh_ggEkzc",
|
||||||
|
},
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnRecordAfterAuthRefreshRequest().Add(func(e *core.RecordAuthRefreshEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnRecordBeforeAuthRefreshRequest": 1,
|
||||||
|
"OnRecordAfterAuthRefreshRequest": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
|
@ -495,9 +538,7 @@ func TestRecordAuthConfirmPasswordReset(t *testing.T) {
|
||||||
"passwordConfirm":"12345678"
|
"passwordConfirm":"12345678"
|
||||||
}`),
|
}`),
|
||||||
ExpectedStatus: 400,
|
ExpectedStatus: 400,
|
||||||
ExpectedContent: []string{
|
ExpectedContent: []string{`"data":{}`},
|
||||||
`"data":{}`,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "different auth collection",
|
Name: "different auth collection",
|
||||||
|
@ -530,6 +571,29 @@ func TestRecordAuthConfirmPasswordReset(t *testing.T) {
|
||||||
"OnRecordAfterConfirmPasswordResetRequest": 1,
|
"OnRecordAfterConfirmPasswordResetRequest": 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnRecordAfterConfirmPasswordResetRequest error response",
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Url: "/api/collections/users/confirm-password-reset",
|
||||||
|
Body: strings.NewReader(`{
|
||||||
|
"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjRxMXhsY2xtZmxva3UzMyIsImVtYWlsIjoidGVzdEBleGFtcGxlLmNvbSIsImNvbGxlY3Rpb25JZCI6Il9wYl91c2Vyc19hdXRoXyIsInR5cGUiOiJhdXRoUmVjb3JkIiwiZXhwIjoyMjA4OTg1MjYxfQ.R_4FOSUHIuJQ5Crl3PpIPCXMsoHzuTaNlccpXg_3FOg",
|
||||||
|
"password":"12345678",
|
||||||
|
"passwordConfirm":"12345678"
|
||||||
|
}`),
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnRecordAfterConfirmPasswordResetRequest().Add(func(e *core.RecordConfirmPasswordResetEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnModelAfterUpdate": 1,
|
||||||
|
"OnModelBeforeUpdate": 1,
|
||||||
|
"OnRecordBeforeConfirmPasswordResetRequest": 1,
|
||||||
|
"OnRecordAfterConfirmPasswordResetRequest": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
|
@ -672,9 +736,7 @@ func TestRecordAuthConfirmVerification(t *testing.T) {
|
||||||
"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjRxMXhsY2xtZmxva3UzMyIsImVtYWlsIjoidGVzdEBleGFtcGxlLmNvbSIsImNvbGxlY3Rpb25JZCI6Il9wYl91c2Vyc19hdXRoXyIsInR5cGUiOiJhdXRoUmVjb3JkIiwiZXhwIjoyMjA4OTg1MjYxfQ.R_4FOSUHIuJQ5Crl3PpIPCXMsoHzuTaNlccpXg_3FOg"
|
"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjRxMXhsY2xtZmxva3UzMyIsImVtYWlsIjoidGVzdEBleGFtcGxlLmNvbSIsImNvbGxlY3Rpb25JZCI6Il9wYl91c2Vyc19hdXRoXyIsInR5cGUiOiJhdXRoUmVjb3JkIiwiZXhwIjoyMjA4OTg1MjYxfQ.R_4FOSUHIuJQ5Crl3PpIPCXMsoHzuTaNlccpXg_3FOg"
|
||||||
}`),
|
}`),
|
||||||
ExpectedStatus: 400,
|
ExpectedStatus: 400,
|
||||||
ExpectedContent: []string{
|
ExpectedContent: []string{`"data":{}`},
|
||||||
`"data":{}`,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "different auth collection",
|
Name: "different auth collection",
|
||||||
|
@ -732,6 +794,27 @@ func TestRecordAuthConfirmVerification(t *testing.T) {
|
||||||
"OnRecordAfterConfirmVerificationRequest": 1,
|
"OnRecordAfterConfirmVerificationRequest": 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnRecordAfterConfirmVerificationRequest error response",
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Url: "/api/collections/users/confirm-verification",
|
||||||
|
Body: strings.NewReader(`{
|
||||||
|
"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjRxMXhsY2xtZmxva3UzMyIsImVtYWlsIjoidGVzdEBleGFtcGxlLmNvbSIsImNvbGxlY3Rpb25JZCI6Il9wYl91c2Vyc19hdXRoXyIsInR5cGUiOiJhdXRoUmVjb3JkIiwiZXhwIjoyMjA4OTg1MjYxfQ.hL16TVmStHFdHLc4a860bRqJ3sFfzjv0_NRNzwsvsrc"
|
||||||
|
}`),
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnRecordAfterConfirmVerificationRequest().Add(func(e *core.RecordConfirmVerificationEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnModelAfterUpdate": 1,
|
||||||
|
"OnModelBeforeUpdate": 1,
|
||||||
|
"OnRecordBeforeConfirmVerificationRequest": 1,
|
||||||
|
"OnRecordAfterConfirmVerificationRequest": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
|
@ -932,6 +1015,28 @@ func TestRecordAuthConfirmEmailChange(t *testing.T) {
|
||||||
`"token":{"code":"validation_token_collection_mismatch"`,
|
`"token":{"code":"validation_token_collection_mismatch"`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnRecordAfterConfirmEmailChangeRequest error response",
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Url: "/api/collections/users/confirm-email-change",
|
||||||
|
Body: strings.NewReader(`{
|
||||||
|
"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjRxMXhsY2xtZmxva3UzMyIsImNvbGxlY3Rpb25JZCI6Il9wYl91c2Vyc19hdXRoXyIsInR5cGUiOiJhdXRoUmVjb3JkIiwiZW1haWwiOiJ0ZXN0QGV4YW1wbGUuY29tIiwibmV3RW1haWwiOiJjaGFuZ2VAZXhhbXBsZS5jb20iLCJleHAiOjIyMDg5ODUyNjF9.1sG6cL708pRXXjiHRZhG-in0X5fnttSf5nNcadKoYRs",
|
||||||
|
"password":"1234567890"
|
||||||
|
}`),
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnRecordAfterConfirmEmailChangeRequest().Add(func(e *core.RecordConfirmEmailChangeEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnModelAfterUpdate": 1,
|
||||||
|
"OnModelBeforeUpdate": 1,
|
||||||
|
"OnRecordBeforeConfirmEmailChangeRequest": 1,
|
||||||
|
"OnRecordAfterConfirmEmailChangeRequest": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
|
@ -1140,6 +1245,27 @@ func TestRecordAuthUnlinkExternalsAuth(t *testing.T) {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnRecordBeforeUnlinkExternalAuthRequest error response",
|
||||||
|
Method: http.MethodDelete,
|
||||||
|
Url: "/api/collections/users/records/4q1xlclmfloku33/external-auths/google",
|
||||||
|
RequestHeaders: map[string]string{
|
||||||
|
"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InN5d2JoZWNuaDQ2cmhtMCIsInR5cGUiOiJhZG1pbiIsImV4cCI6MjIwODk4NTI2MX0.M1m--VOqGyv0d23eeUc0r9xE8ZzHaYVmVFw1VZW6gT8",
|
||||||
|
},
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnRecordAfterUnlinkExternalAuthRequest().Add(func(e *core.RecordUnlinkExternalAuthEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnModelAfterDelete": 1,
|
||||||
|
"OnModelBeforeDelete": 1,
|
||||||
|
"OnRecordAfterUnlinkExternalAuthRequest": 1,
|
||||||
|
"OnRecordBeforeUnlinkExternalAuthRequest": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package apis_test
|
package apis_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
@ -10,6 +11,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/labstack/echo/v5"
|
"github.com/labstack/echo/v5"
|
||||||
|
"github.com/pocketbase/pocketbase/core"
|
||||||
"github.com/pocketbase/pocketbase/models"
|
"github.com/pocketbase/pocketbase/models"
|
||||||
"github.com/pocketbase/pocketbase/tests"
|
"github.com/pocketbase/pocketbase/tests"
|
||||||
)
|
)
|
||||||
|
@ -836,6 +838,27 @@ func TestRecordCrudDelete(t *testing.T) {
|
||||||
"OnRecordBeforeDeleteRequest": 1,
|
"OnRecordBeforeDeleteRequest": 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnRecordAfterDeleteRequest error response",
|
||||||
|
Method: http.MethodDelete,
|
||||||
|
Url: "/api/collections/clients/records/o1y0dd0spd786md",
|
||||||
|
RequestHeaders: map[string]string{
|
||||||
|
"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InN5d2JoZWNuaDQ2cmhtMCIsInR5cGUiOiJhZG1pbiIsImV4cCI6MjIwODk4NTI2MX0.M1m--VOqGyv0d23eeUc0r9xE8ZzHaYVmVFw1VZW6gT8",
|
||||||
|
},
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnRecordAfterDeleteRequest().Add(func(e *core.RecordDeleteEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnModelAfterDelete": 1,
|
||||||
|
"OnModelBeforeDelete": 1,
|
||||||
|
"OnRecordAfterDeleteRequest": 1,
|
||||||
|
"OnRecordBeforeDeleteRequest": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "authenticated record that match the collection delete rule",
|
Name: "authenticated record that match the collection delete rule",
|
||||||
Method: http.MethodDelete,
|
Method: http.MethodDelete,
|
||||||
|
@ -1187,6 +1210,25 @@ func TestRecordCrudCreate(t *testing.T) {
|
||||||
`"code":"validation_not_unique"`,
|
`"code":"validation_not_unique"`,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnRecordAfterCreateRequest error response",
|
||||||
|
Method: http.MethodPost,
|
||||||
|
Url: "/api/collections/demo2/records",
|
||||||
|
Body: strings.NewReader(`{"title":"new"}`),
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnRecordAfterCreateRequest().Add(func(e *core.RecordCreateEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnRecordBeforeCreateRequest": 1,
|
||||||
|
"OnRecordAfterCreateRequest": 1,
|
||||||
|
"OnModelBeforeCreate": 1,
|
||||||
|
"OnModelAfterCreate": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
// ID checks
|
// ID checks
|
||||||
// -----------------------------------------------------------
|
// -----------------------------------------------------------
|
||||||
|
@ -1745,6 +1787,25 @@ func TestRecordCrudUpdate(t *testing.T) {
|
||||||
"OnModelAfterUpdate": 1,
|
"OnModelAfterUpdate": 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnRecordAfterUpdateRequest error response",
|
||||||
|
Method: http.MethodPatch,
|
||||||
|
Url: "/api/collections/demo2/records/0yxhwia2amd8gec",
|
||||||
|
Body: strings.NewReader(`{"title":"new"}`),
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnRecordAfterUpdateRequest().Add(func(e *core.RecordUpdateEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnRecordBeforeUpdateRequest": 1,
|
||||||
|
"OnRecordAfterUpdateRequest": 1,
|
||||||
|
"OnModelBeforeUpdate": 1,
|
||||||
|
"OnModelAfterUpdate": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "try to change the id of an existing record",
|
Name: "try to change the id of an existing record",
|
||||||
Method: http.MethodPatch,
|
Method: http.MethodPatch,
|
||||||
|
|
|
@ -6,12 +6,14 @@ import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"encoding/pem"
|
"encoding/pem"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/labstack/echo/v5"
|
"github.com/labstack/echo/v5"
|
||||||
|
"github.com/pocketbase/pocketbase/core"
|
||||||
"github.com/pocketbase/pocketbase/tests"
|
"github.com/pocketbase/pocketbase/tests"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -240,6 +242,28 @@ func TestSettingsSet(t *testing.T) {
|
||||||
"OnSettingsAfterUpdateRequest": 1,
|
"OnSettingsAfterUpdateRequest": 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "OnSettingsAfterUpdateRequest error response",
|
||||||
|
Method: http.MethodPatch,
|
||||||
|
Url: "/api/settings",
|
||||||
|
Body: strings.NewReader(validData),
|
||||||
|
RequestHeaders: map[string]string{
|
||||||
|
"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InN5d2JoZWNuaDQ2cmhtMCIsInR5cGUiOiJhZG1pbiIsImV4cCI6MjIwODk4NTI2MX0.M1m--VOqGyv0d23eeUc0r9xE8ZzHaYVmVFw1VZW6gT8",
|
||||||
|
},
|
||||||
|
BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) {
|
||||||
|
app.OnSettingsAfterUpdateRequest().Add(func(e *core.SettingsUpdateEvent) error {
|
||||||
|
return errors.New("error")
|
||||||
|
})
|
||||||
|
},
|
||||||
|
ExpectedStatus: 400,
|
||||||
|
ExpectedContent: []string{`"data":{}`},
|
||||||
|
ExpectedEvents: map[string]int{
|
||||||
|
"OnModelBeforeUpdate": 1,
|
||||||
|
"OnModelAfterUpdate": 1,
|
||||||
|
"OnSettingsBeforeUpdateRequest": 1,
|
||||||
|
"OnSettingsAfterUpdateRequest": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, scenario := range scenarios {
|
for _, scenario := range scenarios {
|
||||||
|
|
Loading…
Reference in New Issue