fix: mock correct libraries before tests
This commit is contained in:
37
test/conftest.py
Normal file
37
test/conftest.py
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import sys
|
||||||
|
from unittest.mock import MagicMock
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from unittest.mock import MagicMock
|
||||||
|
|
||||||
|
def pytest_configure(config):
|
||||||
|
"""
|
||||||
|
This hook runs at the start of the pytest session, before any tests are
|
||||||
|
collected. It mocks heavy or unavailable modules to prevent ImportErrors.
|
||||||
|
"""
|
||||||
|
# --- Mock spade and spade-bdi ---
|
||||||
|
mock_spade = MagicMock()
|
||||||
|
mock_spade.agent = MagicMock()
|
||||||
|
mock_spade.behaviour = MagicMock()
|
||||||
|
mock_spade_bdi = MagicMock()
|
||||||
|
mock_spade_bdi.bdi = MagicMock()
|
||||||
|
|
||||||
|
mock_spade.agent.Message = MagicMock()
|
||||||
|
mock_spade.behaviour.CyclicBehaviour = type('CyclicBehaviour', (object,), {})
|
||||||
|
mock_spade_bdi.bdi.BDIAgent = type('BDIAgent', (object,), {})
|
||||||
|
|
||||||
|
sys.modules['spade'] = mock_spade
|
||||||
|
sys.modules['spade.agent'] = mock_spade.agent
|
||||||
|
sys.modules['spade.behaviour'] = mock_spade.behaviour
|
||||||
|
sys.modules['spade_bdi'] = mock_spade_bdi
|
||||||
|
sys.modules['spade_bdi.bdi'] = mock_spade_bdi.bdi
|
||||||
|
|
||||||
|
# --- Mock the config module to prevent Pydantic ImportError ---
|
||||||
|
mock_config_module = MagicMock()
|
||||||
|
|
||||||
|
# The code under test does `from ... import settings`, so our mock module
|
||||||
|
# must have a `settings` attribute. We'll make it a MagicMock so we can
|
||||||
|
# configure it later in our tests using mocker.patch.
|
||||||
|
mock_config_module.settings = MagicMock()
|
||||||
|
|
||||||
|
sys.modules['control_backend.core.config'] = mock_config_module
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
import asyncio
|
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
from unittest.mock import MagicMock, AsyncMock, call
|
from unittest.mock import MagicMock, AsyncMock, call
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from spade.agent import Message
|
|
||||||
|
|
||||||
from control_backend.agents.bdi.behaviours.belief_setter import BeliefSetter
|
from control_backend.agents.bdi.behaviours.belief_setter import BeliefSetter
|
||||||
|
|
||||||
@@ -40,6 +38,15 @@ def belief_setter(mock_agent, mocker):
|
|||||||
return setter
|
return setter
|
||||||
|
|
||||||
|
|
||||||
|
def create_mock_message(sender_node: str, body: str, thread: str) -> MagicMock:
|
||||||
|
"""Helper function to create a configured mock message."""
|
||||||
|
msg = MagicMock()
|
||||||
|
msg.sender.node = sender_node # MagicMock automatically creates nested mocks
|
||||||
|
msg.body = body
|
||||||
|
msg.thread = thread
|
||||||
|
return msg
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_run_no_message_received(belief_setter, mocker):
|
async def test_run_no_message_received(belief_setter, mocker):
|
||||||
"""
|
"""
|
||||||
@@ -62,7 +69,7 @@ async def test_run_message_received(belief_setter, mocker):
|
|||||||
Test that when a message is received, _process_message is called.
|
Test that when a message is received, _process_message is called.
|
||||||
"""
|
"""
|
||||||
# Arrange
|
# Arrange
|
||||||
msg = Message(to="bdi_agent@test")
|
msg = MagicMock();
|
||||||
belief_setter.receive.return_value = msg
|
belief_setter.receive.return_value = msg
|
||||||
mocker.patch.object(belief_setter, "_process_message")
|
mocker.patch.object(belief_setter, "_process_message")
|
||||||
|
|
||||||
@@ -78,7 +85,7 @@ def test_process_message_from_belief_collector(belief_setter, mocker):
|
|||||||
Test processing a message from the correct belief collector agent.
|
Test processing a message from the correct belief collector agent.
|
||||||
"""
|
"""
|
||||||
# Arrange
|
# Arrange
|
||||||
msg = Message(to="bdi_agent@test", sender=COLLECTOR_AGENT_JID)
|
msg = create_mock_message(sender_node=COLLECTOR_AGENT_NAME, body="", thread="")
|
||||||
mock_process_belief = mocker.patch.object(belief_setter, "_process_belief_message")
|
mock_process_belief = mocker.patch.object(belief_setter, "_process_belief_message")
|
||||||
|
|
||||||
# Act
|
# Act
|
||||||
@@ -93,7 +100,7 @@ def test_process_message_from_other_agent(belief_setter, mocker):
|
|||||||
Test that messages from other agents are ignored.
|
Test that messages from other agents are ignored.
|
||||||
"""
|
"""
|
||||||
# Arrange
|
# Arrange
|
||||||
msg = Message(to="bdi_agent@test", sender="other_agent@test")
|
msg = create_mock_message(sender_node="other_agent", body="", thread="")
|
||||||
mock_process_belief = mocker.patch.object(belief_setter, "_process_belief_message")
|
mock_process_belief = mocker.patch.object(belief_setter, "_process_belief_message")
|
||||||
|
|
||||||
# Act
|
# Act
|
||||||
@@ -112,9 +119,8 @@ def test_process_belief_message_valid_json(belief_setter, mocker):
|
|||||||
"is_hot": [["kitchen"]],
|
"is_hot": [["kitchen"]],
|
||||||
"is_clean": [["kitchen"], ["bathroom"]]
|
"is_clean": [["kitchen"], ["bathroom"]]
|
||||||
}
|
}
|
||||||
msg = Message(
|
msg = create_mock_message(
|
||||||
to="bdi_agent@test",
|
sender_node=COLLECTOR_AGENT_JID,
|
||||||
sender=COLLECTOR_AGENT_JID,
|
|
||||||
body=json.dumps(beliefs_payload),
|
body=json.dumps(beliefs_payload),
|
||||||
thread="beliefs"
|
thread="beliefs"
|
||||||
)
|
)
|
||||||
@@ -132,9 +138,8 @@ def test_process_belief_message_invalid_json(belief_setter, mocker, caplog):
|
|||||||
Test that a message with invalid JSON is handled gracefully and an error is logged.
|
Test that a message with invalid JSON is handled gracefully and an error is logged.
|
||||||
"""
|
"""
|
||||||
# Arrange
|
# Arrange
|
||||||
msg = Message(
|
msg = create_mock_message(
|
||||||
to="bdi_agent@test",
|
sender_node=COLLECTOR_AGENT_JID,
|
||||||
sender=COLLECTOR_AGENT_JID,
|
|
||||||
body="this is not a json string",
|
body="this is not a json string",
|
||||||
thread="beliefs"
|
thread="beliefs"
|
||||||
)
|
)
|
||||||
@@ -154,9 +159,8 @@ def test_process_belief_message_wrong_thread(belief_setter, mocker):
|
|||||||
Test that a message with an incorrect thread is ignored.
|
Test that a message with an incorrect thread is ignored.
|
||||||
"""
|
"""
|
||||||
# Arrange
|
# Arrange
|
||||||
msg = Message(
|
msg = create_mock_message(
|
||||||
to="bdi_agent@test",
|
sender_node=COLLECTOR_AGENT_JID,
|
||||||
sender=COLLECTOR_AGENT_JID,
|
|
||||||
body='{"some": "data"}',
|
body='{"some": "data"}',
|
||||||
thread="not_beliefs"
|
thread="not_beliefs"
|
||||||
)
|
)
|
||||||
@@ -173,9 +177,8 @@ def test_process_belief_message_empty_body(belief_setter, mocker):
|
|||||||
Test that a message with an empty body is ignored.
|
Test that a message with an empty body is ignored.
|
||||||
"""
|
"""
|
||||||
# Arrange
|
# Arrange
|
||||||
msg = Message(
|
msg = create_mock_message(
|
||||||
to="bdi_agent@test",
|
sender_node=COLLECTOR_AGENT_JID,
|
||||||
sender=COLLECTOR_AGENT_JID,
|
|
||||||
body="",
|
body="",
|
||||||
thread="beliefs"
|
thread="beliefs"
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user