120 lines
4.8 KiB
Python
120 lines
4.8 KiB
Python
import sys
|
|
import os
|
|
import pytest
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
src_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'src'))
|
|
sys.path.insert(0, src_dir)
|
|
|
|
from controller.mainFrameController import MainFrameController
|
|
from views.mainScreen import MainFrame
|
|
from models.data import TextData
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_main_frame():
|
|
mock_frame = MagicMock(spec=MainFrame)
|
|
mock_frame.provider_container = MagicMock()
|
|
mock_frame.entry_url = MagicMock()
|
|
mock_frame.input_textbox = MagicMock()
|
|
return mock_frame
|
|
|
|
@pytest.fixture
|
|
def controller(mock_main_frame):
|
|
with patch('controller.mainFrameController.VeraMindInference'), \
|
|
patch('controller.mainFrameController.FakeNewsChecker'), \
|
|
patch('controller.mainFrameController.ArticleRater'):
|
|
return MainFrameController(mock_main_frame)
|
|
|
|
def test_init(controller):
|
|
assert isinstance(controller.frame, MagicMock)
|
|
assert isinstance(controller.frame.provider_container, MagicMock)
|
|
assert isinstance(controller.model_inference, MagicMock)
|
|
assert isinstance(controller.db, MagicMock)
|
|
assert isinstance(controller.rater, MagicMock)
|
|
|
|
def test_get_text_data(controller):
|
|
controller.frame.entry_url.get.return_value = "https://example.com"
|
|
controller.frame.input_textbox.get.return_value = "Sample text"
|
|
|
|
with patch('models.data.TextData.text_from_url', return_value=False):
|
|
text_data = controller.get_text_data()
|
|
|
|
assert isinstance(text_data, TextData)
|
|
assert text_data.url == "https://example.com"
|
|
assert text_data.text == "Sample text"
|
|
assert text_data.provider == "Unknown"
|
|
|
|
@pytest.mark.parametrize("result, expected_result_color, confidence, expected_confidence_color", [
|
|
("REAL", "green", 0.85, "green"), # High confidence for REAL result
|
|
("REAL", "green", 0.65, "orange"), # Medium confidence for REAL result
|
|
("REAL", "green", 0.45, "red"), # Low confidence for REAL result
|
|
("FAKE", "red", 0.85, "green"), # High confidence for FAKE result
|
|
("FAKE", "red", 0.65, "orange"), # Medium confidence for FAKE result
|
|
("FAKE", "red", 0.45, "red"), # Low confidence for FAKE result
|
|
])
|
|
def test_press_check_button(controller, result, expected_result_color, confidence, expected_confidence_color):
|
|
# Mock controller methods and properties
|
|
controller.get_text_data = MagicMock(return_value=TextData(text="Sample text"))
|
|
text_data = TextData(text="Sample text")
|
|
text_data.result = result
|
|
text_data.confidence = confidence
|
|
text_data.is_fake_news = (result == "FAKE")
|
|
controller._predict = MagicMock(return_value=text_data)
|
|
controller._add_to_db = MagicMock()
|
|
controller.update_provider_list = MagicMock()
|
|
|
|
# Create a mock response chunk with a content attribute
|
|
class MockChunk:
|
|
def __init__(self, content):
|
|
self.content = content
|
|
|
|
# Mocking get_response to return a list of MockChunk instances
|
|
mock_response = [MockChunk("Sample response")]
|
|
controller.rater.get_response = MagicMock(return_value=mock_response)
|
|
|
|
# Mock frame and its subcomponents
|
|
controller.frame = MagicMock()
|
|
controller.frame.result_label.configure = MagicMock()
|
|
controller.frame.confidence_label.configure = MagicMock()
|
|
controller.frame.output_textbox = MagicMock()
|
|
controller.frame.output_textbox.insert = MagicMock()
|
|
|
|
# Call the method
|
|
controller.press_check_button()
|
|
|
|
# Assertions for result label and confidence label colors
|
|
controller.frame.result_label.configure.assert_called_with(text=result, fg_color=expected_result_color)
|
|
controller.frame.confidence_label.configure.assert_any_call(text=f"{confidence * 100:.2f}%")
|
|
controller.frame.confidence_label.configure.assert_any_call(fg_color=expected_confidence_color)
|
|
|
|
# Additional assertion to verify that the output textbox is updated with the response content
|
|
controller.frame.output_textbox.insert.assert_called_with("end", mock_response[0].content)
|
|
|
|
|
|
def test_predict(controller):
|
|
text_data = TextData(text="Sample text")
|
|
controller.model_inference.predict.return_value = {
|
|
"confidence": 0.9,
|
|
"result": "REAL",
|
|
"is_fake": False
|
|
}
|
|
|
|
result = controller._predict(text_data)
|
|
|
|
assert result.confidence == 0.9
|
|
assert result.result == "REAL"
|
|
assert result.is_fake_news == False
|
|
|
|
def test_add_to_db(controller):
|
|
text_data = TextData(url="https://example.com", provider="Example Provider", is_fake_news=False)
|
|
controller._add_to_db(text_data)
|
|
controller.db.insert_data.assert_called_with(
|
|
url="https://example.com",
|
|
anbieter="example.com",
|
|
is_fake_news=False
|
|
)
|
|
|
|
if __name__ == "__main__":
|
|
pytest.main([__file__])
|