aboutsummaryrefslogtreecommitdiff
path: root/userapi/consumers/syncapi_streamevent_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'userapi/consumers/syncapi_streamevent_test.go')
-rw-r--r--userapi/consumers/syncapi_streamevent_test.go129
1 files changed, 129 insertions, 0 deletions
diff --git a/userapi/consumers/syncapi_streamevent_test.go b/userapi/consumers/syncapi_streamevent_test.go
new file mode 100644
index 00000000..48ea0fe1
--- /dev/null
+++ b/userapi/consumers/syncapi_streamevent_test.go
@@ -0,0 +1,129 @@
+package consumers
+
+import (
+ "context"
+ "testing"
+
+ "github.com/matrix-org/gomatrixserverlib"
+ "github.com/stretchr/testify/assert"
+
+ "github.com/matrix-org/dendrite/internal/pushrules"
+ "github.com/matrix-org/dendrite/setup/config"
+ "github.com/matrix-org/dendrite/test"
+ "github.com/matrix-org/dendrite/userapi/storage"
+)
+
+func mustCreateDatabase(t *testing.T, dbType test.DBType) (storage.Database, func()) {
+ t.Helper()
+ connStr, close := test.PrepareDBConnectionString(t, dbType)
+ db, err := storage.NewUserAPIDatabase(nil, &config.DatabaseOptions{
+ ConnectionString: config.DataSource(connStr),
+ }, "", 4, 0, 0, "")
+ if err != nil {
+ t.Fatalf("failed to create new user db: %v", err)
+ }
+ return db, close
+}
+
+func mustCreateEvent(t *testing.T, content string) *gomatrixserverlib.HeaderedEvent {
+ t.Helper()
+ ev, err := gomatrixserverlib.NewEventFromTrustedJSON([]byte(content), false, gomatrixserverlib.RoomVersionV10)
+ if err != nil {
+ t.Fatalf("failed to create event: %v", err)
+ }
+ return ev.Headered(gomatrixserverlib.RoomVersionV10)
+}
+
+func Test_evaluatePushRules(t *testing.T) {
+ ctx := context.Background()
+
+ test.WithAllDatabases(t, func(t *testing.T, dbType test.DBType) {
+ db, close := mustCreateDatabase(t, dbType)
+ defer close()
+ consumer := OutputStreamEventConsumer{db: db}
+
+ testCases := []struct {
+ name string
+ eventContent string
+ wantAction pushrules.ActionKind
+ wantActions []*pushrules.Action
+ wantNotify bool
+ }{
+ {
+ name: "m.receipt doesn't notify",
+ eventContent: `{"type":"m.receipt"}`,
+ wantAction: pushrules.UnknownAction,
+ wantActions: nil,
+ },
+ {
+ name: "m.reaction doesn't notify",
+ eventContent: `{"type":"m.reaction"}`,
+ wantAction: pushrules.DontNotifyAction,
+ wantActions: []*pushrules.Action{
+ {
+ Kind: pushrules.DontNotifyAction,
+ },
+ },
+ },
+ {
+ name: "m.room.message notifies",
+ eventContent: `{"type":"m.room.message"}`,
+ wantNotify: true,
+ wantAction: pushrules.NotifyAction,
+ wantActions: []*pushrules.Action{
+ {Kind: pushrules.NotifyAction},
+ {
+ Kind: pushrules.SetTweakAction,
+ Tweak: pushrules.HighlightTweak,
+ Value: false,
+ },
+ },
+ },
+ {
+ name: "m.room.message highlights",
+ eventContent: `{"type":"m.room.message", "content": {"body": "test"} }`,
+ wantNotify: true,
+ wantAction: pushrules.NotifyAction,
+ wantActions: []*pushrules.Action{
+ {Kind: pushrules.NotifyAction},
+ {
+ Kind: pushrules.SetTweakAction,
+ Tweak: pushrules.SoundTweak,
+ Value: "default",
+ },
+ {
+ Kind: pushrules.SetTweakAction,
+ Tweak: pushrules.HighlightTweak,
+ Value: true,
+ },
+ },
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ actions, err := consumer.evaluatePushRules(ctx, mustCreateEvent(t, tc.eventContent), &localMembership{
+ UserID: "@test:localhost",
+ Localpart: "test",
+ Domain: "localhost",
+ }, 10)
+ if err != nil {
+ t.Fatalf("failed to evaluate push rules: %v", err)
+ }
+ assert.Equal(t, tc.wantActions, actions)
+ gotAction, _, err := pushrules.ActionsToTweaks(actions)
+ if err != nil {
+ t.Fatalf("failed to get actions: %v", err)
+ }
+ if gotAction != tc.wantAction {
+ t.Fatalf("expected action to be '%s', got '%s'", tc.wantAction, gotAction)
+ }
+ // this is taken from `notifyLocal`
+ if tc.wantNotify && gotAction != pushrules.NotifyAction && gotAction != pushrules.CoalesceAction {
+ t.Fatalf("expected to notify but didn't")
+ }
+ })
+
+ }
+ })
+}