Пример #1
0
def test_phabricator_mozlint(
    mock_config, mock_phabricator, phab, mock_try_task, mock_task
):
    """
    Test Phabricator reporter publication on two mock mozlint issues
    using two different analyzers
    """

    with mock_phabricator as api:
        revision = Revision.from_try(mock_try_task, api)
        revision.mercurial_revision = "deadbeef1234"
        revision.repository = "https://hg.mozilla.org/try"
        revision.repository_try_name = "try"
        revision.lines = {
            # Add dummy lines diff
            "python/test.py": [41, 42, 43],
            "js/test.js": [10, 11, 12],
            "dom/test.cpp": [42],
        }
        revision.files = revision.lines.keys()
        reporter = PhabricatorReporter({}, api=api)

    issue_flake = MozLintIssue(
        analyzer=mock_task(MozLintTask, "source-test-mozlint-py-flake8"),
        path="python/test.py",
        lineno=42,
        column=1,
        message="A bad bad error",
        level="error",
        revision=revision,
        linter="flake8",
        check="EXXX",
    )
    assert issue_flake.is_publishable()

    issue_eslint = MozLintIssue(
        analyzer=mock_task(MozLintTask, "source-test-mozlint-eslint"),
        path="js/test.js",
        lineno=10,
        column=4,
        message="A bad error",
        level="warning",
        revision=revision,
        linter="eslint",
        check="YYY",
    )
    assert issue_eslint.is_publishable()

    issues, patches = reporter.publish([issue_flake, issue_eslint], revision, [])
    assert len(issues) == 2
    assert len(patches) == 0

    # Check the callbacks have been used to publish either a lint result + summary comment
    assert phab.comments[51] == [
        VALID_FLAKE8_MESSAGE.format(results=mock_config.taskcluster.results_dir)
    ]
    assert phab.build_messages["PHID-HMBT-test"] == [
        {
            "buildTargetPHID": "PHID-HMBT-test",
            "lint": [
                {
                    "char": 1,
                    "code": "EXXX",
                    "description": "(IMPORTANT) ERROR: A bad bad error",
                    "line": 42,
                    "name": "py-flake8 (Mozlint)",
                    "path": "python/test.py",
                    "severity": "error",
                },
                {
                    "char": 4,
                    "code": "YYY",
                    "description": "WARNING: A bad error",
                    "line": 10,
                    "name": "eslint (Mozlint)",
                    "path": "js/test.js",
                    "severity": "warning",
                },
            ],
            "unit": [],
            "type": "work",
        }
    ]
Пример #2
0
def test_phabricator_mozlint(
    reporter_config, errors_reported, mock_config, mock_phabricator, mock_try_task
):
    """
    Test Phabricator reporter publication on a mock mozlint issue
    """
    from code_review_bot.report.phabricator import PhabricatorReporter
    from code_review_bot.revisions import Revision
    from code_review_bot.tasks.lint import MozLintIssue

    def _check_inline(request):
        payload = urllib.parse.parse_qs(request.body)
        assert payload["output"] == ["json"]
        assert len(payload["params"]) == 1
        details = json.loads(payload["params"][0])

        assert details == {
            "__conduit__": {"token": "deadbeef"},
            "content": "Error: A bad bad error [flake8: EXXX]",
            "diffID": 42,
            "filePath": "python/test.py",
            "isNewFile": 1,
            "lineLength": 0,
            "lineNumber": 42,
        }

        # Outputs dummy empty response
        resp = {"error_code": None, "result": {"id": "PHID-XXXX-YYYYY"}}
        return (
            201,
            {"Content-Type": "application/json", "unittest": "flake8-inline"},
            json.dumps(resp),
        )

    def _check_comment(request):
        # Check the Phabricator main comment is well formed
        payload = urllib.parse.parse_qs(request.body)
        assert payload["output"] == ["json"]
        assert len(payload["params"]) == 1
        details = json.loads(payload["params"][0])
        assert details["message"] == VALID_FLAKE8_MESSAGE.format(
            results=mock_config.taskcluster.results_dir
        )

        # Outputs dummy empty response
        resp = {"error_code": None, "result": None}
        return (
            201,
            {"Content-Type": "application/json", "unittest": "flake8-comment"},
            json.dumps(resp),
        )

    def _check_message(request):
        payload = urllib.parse.parse_qs(request.body)
        assert payload["output"] == ["json"]
        assert len(payload["params"]) == 1
        details = json.loads(payload["params"][0])
        assert details == {
            "buildTargetPHID": "PHID-HMBT-test",
            "lint": [
                {
                    "char": 1,
                    "code": "EXXX",
                    "description": "A bad bad error",
                    "line": 42,
                    "name": "source-test-mozlint-py-flake8",
                    "path": "python/test.py",
                    "severity": "error",
                }
            ],
            "unit": [],
            "type": "work",
            "__conduit__": {"token": "deadbeef"},
        }

        # Outputs dummy empty response
        resp = {"error_code": None, "result": None}
        return (
            201,
            {"Content-Type": "application/json", "unittest": "flake8-error"},
            json.dumps(resp),
        )

    responses.add_callback(
        responses.POST,
        "http://phabricator.test/api/differential.createinline",
        callback=_check_inline,
    )

    responses.add_callback(
        responses.POST,
        "http://phabricator.test/api/differential.createcomment",
        callback=_check_comment,
    )

    responses.add_callback(
        responses.POST,
        "http://phabricator.test/api/harbormaster.sendmessage",
        callback=_check_message,
    )

    with mock_phabricator as api:
        revision = Revision.from_try(mock_try_task, api)
        revision.lines = {
            # Add dummy lines diff
            "python/test.py": [41, 42, 43],
            "dom/test.cpp": [42],
        }
        revision.files = revision.lines.keys()
        reporter = PhabricatorReporter(reporter_config, api=api)

    issue = MozLintIssue(
        analyzer="source-test-mozlint-py-flake8",
        path="python/test.py",
        lineno=42,
        column=1,
        message="A bad bad error",
        level="error",
        revision=revision,
        linter="flake8",
        check="EXXX",
    )
    assert issue.is_publishable()

    issues, patches = reporter.publish([issue], revision, [])
    assert len(issues) == 1
    assert len(patches) == 0

    # Check the callbacks have been used to publish either:
    # - an inline comment + summary comment when publish_errors is False
    # - a lint result + summary comment when publish_errors is True
    assert len(responses.calls) > 0
    if errors_reported:
        urls = [
            "http://phabricator.test/api/differential.createcomment",
            "http://phabricator.test/api/harbormaster.sendmessage",
        ]
        markers = ["flake8-comment", "flake8-error"]

    else:
        urls = [
            "http://phabricator.test/api/differential.createinline",
            "http://phabricator.test/api/differential.createcomment",
        ]
        markers = ["flake8-inline", "flake8-comment"]

    assert [r.request.url for r in responses.calls[-2:]] == urls
    assert [r.response.headers.get("unittest") for r in responses.calls[-2:]] == markers