You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
5.6 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""
Это unittest для тестирования вашего класса Client из задания.
Для запуска теста на локальном компьютере разместите код unittest-та
и код решения в одном каталоге. Запустите тест при помощи команды:
python -m unittest test_week5.py
Обратите внимание на то, что ваш модуль должен называться client.py.
Это не обязательное требование, если вы назвали мобуль по-другому, то
просто измените его импорт в строке 25 на:
from you_module_name import Client, ClientError
Модуль должен содержать классы Client и ClientError.
Этот unittest поможет вам выполнить задание.
Успехов!
"""
import unittest
from unittest.mock import patch
from collections import deque
# импорт модуля с решением
from client import Client, ClientError
class ServerSocketException(Exception):
pass
class ServerSocket:
"""Mock socket module"""
def __init__(self):
self.response_buf = deque()
self.rsp_map = {
b'put test 0.5 1\n': b'ok\n\n',
b'put test 2.0 2\n': b'ok\n\n',
b'put test 0.4 2\n': b'ok\n\n',
b'put load 301 3\n': b'ok\n\n',
b'get key_not_exists\n': b'ok\n\n',
b'get test\n': b'ok\n'
b'test 0.5 1\n'
b'test 0.4 2\n\n',
b'get get_client_error\n': b'error\nwrong command\n\n',
b'get *\n': b'ok\n'
b'test 0.5 1\n'
b'test 0.4 2\n'
b'load 301 3\n\n',
}
def sendall(self, data):
return self.send(data)
def send(self, data):
if data in self.rsp_map:
self.response_buf.append(self.rsp_map[data])
else:
raise ServerSocketException(f"запрос не соответствует протоколу: {data}")
def recv(self, bytes_count):
try:
rsp = self.response_buf.popleft()
except IndexError:
raise ServerSocketException("нет данных в сокете для чтения ответа")
return rsp
@classmethod
def create_connection(cls, *args, **kwargs):
return cls()
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
pass
def __getattr__(self, feature):
"""ignore socket.connect, soket.bind, etc..."""
pass
class TestClient(unittest.TestCase):
@classmethod
@patch("socket.create_connection", ServerSocket.create_connection)
@patch("socket.socket", ServerSocket.create_connection)
def setUpClass(cls):
cls.client = Client("127.0.0.1", 10000, timeout=2)
@patch("socket.create_connection", ServerSocket.create_connection)
@patch("socket.socket", ServerSocket.create_connection)
def test_client_put(self):
metrics_for_put = [
("test", 0.5, 1),
("test", 2.0, 2),
("test", 0.4, 2),
("load", 301, 3),
]
for metric, value, timestamp in metrics_for_put:
try:
self.client.put(metric, value, timestamp)
except ServerSocketException as exp:
message = exp.args[0]
self.fail(f"Ошибка вызова client.put("
f"'{metric}', {value}, timestamp={timestamp})\n{message}")
@patch("socket.create_connection", ServerSocket.create_connection)
@patch("socket.socket", ServerSocket.create_connection)
def test_client_get_key(self):
try:
rsp = self.client.get("test")
except ServerSocketException as exp:
message = exp.args[0]
self.fail(f"Ошибка вызова client.get('test')\n{message}")
metrics_fixture = {
"test": [(1, .5), (2, .4)],
}
self.assertEqual(rsp, metrics_fixture)
@patch("socket.create_connection", ServerSocket.create_connection)
@patch("socket.socket", ServerSocket.create_connection)
def test_client_get_all(self):
try:
rsp = self.client.get("*")
except ServerSocketException as exp:
message = exp.args[0]
self.fail(f"Ошибка вызова client.get('*')\n{message}")
metrics_fixture = {
"test": [(1, .5), (2, .4)],
"load": [(3, 301.0)]
}
self.assertEqual(rsp, metrics_fixture)
@patch("socket.create_connection", ServerSocket.create_connection)
@patch("socket.socket", ServerSocket.create_connection)
def test_client_get_not_exists(self):
try:
rsp = self.client.get("key_not_exists")
except ServerSocketException as exp:
message = exp.args[0]
self.fail(f"Ошибка вызова client.get('key_not_exists')\n{message}")
self.assertEqual({}, rsp, "check rsp eq {}")
@patch("socket.create_connection", ServerSocket.create_connection)
@patch("socket.socket", ServerSocket.create_connection)
def test_client_get_client_error(self):
try:
self.assertRaises(ClientError,
self.client.get, "get_client_error")
except ServerSocketException as exp:
message = exp.args[0]
self.fail(f"Некорректно обработано сообщение сервера об ошибке: {message}")