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", } ]
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