Skip to main content

Server for mocking websocket messages

Project description

Websocket mockserver (server + client)

Принцип работы

websocket-mockserver — это сервер для мокирования WebSocket-сообщений. Сервер позволяет создавать различные правила, которые определяют, какие сообщения и когда будут отправляться подключённому тестируемому приложению.

Виды правил

  • oneshot — сообщения отправляются клиенту один раз при подключении. Используется для имитации начального состояния или событий, которые должны произойти только при установлении соединения.
  • inbound — сообщения отправляются в ответ на конкретное сообщение от клиента. Позволяет эмулировать реакцию сервера на действия пользователя.
  • schedule — сообщения отправляются клиенту с заданным интервалом времени. Используется для имитации событий, происходящих периодически (например, обновление состояния).

С сервером поставляется класс клиента WebSocketMockServerClient на python, который может быть использован для управления правилами в автотестах.

Обновление

  1. Апнуть версию в setup.py
  2. Апнуть переменную VERSION в .gitlab-ci.yml
  3. Тэгнуть коммит с новым номером версии
  4. Тыкнуть джобу build в CI

Установка

  1. Добавляем контейнер с сокет-сервером в желаемую compose-сеть:
# docker-compose.yml

websocket_server:
  image: <имя_образа>:<тэг>
  environment:
    - PORT=3003
    - LOG_LEVEL=DEBUG
  ports:
    - "3003"
  1. Устанавливаем библиотеку:
pip install websocket-mockserver

API

Ниже представлена документация к REST API сервера. Каждому методу сервера соответствует метод в python-клиенте.

GET /admin/rules

Возвращает все добавленные правила.

response:

{
  "oneshot rules": [],
  "inbound rules": [],
  "schedule rules": []
}

python:

async def get_rules(self)

POST /admin/mapping/inbound

Добавляет мок для ответа на конкретное websocket-сообщение. Поиск соответствия происходит по полям type, type_pattern, payload.

params:

{
  /* каналы сообщений, строка с одним или несколькими каналами через запятую */
  "channels": str,
  /* regexp каналов, по которому будет сравниваться каналы */
  "channels_pattern": str,
  /* точный путь по которому клиент пытается подключиться */
  "url_path": str,
  /* regexp пути подключения */
  "url_pattern": str,
  /* точный тип сообщения */
  "type": str,
  /* regex по которому будет произведен поиск типа сообщения */
  "type_pattern": str,
  /* ответ, ожидаемый клиентом */
  "response": object
  /* полезная нагрузка, ожидаемая сервером */
  "payload": object,
}

response:

{ "status": "ok", "inbound_rules_added": 0 }

python:

async def add_inbound_rule(self, messages: list[dict], expected_type: str, expected_payload: dict)

POST, DELETE /admin/mapping/oneshot

Добавляет/удаляет правило для разовой отправки сообщения клиенту при подключении.

params:

{
  /* каналы сообщений, строка с одним или несколькими каналами через запятую */
  "channels": str,
  /* regexp каналов, по которому будет сравниваться каналы */
  "channels_pattern": str,
  /* точный путь по которому клиент пытается подключиться */
  "url_path": str,
  /* regexp пути подключения */
  "url_pattern": str,
  /* сообщение, ожидаемое клиентом */
  "message": object,
  /* задержка перед отправкой сообщения в сек (как в schedule.timeout) */
  "timeout": float
}

response:

{ "status": "ok", "oneshot_rules_added": 0 }
{ "status": "ok", "oneshot_rules_removed": 0 }

python:

async def add_oneshot_rule(self, messages: list[dict])
...
async def delete_oneshot_rule(self, data: dict)

POST, DELETE /admin/mapping/schedule

Добавляет/удаляет правило для периодической отправки сообщения клиенту с заданным интервалом.

params:

{
  /* каналы сообщений, строка с одним или несколькими каналами через запятую */
  "channels": str,
  /* regexp каналов, по которому будет сравниваться каналы */
  "channels_pattern": str,
  /* точный путь по которому клиент пытается подключиться */
  "url_path": str,
  /* сообщение, ожидаемое клиентом */
  "message": object,
  /* таймаут между отправкой сообщений в сек */
  "timeout": float
}

response:

{ "status": "ok", "schedule_rules_added": 0 }
{ "status": "ok", "schedule_rules_removed": 0 }

python:

async def add_schedule_rule(self, messages: list[dict], timeout: float)
...
async def delete_schedule_rule(self, data: dict)

POST /admin/mapping/reset

Сбросить все правила на сервере.

python:

async def reset_server(self)

Подключение приложения к вебсокет-серверу

Тестируемое приложение подключается к серверу по пути:

WS /ws/{ws_path:path}

где ws_path - путь до мокируемого сервера. Например, если необходимо замокать

ws://example.com/user/ws

то подключение к соответствующему каналу нашего сервера будет происходить так (да, там два слэша):

ws://websocket_server/ws//user/ws

При подключении клиента сервер сравнивает путь и каналы с существующими правилами и отправляет соответствующие сообщения.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

websocket_mockserver-2.0.1-py3-none-any.whl (10.0 kB view details)

Uploaded Python 3

File details

Details for the file websocket_mockserver-2.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for websocket_mockserver-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 9447e61cf3e73916cdc0b22726cda7085abe03abeafaa24ffa19becf53a27da1
MD5 190c2234ab4e58eb9cfd62dc5ea63959
BLAKE2b-256 c2a0e57a3ea6b3716ab8e3d884a94ece0c8c965eb7a190cc66be8cf936521b81

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page