@@ -578,6 +578,79 @@ describe("NotificationService", function () {
578578 } ) ;
579579 } ) ;
580580
581+ describe ( "Test event property contains" , ( ) => {
582+ it . each ( [
583+ // Simple string matching.
584+ { value : "bar" , eventValue : [ "bar" ] , expected : true } ,
585+ // Matches are case-sensitive.
586+ { value : "bar" , eventValue : [ "BAR" ] , expected : false } ,
587+ // Values should not be type-coerced.
588+ { value : "bar" , eventValue : [ true ] , expected : false } ,
589+ { value : "bar" , eventValue : [ 1 ] , expected : false } ,
590+ { value : "bar" , eventValue : [ false ] , expected : false } ,
591+ // Boolean matching.
592+ { value : true , eventValue : [ true ] , expected : true } ,
593+ { value : false , eventValue : [ false ] , expected : true } ,
594+ // Types should not be coerced.
595+ { value : true , eventValue : [ "true" ] , expected : false } ,
596+ { value : true , eventValue : [ 1 ] , expected : false } ,
597+ { value : false , eventValue : [ null ] , expected : false } ,
598+ // Null matching.
599+ { value : null , eventValue : [ null ] , expected : true } ,
600+ // Types should not be coerced
601+ { value : null , eventValue : [ false ] , expected : false } ,
602+ { value : null , eventValue : [ 0 ] , expected : false } ,
603+ { value : null , eventValue : [ "" ] , expected : false } ,
604+ { value : null , eventValue : [ undefined ] , expected : false } ,
605+ // Non-array or empty values should never be matched.
606+ { value : "bar" , eventValue : "bar" , expected : false } ,
607+ { value : "bar" , eventValue : { bar : true } , expected : false } ,
608+ { value : true , eventValue : { true : true } , expected : false } ,
609+ { value : true , eventValue : true , expected : false } ,
610+ { value : null , eventValue : [ ] , expected : false } ,
611+ { value : null , eventValue : { } , expected : false } ,
612+ { value : null , eventValue : null , expected : false } ,
613+ { value : null , eventValue : undefined , expected : false } ,
614+ ] ) ( "test $value against $eventValue" , ( { value, eventValue, expected } ) => {
615+ matrixClient . pushRules ! = {
616+ global : {
617+ override : [
618+ {
619+ actions : [ PushRuleActionName . Notify ] ,
620+ conditions : [
621+ {
622+ kind : ConditionKind . EventPropertyContainsPrefix ,
623+ key : "content.foo" ,
624+ value : value ,
625+ } ,
626+ ] ,
627+ default : true ,
628+ enabled : true ,
629+ rule_id : ".m.rule.test" ,
630+ } ,
631+ ] ,
632+ } ,
633+ } ;
634+
635+ testEvent = utils . mkEvent ( {
636+ type : "m.room.message" ,
637+ room : testRoomId ,
638+ user : "@alfred:localhost" ,
639+ event : true ,
640+ content : {
641+ foo : eventValue ,
642+ } ,
643+ } ) ;
644+
645+ const actions = pushProcessor . actionsForEvent ( testEvent ) ;
646+ if ( expected ) {
647+ expect ( actions ?. notify ) . toBeTruthy ( ) ;
648+ } else {
649+ expect ( actions ?. notify ) . toBeFalsy ( ) ;
650+ }
651+ } ) ;
652+ } ) ;
653+
581654 it . each ( [
582655 // The properly escaped key works.
583656 { key : "content.m\\.test.foo" , pattern : "bar" , expected : true } ,
0 commit comments