from __future__ import absolute_import, division, print_function, annotations import json import types import pytest from _pytest.monkeypatch import MonkeyPatch from ansible_collections.famedly.matrix.plugins.module_utils import synapse from ansible_collections.famedly.matrix.plugins.modules import synapse_ratelimit from ansible_collections.famedly.matrix.tests.unit.mock_synapse.requests.RequestsBase import ( RequestsBase, ) from ansible_collections.famedly.matrix.tests.unit.utils import ( AnsibleExitJson, AnsibleFailJson, assert_expression, set_module_args, exit_json, fail_json, ) class TestAnsibleSynapseRatelimit: @staticmethod def patchModule( monkeypatch: MonkeyPatch, target_module, mock_class: type(RequestsBase) ): # Mock ansible functions monkeypatch.setattr(target_module.AnsibleModule, "exit_json", exit_json) monkeypatch.setattr(target_module.AnsibleModule, "fail_json", fail_json) # Mock MatrixNio for method in RequestsBase.__dict__: if isinstance( getattr(mock_class, method), (types.FunctionType, types.BuiltinFunctionType), ): monkeypatch.setattr( synapse.requests, method, getattr(mock_class, method) ) # Success tests def test_synapse_ratelimit_get(self, monkeypatch): self.patchModule(monkeypatch, synapse_ratelimit, RequestsBase) response = { "_synapse/admin/v1/users/myuser/override_ratelimit": { "status": 200, "content": '{"messages_per_second": 0,"burst_count": 0}', } } monkeypatch.setenv("REQUESTS_GET_RESPONSE", json.dumps(response)) set_module_args( { "hs_url": "matrix.example.tld", "user_id": "myuser", "access_token": "supersecrettoken", "action": "get", } ) with pytest.raises(AnsibleExitJson) as result: synapse_ratelimit.main() ansible_result = result.value.result assert_expression(ansible_result["changed"] is False) def test_synapse_ratelimit_set_changes(self, monkeypatch): self.patchModule(monkeypatch, synapse_ratelimit, RequestsBase) get_response = { "_synapse/admin/v1/users/myuser/override_ratelimit": { "status": 200, "content": '{"messages_per_second": 0,"burst_count": 0}', } } monkeypatch.setenv("REQUESTS_GET_RESPONSE", json.dumps(get_response)) post_response = { "_synapse/admin/v1/users/myuser/override_ratelimit": { "status": 200, "content": '{"messages_per_second": 10,"burst_count": 10}', } } monkeypatch.setenv("REQUESTS_POST_RESPONSE", json.dumps(post_response)) set_module_args( { "hs_url": "matrix.example.tld", "user_id": "myuser", "access_token": "supersecrettoken", "action": "set", "messages_per_second": 10, "burst_count": 10, } ) with pytest.raises(AnsibleExitJson) as result: synapse_ratelimit.main() ansible_result = result.value.result assert_expression(ansible_result["changed"] is True) def test_synapse_ratelimit_set_no_changes(self, monkeypatch): self.patchModule(monkeypatch, synapse_ratelimit, RequestsBase) get_response = { "_synapse/admin/v1/users/myuser/override_ratelimit": { "status": 200, "content": '{"messages_per_second": 10,"burst_count": 10}', } } monkeypatch.setenv("REQUESTS_GET_RESPONSE", json.dumps(get_response)) post_response = { "_synapse/admin/v1/users/myuser/override_ratelimit": { "status": 200, "content": '{"messages_per_second": 10,"burst_count": 10}', } } monkeypatch.setenv("REQUESTS_POST_RESPONSE", json.dumps(post_response)) set_module_args( { "hs_url": "matrix.example.tld", "user_id": "myuser", "access_token": "supersecrettoken", "action": "set", "messages_per_second": 10, "burst_count": 10, } ) with pytest.raises(AnsibleExitJson) as result: synapse_ratelimit.main() ansible_result = result.value.result assert_expression(ansible_result["changed"] is False) def test_synapse_ratelimit_delete(self, monkeypatch): self.patchModule(monkeypatch, synapse_ratelimit, RequestsBase) get_response = { "_synapse/admin/v1/users/myuser/override_ratelimit": { "status": 200, "content": '{"messages_per_second": 10,"burst_count": 10}', } } monkeypatch.setenv("REQUESTS_GET_RESPONSE", json.dumps(get_response)) delete_response = { "_synapse/admin/v1/users/myuser/override_ratelimit": { "status": 200, "content": "{}", } } monkeypatch.setenv("REQUESTS_DELETE_RESPONSE", json.dumps(delete_response)) set_module_args( { "hs_url": "matrix.example.tld", "user_id": "myuser", "access_token": "supersecrettoken", "action": "delete", } ) with pytest.raises(AnsibleExitJson) as result: synapse_ratelimit.main() ansible_result = result.value.result assert_expression(ansible_result["changed"] is True) def test_synapse_ratelimit_get_failure(self, monkeypatch): self.patchModule(monkeypatch, synapse_ratelimit, RequestsBase) response = { "_synapse/admin/v1/users/myuser/override_ratelimit": { "status": 500, "content": "mocked failure", } } monkeypatch.setenv("REQUESTS_GET_RESPONSE", json.dumps(response)) set_module_args( { "hs_url": "matrix.example.tld", "user_id": "myuser", "access_token": "supersecrettoken", "action": "get", } ) with pytest.raises(AnsibleFailJson) as result: synapse_ratelimit.main() def test_synapse_ratelimit_set_failure(self, monkeypatch): self.patchModule(monkeypatch, synapse_ratelimit, RequestsBase) get_response = { "_synapse/admin/v1/users/myuser/override_ratelimit": { "status": 200, "content": '{"messages_per_second": 0,"burst_count": 0}', } } monkeypatch.setenv("REQUESTS_GET_RESPONSE", json.dumps(get_response)) post_response = { "_synapse/admin/v1/users/myuser/override_ratelimit": { "status": 500, "content": "mocked failure", } } monkeypatch.setenv("REQUESTS_POST_RESPONSE", json.dumps(post_response)) set_module_args( { "hs_url": "matrix.example.tld", "user_id": "myuser", "access_token": "supersecrettoken", "action": "set", "messages_per_second": 10, "burst_count": 10, } ) with pytest.raises(AnsibleFailJson) as result: synapse_ratelimit.main() def test_synapse_ratelimit_delete_failure(self, monkeypatch): self.patchModule(monkeypatch, synapse_ratelimit, RequestsBase) get_response = { "_synapse/admin/v1/users/myuser/override_ratelimit": { "status": 200, "content": '{"messages_per_second": 0,"burst_count": 0}', } } monkeypatch.setenv("REQUESTS_GET_RESPONSE", json.dumps(get_response)) delete_response = { "_synapse/admin/v1/users/myuser/override_ratelimit": { "status": 500, "content": "mocked failure", } } monkeypatch.setenv("REQUESTS_DELETE_RESPONSE", json.dumps(delete_response)) set_module_args( { "hs_url": "matrix.example.tld", "user_id": "myuser", "access_token": "supersecrettoken", "action": "delete", } ) with pytest.raises(AnsibleFailJson) as result: synapse_ratelimit.main()