diff --git a/oracles/README.md b/oracles/README.md index 133be02..d2a14de 100644 --- a/oracles/README.md +++ b/oracles/README.md @@ -62,6 +62,11 @@ python oracle.py python -m pytest tests/unit ``` +### Running integration tests +``` +python -m pytest tests/integration +``` + ## Troubleshooting Verify your API keys and network connectivity if encountering issues with Serper or OpenAI APIs. For Docker or Python setup errors, ensure all prerequisites are correctly installed. \ No newline at end of file diff --git a/oracles/requirements.txt b/oracles/requirements.txt index 354fd37..012ef7a 100644 --- a/oracles/requirements.txt +++ b/oracles/requirements.txt @@ -6,4 +6,5 @@ web3==6.15.1 google-cloud-storage==2.14.0 pytest==8.1.1 pytest-cov==4.1.0 +pytest-asyncio==0.23.6 groq==0.4.2 diff --git a/oracles/tests/integration/llm/test_llm_groq.py b/oracles/tests/integration/llm/test_llm_groq.py new file mode 100644 index 0000000..22d33b4 --- /dev/null +++ b/oracles/tests/integration/llm/test_llm_groq.py @@ -0,0 +1,56 @@ +import pytest + +from src.entities import Chat +from src.entities import PromptType +from src.entities import GroqConfig +from src.domain.llm import generate_response_use_case + +MESSAGES = [{"role": "user", "content": "Hello"}] + + +async def _get_config(model: str) -> GroqConfig: + return GroqConfig( + model=model, + frequency_penalty=0.0, + logit_bias=None, + max_tokens=100, + presence_penalty=0.0, + response_format=None, + seed=None, + stop=None, + temperature=0.0, + top_p=1.0, + user=None, + ) + + +async def _get_chat(model: str) -> Chat: + return Chat( + id="1", + callback_id="1", + is_processed=False, + prompt_type=PromptType.GROQ.value, + messages=MESSAGES, + config=await _get_config(model), + ) + + +@pytest.mark.asyncio +async def test_mixtral(): + chat = await _get_chat("mixtral-8x7b-32768") + result = await generate_response_use_case._generate_groq_with_params(chat) + assert "hello" in result.choices[0].message.content.lower() + + +@pytest.mark.asyncio +async def test_llama2_70b(): + chat = await _get_chat("llama2-70b-4096") + result = await generate_response_use_case._generate_groq_with_params(chat) + assert "hello" in result.choices[0].message.content.lower() + + +@pytest.mark.asyncio +async def test_gemma_7b_it(): + chat = await _get_chat("gemma-7b-it") + result = await generate_response_use_case._generate_groq_with_params(chat) + assert "hello" in result.choices[0].message.content.lower() diff --git a/oracles/tests/integration/llm/test_llm_openai.py b/oracles/tests/integration/llm/test_llm_openai.py new file mode 100644 index 0000000..c764565 --- /dev/null +++ b/oracles/tests/integration/llm/test_llm_openai.py @@ -0,0 +1,53 @@ +import pytest + +from src.entities import Chat +from src.entities import PromptType +from src.entities import OpenAiConfig +from src.domain.llm import generate_response_use_case + +MESSAGES = [{"role": "user", "content": "Just say Hello"}] + + +async def _get_config(model: str) -> OpenAiConfig: + return OpenAiConfig( + model=model, + frequency_penalty=0.0, + logit_bias=None, + max_tokens=100, + presence_penalty=0.0, + response_format=None, + seed=None, + stop=None, + temperature=0.0, + top_p=1.0, + user=None, + tools=None, + tool_choice=None, + ) + + +async def _get_chat(model: str) -> Chat: + return Chat( + id="1", + callback_id="1", + is_processed=False, + prompt_type=PromptType.OPENAI.value, + messages=MESSAGES, + config=await _get_config(model), + ) + + +@pytest.mark.asyncio +async def test_gpt_3_5_turbo(): + chat = await _get_chat("gpt-3.5-turbo-1106") + result = await generate_response_use_case._generate_openai_with_params(chat) + assert result is not None + assert "hello" in result.choices[0].message.content.lower() + + +@pytest.mark.asyncio +async def test_gpt_4_turbo(): + chat = await _get_chat("gpt-4-turbo-preview") + result = await generate_response_use_case._generate_openai_with_params(chat) + assert result is not None + assert "hello" in result.choices[0].message.content.lower() diff --git a/oracles/tests/integration/repositories/test_ipfs_repository.py b/oracles/tests/integration/repositories/test_ipfs_repository.py new file mode 100644 index 0000000..2bed377 --- /dev/null +++ b/oracles/tests/integration/repositories/test_ipfs_repository.py @@ -0,0 +1,12 @@ +import pytest + +from src.repositories.ipfs_repository import IpfsRepository + + +@pytest.mark.asyncio +async def test_ipfs_repository(): + ipfs = IpfsRepository() + cid = await ipfs.write_file(bytes([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])) + assert cid is not None + data = await ipfs.read_file(cid) + assert data == bytes([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) diff --git a/oracles/tests/integration/repositories/test_oracle_repository.py b/oracles/tests/integration/repositories/test_oracle_repository.py new file mode 100644 index 0000000..7110091 --- /dev/null +++ b/oracles/tests/integration/repositories/test_oracle_repository.py @@ -0,0 +1,16 @@ +import pytest + +from src.repositories.oracle_repository import OracleRepository + + +@pytest.mark.asyncio +async def test_oracle_repository(): + oracle_repository = OracleRepository() + chats = await oracle_repository.get_unanswered_chats() + assert chats is not None + functions = await oracle_repository.get_unanswered_function_calls() + assert functions is not None + kb_indexing_requests = await oracle_repository.get_unindexed_knowledge_bases() + assert kb_indexing_requests is not None + kb_queries = await oracle_repository.get_unanswered_kb_queries() + assert kb_queries is not None diff --git a/oracles/tests/integration/storage/test_reupload_to_gcp.py b/oracles/tests/integration/storage/test_reupload_to_gcp.py new file mode 100644 index 0000000..c7fe231 --- /dev/null +++ b/oracles/tests/integration/storage/test_reupload_to_gcp.py @@ -0,0 +1,10 @@ +import pytest + +from src.domain.storage import reupload_to_gcp_use_case + + +@pytest.mark.asyncio +async def test_reupload_to_gcp_use_case(): + download_url = "https://picsum.photos/200/200" + result = await reupload_to_gcp_use_case.execute(download_url) + assert len(result) > 0 diff --git a/oracles/tests/integration/tools/test_image_generation.py b/oracles/tests/integration/tools/test_image_generation.py new file mode 100644 index 0000000..005bf68 --- /dev/null +++ b/oracles/tests/integration/tools/test_image_generation.py @@ -0,0 +1,11 @@ +import pytest + +from src.domain.tools.image_generation import generate_image_use_case + + +@pytest.mark.asyncio +async def test_generate_image_use_case(): + query = "white horse" + result = await generate_image_use_case.execute(query) + assert len(result.url) > 0 + assert result.error == "" diff --git a/oracles/tests/integration/tools/test_tool_code_interpreter.py b/oracles/tests/integration/tools/test_tool_code_interpreter.py new file mode 100644 index 0000000..142b036 --- /dev/null +++ b/oracles/tests/integration/tools/test_tool_code_interpreter.py @@ -0,0 +1,18 @@ +import pytest +from src.domain.tools.code_interpreter import python_interpreter_use_case +from src.domain.tools.code_interpreter.entities import PythonInterpreterResult + + +def _format_json_output(stdout: str, stderr: str) -> str: + return f'{{"stdout": "{stdout}", "stderr": "{stderr}"}}' + + +@pytest.mark.asyncio +async def test_python_interpreter_success(): + code = "print('Hello world')" + result = await python_interpreter_use_case.execute(code) + assert result == PythonInterpreterResult( + output=_format_json_output("Hello world\\n", ""), + error="", + exit_code=0, + ) diff --git a/oracles/tests/integration/tools/test_web_search.py b/oracles/tests/integration/tools/test_web_search.py new file mode 100644 index 0000000..b29501f --- /dev/null +++ b/oracles/tests/integration/tools/test_web_search.py @@ -0,0 +1,11 @@ +import pytest + +from src.domain.tools.search import web_search_use_case + + +@pytest.mark.asyncio +async def test_web_search_use_case(): + query = "test" + result = await web_search_use_case.execute(query) + assert len(result.result) > 0 + assert result.error == ""