snapshot of https://github.com/mattermost/mattermost.git (master, 2026-09-16; blobs > 131072B omitted)
Some checks failed
Server CI / Postgres (shard 0) (push) Has been skipped
Server CI / Postgres (shard 3) (push) Has been skipped
BuildEnv Docker Image / build-image (push) Failing after 4s
BuildEnv Docker Image / build-image-fips (push) Failing after 4s
Migration Review & Release Notes / Generate migration review & release notes (push) Failing after 3s
Server CI / Build Environment (push) Failing after 3s
Server CI / Postgres (shard 1) (push) Has been skipped
Tools CI / check-style (mattermost-govet) (push) Failing after 4s
Server CI / Postgres (shard 2) (push) Has been skipped
Tools CI / check-style (mmgotool) (push) Failing after 3s
Server CI / Elasticsearch v8 Compatibility (push) Has been skipped
Server CI / OpenSearch v2 Compatibility (push) Has been skipped
Server CI / Postgres FIPS (shard 0) (push) Has been skipped
Tools CI / Test (mattermost-govet) (push) Failing after 3s
Server CI / Postgres FIPS (shard 1) (push) Has been skipped
Server CI / Postgres FIPS (shard 2) (push) Has been skipped
Tools CI / Test (mmgotool) (push) Failing after 3s
Server CI / Postgres FIPS (shard 3) (push) Has been skipped
Server CI / Run mmctl tests (push) Has been skipped
Server CI / Run mmctl tests (FIPS) (push) Has been skipped
Server CI / Merge Postgres Test Results (push) Has been skipped
Server CI / Merge Postgres FIPS Test Results (push) Has been skipped
Server CI / Check backport migrations (push) Has been skipped
Server CI / Check generated files (push) Has been skipped
Server CI / check-style (push) Has been skipped
Server CI / Vet API (push) Has been skipped
Server CI / Build mattermost server app (push) Has been skipped
Server CI / Server CI Complete (push) Failing after 2s
Server CI / Server CI Artifacts (push) Has been skipped
Server CI / Sentry Upload (push) Has been skipped
Server CI / Server CI Report (push) Failing after 5m1s
Server CI Nightly Race / Race Detector (push) Has been skipped
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
Webapp CI Cache Warm / Warm Webapp node_modules Cache (push) Has been cancelled
E2E CI Cache Warm / Warm E2E npm Registry Cache (push) Has been cancelled
API / build (push) Has been cancelled
Web App CI / check-types (push) Has been cancelled
Web App CI / check-lint (push) Has been cancelled
Web App CI / check-i18n (push) Has been cancelled
Web App CI / check-external-links (push) Has been cancelled
Web App CI / test (platform) (push) Has been cancelled
Web App CI / test (mattermost-redux) (push) Has been cancelled
Web App CI / test (channels shard 1/4) (push) Has been cancelled
Web App CI / test (channels shard 2/4) (push) Has been cancelled
Web App CI / test (channels shard 3/4) (push) Has been cancelled
Web App CI / test (channels shard 4/4) (push) Has been cancelled
Web App CI / upload-coverage (push) Has been cancelled
Web App CI / build (push) Has been cancelled
YAML Lint / yamllint (push) Has been cancelled
Push mirrored docker images / cd/Push mirrored docker images (push) Has been cancelled
docs-cd / Build and deploy docs (push) Has been cancelled
Docs CI / build (push) Has been cancelled
E2E Cache Warm: Cypress deps / Warm Cypress deps cache (push) Has been cancelled
Scorecards supply-chain security / Scorecard analysis (push) Has been cancelled
Server CI Weekly / Postgres FIPS (push) Has been skipped
Server CI Weekly / Run mmctl tests (FIPS) (push) Has been skipped
Server CI Weekly / Postgres with binary parameters (push) Has been skipped
Server CI Weekly / Build Environment (push) Failing after 1s
Server CI Cache Warm / Warm Go Module and Build Cache (push) Failing after 2s
Server CI Nightly Race / Build Environment (push) Failing after 1s
Some checks failed
Server CI / Postgres (shard 0) (push) Has been skipped
Server CI / Postgres (shard 3) (push) Has been skipped
BuildEnv Docker Image / build-image (push) Failing after 4s
BuildEnv Docker Image / build-image-fips (push) Failing after 4s
Migration Review & Release Notes / Generate migration review & release notes (push) Failing after 3s
Server CI / Build Environment (push) Failing after 3s
Server CI / Postgres (shard 1) (push) Has been skipped
Tools CI / check-style (mattermost-govet) (push) Failing after 4s
Server CI / Postgres (shard 2) (push) Has been skipped
Tools CI / check-style (mmgotool) (push) Failing after 3s
Server CI / Elasticsearch v8 Compatibility (push) Has been skipped
Server CI / OpenSearch v2 Compatibility (push) Has been skipped
Server CI / Postgres FIPS (shard 0) (push) Has been skipped
Tools CI / Test (mattermost-govet) (push) Failing after 3s
Server CI / Postgres FIPS (shard 1) (push) Has been skipped
Server CI / Postgres FIPS (shard 2) (push) Has been skipped
Tools CI / Test (mmgotool) (push) Failing after 3s
Server CI / Postgres FIPS (shard 3) (push) Has been skipped
Server CI / Run mmctl tests (push) Has been skipped
Server CI / Run mmctl tests (FIPS) (push) Has been skipped
Server CI / Merge Postgres Test Results (push) Has been skipped
Server CI / Merge Postgres FIPS Test Results (push) Has been skipped
Server CI / Check backport migrations (push) Has been skipped
Server CI / Check generated files (push) Has been skipped
Server CI / check-style (push) Has been skipped
Server CI / Vet API (push) Has been skipped
Server CI / Build mattermost server app (push) Has been skipped
Server CI / Server CI Complete (push) Failing after 2s
Server CI / Server CI Artifacts (push) Has been skipped
Server CI / Sentry Upload (push) Has been skipped
Server CI / Server CI Report (push) Failing after 5m1s
Server CI Nightly Race / Race Detector (push) Has been skipped
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
Webapp CI Cache Warm / Warm Webapp node_modules Cache (push) Has been cancelled
E2E CI Cache Warm / Warm E2E npm Registry Cache (push) Has been cancelled
API / build (push) Has been cancelled
Web App CI / check-types (push) Has been cancelled
Web App CI / check-lint (push) Has been cancelled
Web App CI / check-i18n (push) Has been cancelled
Web App CI / check-external-links (push) Has been cancelled
Web App CI / test (platform) (push) Has been cancelled
Web App CI / test (mattermost-redux) (push) Has been cancelled
Web App CI / test (channels shard 1/4) (push) Has been cancelled
Web App CI / test (channels shard 2/4) (push) Has been cancelled
Web App CI / test (channels shard 3/4) (push) Has been cancelled
Web App CI / test (channels shard 4/4) (push) Has been cancelled
Web App CI / upload-coverage (push) Has been cancelled
Web App CI / build (push) Has been cancelled
YAML Lint / yamllint (push) Has been cancelled
Push mirrored docker images / cd/Push mirrored docker images (push) Has been cancelled
docs-cd / Build and deploy docs (push) Has been cancelled
Docs CI / build (push) Has been cancelled
E2E Cache Warm: Cypress deps / Warm Cypress deps cache (push) Has been cancelled
Scorecards supply-chain security / Scorecard analysis (push) Has been cancelled
Server CI Weekly / Postgres FIPS (push) Has been skipped
Server CI Weekly / Run mmctl tests (FIPS) (push) Has been skipped
Server CI Weekly / Postgres with binary parameters (push) Has been skipped
Server CI Weekly / Build Environment (push) Failing after 1s
Server CI Cache Warm / Warm Go Module and Build Cache (push) Failing after 2s
Server CI Nightly Race / Build Environment (push) Failing after 1s
This commit is contained in:
188
server/channels/app/properties/write_hooks_test.go
Normal file
188
server/channels/app/properties/write_hooks_test.go
Normal file
@@ -0,0 +1,188 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
package properties
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
"github.com/mattermost/mattermost/server/public/model"
|
||||
"github.com/mattermost/mattermost/server/public/shared/request"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
type rejectingValueWriteHook struct {
|
||||
BasePropertyHook
|
||||
err error
|
||||
}
|
||||
|
||||
func (h *rejectingValueWriteHook) PreCreatePropertyValue(_ request.CTX, value *model.PropertyValue) (*model.PropertyValue, error) {
|
||||
return value, h.err
|
||||
}
|
||||
|
||||
func (h *rejectingValueWriteHook) PreCreatePropertyValues(_ request.CTX, values []*model.PropertyValue) ([]*model.PropertyValue, error) {
|
||||
return values, h.err
|
||||
}
|
||||
|
||||
func (h *rejectingValueWriteHook) PreUpdatePropertyValue(_ request.CTX, _ string, value *model.PropertyValue) (*model.PropertyValue, error) {
|
||||
return value, h.err
|
||||
}
|
||||
|
||||
func (h *rejectingValueWriteHook) PreUpdatePropertyValues(_ request.CTX, _ string, values []*model.PropertyValue) ([]*model.PropertyValue, error) {
|
||||
return values, h.err
|
||||
}
|
||||
|
||||
func (h *rejectingValueWriteHook) PreUpsertPropertyValue(_ request.CTX, value *model.PropertyValue) (*model.PropertyValue, error) {
|
||||
return value, h.err
|
||||
}
|
||||
|
||||
func (h *rejectingValueWriteHook) PreUpsertPropertyValues(_ request.CTX, values []*model.PropertyValue) ([]*model.PropertyValue, error) {
|
||||
return values, h.err
|
||||
}
|
||||
|
||||
func (h *rejectingValueWriteHook) PreDeletePropertyValue(_ request.CTX, _, _ string) error {
|
||||
return h.err
|
||||
}
|
||||
|
||||
func (h *rejectingValueWriteHook) PreDeletePropertyValuesForTarget(_ request.CTX, _, _, _ string) error {
|
||||
return h.err
|
||||
}
|
||||
|
||||
func (h *rejectingValueWriteHook) PreDeletePropertyValuesForField(_ request.CTX, _, _ string) error {
|
||||
return h.err
|
||||
}
|
||||
|
||||
type recordingValueWriteHook struct {
|
||||
BasePropertyHook
|
||||
operation string
|
||||
}
|
||||
|
||||
func (h *recordingValueWriteHook) record(operation string) error {
|
||||
h.operation = operation
|
||||
return nil
|
||||
}
|
||||
|
||||
func (h *recordingValueWriteHook) PostCreatePropertyValue(_ request.CTX, _ *model.PropertyValue) error {
|
||||
return h.record("create")
|
||||
}
|
||||
|
||||
func (h *recordingValueWriteHook) PostCreatePropertyValues(_ request.CTX, _ []*model.PropertyValue) error {
|
||||
return h.record("create_batch")
|
||||
}
|
||||
|
||||
func (h *recordingValueWriteHook) PostUpdatePropertyValue(_ request.CTX, _ *model.PropertyValue) error {
|
||||
return h.record("update")
|
||||
}
|
||||
|
||||
func (h *recordingValueWriteHook) PostUpdatePropertyValues(_ request.CTX, _ []*model.PropertyValue) error {
|
||||
return h.record("update_batch")
|
||||
}
|
||||
|
||||
func (h *recordingValueWriteHook) PostUpsertPropertyValue(_ request.CTX, _ *model.PropertyValue) error {
|
||||
return h.record("upsert")
|
||||
}
|
||||
|
||||
func (h *recordingValueWriteHook) PostUpsertPropertyValues(_ request.CTX, _ []*model.PropertyValue) error {
|
||||
return h.record("upsert_batch")
|
||||
}
|
||||
|
||||
func (h *recordingValueWriteHook) PostDeletePropertyValue(_ request.CTX, _, _ string, _ *model.PropertyValue) error {
|
||||
return h.record("delete")
|
||||
}
|
||||
|
||||
func (h *recordingValueWriteHook) PostDeletePropertyValuesForTarget(_ request.CTX, _, _, _ string) error {
|
||||
return h.record("delete_target")
|
||||
}
|
||||
|
||||
func (h *recordingValueWriteHook) PostDeletePropertyValuesForField(_ request.CTX, _, _ string) error {
|
||||
return h.record("delete_field")
|
||||
}
|
||||
|
||||
func TestValueWritePostHooksDoNotRunAfterPreHookErrors(t *testing.T) {
|
||||
th := Setup(t)
|
||||
rejectedErr := errors.New("write rejected")
|
||||
recorder := &recordingValueWriteHook{}
|
||||
th.service.AddHook(&rejectingValueWriteHook{err: rejectedErr})
|
||||
th.service.AddHook(recorder)
|
||||
|
||||
groupID := model.NewId()
|
||||
valueID := model.NewId()
|
||||
value := &model.PropertyValue{GroupID: groupID}
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
run func() error
|
||||
}{
|
||||
{
|
||||
name: "create",
|
||||
run: func() error {
|
||||
_, err := th.service.CreatePropertyValue(th.Context, value)
|
||||
return err
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "create batch",
|
||||
run: func() error {
|
||||
_, err := th.service.CreatePropertyValues(th.Context, []*model.PropertyValue{value})
|
||||
return err
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "update",
|
||||
run: func() error {
|
||||
_, err := th.service.UpdatePropertyValue(th.Context, groupID, value)
|
||||
return err
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "update batch",
|
||||
run: func() error {
|
||||
_, err := th.service.UpdatePropertyValues(th.Context, groupID, []*model.PropertyValue{value})
|
||||
return err
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "upsert",
|
||||
run: func() error {
|
||||
_, err := th.service.UpsertPropertyValue(th.Context, value)
|
||||
return err
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "upsert batch",
|
||||
run: func() error {
|
||||
_, err := th.service.UpsertPropertyValues(th.Context, []*model.PropertyValue{value})
|
||||
return err
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "delete",
|
||||
run: func() error {
|
||||
return th.service.DeletePropertyValue(th.Context, groupID, valueID)
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "delete target",
|
||||
run: func() error {
|
||||
return th.service.DeletePropertyValuesForTarget(th.Context, groupID, "user", model.NewId())
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "delete field",
|
||||
run: func() error {
|
||||
return th.service.DeletePropertyValuesForField(th.Context, groupID, model.NewId())
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
recorder.operation = ""
|
||||
|
||||
err := tt.run()
|
||||
require.ErrorIs(t, err, rejectedErr)
|
||||
require.Empty(t, recorder.operation)
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user