mirror of
https://github.com/FoundationAgents/MetaGPT.git
synced 2026-04-25 08:46:48 +02:00
86 lines
2.4 KiB
Python
86 lines
2.4 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
@Time : 2023/5/1 12:10
|
|
@Author : alexanderwu
|
|
@File : conftest.py
|
|
"""
|
|
|
|
import asyncio
|
|
import re
|
|
from unittest.mock import Mock
|
|
|
|
import pytest
|
|
|
|
from metagpt.config import CONFIG
|
|
from metagpt.const import DEFAULT_WORKSPACE_ROOT
|
|
from metagpt.logs import logger
|
|
from metagpt.provider.openai_api import OpenAIGPTAPI as GPTAPI
|
|
from metagpt.utils.git_repository import GitRepository
|
|
|
|
|
|
class Context:
|
|
def __init__(self):
|
|
self._llm_ui = None
|
|
self._llm_api = GPTAPI()
|
|
|
|
@property
|
|
def llm_api(self):
|
|
return self._llm_api
|
|
|
|
|
|
@pytest.fixture(scope="package")
|
|
def llm_api():
|
|
logger.info("Setting up the test")
|
|
_context = Context()
|
|
|
|
yield _context.llm_api
|
|
|
|
logger.info("Tearing down the test")
|
|
|
|
|
|
@pytest.fixture(scope="function")
|
|
def mock_llm():
|
|
# Create a mock LLM for testing
|
|
return Mock()
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def proxy():
|
|
pattern = re.compile(
|
|
rb"(?P<method>[a-zA-Z]+) (?P<uri>(\w+://)?(?P<host>[^\s\'\"<>\[\]{}|/:]+)(:(?P<port>\d+))?[^\s\'\"<>\[\]{}|]*) "
|
|
)
|
|
|
|
async def pipe(reader, writer):
|
|
while not reader.at_eof():
|
|
writer.write(await reader.read(2048))
|
|
writer.close()
|
|
|
|
async def handle_client(reader, writer):
|
|
data = await reader.readuntil(b"\r\n\r\n")
|
|
print(f"Proxy: {data}") # checking with capfd fixture
|
|
infos = pattern.match(data)
|
|
host, port = infos.group("host"), infos.group("port")
|
|
port = int(port) if port else 80
|
|
remote_reader, remote_writer = await asyncio.open_connection(host, port)
|
|
if data.startswith(b"CONNECT"):
|
|
writer.write(b"HTTP/1.1 200 Connection Established\r\n\r\n")
|
|
else:
|
|
remote_writer.write(data)
|
|
await asyncio.gather(pipe(reader, remote_writer), pipe(remote_reader, writer))
|
|
|
|
server = asyncio.get_event_loop().run_until_complete(asyncio.start_server(handle_client, "127.0.0.1", 0))
|
|
return "http://{}:{}".format(*server.sockets[0].getsockname())
|
|
|
|
|
|
# init & dispose git repo
|
|
@pytest.fixture(scope="session", autouse=True)
|
|
def setup_and_teardown_git_repo(request):
|
|
CONFIG.git_repo = GitRepository(local_path=DEFAULT_WORKSPACE_ROOT / "unittest")
|
|
|
|
# Destroy git repo at the end of the test session.
|
|
def fin():
|
|
CONFIG.git_repo.delete_repository()
|
|
|
|
# Register the function for destroying the environment.
|
|
request.addfinalizer(fin)
|