#!/usr/bin/env python3 # Copyright 2023 Google Inc. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import unittest from unittest import mock import PRESUBMIT from PRESUBMIT_test_mocks import MockFile, MockAffectedFile from PRESUBMIT_test_mocks import MockInputApi, MockOutputApi class ReleaseNotesTest(unittest.TestCase): def testNoEditTopReleaseNotesNoWarning(self): mock_input_api = MockInputApi() mock_input_api.files = [ MockFile('README.chromium', ''), ] mock_output_api = MockOutputApi() results = PRESUBMIT._CheckTopReleaseNotesChanged( mock_input_api, mock_output_api) self.assertEqual(0, len(results)) def testUpdateTopReleaseNotesIssuesWarning(self): mock_input_api = MockInputApi() mock_input_api.files = [ MockFile('RELEASE_NOTES.md', ''), ] mock_output_api = MockOutputApi() results = PRESUBMIT._CheckTopReleaseNotesChanged( mock_input_api, mock_output_api) self.assertEqual(1, len(results)) self.assertIsInstance( results[0], mock_output_api.PresubmitPromptWarning, 'Not a warning') self.assertTrue(results[0].message.startswith( 'Do not edit RELEASE_NOTES.md')) def testUpdateTopReleaseNotesNoWarning(self): mock_input_api = MockInputApi() mock_input_api.files = [ MockFile('RELEASE_NOTES.md', ''), MockFile('relnotes/deleted_note.md', ''), ] mock_output_api = MockOutputApi() results = PRESUBMIT._CheckTopReleaseNotesChanged( mock_input_api, mock_output_api) self.assertEqual(0, len(results)) def testUpdatePublicHeaderAndNoReleaseNoteGeneratesWarning(self): mock_input_api = MockInputApi() mock_input_api.files = [ MockFile('include/core/SkDrawable.h', ''), ] mock_output_api = MockOutputApi() results = PRESUBMIT._CheckReleaseNotesForPublicAPI( mock_input_api, mock_output_api) self.assertEqual(1, len(results)) self.assertIsInstance( results[0], mock_output_api.PresubmitPromptWarning, 'Not a warning') def testUpdatePublicHeaderAndReleaseNoteGeneratesNoWarning(self): mock_input_api = MockInputApi() mock_input_api.files = [ MockFile('include/core/SkDrawable.h', ''), MockFile('relnotes/new_note.md', ''), ] mock_output_api = MockOutputApi() results = PRESUBMIT._CheckReleaseNotesForPublicAPI( mock_input_api, mock_output_api) self.assertEqual(0, len(results)) class RunCommandAndCheckDiffTest(unittest.TestCase): def setUp(self): self.foo_file = MockAffectedFile('foo.txt', new_contents=['foo']) self.bar_file = MockAffectedFile('bar.txt', new_contents=['bar']) self.mock_input_api = MockInputApi() self.mock_input_api.files = [self.foo_file, self.bar_file] self.mock_output_api = MockOutputApi() def setContents(self, file, contents): file._new_contents = contents @mock.patch('subprocess.check_output') def testNoChangesReturnsNoResults(self, mock_subprocess): results = PRESUBMIT._RunCommandAndCheckDiff(self.mock_output_api, [], []) self.assertEqual(results, []) @mock.patch('subprocess.check_output') def testChangingIrrelevantFilesReturnsNoResults(self, mock_subprocess): mock_subprocess.side_effect = lambda *args, **kwargs: self.setContents(self.bar_file, ['foo']) results = PRESUBMIT._RunCommandAndCheckDiff( self.mock_output_api, ['cmd'], [self.foo_file], ) self.assertEqual(results, []) @mock.patch('subprocess.check_output') def testChangingRelevantFilesReturnsDiff(self, mock_subprocess): mock_subprocess.side_effect = lambda *args, **kwargs: self.setContents(self.foo_file, ['bar']) results = PRESUBMIT._RunCommandAndCheckDiff( self.mock_output_api, ['cmd'], [self.foo_file], ) self.assertEqual(len(results), 1) self.assertEqual(results[0].message, """Diffs found after running "cmd": --- foo.txt +++ foo.txt @@ -1 +1 @@ -foo +bar Please commit or discard the above changes.""") if __name__ == '__main__': unittest.main()