def test_svn_exclude_naive(self): self.list_contents = {} self.list_contents['acme/project9/module'] = ['pk', 'cli', 'rab', 'api'] r = Rover('') r.config_items = _list_as_rover_items( [('acme/project9/module', 'HEAD', 'svn', 'http://foo.com'), ('acme/project9/module/rab', 'HEAD', 'svn', 'http://bar.com')]) r.resolve() expected = _list_as_rover_items( [('acme/project9/module/pk', 'HEAD', 'svn', 'http://foo.com'), ('acme/project9/module/cli', 'HEAD', 'svn', 'http://foo.com'), ('acme/project9/module/api', 'HEAD', 'svn', 'http://foo.com'), ('acme/project9/module/rab', 'HEAD', 'svn', 'http://bar.com')]) self.assertEquals(r.config_items, expected)
class RoverResolverTestCase(unittest.TestCase): def setUp(self): self.rover = Rover('') def test_is_not_destructive(self): """ tests that if the config has no overrides, that it comes out exactly as input """ input = _list_as_rover_items([ ('acme/project9','HEAD','cvs'), ('acme/app','HEAD','cvs'), ('acme/framework','HEAD','cvs'), ('acme/project9/module/api','project9_dev_03_b','cvs'), ('acme/project9/module/pk','ACME_LIVE_T','cvs'), ]) self.rover.config_items = input self.rover.resolve() output = self.rover.config_items self.assertEquals(input, output) def test_overrides_are_removed(self): """ tests that overridden whole directories are removed """ input = _list_as_rover_items([ ('acme/project9','HEAD','cvs'), ('acme/app','HEAD','cvs'), ('acme/framework','HEAD','cvs'), ('acme/project9','project9_foo_b','cvs'), ]) expected = _list_as_rover_items([ ('acme/app','HEAD','cvs'), ('acme/framework','HEAD','cvs'), ('acme/project9','project9_foo_b','cvs'), ]) self.rover.config_items = input self.rover.resolve() output = self.rover.config_items self.assertEquals(expected, output) def test_dir_overrides_subdir_but_not_file(self): """ tests that a directory checked out later overrides subdirectories of itself that are checked out earlier. also checks that directories whose name is a prefix of a file do not override the checkout for that file """ input = _list_as_rover_items([ ('acme/project9','HEAD','cvs'), ('acme/app','HEAD','cvs'), ('acme/framework','HEAD','cvs'), ('acme/project9','project9_foo_b','cvs'), ('acme/project9/module.conf','bar','cvs'), ('acme/project9/module/api','project9_dev_03_b','cvs'), ('acme/project9/module','project9_module_b','cvs'), ]) expected = _list_as_rover_items([ ('acme/app','HEAD','cvs'), ('acme/framework','HEAD','cvs'), ('acme/project9 !acme/project9/module !acme/project9/module/api !acme/project9/module.conf','project9_foo_b','cvs'), ('acme/project9/module.conf','bar','cvs'), ('acme/project9/module','project9_module_b','cvs'), ]) self.rover.config_items = input self.rover.resolve() output = self.rover.config_items self.assertEquals(expected, output) def test_dir_overrides_file_in_dir(self): """ tests that a directory checked out later overrides a single file checked out that lives in that directory """ input = _list_as_rover_items([ ('acme/project9','HEAD','cvs'), ('acme/app','HEAD','cvs'), ('acme/framework','HEAD','cvs'), ('acme/project9','project9_foo_b','cvs'), ('acme/project9/module.conf','bar','cvs'), ('acme/project9/module/api','project9_dev_03_b','cvs'), ('acme/project9/module/pk','ACME_LIVE_T','cvs'), ('acme/project9','project9_module_b','cvs'), ]) expected = _list_as_rover_items([ ('acme/app','HEAD','cvs'), ('acme/framework','HEAD','cvs'), ('acme/project9','project9_module_b','cvs'), ]) self.rover.config_items = input self.rover.resolve() output = self.rover.config_items self.assertEquals(expected, output) def test_works_with_cvs_excludes(self): """ tests that modules are replaced correctly, even in the presence of cvs excludes """ input = _list_as_rover_items([ ('acme/project9','HEAD','cvs', ''), ('acme/app','HEAD','cvs', ''), ('acme/framework','HEAD','cvs', ''), ('acme/project9 !acme/project9/module/api','project9_foo_b','cvs', ''), ('acme/project9/module.conf','bar','cvs', ''), ('acme/project9/module/api','project9_dev_03_b','cvs', ''), ('acme/project9/module/pk','ACME_LIVE_T','cvs', ''), ('acme/project9 !acme/project9/module/rab','project9_module_b','cvs', ''), ]) expected = _list_as_rover_items([ ('acme/app','HEAD','cvs', ''), ('acme/framework','HEAD','cvs', ''), ('acme/project9 !acme/project9/module/rab','project9_module_b','cvs', ''), ]) self.rover.config_items = input self.rover.resolve() output = self.rover.config_items self.assertEquals(expected, output) def test_is_not_destructive_with_cvs_exclude_self(self): """ test that a child module does not cause a parent module to be replaced if the parent module excludes a match of the child module """ input = _list_as_rover_items([ ('acme !acme/foo/bar','HEAD','cvs', ''), ('acme/foo/bar','HEAD','cvs', ''), ]) self.rover.config_items = input self.rover.resolve() output = self.rover.config_items self.assertEquals(input, output) def test_is_not_destructive_with_cvs_exclude_parent(self): """ test that a child module does not cause a parent module to be replaced if the parent module excludes a match of the child module """ input = _list_as_rover_items([ ('acme !acme/foo/bar/baz','HEAD','cvs', ''), ('acme/foo/bar','HEAD','cvs', ''), ]) self.rover.config_items = input self.rover.resolve() output = self.rover.config_items self.assertEquals(input, output) def test_works_with_svn_and_cvs(self): """ tests that overrides happen correctly when cvs and svn checkouts are mixed """ input = _list_as_rover_items([ ('acme/project9','HEAD','cvs'), ('acme/framework','HEAD','svn', 'http://example.com/trunk'), ('acme/project9/module/api','project9_dev_03_b','svn', 'http://example.com/trunk'), ]) expected = _list_as_rover_items([ ('acme/project9 !acme/project9/module/api','HEAD','cvs'), ('acme/framework','HEAD','svn', 'http://example.com/trunk'), ('acme/project9/module/api','project9_dev_03_b','svn', 'http://example.com/trunk'), ]) self.rover.config_items = input self.rover.resolve() output = self.rover.config_items self.assertEquals(input, output) def test_only_excludes_once(self): """ tests that excludes only get added to the checkout path once """ input = _list_as_rover_items([ ('acme/project9', 'HEAD', 'cvs'), ('acme/project9/etc', 'foo_b', 'cvs'), ('acme/project9/etc', 'bar_b', 'cvs'), ]) expected = _list_as_rover_items([ ('acme/project9 !acme/project9/etc','HEAD','cvs'), ('acme/project9/etc', 'bar_b', 'cvs'), ]) self.rover.config_items = input self.rover.resolve() output = self.rover.config_items self.assertEquals(expected, output) def test_reports_clobbers(self): """ tests that clobbered files are properly detected and reported """ input = _list_as_rover_items([ ('acme/project9', 'HEAD', 'cvs'), ('acme/project9/etc', 'foo_b', 'cvs'), ('acme/project9/etc', 'bar_b', 'cvs'), ]) expected = _list_as_rover_items([ ('acme/project9 !acme/project9/etc','HEAD','cvs'), ('acme/project9/etc', 'bar_b', 'cvs'), ]) self.rover.config_items = input self.rover.resolve() self.assert_(len(self.rover.clobbers) > 0)
class RoverCleanTestCases(unittest.TestCase): """ tests that Rover detects and removes the correct directories in clean and paranoid mode given a certain rover config and directory structure """ def setUp(self): self.rover = Rover('') def test_removes(self): """ test the basic case. if a directory (say acme/spin) exists in the local checkout, but is no longer in the rover config, it is removed. """ input = _list_as_rover_items([ ('acme/project9','HEAD','cvs'), ('acme/app','HEAD','cvs'), ]) dirs = ['acme', [['app', [['CVS', [], []]], []], ['project9', [['CVS', [], []], ['rab', [['CVS', [], []]], []]], []], ['spin', [['CVS', [], []]], []], ['CVS', [], []]], []] os.walk = mock_os_walk_factory(dirs) self.rover.config_items = input self.rover.resolve() output = self.rover._clean() expected = ['acme/spin'] self.assertEquals(expected, output) def test_removes_excludes(self): """ tests that when a directory is excluded with a ! it is removed """ input = _list_as_rover_items([ ('acme/project9 !acme/project9/rab','HEAD','cvs'), ('acme/app','HEAD','cvs'), ('acme/spin','HEAD','cvs'), ]) dirs = ['acme', [['app', [['CVS', [], []]], []], ['project9', [['CVS', [], []], ['rab', [['CVS', [], []]], []]], []], ['spin', [['CVS', [], []]], []], ['CVS', [], []]], []] os.walk = mock_os_walk_factory(dirs) self.rover.config_items = input self.rover.resolve() output = self.rover._clean() expected = ['acme/project9/rab'] self.assertEquals(expected, output) def test_preserves_not_excluded(self): """ tests that when a directory is excluded in some lines but not in others, it is preserved """ input = _list_as_rover_items([ ('acme/project9 !acme/project9/rab','HEAD','cvs'), ('acme/project9/rab','FOO_BRANCH','cvs'), ('acme/app','HEAD','cvs'), ('acme/spin','HEAD','cvs'), ]) dirs = ['acme', [['app', [['CVS', [], []]], []], ['project9', [['CVS', [], []], ['rab', [['CVS', [], []]], []]], []], ['spin', [['CVS', [], []]], []], ['CVS', [], []]], []] os.walk = mock_os_walk_factory(dirs) self.rover.config_items = input self.rover.resolve() output = self.rover._clean() expected = [] self.assertEquals(expected, output) def test_mixed(self): """ test with mixed cvs and svn """ input = _list_as_rover_items([ ('acme/project9','HEAD','cvs'), ('acme/app','HEAD','svn','http://example.com/svn'), ]) dirs = ['acme', [['app', [['.svn', [], []]], []], ['project9', [['CVS', [], []], ['rab', [['CVS', [], []]], []]], []], ['spin', [['.svn', [], []]], []], ['CVS', [], []]], []] os.walk = mock_os_walk_factory(dirs) self.rover.config_items = input self.rover.resolve() output = self.rover._clean() expected = ['acme/spin'] self.assertEquals(expected, output)