415 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			415 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Python
		
	
	
# Copyright 2020 The Matrix.org Foundation C.I.C.
 | 
						|
#
 | 
						|
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
# you may not use this file except in compliance with the License.
 | 
						|
# You may obtain a copy of the License at
 | 
						|
#
 | 
						|
#     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
# Unless required by applicable law or agreed to in writing, software
 | 
						|
# distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
# See the License for the specific language governing permissions and
 | 
						|
# limitations under the License.
 | 
						|
import synapse
 | 
						|
from synapse.api.errors import Codes
 | 
						|
from synapse.rest.client import login, push_rule, room
 | 
						|
 | 
						|
from tests.unittest import HomeserverTestCase
 | 
						|
 | 
						|
 | 
						|
class PushRuleAttributesTestCase(HomeserverTestCase):
 | 
						|
    servlets = [
 | 
						|
        synapse.rest.admin.register_servlets_for_client_rest_resource,
 | 
						|
        room.register_servlets,
 | 
						|
        login.register_servlets,
 | 
						|
        push_rule.register_servlets,
 | 
						|
    ]
 | 
						|
    hijack_auth = False
 | 
						|
 | 
						|
    def test_enabled_on_creation(self):
 | 
						|
        """
 | 
						|
        Tests the GET and PUT of push rules' `enabled` endpoints.
 | 
						|
        Tests that a rule is enabled upon creation, even though a rule with that
 | 
						|
            ruleId existed previously and was disabled.
 | 
						|
        """
 | 
						|
        self.register_user("user", "pass")
 | 
						|
        token = self.login("user", "pass")
 | 
						|
 | 
						|
        body = {
 | 
						|
            "conditions": [
 | 
						|
                {"kind": "event_match", "key": "sender", "pattern": "@user2:hs"}
 | 
						|
            ],
 | 
						|
            "actions": ["notify", {"set_tweak": "highlight"}],
 | 
						|
        }
 | 
						|
 | 
						|
        # PUT a new rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "PUT", "/pushrules/global/override/best.friend", body, access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
 | 
						|
        # GET enabled for that new rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "GET", "/pushrules/global/override/best.friend/enabled", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
        self.assertEqual(channel.json_body["enabled"], True)
 | 
						|
 | 
						|
    def test_enabled_on_recreation(self):
 | 
						|
        """
 | 
						|
        Tests the GET and PUT of push rules' `enabled` endpoints.
 | 
						|
        Tests that a rule is enabled upon creation, even if a rule with that
 | 
						|
            ruleId existed previously and was disabled.
 | 
						|
        """
 | 
						|
        self.register_user("user", "pass")
 | 
						|
        token = self.login("user", "pass")
 | 
						|
 | 
						|
        body = {
 | 
						|
            "conditions": [
 | 
						|
                {"kind": "event_match", "key": "sender", "pattern": "@user2:hs"}
 | 
						|
            ],
 | 
						|
            "actions": ["notify", {"set_tweak": "highlight"}],
 | 
						|
        }
 | 
						|
 | 
						|
        # PUT a new rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "PUT", "/pushrules/global/override/best.friend", body, access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
 | 
						|
        # disable the rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "PUT",
 | 
						|
            "/pushrules/global/override/best.friend/enabled",
 | 
						|
            {"enabled": False},
 | 
						|
            access_token=token,
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
 | 
						|
        # check rule disabled
 | 
						|
        channel = self.make_request(
 | 
						|
            "GET", "/pushrules/global/override/best.friend/enabled", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
        self.assertEqual(channel.json_body["enabled"], False)
 | 
						|
 | 
						|
        # DELETE the rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "DELETE", "/pushrules/global/override/best.friend", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
 | 
						|
        # PUT a new rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "PUT", "/pushrules/global/override/best.friend", body, access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
 | 
						|
        # GET enabled for that new rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "GET", "/pushrules/global/override/best.friend/enabled", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
        self.assertEqual(channel.json_body["enabled"], True)
 | 
						|
 | 
						|
    def test_enabled_disable(self):
 | 
						|
        """
 | 
						|
        Tests the GET and PUT of push rules' `enabled` endpoints.
 | 
						|
        Tests that a rule is disabled and enabled when we ask for it.
 | 
						|
        """
 | 
						|
        self.register_user("user", "pass")
 | 
						|
        token = self.login("user", "pass")
 | 
						|
 | 
						|
        body = {
 | 
						|
            "conditions": [
 | 
						|
                {"kind": "event_match", "key": "sender", "pattern": "@user2:hs"}
 | 
						|
            ],
 | 
						|
            "actions": ["notify", {"set_tweak": "highlight"}],
 | 
						|
        }
 | 
						|
 | 
						|
        # PUT a new rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "PUT", "/pushrules/global/override/best.friend", body, access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
 | 
						|
        # disable the rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "PUT",
 | 
						|
            "/pushrules/global/override/best.friend/enabled",
 | 
						|
            {"enabled": False},
 | 
						|
            access_token=token,
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
 | 
						|
        # check rule disabled
 | 
						|
        channel = self.make_request(
 | 
						|
            "GET", "/pushrules/global/override/best.friend/enabled", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
        self.assertEqual(channel.json_body["enabled"], False)
 | 
						|
 | 
						|
        # re-enable the rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "PUT",
 | 
						|
            "/pushrules/global/override/best.friend/enabled",
 | 
						|
            {"enabled": True},
 | 
						|
            access_token=token,
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
 | 
						|
        # check rule enabled
 | 
						|
        channel = self.make_request(
 | 
						|
            "GET", "/pushrules/global/override/best.friend/enabled", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
        self.assertEqual(channel.json_body["enabled"], True)
 | 
						|
 | 
						|
    def test_enabled_404_when_get_non_existent(self):
 | 
						|
        """
 | 
						|
        Tests that `enabled` gives 404 when the rule doesn't exist.
 | 
						|
        """
 | 
						|
        self.register_user("user", "pass")
 | 
						|
        token = self.login("user", "pass")
 | 
						|
 | 
						|
        body = {
 | 
						|
            "conditions": [
 | 
						|
                {"kind": "event_match", "key": "sender", "pattern": "@user2:hs"}
 | 
						|
            ],
 | 
						|
            "actions": ["notify", {"set_tweak": "highlight"}],
 | 
						|
        }
 | 
						|
 | 
						|
        # check 404 for never-heard-of rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "GET", "/pushrules/global/override/best.friend/enabled", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 404)
 | 
						|
        self.assertEqual(channel.json_body["errcode"], Codes.NOT_FOUND)
 | 
						|
 | 
						|
        # PUT a new rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "PUT", "/pushrules/global/override/best.friend", body, access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
 | 
						|
        # GET enabled for that new rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "GET", "/pushrules/global/override/best.friend/enabled", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
 | 
						|
        # DELETE the rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "DELETE", "/pushrules/global/override/best.friend", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
 | 
						|
        # check 404 for deleted rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "GET", "/pushrules/global/override/best.friend/enabled", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 404)
 | 
						|
        self.assertEqual(channel.json_body["errcode"], Codes.NOT_FOUND)
 | 
						|
 | 
						|
    def test_enabled_404_when_get_non_existent_server_rule(self):
 | 
						|
        """
 | 
						|
        Tests that `enabled` gives 404 when the server-default rule doesn't exist.
 | 
						|
        """
 | 
						|
        self.register_user("user", "pass")
 | 
						|
        token = self.login("user", "pass")
 | 
						|
 | 
						|
        # check 404 for never-heard-of rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "GET", "/pushrules/global/override/.m.muahahaha/enabled", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 404)
 | 
						|
        self.assertEqual(channel.json_body["errcode"], Codes.NOT_FOUND)
 | 
						|
 | 
						|
    def test_enabled_404_when_put_non_existent_rule(self):
 | 
						|
        """
 | 
						|
        Tests that `enabled` gives 404 when we put to a rule that doesn't exist.
 | 
						|
        """
 | 
						|
        self.register_user("user", "pass")
 | 
						|
        token = self.login("user", "pass")
 | 
						|
 | 
						|
        # enable & check 404 for never-heard-of rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "PUT",
 | 
						|
            "/pushrules/global/override/best.friend/enabled",
 | 
						|
            {"enabled": True},
 | 
						|
            access_token=token,
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 404)
 | 
						|
        self.assertEqual(channel.json_body["errcode"], Codes.NOT_FOUND)
 | 
						|
 | 
						|
    def test_enabled_404_when_put_non_existent_server_rule(self):
 | 
						|
        """
 | 
						|
        Tests that `enabled` gives 404 when we put to a server-default rule that doesn't exist.
 | 
						|
        """
 | 
						|
        self.register_user("user", "pass")
 | 
						|
        token = self.login("user", "pass")
 | 
						|
 | 
						|
        # enable & check 404 for never-heard-of rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "PUT",
 | 
						|
            "/pushrules/global/override/.m.muahahah/enabled",
 | 
						|
            {"enabled": True},
 | 
						|
            access_token=token,
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 404)
 | 
						|
        self.assertEqual(channel.json_body["errcode"], Codes.NOT_FOUND)
 | 
						|
 | 
						|
    def test_actions_get(self):
 | 
						|
        """
 | 
						|
        Tests that `actions` gives you what you expect on a fresh rule.
 | 
						|
        """
 | 
						|
        self.register_user("user", "pass")
 | 
						|
        token = self.login("user", "pass")
 | 
						|
 | 
						|
        body = {
 | 
						|
            "conditions": [
 | 
						|
                {"kind": "event_match", "key": "sender", "pattern": "@user2:hs"}
 | 
						|
            ],
 | 
						|
            "actions": ["notify", {"set_tweak": "highlight"}],
 | 
						|
        }
 | 
						|
 | 
						|
        # PUT a new rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "PUT", "/pushrules/global/override/best.friend", body, access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
 | 
						|
        # GET actions for that new rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "GET", "/pushrules/global/override/best.friend/actions", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
        self.assertEqual(
 | 
						|
            channel.json_body["actions"], ["notify", {"set_tweak": "highlight"}]
 | 
						|
        )
 | 
						|
 | 
						|
    def test_actions_put(self):
 | 
						|
        """
 | 
						|
        Tests that PUT on actions updates the value you'd get from GET.
 | 
						|
        """
 | 
						|
        self.register_user("user", "pass")
 | 
						|
        token = self.login("user", "pass")
 | 
						|
 | 
						|
        body = {
 | 
						|
            "conditions": [
 | 
						|
                {"kind": "event_match", "key": "sender", "pattern": "@user2:hs"}
 | 
						|
            ],
 | 
						|
            "actions": ["notify", {"set_tweak": "highlight"}],
 | 
						|
        }
 | 
						|
 | 
						|
        # PUT a new rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "PUT", "/pushrules/global/override/best.friend", body, access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
 | 
						|
        # change the rule actions
 | 
						|
        channel = self.make_request(
 | 
						|
            "PUT",
 | 
						|
            "/pushrules/global/override/best.friend/actions",
 | 
						|
            {"actions": ["dont_notify"]},
 | 
						|
            access_token=token,
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
 | 
						|
        # GET actions for that new rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "GET", "/pushrules/global/override/best.friend/actions", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
        self.assertEqual(channel.json_body["actions"], ["dont_notify"])
 | 
						|
 | 
						|
    def test_actions_404_when_get_non_existent(self):
 | 
						|
        """
 | 
						|
        Tests that `actions` gives 404 when the rule doesn't exist.
 | 
						|
        """
 | 
						|
        self.register_user("user", "pass")
 | 
						|
        token = self.login("user", "pass")
 | 
						|
 | 
						|
        body = {
 | 
						|
            "conditions": [
 | 
						|
                {"kind": "event_match", "key": "sender", "pattern": "@user2:hs"}
 | 
						|
            ],
 | 
						|
            "actions": ["notify", {"set_tweak": "highlight"}],
 | 
						|
        }
 | 
						|
 | 
						|
        # check 404 for never-heard-of rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "GET", "/pushrules/global/override/best.friend/enabled", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 404)
 | 
						|
        self.assertEqual(channel.json_body["errcode"], Codes.NOT_FOUND)
 | 
						|
 | 
						|
        # PUT a new rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "PUT", "/pushrules/global/override/best.friend", body, access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
 | 
						|
        # DELETE the rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "DELETE", "/pushrules/global/override/best.friend", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 200)
 | 
						|
 | 
						|
        # check 404 for deleted rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "GET", "/pushrules/global/override/best.friend/enabled", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 404)
 | 
						|
        self.assertEqual(channel.json_body["errcode"], Codes.NOT_FOUND)
 | 
						|
 | 
						|
    def test_actions_404_when_get_non_existent_server_rule(self):
 | 
						|
        """
 | 
						|
        Tests that `actions` gives 404 when the server-default rule doesn't exist.
 | 
						|
        """
 | 
						|
        self.register_user("user", "pass")
 | 
						|
        token = self.login("user", "pass")
 | 
						|
 | 
						|
        # check 404 for never-heard-of rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "GET", "/pushrules/global/override/.m.muahahaha/actions", access_token=token
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 404)
 | 
						|
        self.assertEqual(channel.json_body["errcode"], Codes.NOT_FOUND)
 | 
						|
 | 
						|
    def test_actions_404_when_put_non_existent_rule(self):
 | 
						|
        """
 | 
						|
        Tests that `actions` gives 404 when putting to a rule that doesn't exist.
 | 
						|
        """
 | 
						|
        self.register_user("user", "pass")
 | 
						|
        token = self.login("user", "pass")
 | 
						|
 | 
						|
        # enable & check 404 for never-heard-of rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "PUT",
 | 
						|
            "/pushrules/global/override/best.friend/actions",
 | 
						|
            {"actions": ["dont_notify"]},
 | 
						|
            access_token=token,
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 404)
 | 
						|
        self.assertEqual(channel.json_body["errcode"], Codes.NOT_FOUND)
 | 
						|
 | 
						|
    def test_actions_404_when_put_non_existent_server_rule(self):
 | 
						|
        """
 | 
						|
        Tests that `actions` gives 404 when putting to a server-default rule that doesn't exist.
 | 
						|
        """
 | 
						|
        self.register_user("user", "pass")
 | 
						|
        token = self.login("user", "pass")
 | 
						|
 | 
						|
        # enable & check 404 for never-heard-of rule
 | 
						|
        channel = self.make_request(
 | 
						|
            "PUT",
 | 
						|
            "/pushrules/global/override/.m.muahahah/actions",
 | 
						|
            {"actions": ["dont_notify"]},
 | 
						|
            access_token=token,
 | 
						|
        )
 | 
						|
        self.assertEqual(channel.code, 404)
 | 
						|
        self.assertEqual(channel.json_body["errcode"], Codes.NOT_FOUND)
 |