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__])