Index: third_party/recipe_engine/unittests/package_test.py |
diff --git a/third_party/recipe_engine/unittests/package_test.py b/third_party/recipe_engine/unittests/package_test.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..e7c08ffe13207fcb370cee7481957536e4f4373c |
--- /dev/null |
+++ b/third_party/recipe_engine/unittests/package_test.py |
@@ -0,0 +1,143 @@ |
+#!/usr/bin/env python |
+ |
+import doctest |
+import os |
+import sys |
+import unittest |
+ |
+RECIPE_ENGINE = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
+THIRD_PARTY = os.path.dirname(RECIPE_ENGINE) |
+sys.path.insert(0, os.path.join(THIRD_PARTY, 'mock-1.0.1')) |
+sys.path.insert(0, THIRD_PARTY) |
+ |
+import mock |
+from recipe_engine import package |
+ |
+class MockIOThings(object): |
+ def setUp(self): |
+ self.mock_os_patcher = mock.patch('recipe_engine.package.os') |
+ self.mock_os = self.mock_os_patcher.start() |
+ self.mock_os.path.join = os.path.join |
+ |
+ self.mock_subprocess_patcher = mock.patch( |
+ 'recipe_engine.package.subprocess') |
+ self.mock_subprocess = self.mock_subprocess_patcher.start() |
+ |
+ def tearDown(self): |
+ self.mock_subprocess_patcher.stop() |
+ self.mock_os_patcher.stop() |
+ |
+ |
+class TestGitRepoSpec(MockIOThings, unittest.TestCase): |
+ REPO_URL = 'https://funny.recipes/repo.git' |
+ def setUp(self): |
+ super(TestGitRepoSpec, self).setUp() |
+ |
+ self.repo_spec = package.GitRepoSpec( |
+ 'funny_recipes', |
+ self.REPO_URL, |
+ 'master', |
+ 'deadbeef', |
+ 'path/to/recipes', |
+ ) |
+ self.context = package.PackageContext.from_pyl_path( |
+ os.path.join('path', 'to', 'package.pyl')) |
+ |
+ def test_checkout_nonexistant_package_dir(self): |
+ self.mock_os.path.exists.return_value = False |
+ self.mock_os.path.isdir.return_value = False |
+ |
+ self.repo_spec.checkout(self.context) |
+ |
+ self.mock_subprocess.check_call.assert_any_call( |
+ ['git', 'clone', self.REPO_URL, |
+ os.path.join(self.context.package_dir, 'funny_recipes')]) |
+ self.mock_subprocess.check_call.assert_any_call( |
+ ['git', 'checkout', '-q', 'deadbeef']) |
+ |
+ @mock.patch('recipe_engine.package.logging') |
+ def test_checkout_dont_mess_with_this(self, mock_logging): |
+ self.mock_os.path.exists.wraps = lambda path: ( |
+ path == os.path.join(self.context.package_dir, '.dont_mess_with_this')) |
+ self.repo_spec.checkout(self.context) |
+ self.mock_subprocess.check_call.assert_has_calls([]) |
+ self.assertRegexpMatches(mock_logging.warn.call_args[0][0], |
+ r'\.dont_mess_with_this') |
+ |
+ |
+class TestPackageSpec(MockIOThings, unittest.TestCase): |
+ def setUp(self): |
+ super(TestPackageSpec, self).setUp() |
+ |
+ self.package_pyl = { |
+ 'api_version': 0, |
+ 'id': 'super_main_package', |
+ 'deps': { |
+ 'foo': { |
+ 'repo': 'https://repo.com/foo.git', |
+ 'branch': 'master', |
+ 'revision': 'cafebeef', |
+ 'path': 'foos/recipes', |
+ }, |
+ 'bar': { |
+ 'repo': 'https://repo.com/bar.git', |
+ 'branch': 'superbar', |
+ 'revision': 'deadd00d', |
+ 'path': 'bars/recipes', |
+ }, |
+ }, |
+ } |
+ self.context = package.PackageContext.from_pyl_path( |
+ os.path.join('path', 'to', 'package.pyl')) |
+ |
+ def test_dump_load_inverses(self): |
+ # Doubles as a test for equality reflexivity. |
+ package_spec = package.PackageSpec.load(self.package_pyl) |
+ self.assertEqual(package_spec.dump(), self.package_pyl) |
+ self.assertEqual(package.PackageSpec.load(self.package_pyl), package_spec) |
+ |
+ def test_updates_merged(self): |
+ package_spec = package.PackageSpec.load(self.package_pyl) |
+ package_spec.deps['foo']._raw_updates = mock.Mock(return_value='\n'.join([ |
+ "2015-07-02T16:41:46+00:00 aaaaaa", |
+ "2015-07-05T13:38:26+00:00 bbbbbb", |
+ "2015-07-07T15:52:20-07:00 cccccc", |
+ ])) |
+ package_spec.deps['bar']._raw_updates = mock.Mock(return_value='\n'.join([ |
+ "2015-07-01T17:09:06+00:00 dddddd", |
+ "2015-07-03T10:12:30+00:00 eeeeee", |
+ "2015-07-06T21:16:36-07:00 ffffff", |
+ ])) |
+ updates = package_spec.updates(self.context) |
+ self.assertEqual( |
+ [ (spec.deps['foo'].revision, spec.deps['bar'].revision) |
+ for _date, spec in updates ], |
+ [ ('cafebeef', 'dddddd'), |
+ ('aaaaaa', 'dddddd'), |
+ ('aaaaaa', 'eeeeee'), |
+ ('bbbbbb', 'eeeeee'), |
+ ('bbbbbb', 'ffffff'), |
+ ('cccccc', 'ffffff') ]) |
+ |
+ def test_no_version(self): |
+ with self.assertRaises(Exception): |
+ package.PackageSpec.load({ |
+ 'id': 'foo', |
+ 'deps': {}, |
+ }) |
+ |
+ def test_unsupported_version(self): |
+ with self.assertRaises(Exception): |
+ package.PackageSpec.load({ |
+ 'api_version': 1, |
+ 'id': 'fizzbar', |
+ 'deps': {}, |
+ }) |
+ |
+def load_tests(loader, tests, ignore): |
+ tests.addTests(doctest.DocTestSuite(package)) |
+ return tests |
+ |
+ |
+if __name__ == '__main__': |
+ result = unittest.main() |