From 205b2fde18bdf5f6ff77375b2028a4e45a64e256 Mon Sep 17 00:00:00 2001 From: Daniel McKnight Date: Fri, 3 Jan 2025 14:46:50 -0800 Subject: [PATCH] Implement RMQ test fixture --- neon_minerva/integration/rabbit_mq.py | 81 +++++++++++++++++++++++++++ requirements/rabbit_mq.txt | 1 + setup.py | 3 +- 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 neon_minerva/integration/rabbit_mq.py create mode 100644 requirements/rabbit_mq.txt diff --git a/neon_minerva/integration/rabbit_mq.py b/neon_minerva/integration/rabbit_mq.py new file mode 100644 index 0000000..fad055e --- /dev/null +++ b/neon_minerva/integration/rabbit_mq.py @@ -0,0 +1,81 @@ +# NEON AI (TM) SOFTWARE, Software Development Kit & Application Development System +# All trademark and other rights reserved by their respective owners +# Copyright 2008-2024 NeonGecko.com Inc. +# BSD-3 +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import pytest + +from os import environ +from port_for import get_port +from pytest_rabbitmq.factories.executor import RabbitMqExecutor +from pytest_rabbitmq.factories.process import get_config + + +@pytest.fixture(scope="class") +def rmq_instance(request, tmp_path_factory): + config = get_config(request) + rabbit_ctl = config["ctl"] + rabbit_server = config["server"] + rabbit_host = "127.0.0.1" + rabbit_port = get_port(config["port"]) + rabbit_distribution_port = get_port( + config["distribution_port"], [rabbit_port] + ) + assert rabbit_distribution_port + assert ( + rabbit_distribution_port != rabbit_port + ), "rabbit_port and distribution_port can not be the same!" + + tmpdir = tmp_path_factory.mktemp(f"pytest-rabbitmq-{request.fixturename}") + + rabbit_plugin_path = config["plugindir"] + + rabbit_logpath = config["logsdir"] + + if not rabbit_logpath: + rabbit_logpath = tmpdir / "logs" + + rabbit_executor = RabbitMqExecutor( + rabbit_server, + rabbit_host, + rabbit_port, + rabbit_distribution_port, + rabbit_ctl, + logpath=rabbit_logpath, + path=tmpdir, + plugin_path=rabbit_plugin_path, + node_name=config["node"], + ) + + rabbit_executor.start() + + # Init RMQ config + rmq_username = environ.get("TEST_RMQ_USERNAME", "test_llm_user") + rmq_password = environ.get("TEST_RMQ_PASSWORD", "test_llm_password") + rmq_vhost = environ.get("TEST_RMQ_VHOST", "/test") + rabbit_executor.rabbitctl_output("add_user", rmq_username, rmq_password) + rabbit_executor.rabbitctl_output("add_vhost", rmq_vhost) + rabbit_executor.rabbitctl_output("set_permissions", "-p", rmq_vhost, + rmq_username, ".*", ".*", ".*") + request.cls.rmq_instance = rabbit_executor diff --git a/requirements/rabbit_mq.txt b/requirements/rabbit_mq.txt new file mode 100644 index 0000000..0fbb850 --- /dev/null +++ b/requirements/rabbit_mq.txt @@ -0,0 +1 @@ +pytest-rabbitmq diff --git a/setup.py b/setup.py index 3f80cbb..265fc9a 100644 --- a/setup.py +++ b/setup.py @@ -75,7 +75,8 @@ def get_requirements(requirements_filename: str): python_requires='>=3.6', install_requires=get_requirements("requirements.txt"), extras_require={"chatbots": get_requirements("chatbots.txt"), - "padatious": get_requirements("padatious.txt")}, + "padatious": get_requirements("padatious.txt"), + "rmq": get_requirements("rabbit_mq.txt")}, entry_points={ 'console_scripts': ['minerva=neon_minerva.cli:neon_minerva_cli'] }