from collections import namedtuple from typing import Dict from bs4 import BeautifulSoup from db_layer.capturing_tasks_interface import CapturingTasksInterface from core.parsing_utils import ParsingFlow from core.scrapping_utils import UrlAttack class MockCapturingInterface(CapturingTasksInterface): task_state_record = namedtuple( "TaskStateRecord", ["uuid", "uuid_exploring", "status", "ad_url"] ) def __init__(self): self.tasks = {} def update_capturing_task(self, uuid, uuid_exploring, status, ad_url): if uuid not in self.tasks: self.tasks[uuid] = [] self.tasks[uuid].append( MockCapturingInterface.task_state_record( uuid=uuid, uuid_exploring=uuid_exploring, status=status, ad_url=ad_url ) ) class MockParsingFlow(ParsingFlow): def __init__( self, issues_to_return: Dict[str, dict] = None, mock_all_found_fields_are_valid: bool = True, mock_all_non_optional_fields_were_found: bool = True, mock_field_values_to_return: Dict[str, dict] = None, ): args_with_empty_dict_as_default = [ issues_to_return, mock_field_values_to_return, ] for arg in args_with_empty_dict_as_default: if arg is None: arg = dict() self._issues = issues_to_return self._mock_all_found_fields_are_valid = mock_all_found_fields_are_valid self._mock_field_values_to_return = mock_field_values_to_return self._mock_all_non_optional_fields_were_found = ( mock_all_non_optional_fields_were_found ) def execute_flow(self, soup: BeautifulSoup) -> None: pass @property def issues(self) -> Dict[str, dict]: return self._issues @property def all_found_fields_are_valid(self) -> bool: return self._mock_all_found_fields_are_valid @property def all_non_optional_fields_were_found(self) -> bool: return self._mock_all_non_optional_fields_were_found @property def field_values(self) -> Dict: return self._mock_field_values_to_return class MockUrlAttack(UrlAttack): def __init__(self, url: str) -> None: super().__init__(url=url) def get_text(self) -> str: return "this_is_a_fake_html_string" class MockUrlAttackReturnsSuccess(MockUrlAttack): def __init__(self, url: str) -> None: super().__init__(url=url) def attack(self) -> None: self.success = True self.has_been_attacked = True class MockUrlAttackReturnsFailure(MockUrlAttack): def __init__(self, url: str) -> None: super().__init__(url=url) def attack(self) -> None: self.success = False self.has_been_attacked = True