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/test/testrig" "github.com/matrix-org/dendrite/userapi/storage" ) func mustCreateDatabase(t *testing.T, dbType test.DBType) (storage.Database, func()) { base, baseclose := testrig.CreateBaseDendrite(t, dbType) t.Helper() connStr, close := test.PrepareDBConnectionString(t, dbType) db, err := storage.NewUserAPIDatabase(base, &config.DatabaseOptions{ ConnectionString: config.DataSource(connStr), }, "", 4, 0, 0, "") if err != nil { t.Fatalf("failed to create new user db: %v", err) } return db, func() { close() baseclose() } } 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 := OutputRoomEventConsumer{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") } }) } }) }