mirror of https://github.com/mongodb/mongo
114 lines
4.0 KiB
Python
114 lines
4.0 KiB
Python
"""Unit tests for buildscripts.patch_builds.change_data.py."""
|
|
|
|
from __future__ import absolute_import
|
|
|
|
import os
|
|
import unittest
|
|
|
|
from mock import MagicMock, mock_open, patch
|
|
|
|
import buildscripts.patch_builds.change_data as under_test
|
|
|
|
NS = "buildscripts.patch_builds.change_data"
|
|
|
|
FILE_CONTENT = "Hello, Universe!\n"
|
|
|
|
|
|
def ns(relative_name):
|
|
"""Return a full name from a name relative to the test module"s name space."""
|
|
return NS + "." + relative_name
|
|
|
|
|
|
def create_mock_repo(working_dir=""):
|
|
return MagicMock(working_dir=working_dir)
|
|
|
|
|
|
class TestFindChangedFilesInRepos(unittest.TestCase):
|
|
@patch(ns("find_changed_files"))
|
|
def test_nothing_found(self, changed_files_mock):
|
|
repos_mock = [MagicMock()]
|
|
changed_files_mock.return_value = set()
|
|
|
|
self.assertEqual(0, len(under_test.find_changed_files_in_repos(repos_mock)))
|
|
|
|
@patch(ns("find_changed_files"))
|
|
def test_changed_files_in_multiple_repos(self, changed_files_mock):
|
|
repos_mock = [MagicMock(), MagicMock()]
|
|
first_repo_file_changes = [
|
|
os.path.join("jstests", "test1.js"),
|
|
os.path.join("jstests", "test1.cpp"),
|
|
]
|
|
second_repo_file_changes = [
|
|
os.path.join("jstests", "test2.js"),
|
|
]
|
|
changed_files_mock.side_effect = [first_repo_file_changes, second_repo_file_changes]
|
|
|
|
self.assertEqual(3, len(under_test.find_changed_files_in_repos(repos_mock)))
|
|
|
|
|
|
class TestGenerateRevisionMap(unittest.TestCase):
|
|
def test_mongo_revisions_is_mapped_correctly(self):
|
|
mock_repo_list = [create_mock_repo(os.getcwd()), create_mock_repo("/path/to/enterprise")]
|
|
revision_data = {"mongo": "revision1234", "enterprise": "revision5678"}
|
|
|
|
revision_map = under_test.generate_revision_map(mock_repo_list, revision_data)
|
|
|
|
self.assertEqual(revision_map[mock_repo_list[0].git_dir], revision_data["mongo"])
|
|
self.assertEqual(revision_map[mock_repo_list[1].git_dir], revision_data["enterprise"])
|
|
|
|
def test_missing_revisions_are_not_returned(self):
|
|
mock_repo_list = [create_mock_repo(os.getcwd()), create_mock_repo("/path/to/enterprise")]
|
|
revision_data = {"mongo": "revision1234"}
|
|
|
|
revision_map = under_test.generate_revision_map(mock_repo_list, revision_data)
|
|
|
|
self.assertEqual(revision_map[mock_repo_list[0].git_dir], revision_data["mongo"])
|
|
self.assertEqual(len(revision_map), 1)
|
|
|
|
def test_missing_repos_are_not_returned(self):
|
|
mock_repo_list = [create_mock_repo(os.getcwd())]
|
|
revision_data = {"mongo": "revision1234", "enterprise": "revision56768"}
|
|
|
|
revision_map = under_test.generate_revision_map(mock_repo_list, revision_data)
|
|
|
|
self.assertEqual(revision_map[mock_repo_list[0].git_dir], revision_data["mongo"])
|
|
self.assertEqual(len(revision_map), 1)
|
|
|
|
|
|
class TestFindChangedFilesAndLinesInRepos(unittest.TestCase):
|
|
@patch("builtins.open", new_callable=mock_open, read_data=FILE_CONTENT)
|
|
def test_detects_file_and_line_modifications_no_change(self, mock_open):
|
|
repo_mock = MagicMock()
|
|
repo_mock.git.diff.return_value = ""
|
|
|
|
changed_files = ["src/module/test1.cpp"]
|
|
revision_map = {}
|
|
|
|
result = under_test.find_modified_lines_for_files(repo_mock, changed_files, revision_map)
|
|
|
|
expected_result = {}
|
|
|
|
mock_open.assert_called_once_with("src/module/test1.cpp", "r")
|
|
|
|
self.assertEqual(result, expected_result)
|
|
|
|
@patch("builtins.open", new_callable=mock_open, read_data=FILE_CONTENT)
|
|
def test_detects_file_and_line_modifications_one_file(self, mock_open):
|
|
repo_mock = MagicMock()
|
|
repo_mock.git.diff.return_value = """\
|
|
@@ -1,2 +1,2 @@
|
|
-Hello, World!
|
|
+Hello, Universe!
|
|
"""
|
|
|
|
changed_files = ["src/module/test1.cpp"]
|
|
revision_map = {}
|
|
|
|
result = under_test.find_modified_lines_for_files(repo_mock, changed_files, revision_map)
|
|
|
|
expected_result = {"src/module/test1.cpp": [(1, "Hello, Universe!")]}
|
|
|
|
mock_open.assert_called_once_with("src/module/test1.cpp", "r")
|
|
|
|
self.assertEqual(result, expected_result)
|