def test_backend_publication(mock_revision, mock_task): """ Test the backend publication status modifies an issue publication """ lines = [ (1, None, b"deletion"), (None, 1, b"change here"), ] issue = ClangFormatIssue( mock_task(ClangFormatTask, "mock-clang-format"), "dom/somefile.cpp", lines, mock_revision, ) assert issue.validates() # At first backend data is empty assert issue.on_backend is None # Not publishable as not in patch assert mock_revision.lines == {} assert not mock_revision.contains(issue) assert not issue.is_publishable() # The backend data takes precedence over local in patch issue.on_backend = {"publishable": True} assert issue.is_publishable()
def test_phabricator_clang_format(mock_config, mock_phabricator, mock_try_task): """ Test Phabricator reporter publication on a mock clang-format issue """ from code_review_bot.report.phabricator import PhabricatorReporter from code_review_bot.revisions import Revision, ImprovementPatch from code_review_bot.tasks.clang_format import ClangFormatIssue 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_CLANG_FORMAT_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": "clang-format"}, json.dumps(resp), ) responses.add_callback( responses.POST, "http://phabricator.test/api/differential.createcomment", callback=_check_comment, ) with mock_phabricator as api: revision = Revision.from_try(mock_try_task, api) revision.lines = { # Add dummy lines diff "test.cpp": [41, 42, 43], "dom/test.cpp": [42], } reporter = PhabricatorReporter({"analyzers": ["clang-format"]}, api=api) issue = ClangFormatIssue( "source-test-clang-format", "dom/test.cpp", 42, 1, revision ) assert issue.is_publishable() revision.improvement_patches = [ ImprovementPatch("clang-format", repr(revision), "Some lint fixes") ] list(map(lambda p: p.write(), revision.improvement_patches)) # trigger local write issues, patches = reporter.publish([issue], revision, []) assert len(issues) == 1 assert len(patches) == 1 # Check the callback has been used assert len(responses.calls) > 0 call = responses.calls[-1] assert call.request.url == "http://phabricator.test/api/differential.createcomment" assert call.response.headers.get("unittest") == "clang-format"
def test_backend_publication(mock_revision): """ Test the backend publication status modifies an issue publication """ issue = ClangFormatIssue("mock-clang-format", "dom/somefile.cpp", 1, 1, mock_revision) assert issue.validates() # At first backend data is empty assert issue.on_backend is None # Not publishable as not in patch assert mock_revision.lines == {} assert not mock_revision.contains(issue) assert not issue.is_publishable() # The backend data takes precedence over local in patch issue.on_backend = {"publishable": True} assert issue.is_publishable()
def test_clang_format_3rd_party(mock_config, mock_revision): """ Test a clang format issue in 3rd party is not publishable """ from code_review_bot.tasks.clang_format import ClangFormatIssue mock_revision.lines = { "test/not_3rd.c": [10], "test/dummy/third_party.c": [10] } issue = ClangFormatIssue("test/not_3rd.c", 10, 1, mock_revision) assert issue.is_publishable() assert issue.as_phabricator_lint() == { "code": "clang-format", "line": 10, "name": "C/C++ style issue", "path": "test/not_3rd.c", "severity": "warning", } # test/dummy is a third party directory issue = ClangFormatIssue("test/dummy/third_party.c", 10, 1, mock_revision) assert not issue.is_publishable()
def test_phabricator_clang_format(mock_config, mock_phabricator, phab, mock_try_task, mock_task): """ Test Phabricator reporter publication on a mock clang-format issue """ 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 "test.cpp": [41, 42, 43], "dom/test.cpp": [42], } reporter = PhabricatorReporter({"analyzers": ["clang-format"]}, api=api) task = mock_task(ClangFormatTask, "source-test-clang-format") lines = [ (41, 41, b"no change"), (42, None, b"deletion"), (None, 42, b"change here"), ] issue = ClangFormatIssue(task, "dom/test.cpp", lines, revision) assert issue.is_publishable() revision.improvement_patches = [ ImprovementPatch(task, repr(revision), "Some lint fixes") ] list(map(lambda p: p.write(), revision.improvement_patches)) # trigger local write issues, patches = reporter.publish([issue], revision, [], []) assert len(issues) == 1 assert len(patches) == 1 # Check the comment has been posted assert phab.comments[51] == [ VALID_CLANG_FORMAT_MESSAGE.format( results=mock_config.taskcluster.results_dir) ]