-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_plugin_run.py
105 lines (83 loc) · 5.59 KB
/
test_plugin_run.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import datetime
import importlib.util
import os
from typing import Type
import sys
import pytest
from pathlib import Path
from s3p_sdk.plugin.payloads.parsers import S3PParserBase
from selenium.webdriver.chrome import webdriver
from selenium.webdriver import Chrome
from selenium.webdriver.ie.webdriver import WebDriver
from tests.config.fixtures import fix_plugin_config, project_config
from tests.payload.fixtures import execute_timeout
from s3p_sdk.types import S3PRefer, S3PDocument, S3PPlugin, S3PPluginRestrictions
from s3p_sdk.plugin.types import SOURCE
@pytest.mark.payload_set
class TestPayloadRun:
@pytest.fixture(scope="class", autouse=True)
def chrome_driver(self) -> WebDriver:
options = webdriver.Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('window-size=1920x1080')
options.add_argument("disable-gpu")
driver = Chrome(options=options)
yield driver
driver.quit()
@pytest.fixture(scope="class")
def fix_s3pRefer(self) -> S3PRefer:
return S3PRefer(1, 'test-refer', SOURCE, None)
@pytest.fixture(scope="class")
def fix_s3pPlugin(self) -> S3PPlugin:
return S3PPlugin(1, 'unittests/repo/1', True, None, None, SOURCE, "3.0")
@pytest.fixture(scope="module", autouse=True)
def fix_payload(self, project_config, fix_plugin_config) -> Type[S3PParserBase]:
MODULE_NAME: str = 's3p_test_plugin_payload'
"""Загружает конфигурацию из config.py файла по динамическому пути на основании конфигурации"""
payload_path = Path(project_config.root) / 'src' / project_config.name / fix_plugin_config.payload.file
assert os.path.exists(payload_path)
spec = importlib.util.spec_from_file_location(MODULE_NAME, payload_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
# Get the class from the module
class_name = fix_plugin_config.payload.classname
assert class_name in module.__dict__, f"Class {class_name} not found in module."
# Create an instance of the class
parser_class = module.__dict__[class_name]
assert issubclass(parser_class, S3PParserBase), f"{class_name} is not a subclass of S3PParserBase."
return parser_class
def run_payload(self, payload: Type[S3PParserBase], _plugin: S3PPlugin, driver: WebDriver, refer: S3PRefer, max_document: int,
timeout: int = 2):
# !WARNING Требуется изменить путь до актуального парсера плагина
from src.s3_platform_plugin_template.template_payload import MyTemplateParser
if isinstance(payload, type(MyTemplateParser)):
_payload = payload(refer=refer, plugin=_plugin, restrictions=S3PPluginRestrictions(max_document, None, None, None), web_driver=driver)
@execute_timeout(timeout)
def execute() -> tuple[S3PDocument, ...]:
return _payload.content()
return execute()
else:
assert False, "Тест проверяет payload плагина"
def test_all_cases_with_once_executing_parser(self, chrome_driver, fix_s3pRefer, fix_payload, fix_s3pPlugin):
"""
Test Case
Этот тест выполняет однократный запуск парсера, а затем проверяет ответ по нескольким параметрам.
Требования:
1. Количество материалов должно быть не меньше параметра максимального числа материалов.
2. Тип возвращаемых документов должен соответствовать S3PDocument
3. Каждый полученный документ должен обязательно содержать 3 ключевых поля (title, link, published)
"""
max_docs = 4
docs = self.run_payload(fix_payload, fix_s3pPlugin, chrome_driver, fix_s3pRefer, max_docs, 100)
# 1. Количество материалов должно быть не меньше параметра максимального числа материалов.
assert len(docs) == max_docs, f"Payload вернул {len(docs)} материалов. А должен был {max_docs}"
# 2. Тип возвращаемых документов должен соответствовать S3PDocument
assert isinstance(docs, tuple) and all([isinstance(el, S3PDocument) for el in docs]), f"Тип возвращаемых документов должен соответствовать S3PDocument"
# 3. Каждый полученный документ должен обязательно содержать 3 ключевых поля (title, link, published)
for el in docs:
assert el.title is not None and isinstance(el.title, str), f"Документ {el} должен обязательно содержать ключевое поле title"
assert el.link is not None and isinstance(el.link, str), f"Документ {el} должен обязательно содержать ключевое поле link"
assert el.published is not None and isinstance(el.published, datetime.datetime), f"Документ {el} должен обязательно содержать ключевое поле published"
assert el.hash