| import responses |
| import pytest |
| import json |
| from copy import deepcopy |
| from matrix_client import client, api |
| from matrix_client.errors import MatrixRequestError, MatrixError, MatrixHttpLibError |
| from matrix_client import __version__ as lib_version |
| from . import response_examples |
| MATRIX_V2_API_PATH = "/_matrix/client/r0" |
|
|
|
|
| class TestTagsApi: |
| cli = client.MatrixClient("http://example.com") |
| user_id = "@user:matrix.org" |
| room_id = "#foo:matrix.org" |
|
|
| @responses.activate |
| def test_get_user_tags(self): |
| tags_url = "http://example.com" \ |
| "/_matrix/client/r0/user/@user:matrix.org/rooms/#foo:matrix.org/tags" |
| responses.add(responses.GET, tags_url, body='{}') |
| self.cli.api.get_user_tags(self.user_id, self.room_id) |
| req = responses.calls[0].request |
| assert req.url == tags_url |
| assert req.method == 'GET' |
|
|
| @responses.activate |
| def test_add_user_tags(self): |
| tags_url = "http://example.com" \ |
| "/_matrix/client/r0/user/@user:matrix.org/rooms/#foo:matrix.org/tags/foo" |
| responses.add(responses.PUT, tags_url, body='{}') |
| self.cli.api.add_user_tag(self.user_id, self.room_id, "foo", body={"order": "5"}) |
| req = responses.calls[0].request |
| assert req.url == tags_url |
| assert req.method == 'PUT' |
|
|
| @responses.activate |
| def test_remove_user_tags(self): |
| tags_url = "http://example.com" \ |
| "/_matrix/client/r0/user/@user:matrix.org/rooms/#foo:matrix.org/tags/foo" |
| responses.add(responses.DELETE, tags_url, body='{}') |
| self.cli.api.remove_user_tag(self.user_id, self.room_id, "foo") |
| req = responses.calls[0].request |
| assert req.url == tags_url |
| assert req.method == 'DELETE' |
|
|
|
|
| class TestAccountDataApi: |
| cli = client.MatrixClient("http://example.com") |
| user_id = "@user:matrix.org" |
| room_id = "#foo:matrix.org" |
|
|
| @responses.activate |
| def test_set_account_data(self): |
| account_data_url = "http://example.com" \ |
| "/_matrix/client/r0/user/@user:matrix.org/account_data/foo" |
| responses.add(responses.PUT, account_data_url, body='{}') |
| self.cli.api.set_account_data(self.user_id, 'foo', {'bar': 1}) |
| req = responses.calls[0].request |
| assert req.url == account_data_url |
| assert req.method == 'PUT' |
|
|
| @responses.activate |
| def test_set_room_account_data(self): |
| account_data_url = "http://example.com/_matrix/client/r0/user" \ |
| "/@user:matrix.org/rooms/#foo:matrix.org/account_data/foo" |
| responses.add(responses.PUT, account_data_url, body='{}') |
| self.cli.api.set_room_account_data(self.user_id, self.room_id, 'foo', {'bar': 1}) |
| req = responses.calls[0].request |
| assert req.url == account_data_url |
| assert req.method == 'PUT' |
|
|
|
|
| class TestUnbanApi: |
| cli = client.MatrixClient("http://example.com") |
| user_id = "@user:matrix.org" |
| room_id = "#foo:matrix.org" |
|
|
| @responses.activate |
| def test_unban(self): |
| unban_url = "http://example.com" \ |
| "/_matrix/client/r0/rooms/#foo:matrix.org/unban" |
| responses.add(responses.POST, unban_url, body='{}') |
| self.cli.api.unban_user(self.room_id, self.user_id) |
| req = responses.calls[0].request |
| assert req.url == unban_url |
| assert req.method == 'POST' |
|
|
|
|
| class TestDeviceApi: |
| cli = client.MatrixClient("http://example.com") |
| device_id = "QBUAZIFURK" |
| display_name = "test_name" |
| auth_body = { |
| "auth": { |
| "type": "example.type.foo", |
| "session": "xxxxx", |
| "example_credential": "verypoorsharedsecret" |
| } |
| } |
|
|
| @responses.activate |
| def test_get_devices(self): |
| get_devices_url = "http://example.com/_matrix/client/r0/devices" |
| responses.add(responses.GET, get_devices_url, body='{}') |
| self.cli.api.get_devices() |
| req = responses.calls[0].request |
| assert req.url == get_devices_url |
| assert req.method == 'GET' |
|
|
| @responses.activate |
| def test_get_device(self): |
| get_device_url = "http://example.com/_matrix/client/r0/devices/QBUAZIFURK" |
| responses.add(responses.GET, get_device_url, body='{}') |
| self.cli.api.get_device(self.device_id) |
| req = responses.calls[0].request |
| assert req.url == get_device_url |
| assert req.method == 'GET' |
|
|
| @responses.activate |
| def test_update_device_info(self): |
| update_url = "http://example.com/_matrix/client/r0/devices/QBUAZIFURK" |
| responses.add(responses.PUT, update_url, body='{}') |
| self.cli.api.update_device_info(self.device_id, self.display_name) |
| req = responses.calls[0].request |
| assert req.url == update_url |
| assert req.method == 'PUT' |
|
|
| @responses.activate |
| def test_delete_device(self): |
| delete_device_url = "http://example.com/_matrix/client/r0/devices/QBUAZIFURK" |
| responses.add(responses.DELETE, delete_device_url, body='{}') |
| |
| responses.add(responses.DELETE, delete_device_url, body='{}', status=401) |
| self.cli.api.delete_device(self.auth_body, self.device_id) |
| req = responses.calls[0].request |
| assert req.url == delete_device_url |
| assert req.method == 'DELETE' |
|
|
| with pytest.raises(MatrixRequestError): |
| self.cli.api.delete_device(self.auth_body, self.device_id) |
|
|
| @responses.activate |
| def test_delete_devices(self): |
| delete_devices_url = "http://example.com/_matrix/client/r0/delete_devices" |
| responses.add(responses.POST, delete_devices_url, body='{}') |
| |
| responses.add(responses.POST, delete_devices_url, body='{}', status=401) |
| self.cli.api.delete_devices(self.auth_body, [self.device_id]) |
| req = responses.calls[0].request |
| assert req.url == delete_devices_url |
| assert req.method == 'POST' |
|
|
| with pytest.raises(MatrixRequestError): |
| self.cli.api.delete_devices(self.auth_body, [self.device_id]) |
|
|
|
|
| class TestKeysApi: |
| cli = client.MatrixClient("http://example.com") |
| user_id = "@alice:matrix.org" |
| device_id = "JLAFKJWSCS" |
| one_time_keys = {"curve25519:AAAAAQ": "/qyvZvwjiTxGdGU0RCguDCLeR+nmsb3FfNG3/Ve4vU8"} |
| device_keys = { |
| "user_id": "@alice:example.com", |
| "device_id": "JLAFKJWSCS", |
| "algorithms": [ |
| "m.olm.curve25519-aes-sha256", |
| "m.megolm.v1.aes-sha" |
| ], |
| "keys": { |
| "curve25519:JLAFKJWSCS": "3C5BFWi2Y8MaVvjM8M22DBmh24PmgR0nPvJOIArzgyI", |
| "ed25519:JLAFKJWSCS": "lEuiRJBit0IG6nUf5pUzWTUEsRVVe/HJkoKuEww9ULI" |
| }, |
| "signatures": { |
| "@alice:example.com": { |
| "ed25519:JLAFKJWSCS": ("dSO80A01XiigH3uBiDVx/EjzaoycHcjq9lfQX0uWsqxl2gi" |
| "MIiSPR8a4d291W1ihKJL/a+myXS367WT6NAIcBA") |
| } |
| } |
| } |
|
|
| @responses.activate |
| @pytest.mark.parametrize("args", [ |
| {}, |
| {'device_keys': device_keys}, |
| {'one_time_keys': one_time_keys} |
| ]) |
| def test_upload_keys(self, args): |
| upload_keys_url = "http://example.com/_matrix/client/r0/keys/upload" |
| responses.add(responses.POST, upload_keys_url, body='{}') |
| self.cli.api.upload_keys(**args) |
| req = responses.calls[0].request |
| assert req.url == upload_keys_url |
| assert req.method == 'POST' |
|
|
| @responses.activate |
| def test_query_keys(self): |
| query_user_keys_url = "http://example.com/_matrix/client/r0/keys/query" |
| responses.add(responses.POST, query_user_keys_url, body='{}') |
| self.cli.api.query_keys({self.user_id: self.device_id}, timeout=10) |
| req = responses.calls[0].request |
| assert req.url == query_user_keys_url |
| assert req.method == 'POST' |
|
|
| @responses.activate |
| def test_claim_keys(self): |
| claim_keys_url = "http://example.com/_matrix/client/r0/keys/claim" |
| responses.add(responses.POST, claim_keys_url, body='{}') |
| self.cli.api.claim_keys({self.user_id: {self.device_id: "algo"}}, timeout=1000) |
| req = responses.calls[0].request |
| assert req.url == claim_keys_url |
| assert req.method == 'POST' |
|
|
| @responses.activate |
| def test_key_changes(self): |
| key_changes_url = "http://example.com/_matrix/client/r0/keys/changes" |
| responses.add(responses.GET, key_changes_url, body='{}') |
| self.cli.api.key_changes('s72594_4483_1934', 's75689_5632_2435') |
| req = responses.calls[0].request |
| assert req.url.split('?')[0] == key_changes_url |
| assert req.method == 'GET' |
|
|
|
|
| class TestSendToDeviceApi: |
| cli = client.MatrixClient("http://example.com") |
| user_id = "@alice:matrix.org" |
| device_id = "JLAFKJWSCS" |
|
|
| @responses.activate |
| def test_send_to_device(self): |
| txn_id = self.cli.api._make_txn_id() |
| send_to_device_url = \ |
| "http://example.com/_matrix/client/r0/sendToDevice/m.new_device/" + txn_id |
| responses.add(responses.PUT, send_to_device_url, body='{}') |
| payload = {self.user_id: {self.device_id: {"test": 1}}} |
| self.cli.api.send_to_device("m.new_device", payload, txn_id) |
| req = responses.calls[0].request |
| assert req.url == send_to_device_url |
| assert req.method == 'PUT' |
|
|
|
|
| class TestMainApi: |
| user_id = "@alice:matrix.org" |
| token = "Dp0YKRXwx0iWDhFj7lg3DVjwsWzGcUIgARljgyAip2JD8qd5dSaW" \ |
| "cxowTKEFetPulfLijAhv8eOmUSScyGcWgZyNMRTBmoJ0RFc0HotPvTBZ" \ |
| "U98yKRLtat7V43aCpFmK" |
| test_path = "/account/whoami" |
|
|
| @responses.activate |
| def test_send_token_header(self): |
| mapi = api.MatrixHttpApi("http://example.com", token=self.token) |
| responses.add( |
| responses.GET, |
| mapi._base_url+MATRIX_V2_API_PATH+self.test_path, |
| body='{"application/json": {"user_id": "%s"}}' % self.user_id |
| ) |
| mapi._send("GET", self.test_path) |
| req = responses.calls[0].request |
| assert req.method == 'GET' |
| assert req.headers['Authorization'] == 'Bearer %s' % self.token |
|
|
| @responses.activate |
| def test_send_user_agent_header(self): |
| mapi = api.MatrixHttpApi("http://example.com") |
| responses.add( |
| responses.GET, |
| mapi._base_url+MATRIX_V2_API_PATH+self.test_path, |
| body='{"application/json": {"user_id": "%s"}}' % self.user_id |
| ) |
| mapi._send("GET", self.test_path) |
| req = responses.calls[0].request |
| assert req.method == 'GET' |
| assert req.headers['User-Agent'] == 'matrix-python-sdk/%s' % lib_version |
|
|
| @responses.activate |
| def test_send_token_query(self): |
| mapi = api.MatrixHttpApi( |
| "http://example.com", |
| token=self.token, |
| use_authorization_header=False |
| ) |
| responses.add( |
| responses.GET, |
| mapi._base_url+MATRIX_V2_API_PATH+self.test_path, |
| body='{"application/json": {"user_id": "%s"}}' % self.user_id |
| ) |
| mapi._send("GET", self.test_path) |
| req = responses.calls[0].request |
| assert req.method == 'GET' |
| assert self.token in req.url |
|
|
| @responses.activate |
| def test_send_user_id(self): |
| mapi = api.MatrixHttpApi( |
| "http://example.com", |
| token=self.token, |
| identity=self.user_id |
| ) |
| responses.add( |
| responses.GET, |
| mapi._base_url+MATRIX_V2_API_PATH+self.test_path, |
| body='{"application/json": {"user_id": "%s"}}' % self.user_id |
| ) |
| mapi._send("GET", self.test_path) |
| req = responses.calls[0].request |
| assert "user_id" in req.url |
|
|
| @responses.activate |
| def test_send_unsup_method(self): |
| mapi = api.MatrixHttpApi("http://example.com") |
| with pytest.raises(MatrixError): |
| mapi._send("GOT", self.test_path) |
|
|
| @responses.activate |
| def test_send_request_error(self): |
| mapi = api.MatrixHttpApi("http://example.com") |
| with pytest.raises(MatrixHttpLibError): |
| mapi._send("GET", self.test_path) |
|
|
|
|
| class TestMediaApi: |
| cli = client.MatrixClient("http://example.com") |
| user_id = "@alice:example.com" |
| mxcurl = "mxc://example.com/OonjUOmcuVpUnmOWKtzPmAFe" |
|
|
| @responses.activate |
| def test_media_download(self): |
| media_url = \ |
| "http://example.com/_matrix/media/r0/download/" + self.mxcurl[6:] |
| with open('test/response_examples.py', 'rb') as fil: |
| responses.add( |
| responses.GET, media_url, |
| content_type='application/python', |
| body=fil.read(), status=200, stream=True |
| ) |
| resp = self.cli.api.media_download(self.mxcurl, allow_remote=False) |
| resp.raw.decode_content = True |
| req = responses.calls[0].request |
| assert req.url.split('?')[0] == media_url |
| assert req.method == 'GET' |
|
|
| def test_media_download_wrong_url(self): |
| with pytest.raises(ValueError): |
| self.cli.api.media_download(self.mxcurl[6:]) |
|
|
| @responses.activate |
| def test_get_thumbnail(self): |
| media_url = \ |
| "http://example.com/_matrix/media/r0/thumbnail/" + self.mxcurl[6:] |
| with open('test/response_examples.py', 'rb') as fil: |
| responses.add( |
| responses.GET, media_url, |
| content_type='application/python', |
| body=fil.read(), status=200, stream=True |
| ) |
| resp = self.cli.api.get_thumbnail( |
| self.mxcurl, 28, 28, allow_remote=False |
| ) |
| resp.raw.decode_content = True |
| req = responses.calls[0].request |
| assert req.url.split('?')[0] == media_url |
| assert req.method == 'GET' |
|
|
| def test_get_thumbnail_wrong_url(self): |
| with pytest.raises(ValueError): |
| self.cli.api.get_thumbnail(self.mxcurl[6:], 28, 28) |
|
|
| def test_get_thumbnail_wrong_method(self): |
| with pytest.raises(ValueError): |
| self.cli.api.get_thumbnail(self.mxcurl, 28, 28, 'cut') |
|
|
| @responses.activate |
| def test_get_url_preview(self): |
| media_url = \ |
| "http://example.com/_matrix/media/r0/preview_url" |
| preview_url = deepcopy(response_examples.example_preview_url) |
| responses.add( |
| responses.GET, media_url, |
| body=json.dumps(preview_url) |
| ) |
| self.cli.api.get_url_preview("https://google.com/", 1510610716656) |
| req = responses.calls[0].request |
| assert req.url.split('?')[0] == media_url |
| assert req.method == 'GET' |
|
|
|
|
| class TestRoomApi: |
| cli = client.MatrixClient("http://example.com") |
| user_id = "@user:matrix.org" |
| room_id = "#foo:matrix.org" |
|
|
| @responses.activate |
| def test_create_room_visibility_public(self): |
| create_room_url = "http://example.com" \ |
| "/_matrix/client/r0/createRoom" |
| responses.add( |
| responses.POST, |
| create_room_url, |
| json='{"room_id": "!sefiuhWgwghwWgh:example.com"}' |
| ) |
| self.cli.api.create_room( |
| name="test", |
| alias="#test:example.com", |
| is_public=True |
| ) |
| req = responses.calls[0].request |
| assert req.url == create_room_url |
| assert req.method == 'POST' |
| j = json.loads(req.body) |
| assert j["room_alias_name"] == "#test:example.com" |
| assert j["visibility"] == "public" |
| assert j["name"] == "test" |
|
|
| @responses.activate |
| def test_create_room_visibility_private(self): |
| create_room_url = "http://example.com" \ |
| "/_matrix/client/r0/createRoom" |
| responses.add( |
| responses.POST, |
| create_room_url, |
| json='{"room_id": "!sefiuhWgwghwWgh:example.com"}' |
| ) |
| self.cli.api.create_room( |
| name="test", |
| alias="#test:example.com", |
| is_public=False |
| ) |
| req = responses.calls[0].request |
| assert req.url == create_room_url |
| assert req.method == 'POST' |
| j = json.loads(req.body) |
| assert j["room_alias_name"] == "#test:example.com" |
| assert j["visibility"] == "private" |
| assert j["name"] == "test" |
|
|
| @responses.activate |
| def test_create_room_federate_true(self): |
| create_room_url = "http://example.com" \ |
| "/_matrix/client/r0/createRoom" |
| responses.add( |
| responses.POST, |
| create_room_url, |
| json='{"room_id": "!sefiuhWgwghwWgh:example.com"}' |
| ) |
| self.cli.api.create_room( |
| name="test2", |
| alias="#test2:example.com", |
| federate=True |
| ) |
| req = responses.calls[0].request |
| assert req.url == create_room_url |
| assert req.method == 'POST' |
| j = json.loads(req.body) |
| assert j["creation_content"]["m.federate"] |
|
|
| @responses.activate |
| def test_create_room_federate_false(self): |
| create_room_url = "http://example.com" \ |
| "/_matrix/client/r0/createRoom" |
| responses.add( |
| responses.POST, |
| create_room_url, |
| json='{"room_id": "!sefiuhWgwghwWgh:example.com"}' |
| ) |
| self.cli.api.create_room( |
| name="test", |
| alias="#test:example.com", |
| federate=False |
| ) |
| req = responses.calls[0].request |
| assert req.url == create_room_url |
| assert req.method == 'POST' |
| j = json.loads(req.body) |
| assert not j["creation_content"]["m.federate"] |
|
|
|
|
| class TestWhoamiQuery: |
| user_id = "@alice:example.com" |
| token = "Dp0YKRXwx0iWDhFj7lg3DVjwsWzGcUIgARljgyAip2JD8qd5dSaW" \ |
| "cxowTKEFetPulfLijAhv8eOmUSScyGcWgZyNMRTBmoJ0RFc0HotPvTBZ" \ |
| "U98yKRLtat7V43aCpFmK" |
|
|
| @responses.activate |
| def test_whoami(self): |
| mapi = api.MatrixHttpApi("http://example.com", token=self.token) |
| whoami_url = "http://example.com/_matrix/client/r0/account/whoami" |
| responses.add( |
| responses.GET, |
| whoami_url, |
| body='{"user_id": "%s"}' % self.user_id |
| ) |
| mapi.whoami() |
| req = responses.calls[0].request |
| assert req.method == 'GET' |
| assert whoami_url in req.url |
|
|
| @responses.activate |
| def test_whoami_unauth(self): |
| mapi = api.MatrixHttpApi("http://example.com") |
| whoami_url = "http://example.com/_matrix/client/r0/account/whoami" |
| responses.add( |
| responses.GET, |
| whoami_url, |
| body='{"user_id": "%s"}' % self.user_id |
| ) |
| with pytest.raises(MatrixError): |
| mapi.whoami() |
|
|