1
0
mirror of synced 2025-12-26 14:02:10 -05:00
Files
airbyte/tools/ci_code_validator/tests/test_tools.py
2022-02-21 14:01:42 +02:00

103 lines
3.7 KiB
Python

import json
import os
import shutil
import subprocess
from pathlib import Path
import pytest
import requests_mock
from ci_code_validator.ci_sonar_qube.log_parsers import LogParser
HERE = Path(__file__).parent
PACKAGE_DIR = HERE / "simple_package"
SMELL_PACKAGE_DIR = HERE / "simple_smell_package"
SIMPLE_FILES = HERE / "simple_files"
WITHOUT_ISSUE_REPORT = SIMPLE_FILES / "without_issues_report.json"
ISORT_CMD = """isort --diff {package_dir}""" # config file should be in a started folder
BLACK_CMD = r"""black --config {toml_config_file} --diff {package_dir}"""
MYPY_CMD = r"""mypy {package_dir} --config-file={toml_config_file}"""
@pytest.fixture(scope="session")
def toml_config_file() -> Path:
root_dir = HERE
while str(root_dir) != root_dir.root:
config_file = root_dir / "pyproject.toml"
if config_file.is_file():
return config_file
root_dir = root_dir.parent
raise Exception("can't found pyproject.toml")
@pytest.fixture(autouse=True)
def prepare_toml_file(toml_config_file):
pyproject_toml = Path(os.getcwd()) / "pyproject.toml"
if toml_config_file != pyproject_toml and not pyproject_toml.is_file():
shutil.copy(toml_config_file, pyproject_toml)
yield
if toml_config_file != pyproject_toml and pyproject_toml.is_file():
os.remove(str(pyproject_toml))
@pytest.mark.parametrize(
"cmd,package_dir,expected_file",
[
(
"mypy {package_dir} --config-file={toml_config_file}",
SMELL_PACKAGE_DIR,
SIMPLE_FILES / "mypy_smell_package_report.json"
),
(
"mypy {package_dir} --config-file={toml_config_file}",
PACKAGE_DIR,
WITHOUT_ISSUE_REPORT
),
(
"black --config {toml_config_file} --diff {package_dir}",
SMELL_PACKAGE_DIR,
HERE / "simple_files/black_smell_package_report.json"
),
(
"black --config {toml_config_file} --diff {package_dir}",
PACKAGE_DIR,
WITHOUT_ISSUE_REPORT
),
(
ISORT_CMD,
SMELL_PACKAGE_DIR,
HERE / "simple_files/isort_smell_package_report.json"
),
(
ISORT_CMD,
PACKAGE_DIR,
WITHOUT_ISSUE_REPORT,
),
],
ids=["mypy_failed", "mypy_pass", "black_failed", "black_pass", "isort_failed", "isort_pass"]
)
def test_tool(tmp_path, toml_config_file, cmd, package_dir, expected_file):
cmd = cmd.format(package_dir=package_dir, toml_config_file=toml_config_file)
proc = subprocess.Popen(cmd.split(" "), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, _ = proc.communicate()
file_log = tmp_path / "temp.log"
file_log.write_bytes(out)
assert file_log.is_file() is True
issues_file = tmp_path / "issues.json"
with requests_mock.Mocker() as m:
m.get('/api/authentication/validate', json={"valid": True})
m.get("/api/rules/search", json={"rules": []})
m.post("/api/rules/create", json={})
parser = LogParser(issues_file, host="http://fake.com/", token="fake_token")
assert getattr(parser, f'from_{cmd.split(" ")[0]}')(file_log) == 0
assert issues_file.is_file() is True
data = json.loads(issues_file.read_text())
for issue in data["issues"]:
issue["primaryLocation"]["filePath"] = "/".join(issue["primaryLocation"]["filePath"].split("/")[-2:])
expected_data = json.loads(Path(expected_file).read_text())
assert json.dumps(data, sort_keys=True, separators=(',', ': ')) == json.dumps(expected_data, sort_keys=True, separators=(',', ': '))