mirror of
https://github.com/gogcom/galaxy-integrations-python-api.git
synced 2026-01-01 03:18:25 -05:00
Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
701d3cf522 | ||
|
|
c8083b9006 | ||
|
|
0608ade6d3 | ||
|
|
c349a3df8e | ||
|
|
1fd959a665 | ||
|
|
234a21d085 | ||
|
|
90835ece58 | ||
|
|
9e1c8cfddd | ||
|
|
f7f170b9ca | ||
|
|
8ad5ed76b7 | ||
|
|
7727098c6f | ||
|
|
e53dc8f2c6 | ||
|
|
527fd034bf | ||
|
|
6e251c6eb9 | ||
|
|
dc9fc2cc5d | ||
|
|
1fb79eb21a | ||
|
|
7b9bcf86a1 | ||
|
|
30b3533e1d | ||
|
|
92b1d8e4df | ||
|
|
4adef2dace | ||
|
|
1430fe39d7 | ||
|
|
c591efc493 | ||
|
|
7c4f3fba5b | ||
|
|
f2e2e41d04 | ||
|
|
25b850d8bb | ||
|
|
403736612a | ||
|
|
3071c2e771 | ||
|
|
23ef34bed5 | ||
|
|
a4b08f8105 | ||
|
|
4d62b8ccb8 |
@@ -34,6 +34,8 @@ pytest
|
|||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
|
### 0.21
|
||||||
|
* Add `Epic` platform.
|
||||||
### 0.16
|
### 0.16
|
||||||
* Do not log sensitive data.
|
* Do not log sensitive data.
|
||||||
* Return `LocalGameState` as int (possible combination of flags).
|
* Return `LocalGameState` as int (possible combination of flags).
|
||||||
|
|||||||
@@ -1,2 +1,6 @@
|
|||||||
|
-e .
|
||||||
pytest==4.2.0
|
pytest==4.2.0
|
||||||
pytest-flakes==4.0.0
|
pytest-flakes==4.0.0
|
||||||
|
# because of pip bug https://github.com/pypa/pip/issues/4780
|
||||||
|
aiohttp==3.5.4
|
||||||
|
certifi==2019.3.9
|
||||||
|
|||||||
9
setup.py
9
setup.py
@@ -2,9 +2,14 @@ from setuptools import setup, find_packages
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="galaxy.plugin.api",
|
name="galaxy.plugin.api",
|
||||||
version="0.19",
|
version="0.28",
|
||||||
description="Galaxy python plugin API",
|
description="Galaxy python plugin API",
|
||||||
author='Galaxy team',
|
author='Galaxy team',
|
||||||
author_email='galaxy@gog.com',
|
author_email='galaxy@gog.com',
|
||||||
packages=find_packages(exclude=["tests"])
|
packages=find_packages("src"),
|
||||||
|
package_dir={'': 'src'},
|
||||||
|
install_requires=[
|
||||||
|
"aiohttp==3.5.4",
|
||||||
|
"certifi==2019.3.9"
|
||||||
|
]
|
||||||
)
|
)
|
||||||
|
|||||||
1
src/galaxy/__init__.py
Normal file
1
src/galaxy/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
__path__ = __import__('pkgutil').extend_path(__path__, __name__)
|
||||||
@@ -10,6 +10,7 @@ class Platform(Enum):
|
|||||||
Origin = "origin"
|
Origin = "origin"
|
||||||
Uplay = "uplay"
|
Uplay = "uplay"
|
||||||
Battlenet = "battlenet"
|
Battlenet = "battlenet"
|
||||||
|
Epic = "epic"
|
||||||
|
|
||||||
class Feature(Enum):
|
class Feature(Enum):
|
||||||
Unknown = "Unknown"
|
Unknown = "Unknown"
|
||||||
@@ -23,6 +24,7 @@ class Feature(Enum):
|
|||||||
Chat = "Chat"
|
Chat = "Chat"
|
||||||
ImportUsers = "ImportUsers"
|
ImportUsers = "ImportUsers"
|
||||||
VerifyGame = "VerifyGame"
|
VerifyGame = "VerifyGame"
|
||||||
|
ImportFriends = "ImportFriends"
|
||||||
|
|
||||||
class LicenseType(Enum):
|
class LicenseType(Enum):
|
||||||
Unknown = "Unknown"
|
Unknown = "Unknown"
|
||||||
@@ -2,6 +2,7 @@ import asyncio
|
|||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
from collections.abc import Iterable
|
from collections.abc import Iterable
|
||||||
import logging
|
import logging
|
||||||
|
import inspect
|
||||||
import json
|
import json
|
||||||
|
|
||||||
class JsonRpcError(Exception):
|
class JsonRpcError(Exception):
|
||||||
@@ -46,7 +47,7 @@ class UnknownError(ApplicationError):
|
|||||||
super().__init__(0, "Unknown error", data)
|
super().__init__(0, "Unknown error", data)
|
||||||
|
|
||||||
Request = namedtuple("Request", ["method", "params", "id"], defaults=[{}, None])
|
Request = namedtuple("Request", ["method", "params", "id"], defaults=[{}, None])
|
||||||
Method = namedtuple("Method", ["callback", "internal", "sensitive_params"])
|
Method = namedtuple("Method", ["callback", "signature", "internal", "sensitive_params"])
|
||||||
|
|
||||||
def anonymise_sensitive_params(params, sensitive_params):
|
def anonymise_sensitive_params(params, sensitive_params):
|
||||||
anomized_data = "****"
|
anomized_data = "****"
|
||||||
@@ -81,7 +82,7 @@ class Server():
|
|||||||
:param sensitive_params: list of parameters that will by anonymized before logging; if False - no params
|
:param sensitive_params: list of parameters that will by anonymized before logging; if False - no params
|
||||||
are considered sensitive, if True - all params are considered sensitive
|
are considered sensitive, if True - all params are considered sensitive
|
||||||
"""
|
"""
|
||||||
self._methods[name] = Method(callback, internal, sensitive_params)
|
self._methods[name] = Method(callback, inspect.signature(callback), internal, sensitive_params)
|
||||||
|
|
||||||
def register_notification(self, name, callback, internal, sensitive_params=False):
|
def register_notification(self, name, callback, internal, sensitive_params=False):
|
||||||
"""
|
"""
|
||||||
@@ -92,7 +93,7 @@ class Server():
|
|||||||
:param sensitive_params: list of parameters that will by anonymized before logging; if False - no params
|
:param sensitive_params: list of parameters that will by anonymized before logging; if False - no params
|
||||||
are considered sensitive, if True - all params are considered sensitive
|
are considered sensitive, if True - all params are considered sensitive
|
||||||
"""
|
"""
|
||||||
self._notifications[name] = Method(callback, internal, sensitive_params)
|
self._notifications[name] = Method(callback, inspect.signature(callback), internal, sensitive_params)
|
||||||
|
|
||||||
def register_eof(self, callback):
|
def register_eof(self, callback):
|
||||||
self._eof_listeners.append(callback)
|
self._eof_listeners.append(callback)
|
||||||
@@ -138,15 +139,20 @@ class Server():
|
|||||||
logging.error("Received unknown notification: %s", request.method)
|
logging.error("Received unknown notification: %s", request.method)
|
||||||
return
|
return
|
||||||
|
|
||||||
callback, internal, sensitive_params = method
|
callback, signature, internal, sensitive_params = method
|
||||||
self._log_request(request, sensitive_params)
|
self._log_request(request, sensitive_params)
|
||||||
|
|
||||||
|
try:
|
||||||
|
bound_args = signature.bind(**request.params)
|
||||||
|
except TypeError:
|
||||||
|
self._send_error(request.id, InvalidParams())
|
||||||
|
|
||||||
if internal:
|
if internal:
|
||||||
# internal requests are handled immediately
|
# internal requests are handled immediately
|
||||||
callback(**request.params)
|
callback(*bound_args.args, **bound_args.kwargs)
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
asyncio.create_task(callback(**request.params))
|
asyncio.create_task(callback(*bound_args.args, **bound_args.kwargs))
|
||||||
except Exception:
|
except Exception:
|
||||||
logging.exception("Unexpected exception raised in notification handler")
|
logging.exception("Unexpected exception raised in notification handler")
|
||||||
|
|
||||||
@@ -157,20 +163,23 @@ class Server():
|
|||||||
self._send_error(request.id, MethodNotFound())
|
self._send_error(request.id, MethodNotFound())
|
||||||
return
|
return
|
||||||
|
|
||||||
callback, internal, sensitive_params = method
|
callback, signature, internal, sensitive_params = method
|
||||||
self._log_request(request, sensitive_params)
|
self._log_request(request, sensitive_params)
|
||||||
|
|
||||||
|
try:
|
||||||
|
bound_args = signature.bind(**request.params)
|
||||||
|
except TypeError:
|
||||||
|
self._send_error(request.id, InvalidParams())
|
||||||
|
|
||||||
if internal:
|
if internal:
|
||||||
# internal requests are handled immediately
|
# internal requests are handled immediately
|
||||||
response = callback(request.params)
|
response = callback(*bound_args.args, **bound_args.kwargs)
|
||||||
self._send_response(request.id, response)
|
self._send_response(request.id, response)
|
||||||
else:
|
else:
|
||||||
async def handle():
|
async def handle():
|
||||||
try:
|
try:
|
||||||
result = await callback(request.params)
|
result = await callback(*bound_args.args, **bound_args.kwargs)
|
||||||
self._send_response(request.id, result)
|
self._send_response(request.id, result)
|
||||||
except TypeError:
|
|
||||||
self._send_error(request.id, InvalidParams())
|
|
||||||
except NotImplementedError:
|
except NotImplementedError:
|
||||||
self._send_error(request.id, MethodNotFound())
|
self._send_error(request.id, MethodNotFound())
|
||||||
except JsonRpcError as error:
|
except JsonRpcError as error:
|
||||||
@@ -6,7 +6,6 @@ import dataclasses
|
|||||||
from enum import Enum
|
from enum import Enum
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
import sys
|
import sys
|
||||||
import os
|
|
||||||
|
|
||||||
from galaxy.api.jsonrpc import Server, NotificationClient
|
from galaxy.api.jsonrpc import Server, NotificationClient
|
||||||
from galaxy.api.consts import Feature
|
from galaxy.api.consts import Feature
|
||||||
@@ -78,8 +77,8 @@ class Plugin():
|
|||||||
self._register_method(
|
self._register_method(
|
||||||
"import_friends",
|
"import_friends",
|
||||||
self.get_friends,
|
self.get_friends,
|
||||||
result_name="user_info_list",
|
result_name="friend_info_list",
|
||||||
feature=Feature.ImportUsers
|
feature=Feature.ImportFriends
|
||||||
)
|
)
|
||||||
self._register_method(
|
self._register_method(
|
||||||
"import_user_infos",
|
"import_user_infos",
|
||||||
@@ -141,8 +140,8 @@ class Plugin():
|
|||||||
|
|
||||||
def _register_method(self, name, handler, result_name=None, internal=False, sensitive_params=False, feature=None):
|
def _register_method(self, name, handler, result_name=None, internal=False, sensitive_params=False, feature=None):
|
||||||
if internal:
|
if internal:
|
||||||
def method(params):
|
def method(*args, **kwargs):
|
||||||
result = handler(**params)
|
result = handler(*args, **kwargs)
|
||||||
if result_name:
|
if result_name:
|
||||||
result = {
|
result = {
|
||||||
result_name: result
|
result_name: result
|
||||||
@@ -150,8 +149,8 @@ class Plugin():
|
|||||||
return result
|
return result
|
||||||
self._server.register_method(name, method, True, sensitive_params)
|
self._server.register_method(name, method, True, sensitive_params)
|
||||||
else:
|
else:
|
||||||
async def method(params):
|
async def method(*args, **kwargs):
|
||||||
result = await handler(**params)
|
result = await handler(*args, **kwargs)
|
||||||
if result_name:
|
if result_name:
|
||||||
result = {
|
result = {
|
||||||
result_name: result
|
result_name: result
|
||||||
@@ -228,17 +227,13 @@ class Plugin():
|
|||||||
self._notification_client.notify("local_game_status_changed", params)
|
self._notification_client.notify("local_game_status_changed", params)
|
||||||
|
|
||||||
def add_friend(self, user):
|
def add_friend(self, user):
|
||||||
params = {"user_info" : user}
|
params = {"friend_info" : user}
|
||||||
self._notification_client.notify("friend_added", params)
|
self._notification_client.notify("friend_added", params)
|
||||||
|
|
||||||
def remove_friend(self, user_id):
|
def remove_friend(self, user_id):
|
||||||
params = {"user_id" : user_id}
|
params = {"user_id" : user_id}
|
||||||
self._notification_client.notify("friend_removed", params)
|
self._notification_client.notify("friend_removed", params)
|
||||||
|
|
||||||
def update_friend(self, user):
|
|
||||||
params = {"user_info" : user}
|
|
||||||
self._notification_client.notify("friend_updated", params)
|
|
||||||
|
|
||||||
def update_room(self, room_id, unread_message_count=None, new_messages=None):
|
def update_room(self, room_id, unread_message_count=None, new_messages=None):
|
||||||
params = {"room_id": room_id}
|
params = {"room_id": room_id}
|
||||||
if unread_message_count is not None:
|
if unread_message_count is not None:
|
||||||
@@ -320,29 +315,7 @@ class Plugin():
|
|||||||
async def get_game_times(self):
|
async def get_game_times(self):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
def _prepare_logging(logger_file):
|
|
||||||
root = logging.getLogger()
|
|
||||||
root.setLevel(logging.DEBUG)
|
|
||||||
if logger_file:
|
|
||||||
# ensure destination folder exists
|
|
||||||
os.makedirs(os.path.dirname(os.path.abspath(logger_file)), exist_ok=True)
|
|
||||||
handler = logging.handlers.RotatingFileHandler(
|
|
||||||
logger_file,
|
|
||||||
mode="a",
|
|
||||||
maxBytes=10000000,
|
|
||||||
backupCount=10,
|
|
||||||
encoding="utf-8"
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
handler = logging.StreamHandler()
|
|
||||||
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
|
||||||
handler.setFormatter(formatter)
|
|
||||||
root.addHandler(handler)
|
|
||||||
|
|
||||||
def create_and_run_plugin(plugin_class, argv):
|
def create_and_run_plugin(plugin_class, argv):
|
||||||
logger_file = argv[3] if len(argv) >= 4 else None
|
|
||||||
_prepare_logging(logger_file)
|
|
||||||
|
|
||||||
if len(argv) < 3:
|
if len(argv) < 3:
|
||||||
logging.critical("Not enough parameters, required: token, port")
|
logging.critical("Not enough parameters, required: token, port")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
@@ -8,10 +8,19 @@ class Authentication():
|
|||||||
user_id: str
|
user_id: str
|
||||||
user_name: str
|
user_name: str
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Cookie():
|
||||||
|
name: str
|
||||||
|
value: str
|
||||||
|
domain: Optional[str] = None
|
||||||
|
path: Optional[str] = None
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class NextStep():
|
class NextStep():
|
||||||
next_step: str
|
next_step: str
|
||||||
auth_params: Dict[str, str]
|
auth_params: Dict[str, str]
|
||||||
|
cookies: Optional[List[Cookie]] = None
|
||||||
|
js: Optional[Dict[str, List[str]]] = None
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class LicenseInfo():
|
class LicenseInfo():
|
||||||
@@ -28,7 +37,7 @@ class Dlc():
|
|||||||
class Game():
|
class Game():
|
||||||
game_id: str
|
game_id: str
|
||||||
game_title: str
|
game_title: str
|
||||||
dlcs: List[Dlc]
|
dlcs: Optional[List[Dlc]]
|
||||||
license_info: LicenseInfo
|
license_info: LicenseInfo
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
@@ -60,6 +69,11 @@ class UserInfo():
|
|||||||
avatar_url: str
|
avatar_url: str
|
||||||
presence: Presence
|
presence: Presence
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class FriendInfo():
|
||||||
|
user_id: str
|
||||||
|
user_name: str
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class Room():
|
class Room():
|
||||||
room_id: str
|
room_id: str
|
||||||
43
src/galaxy/http.py
Normal file
43
src/galaxy/http.py
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
import asyncio
|
||||||
|
import ssl
|
||||||
|
from http import HTTPStatus
|
||||||
|
|
||||||
|
import aiohttp
|
||||||
|
import certifi
|
||||||
|
|
||||||
|
from galaxy.api.errors import (
|
||||||
|
AccessDenied, AuthenticationRequired,
|
||||||
|
BackendTimeout, BackendNotAvailable, BackendError, NetworkError, UnknownError
|
||||||
|
)
|
||||||
|
|
||||||
|
class HttpClient:
|
||||||
|
def __init__(self, limit=20, timeout=aiohttp.ClientTimeout(total=60), cookie_jar=None):
|
||||||
|
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
|
||||||
|
ssl_context.load_verify_locations(certifi.where())
|
||||||
|
connector = aiohttp.TCPConnector(limit=limit, timeout=timeout, ssl=ssl_context)
|
||||||
|
self._session = aiohttp.ClientSession(connector=connector, cookie_jar=cookie_jar)
|
||||||
|
|
||||||
|
async def close(self):
|
||||||
|
await self._session.close()
|
||||||
|
|
||||||
|
async def request(self, method, *args, **kwargs):
|
||||||
|
try:
|
||||||
|
response = await self._session.request(method, *args, **kwargs)
|
||||||
|
except asyncio.TimeoutError:
|
||||||
|
raise BackendTimeout()
|
||||||
|
except aiohttp.ClientConnectionError:
|
||||||
|
raise NetworkError()
|
||||||
|
except aiohttp.ServerDisconnectedError:
|
||||||
|
raise BackendNotAvailable()
|
||||||
|
if response.status == HTTPStatus.UNAUTHORIZED:
|
||||||
|
raise AuthenticationRequired()
|
||||||
|
if response.status == HTTPStatus.FORBIDDEN:
|
||||||
|
raise AccessDenied()
|
||||||
|
if response.status == HTTPStatus.SERVICE_UNAVAILABLE:
|
||||||
|
raise BackendNotAvailable()
|
||||||
|
if response.status >= 500:
|
||||||
|
raise BackendError()
|
||||||
|
if response.status >= 400:
|
||||||
|
raise UnknownError()
|
||||||
|
|
||||||
|
return response
|
||||||
20
src/galaxy/tools.py
Normal file
20
src/galaxy/tools.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import io
|
||||||
|
import os
|
||||||
|
import zipfile
|
||||||
|
from glob import glob
|
||||||
|
|
||||||
|
def zip_folder(folder):
|
||||||
|
files = glob(os.path.join(folder, "**"), recursive=True)
|
||||||
|
files = [file.replace(folder + os.sep, "") for file in files]
|
||||||
|
files = [file for file in files if file]
|
||||||
|
|
||||||
|
zip_buffer = io.BytesIO()
|
||||||
|
with zipfile.ZipFile(zip_buffer, mode="w", compression=zipfile.ZIP_DEFLATED) as zipf:
|
||||||
|
for file in files:
|
||||||
|
zipf.write(os.path.join(folder, file), arcname=file)
|
||||||
|
return zip_buffer
|
||||||
|
|
||||||
|
def zip_folder_to_file(folder, filename):
|
||||||
|
zip_content = zip_folder(folder).getbuffer()
|
||||||
|
with open(filename, "wb") as archive:
|
||||||
|
archive.write(zip_content)
|
||||||
12
src/galaxy/unittest/mock.py
Normal file
12
src/galaxy/unittest/mock.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
from asyncio import coroutine
|
||||||
|
from unittest.mock import MagicMock
|
||||||
|
|
||||||
|
class AsyncMock(MagicMock):
|
||||||
|
async def __call__(self, *args, **kwargs):
|
||||||
|
return super(AsyncMock, self).__call__(*args, **kwargs)
|
||||||
|
|
||||||
|
def coroutine_mock():
|
||||||
|
coro = MagicMock(name="CoroutineResult")
|
||||||
|
corofunc = MagicMock(name="CoroutineFunction", side_effect=coroutine(coro))
|
||||||
|
corofunc.coro = coro
|
||||||
|
return corofunc
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
from unittest.mock import MagicMock
|
|
||||||
|
|
||||||
class AsyncMock(MagicMock):
|
|
||||||
async def __call__(self, *args, **kwargs):
|
|
||||||
# pylint: disable=useless-super-delegation
|
|
||||||
return super(AsyncMock, self).__call__(*args, **kwargs)
|
|
||||||
@@ -6,7 +6,7 @@ import pytest
|
|||||||
|
|
||||||
from galaxy.api.plugin import Plugin
|
from galaxy.api.plugin import Plugin
|
||||||
from galaxy.api.consts import Platform
|
from galaxy.api.consts import Platform
|
||||||
from tests.async_mock import AsyncMock
|
from galaxy.unittest.mock import AsyncMock, coroutine_mock
|
||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
def reader():
|
def reader():
|
||||||
@@ -57,7 +57,7 @@ def plugin(reader, writer):
|
|||||||
|
|
||||||
with ExitStack() as stack:
|
with ExitStack() as stack:
|
||||||
for method in async_methods:
|
for method in async_methods:
|
||||||
stack.enter_context(patch.object(Plugin, method, new_callable=AsyncMock))
|
stack.enter_context(patch.object(Plugin, method, new_callable=coroutine_mock))
|
||||||
for method in methods:
|
for method in methods:
|
||||||
stack.enter_context(patch.object(Plugin, method))
|
stack.enter_context(patch.object(Plugin, method))
|
||||||
yield Plugin(Platform.Generic, "0.1", reader, writer, "token")
|
yield Plugin(Platform.Generic, "0.1", reader, writer, "token")
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ def test_success(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.get_unlocked_achievements.return_value = [
|
plugin.get_unlocked_achievements.coro.return_value = [
|
||||||
Achievement(achievement_id="lvl10", unlock_time=1548421241),
|
Achievement(achievement_id="lvl10", unlock_time=1548421241),
|
||||||
Achievement(achievement_name="Got level 20", unlock_time=1548422395),
|
Achievement(achievement_name="Got level 20", unlock_time=1548422395),
|
||||||
Achievement(achievement_id="lvl30", achievement_name="Got level 30", unlock_time=1548495633)
|
Achievement(achievement_id="lvl30", achievement_name="Got level 30", unlock_time=1548495633)
|
||||||
@@ -65,7 +65,7 @@ def test_failure(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.get_unlocked_achievements.side_effect = UnknownError()
|
plugin.get_unlocked_achievements.coro.side_effect = UnknownError()
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
plugin.get_unlocked_achievements.assert_called()
|
plugin.get_unlocked_achievements.assert_called()
|
||||||
response = json.loads(write.call_args[0][0])
|
response = json.loads(write.call_args[0][0])
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ def test_success(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.authenticate.return_value = Authentication("132", "Zenek")
|
plugin.authenticate.coro.return_value = Authentication("132", "Zenek")
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
plugin.authenticate.assert_called_with()
|
plugin.authenticate.assert_called_with()
|
||||||
response = json.loads(write.call_args[0][0])
|
response = json.loads(write.call_args[0][0])
|
||||||
@@ -56,7 +56,7 @@ def test_failure(plugin, readline, write, error, code, message):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.authenticate.side_effect = error()
|
plugin.authenticate.coro.side_effect = error()
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
plugin.authenticate.assert_called_with()
|
plugin.authenticate.assert_called_with()
|
||||||
response = json.loads(write.call_args[0][0])
|
response = json.loads(write.call_args[0][0])
|
||||||
@@ -82,7 +82,7 @@ def test_stored_credentials(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.authenticate.return_value = Authentication("132", "Zenek")
|
plugin.authenticate.coro.return_value = Authentication("132", "Zenek")
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
plugin.authenticate.assert_called_with(stored_credentials={"token": "ABC"})
|
plugin.authenticate.assert_called_with(stored_credentials={"token": "ABC"})
|
||||||
write.assert_called()
|
write.assert_called()
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ def test_send_message_success(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.send_message.return_value = None
|
plugin.send_message.coro.return_value = None
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
plugin.send_message.assert_called_with(room_id="14", message="Hello!")
|
plugin.send_message.assert_called_with(room_id="14", message="Hello!")
|
||||||
response = json.loads(write.call_args[0][0])
|
response = json.loads(write.call_args[0][0])
|
||||||
@@ -52,7 +52,7 @@ def test_send_message_failure(plugin, readline, write, error, code, message):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.send_message.side_effect = error()
|
plugin.send_message.coro.side_effect = error()
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
plugin.send_message.assert_called_with(room_id="15", message="Bye")
|
plugin.send_message.assert_called_with(room_id="15", message="Bye")
|
||||||
response = json.loads(write.call_args[0][0])
|
response = json.loads(write.call_args[0][0])
|
||||||
@@ -78,7 +78,7 @@ def test_mark_as_read_success(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.mark_as_read.return_value = None
|
plugin.mark_as_read.coro.return_value = None
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
plugin.mark_as_read.assert_called_with(room_id="14", last_message_id="67")
|
plugin.mark_as_read.assert_called_with(room_id="14", last_message_id="67")
|
||||||
response = json.loads(write.call_args[0][0])
|
response = json.loads(write.call_args[0][0])
|
||||||
@@ -114,7 +114,7 @@ def test_mark_as_read_failure(plugin, readline, write, error, code, message):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.mark_as_read.side_effect = error()
|
plugin.mark_as_read.coro.side_effect = error()
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
plugin.mark_as_read.assert_called_with(room_id="18", last_message_id="7")
|
plugin.mark_as_read.assert_called_with(room_id="18", last_message_id="7")
|
||||||
response = json.loads(write.call_args[0][0])
|
response = json.loads(write.call_args[0][0])
|
||||||
@@ -136,7 +136,7 @@ def test_get_rooms_success(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.get_rooms.return_value = [
|
plugin.get_rooms.coro.return_value = [
|
||||||
Room("13", 0, None),
|
Room("13", 0, None),
|
||||||
Room("15", 34, "8")
|
Room("15", 34, "8")
|
||||||
]
|
]
|
||||||
@@ -170,7 +170,7 @@ def test_get_rooms_failure(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.get_rooms.side_effect = UnknownError()
|
plugin.get_rooms.coro.side_effect = UnknownError()
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
plugin.get_rooms.assert_called_with()
|
plugin.get_rooms.assert_called_with()
|
||||||
response = json.loads(write.call_args[0][0])
|
response = json.loads(write.call_args[0][0])
|
||||||
@@ -196,7 +196,7 @@ def test_get_room_history_from_message_success(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.get_room_history_from_message.return_value = [
|
plugin.get_room_history_from_message.coro.return_value = [
|
||||||
Message("13", "149", 1549454837, "Hello"),
|
Message("13", "149", 1549454837, "Hello"),
|
||||||
Message("14", "812", 1549454899, "Hi")
|
Message("14", "812", 1549454899, "Hi")
|
||||||
]
|
]
|
||||||
@@ -245,7 +245,7 @@ def test_get_room_history_from_message_failure(plugin, readline, write, error, c
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.get_room_history_from_message.side_effect = error()
|
plugin.get_room_history_from_message.coro.side_effect = error()
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
plugin.get_room_history_from_message.assert_called_with(room_id="33", message_id="88")
|
plugin.get_room_history_from_message.assert_called_with(room_id="33", message_id="88")
|
||||||
response = json.loads(write.call_args[0][0])
|
response = json.loads(write.call_args[0][0])
|
||||||
@@ -271,7 +271,7 @@ def test_get_room_history_from_timestamp_success(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.get_room_history_from_timestamp.return_value = [
|
plugin.get_room_history_from_timestamp.coro.return_value = [
|
||||||
Message("12", "155", 1549454836, "Bye")
|
Message("12", "155", 1549454836, "Bye")
|
||||||
]
|
]
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
@@ -308,7 +308,7 @@ def test_get_room_history_from_timestamp_failure(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.get_room_history_from_timestamp.side_effect = UnknownError()
|
plugin.get_room_history_from_timestamp.coro.side_effect = UnknownError()
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
plugin.get_room_history_from_timestamp.assert_called_with(
|
plugin.get_room_history_from_timestamp.assert_called_with(
|
||||||
room_id="10",
|
room_id="10",
|
||||||
|
|||||||
90
tests/test_friends.py
Normal file
90
tests/test_friends.py
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
import asyncio
|
||||||
|
import json
|
||||||
|
|
||||||
|
from galaxy.api.types import FriendInfo
|
||||||
|
from galaxy.api.errors import UnknownError
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_friends_success(plugin, readline, write):
|
||||||
|
request = {
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"id": "3",
|
||||||
|
"method": "import_friends"
|
||||||
|
}
|
||||||
|
|
||||||
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
|
plugin.get_friends.coro.return_value = [
|
||||||
|
FriendInfo("3", "Jan"),
|
||||||
|
FriendInfo("5", "Ola")
|
||||||
|
]
|
||||||
|
asyncio.run(plugin.run())
|
||||||
|
plugin.get_friends.assert_called_with()
|
||||||
|
response = json.loads(write.call_args[0][0])
|
||||||
|
|
||||||
|
assert response == {
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"id": "3",
|
||||||
|
"result": {
|
||||||
|
"friend_info_list": [
|
||||||
|
{"user_id": "3", "user_name": "Jan"},
|
||||||
|
{"user_id": "5", "user_name": "Ola"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_friends_failure(plugin, readline, write):
|
||||||
|
request = {
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"id": "3",
|
||||||
|
"method": "import_friends"
|
||||||
|
}
|
||||||
|
|
||||||
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
|
plugin.get_friends.coro.side_effect = UnknownError()
|
||||||
|
asyncio.run(plugin.run())
|
||||||
|
plugin.get_friends.assert_called_with()
|
||||||
|
response = json.loads(write.call_args[0][0])
|
||||||
|
|
||||||
|
assert response == {
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"id": "3",
|
||||||
|
"error": {
|
||||||
|
"code": 0,
|
||||||
|
"message": "Unknown error",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def test_add_friend(plugin, write):
|
||||||
|
friend = FriendInfo("7", "Kuba")
|
||||||
|
|
||||||
|
async def couritine():
|
||||||
|
plugin.add_friend(friend)
|
||||||
|
|
||||||
|
asyncio.run(couritine())
|
||||||
|
response = json.loads(write.call_args[0][0])
|
||||||
|
|
||||||
|
assert response == {
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"method": "friend_added",
|
||||||
|
"params": {
|
||||||
|
"friend_info": {"user_id": "7", "user_name": "Kuba"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def test_remove_friend(plugin, write):
|
||||||
|
async def couritine():
|
||||||
|
plugin.remove_friend("5")
|
||||||
|
|
||||||
|
asyncio.run(couritine())
|
||||||
|
response = json.loads(write.call_args[0][0])
|
||||||
|
|
||||||
|
assert response == {
|
||||||
|
"jsonrpc": "2.0",
|
||||||
|
"method": "friend_removed",
|
||||||
|
"params": {
|
||||||
|
"user_id": "5"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,7 +12,7 @@ def test_success(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.get_game_times.return_value = [
|
plugin.get_game_times.coro.return_value = [
|
||||||
GameTime("3", 60, 1549550504),
|
GameTime("3", 60, 1549550504),
|
||||||
GameTime("5", 10, 1549550502)
|
GameTime("5", 10, 1549550502)
|
||||||
]
|
]
|
||||||
@@ -47,7 +47,7 @@ def test_failure(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.get_game_times.side_effect = UnknownError()
|
plugin.get_game_times.coro.side_effect = UnknownError()
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
plugin.get_game_times.assert_called_with()
|
plugin.get_game_times.assert_called_with()
|
||||||
response = json.loads(write.call_args[0][0])
|
response = json.loads(write.call_args[0][0])
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ def test_success(plugin, readline, write):
|
|||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
|
|
||||||
plugin.get_local_games.return_value = [
|
plugin.get_local_games.coro.return_value = [
|
||||||
LocalGame("1", LocalGameState.Running),
|
LocalGame("1", LocalGameState.Running),
|
||||||
LocalGame("2", LocalGameState.Installed),
|
LocalGame("2", LocalGameState.Installed),
|
||||||
LocalGame("3", LocalGameState.Installed | LocalGameState.Running)
|
LocalGame("3", LocalGameState.Installed | LocalGameState.Running)
|
||||||
@@ -61,7 +61,7 @@ def test_failure(plugin, readline, write, error, code, message):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.get_local_games.side_effect = error()
|
plugin.get_local_games.coro.side_effect = error()
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
plugin.get_local_games.assert_called_with()
|
plugin.get_local_games.assert_called_with()
|
||||||
response = json.loads(write.call_args[0][0])
|
response = json.loads(write.call_args[0][0])
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ def test_success(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.get_owned_games.return_value = [
|
plugin.get_owned_games.coro.return_value = [
|
||||||
Game("3", "Doom", None, LicenseInfo(LicenseType.SinglePurchase, None)),
|
Game("3", "Doom", None, LicenseInfo(LicenseType.SinglePurchase, None)),
|
||||||
Game(
|
Game(
|
||||||
"5",
|
"5",
|
||||||
@@ -75,7 +75,7 @@ def test_failure(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.get_owned_games.side_effect = UnknownError()
|
plugin.get_owned_games.coro.side_effect = UnknownError()
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
plugin.get_owned_games.assert_called_with()
|
plugin.get_owned_games.assert_called_with()
|
||||||
response = json.loads(write.call_args[0][0])
|
response = json.loads(write.call_args[0][0])
|
||||||
|
|||||||
@@ -5,153 +5,6 @@ from galaxy.api.types import UserInfo, Presence
|
|||||||
from galaxy.api.errors import UnknownError
|
from galaxy.api.errors import UnknownError
|
||||||
from galaxy.api.consts import PresenceState
|
from galaxy.api.consts import PresenceState
|
||||||
|
|
||||||
def test_get_friends_success(plugin, readline, write):
|
|
||||||
request = {
|
|
||||||
"jsonrpc": "2.0",
|
|
||||||
"id": "3",
|
|
||||||
"method": "import_friends"
|
|
||||||
}
|
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
|
||||||
plugin.get_friends.return_value = [
|
|
||||||
UserInfo(
|
|
||||||
"3",
|
|
||||||
True,
|
|
||||||
"Jan",
|
|
||||||
"http://avatar1.png",
|
|
||||||
Presence(
|
|
||||||
PresenceState.Online,
|
|
||||||
"123",
|
|
||||||
"Main menu"
|
|
||||||
)
|
|
||||||
),
|
|
||||||
UserInfo(
|
|
||||||
"5",
|
|
||||||
True,
|
|
||||||
"Ola",
|
|
||||||
"http://avatar2.png",
|
|
||||||
Presence(PresenceState.Offline)
|
|
||||||
)
|
|
||||||
]
|
|
||||||
asyncio.run(plugin.run())
|
|
||||||
plugin.get_friends.assert_called_with()
|
|
||||||
response = json.loads(write.call_args[0][0])
|
|
||||||
|
|
||||||
assert response == {
|
|
||||||
"jsonrpc": "2.0",
|
|
||||||
"id": "3",
|
|
||||||
"result": {
|
|
||||||
"user_info_list": [
|
|
||||||
{
|
|
||||||
"user_id": "3",
|
|
||||||
"is_friend": True,
|
|
||||||
"user_name": "Jan",
|
|
||||||
"avatar_url": "http://avatar1.png",
|
|
||||||
"presence": {
|
|
||||||
"presence_state": "online",
|
|
||||||
"game_id": "123",
|
|
||||||
"presence_status": "Main menu"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"user_id": "5",
|
|
||||||
"is_friend": True,
|
|
||||||
"user_name": "Ola",
|
|
||||||
"avatar_url": "http://avatar2.png",
|
|
||||||
"presence": {
|
|
||||||
"presence_state": "offline"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def test_get_friends_failure(plugin, readline, write):
|
|
||||||
request = {
|
|
||||||
"jsonrpc": "2.0",
|
|
||||||
"id": "3",
|
|
||||||
"method": "import_friends"
|
|
||||||
}
|
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
|
||||||
plugin.get_friends.side_effect = UnknownError()
|
|
||||||
asyncio.run(plugin.run())
|
|
||||||
plugin.get_friends.assert_called_with()
|
|
||||||
response = json.loads(write.call_args[0][0])
|
|
||||||
|
|
||||||
assert response == {
|
|
||||||
"jsonrpc": "2.0",
|
|
||||||
"id": "3",
|
|
||||||
"error": {
|
|
||||||
"code": 0,
|
|
||||||
"message": "Unknown error",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def test_add_friend(plugin, write):
|
|
||||||
friend = UserInfo("7", True, "Kuba", "http://avatar.png", Presence(PresenceState.Offline))
|
|
||||||
|
|
||||||
async def couritine():
|
|
||||||
plugin.add_friend(friend)
|
|
||||||
|
|
||||||
asyncio.run(couritine())
|
|
||||||
response = json.loads(write.call_args[0][0])
|
|
||||||
|
|
||||||
assert response == {
|
|
||||||
"jsonrpc": "2.0",
|
|
||||||
"method": "friend_added",
|
|
||||||
"params": {
|
|
||||||
"user_info": {
|
|
||||||
"user_id": "7",
|
|
||||||
"is_friend": True,
|
|
||||||
"user_name": "Kuba",
|
|
||||||
"avatar_url": "http://avatar.png",
|
|
||||||
"presence": {
|
|
||||||
"presence_state": "offline"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def test_remove_friend(plugin, write):
|
|
||||||
async def couritine():
|
|
||||||
plugin.remove_friend("5")
|
|
||||||
|
|
||||||
asyncio.run(couritine())
|
|
||||||
response = json.loads(write.call_args[0][0])
|
|
||||||
|
|
||||||
assert response == {
|
|
||||||
"jsonrpc": "2.0",
|
|
||||||
"method": "friend_removed",
|
|
||||||
"params": {
|
|
||||||
"user_id": "5"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def test_update_friend(plugin, write):
|
|
||||||
friend = UserInfo("9", True, "Anna", "http://avatar.png", Presence(PresenceState.Offline))
|
|
||||||
|
|
||||||
async def couritine():
|
|
||||||
plugin.update_friend(friend)
|
|
||||||
|
|
||||||
asyncio.run(couritine())
|
|
||||||
response = json.loads(write.call_args[0][0])
|
|
||||||
|
|
||||||
assert response == {
|
|
||||||
"jsonrpc": "2.0",
|
|
||||||
"method": "friend_updated",
|
|
||||||
"params": {
|
|
||||||
"user_info": {
|
|
||||||
"user_id": "9",
|
|
||||||
"is_friend": True,
|
|
||||||
"user_name": "Anna",
|
|
||||||
"avatar_url": "http://avatar.png",
|
|
||||||
"presence": {
|
|
||||||
"presence_state": "offline"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def test_get_users_success(plugin, readline, write):
|
def test_get_users_success(plugin, readline, write):
|
||||||
request = {
|
request = {
|
||||||
@@ -164,7 +17,7 @@ def test_get_users_success(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.get_users.return_value = [
|
plugin.get_users.coro.return_value = [
|
||||||
UserInfo("5", False, "Ula", "http://avatar.png", Presence(PresenceState.Offline))
|
UserInfo("5", False, "Ula", "http://avatar.png", Presence(PresenceState.Offline))
|
||||||
]
|
]
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
@@ -189,6 +42,7 @@ def test_get_users_success(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def test_get_users_failure(plugin, readline, write):
|
def test_get_users_failure(plugin, readline, write):
|
||||||
request = {
|
request = {
|
||||||
"jsonrpc": "2.0",
|
"jsonrpc": "2.0",
|
||||||
@@ -200,7 +54,7 @@ def test_get_users_failure(plugin, readline, write):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readline.side_effect = [json.dumps(request), ""]
|
readline.side_effect = [json.dumps(request), ""]
|
||||||
plugin.get_users.side_effect = UnknownError()
|
plugin.get_users.coro.side_effect = UnknownError()
|
||||||
asyncio.run(plugin.run())
|
asyncio.run(plugin.run())
|
||||||
plugin.get_users.assert_called_with(user_id_list=["10", "11", "12"])
|
plugin.get_users.assert_called_with(user_id_list=["10", "11", "12"])
|
||||||
response = json.loads(write.call_args[0][0])
|
response = json.loads(write.call_args[0][0])
|
||||||
|
|||||||
Reference in New Issue
Block a user