Add PushRuleCollection tests
This commit is contained in:
parent
aec3b8d204
commit
c5ea283777
@ -27,7 +27,7 @@ type PushRuleCollection interface {
|
|||||||
|
|
||||||
type PushRuleArray []*PushRule
|
type PushRuleArray []*PushRule
|
||||||
|
|
||||||
func (rules PushRuleArray) setType(typ PushRuleType) PushRuleArray {
|
func (rules PushRuleArray) SetType(typ PushRuleType) PushRuleArray {
|
||||||
for _, rule := range rules {
|
for _, rule := range rules {
|
||||||
rule.Type = typ
|
rule.Type = typ
|
||||||
}
|
}
|
||||||
@ -49,7 +49,7 @@ type PushRuleMap struct {
|
|||||||
Type PushRuleType
|
Type PushRuleType
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rules PushRuleArray) setTypeAndMap(typ PushRuleType) PushRuleMap {
|
func (rules PushRuleArray) SetTypeAndMap(typ PushRuleType) PushRuleMap {
|
||||||
data := PushRuleMap{
|
data := PushRuleMap{
|
||||||
Map: make(map[string]*PushRule),
|
Map: make(map[string]*PushRule),
|
||||||
Type: typ,
|
Type: typ,
|
||||||
@ -76,7 +76,7 @@ func (ruleMap PushRuleMap) GetActions(room Room, event *gomatrix.Event) PushActi
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ruleMap PushRuleMap) unmap() PushRuleArray {
|
func (ruleMap PushRuleMap) Unmap() PushRuleArray {
|
||||||
array := make(PushRuleArray, len(ruleMap.Map))
|
array := make(PushRuleArray, len(ruleMap.Map))
|
||||||
index := 0
|
index := 0
|
||||||
for _, rule := range ruleMap.Map {
|
for _, rule := range ruleMap.Map {
|
||||||
|
293
matrix/pushrules/rule_array_test.go
Normal file
293
matrix/pushrules/rule_array_test.go
Normal file
@ -0,0 +1,293 @@
|
|||||||
|
// gomuks - A terminal Matrix client written in Go.
|
||||||
|
// Copyright (C) 2018 Tulir Asokan
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
package pushrules_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"maunium.net/go/gomuks/matrix/pushrules"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPushRuleArray_GetActions_FirstMatchReturns(t *testing.T) {
|
||||||
|
cond1 := newMatchPushCondition("content.msgtype", "m.emote")
|
||||||
|
cond2 := newMatchPushCondition("content.body", "no match")
|
||||||
|
actions1 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionNotify},
|
||||||
|
{Action: pushrules.ActionSetTweak, Tweak: pushrules.TweakHighlight},
|
||||||
|
{Action: pushrules.ActionSetTweak, Tweak: pushrules.TweakSound, Value: "ping"},
|
||||||
|
}
|
||||||
|
rule1 := &pushrules.PushRule{
|
||||||
|
Type: pushrules.OverrideRule,
|
||||||
|
Enabled: true,
|
||||||
|
Conditions: []*pushrules.PushCondition{cond1, cond2},
|
||||||
|
Actions: actions1,
|
||||||
|
}
|
||||||
|
|
||||||
|
actions2 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionDontNotify},
|
||||||
|
{Action: pushrules.ActionSetTweak, Tweak: pushrules.TweakHighlight, Value: false},
|
||||||
|
{Action: pushrules.ActionSetTweak, Tweak: pushrules.TweakSound, Value: "pong"},
|
||||||
|
}
|
||||||
|
rule2 := &pushrules.PushRule{
|
||||||
|
Type: pushrules.RoomRule,
|
||||||
|
Enabled: true,
|
||||||
|
RuleID: "!fakeroom:maunium.net",
|
||||||
|
Actions: actions2,
|
||||||
|
}
|
||||||
|
|
||||||
|
actions3 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionCoalesce},
|
||||||
|
}
|
||||||
|
rule3 := &pushrules.PushRule{
|
||||||
|
Type: pushrules.SenderRule,
|
||||||
|
Enabled: true,
|
||||||
|
RuleID: "@tulir:maunium.net",
|
||||||
|
Actions: actions3,
|
||||||
|
}
|
||||||
|
|
||||||
|
rules := pushrules.PushRuleArray{rule1, rule2, rule3}
|
||||||
|
|
||||||
|
event := newFakeEvent("m.room.message", map[string]interface{}{
|
||||||
|
"msgtype": "m.emote",
|
||||||
|
"body": "is testing pushrules",
|
||||||
|
})
|
||||||
|
assert.Equal(t, rules.GetActions(blankTestRoom, event), actions2)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPushRuleArray_GetActions_NoMatchesIsNil(t *testing.T) {
|
||||||
|
cond1 := newMatchPushCondition("content.msgtype", "m.emote")
|
||||||
|
cond2 := newMatchPushCondition("content.body", "no match")
|
||||||
|
actions1 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionNotify},
|
||||||
|
{Action: pushrules.ActionSetTweak, Tweak: pushrules.TweakHighlight},
|
||||||
|
{Action: pushrules.ActionSetTweak, Tweak: pushrules.TweakSound, Value: "ping"},
|
||||||
|
}
|
||||||
|
rule1 := &pushrules.PushRule{
|
||||||
|
Type: pushrules.OverrideRule,
|
||||||
|
Enabled: true,
|
||||||
|
Conditions: []*pushrules.PushCondition{cond1, cond2},
|
||||||
|
Actions: actions1,
|
||||||
|
}
|
||||||
|
|
||||||
|
actions2 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionDontNotify},
|
||||||
|
{Action: pushrules.ActionSetTweak, Tweak: pushrules.TweakHighlight, Value: false},
|
||||||
|
{Action: pushrules.ActionSetTweak, Tweak: pushrules.TweakSound, Value: "pong"},
|
||||||
|
}
|
||||||
|
rule2 := &pushrules.PushRule{
|
||||||
|
Type: pushrules.RoomRule,
|
||||||
|
Enabled: true,
|
||||||
|
RuleID: "!realroom:maunium.net",
|
||||||
|
Actions: actions2,
|
||||||
|
}
|
||||||
|
|
||||||
|
actions3 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionCoalesce},
|
||||||
|
}
|
||||||
|
rule3 := &pushrules.PushRule{
|
||||||
|
Type: pushrules.SenderRule,
|
||||||
|
Enabled: true,
|
||||||
|
RuleID: "@otheruser:maunium.net",
|
||||||
|
Actions: actions3,
|
||||||
|
}
|
||||||
|
|
||||||
|
rules := pushrules.PushRuleArray{rule1, rule2, rule3}
|
||||||
|
|
||||||
|
event := newFakeEvent("m.room.message", map[string]interface{}{
|
||||||
|
"msgtype": "m.emote",
|
||||||
|
"body": "is testing pushrules",
|
||||||
|
})
|
||||||
|
assert.Nil(t, rules.GetActions(blankTestRoom, event))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPushRuleMap_GetActions_RoomRuleExists(t *testing.T) {
|
||||||
|
actions1 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionDontNotify},
|
||||||
|
{Action: pushrules.ActionSetTweak, Tweak: pushrules.TweakHighlight, Value: false},
|
||||||
|
{Action: pushrules.ActionSetTweak, Tweak: pushrules.TweakSound, Value: "pong"},
|
||||||
|
}
|
||||||
|
rule1 := &pushrules.PushRule{
|
||||||
|
Type: pushrules.RoomRule,
|
||||||
|
Enabled: true,
|
||||||
|
RuleID: "!realroom:maunium.net",
|
||||||
|
Actions: actions1,
|
||||||
|
}
|
||||||
|
|
||||||
|
actions2 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionNotify},
|
||||||
|
}
|
||||||
|
rule2 := &pushrules.PushRule{
|
||||||
|
Type: pushrules.RoomRule,
|
||||||
|
Enabled: true,
|
||||||
|
RuleID: "!thirdroom:maunium.net",
|
||||||
|
Actions: actions2,
|
||||||
|
}
|
||||||
|
|
||||||
|
actions3 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionCoalesce},
|
||||||
|
}
|
||||||
|
rule3 := &pushrules.PushRule{
|
||||||
|
Type: pushrules.RoomRule,
|
||||||
|
Enabled: true,
|
||||||
|
RuleID: "!fakeroom:maunium.net",
|
||||||
|
Actions: actions3,
|
||||||
|
}
|
||||||
|
|
||||||
|
rules := pushrules.PushRuleMap{
|
||||||
|
Map: map[string]*pushrules.PushRule{
|
||||||
|
rule1.RuleID: rule1,
|
||||||
|
rule2.RuleID: rule2,
|
||||||
|
rule3.RuleID: rule3,
|
||||||
|
},
|
||||||
|
Type: pushrules.RoomRule,
|
||||||
|
}
|
||||||
|
|
||||||
|
event := newFakeEvent("m.room.message", map[string]interface{}{
|
||||||
|
"msgtype": "m.emote",
|
||||||
|
"body": "is testing pushrules",
|
||||||
|
})
|
||||||
|
assert.Equal(t, rules.GetActions(blankTestRoom, event), actions3)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPushRuleMap_GetActions_RoomRuleDoesntExist(t *testing.T) {
|
||||||
|
actions1 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionDontNotify},
|
||||||
|
{Action: pushrules.ActionSetTweak, Tweak: pushrules.TweakHighlight, Value: false},
|
||||||
|
{Action: pushrules.ActionSetTweak, Tweak: pushrules.TweakSound, Value: "pong"},
|
||||||
|
}
|
||||||
|
rule1 := &pushrules.PushRule{
|
||||||
|
Type: pushrules.RoomRule,
|
||||||
|
Enabled: true,
|
||||||
|
RuleID: "!realroom:maunium.net",
|
||||||
|
Actions: actions1,
|
||||||
|
}
|
||||||
|
|
||||||
|
actions2 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionNotify},
|
||||||
|
}
|
||||||
|
rule2 := &pushrules.PushRule{
|
||||||
|
Type: pushrules.RoomRule,
|
||||||
|
Enabled: true,
|
||||||
|
RuleID: "!thirdroom:maunium.net",
|
||||||
|
Actions: actions2,
|
||||||
|
}
|
||||||
|
|
||||||
|
rules := pushrules.PushRuleMap{
|
||||||
|
Map: map[string]*pushrules.PushRule{
|
||||||
|
rule1.RuleID: rule1,
|
||||||
|
rule2.RuleID: rule2,
|
||||||
|
},
|
||||||
|
Type: pushrules.RoomRule,
|
||||||
|
}
|
||||||
|
|
||||||
|
event := newFakeEvent("m.room.message", map[string]interface{}{
|
||||||
|
"msgtype": "m.emote",
|
||||||
|
"body": "is testing pushrules",
|
||||||
|
})
|
||||||
|
assert.Nil(t, rules.GetActions(blankTestRoom, event))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPushRuleMap_GetActions_SenderRuleExists(t *testing.T) {
|
||||||
|
actions1 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionDontNotify},
|
||||||
|
{Action: pushrules.ActionSetTweak, Tweak: pushrules.TweakHighlight, Value: false},
|
||||||
|
{Action: pushrules.ActionSetTweak, Tweak: pushrules.TweakSound, Value: "pong"},
|
||||||
|
}
|
||||||
|
rule1 := &pushrules.PushRule{
|
||||||
|
Type: pushrules.SenderRule,
|
||||||
|
Enabled: true,
|
||||||
|
RuleID: "@tulir:maunium.net",
|
||||||
|
Actions: actions1,
|
||||||
|
}
|
||||||
|
|
||||||
|
actions2 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionNotify},
|
||||||
|
}
|
||||||
|
rule2 := &pushrules.PushRule{
|
||||||
|
Type: pushrules.SenderRule,
|
||||||
|
Enabled: true,
|
||||||
|
RuleID: "@someone:maunium.net",
|
||||||
|
Actions: actions2,
|
||||||
|
}
|
||||||
|
|
||||||
|
actions3 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionCoalesce},
|
||||||
|
}
|
||||||
|
rule3 := &pushrules.PushRule{
|
||||||
|
Type: pushrules.SenderRule,
|
||||||
|
Enabled: true,
|
||||||
|
RuleID: "@otheruser:matrix.org",
|
||||||
|
Actions: actions3,
|
||||||
|
}
|
||||||
|
|
||||||
|
rules := pushrules.PushRuleMap{
|
||||||
|
Map: map[string]*pushrules.PushRule{
|
||||||
|
rule1.RuleID: rule1,
|
||||||
|
rule2.RuleID: rule2,
|
||||||
|
rule3.RuleID: rule3,
|
||||||
|
},
|
||||||
|
Type: pushrules.SenderRule,
|
||||||
|
}
|
||||||
|
|
||||||
|
event := newFakeEvent("m.room.message", map[string]interface{}{
|
||||||
|
"msgtype": "m.emote",
|
||||||
|
"body": "is testing pushrules",
|
||||||
|
})
|
||||||
|
assert.Equal(t, rules.GetActions(blankTestRoom, event), actions1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPushRuleArray_SetTypeAndMap(t *testing.T) {
|
||||||
|
actions1 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionDontNotify},
|
||||||
|
{Action: pushrules.ActionSetTweak, Tweak: pushrules.TweakHighlight, Value: false},
|
||||||
|
{Action: pushrules.ActionSetTweak, Tweak: pushrules.TweakSound, Value: "pong"},
|
||||||
|
}
|
||||||
|
rule1 := &pushrules.PushRule{
|
||||||
|
Enabled: true,
|
||||||
|
RuleID: "@tulir:maunium.net",
|
||||||
|
Actions: actions1,
|
||||||
|
}
|
||||||
|
|
||||||
|
actions2 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionNotify},
|
||||||
|
}
|
||||||
|
rule2 := &pushrules.PushRule{
|
||||||
|
Enabled: true,
|
||||||
|
RuleID: "@someone:maunium.net",
|
||||||
|
Actions: actions2,
|
||||||
|
}
|
||||||
|
|
||||||
|
actions3 := pushrules.PushActionArray{
|
||||||
|
{Action: pushrules.ActionCoalesce},
|
||||||
|
}
|
||||||
|
rule3 := &pushrules.PushRule{
|
||||||
|
Enabled: true,
|
||||||
|
RuleID: "@otheruser:matrix.org",
|
||||||
|
Actions: actions3,
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleArray := pushrules.PushRuleArray{rule1, rule2, rule3}
|
||||||
|
ruleMap := ruleArray.SetTypeAndMap(pushrules.SenderRule)
|
||||||
|
assert.Equal(t, pushrules.SenderRule, ruleMap.Type)
|
||||||
|
for _, rule := range ruleArray {
|
||||||
|
assert.Equal(t, rule, ruleMap.Map[rule.RuleID])
|
||||||
|
}
|
||||||
|
newRuleArray := ruleMap.Unmap()
|
||||||
|
for _, rule := range ruleArray {
|
||||||
|
assert.Contains(t, newRuleArray, rule)
|
||||||
|
}
|
||||||
|
}
|
@ -53,11 +53,11 @@ func (rs *PushRuleset) UnmarshalJSON(raw []byte) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
rs.Override = data.Override.setType(OverrideRule)
|
rs.Override = data.Override.SetType(OverrideRule)
|
||||||
rs.Content = data.Content.setType(ContentRule)
|
rs.Content = data.Content.SetType(ContentRule)
|
||||||
rs.Room = data.Room.setTypeAndMap(RoomRule)
|
rs.Room = data.Room.SetTypeAndMap(RoomRule)
|
||||||
rs.Sender = data.Sender.setTypeAndMap(SenderRule)
|
rs.Sender = data.Sender.SetTypeAndMap(SenderRule)
|
||||||
rs.Underride = data.Underride.setType(UnderrideRule)
|
rs.Underride = data.Underride.SetType(UnderrideRule)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,8 +66,8 @@ func (rs *PushRuleset) MarshalJSON() ([]byte, error) {
|
|||||||
data := rawPushRuleset{
|
data := rawPushRuleset{
|
||||||
Override: rs.Override,
|
Override: rs.Override,
|
||||||
Content: rs.Content,
|
Content: rs.Content,
|
||||||
Room: rs.Room.unmap(),
|
Room: rs.Room.Unmap(),
|
||||||
Sender: rs.Sender.unmap(),
|
Sender: rs.Sender.Unmap(),
|
||||||
Underride: rs.Underride,
|
Underride: rs.Underride,
|
||||||
}
|
}
|
||||||
return json.Marshal(&data)
|
return json.Marshal(&data)
|
||||||
|
Loading…
Reference in New Issue
Block a user