# Copyright 2014 Antoine "hashar" Musso # Copyright 2014 Wikimedia Foundation Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import logging import testtools from zuul.lib.clonemapper import CloneMapper logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(name)-17s ' '%(levelname)-8s %(message)s') class TestCloneMapper(testtools.TestCase): def test_empty_mapper(self): """Given an empty map, the slashes in project names are directory separators""" cmap = CloneMapper( {}, [ 'project1', 'plugins/plugin1' ]) self.assertEqual( {'project1': '/basepath/project1', 'plugins/plugin1': '/basepath/plugins/plugin1'}, cmap.expand('/basepath') ) def test_map_to_a_dot_dir(self): """Verify we normalize path, hence '.' refers to the basepath""" cmap = CloneMapper( [{'name': 'mediawiki/core', 'dest': '.'}], ['mediawiki/core']) self.assertEqual( {'mediawiki/core': '/basepath'}, cmap.expand('/basepath')) def test_map_using_regex(self): """One can use regex in maps and use \\1 to forge the directory""" cmap = CloneMapper( [{'name': 'plugins/(.*)', 'dest': 'project/plugins/\\1'}], ['plugins/PluginFirst']) self.assertEqual( {'plugins/PluginFirst': '/basepath/project/plugins/PluginFirst'}, cmap.expand('/basepath')) def test_map_discarding_regex_group(self): cmap = CloneMapper( [{'name': 'plugins/(.*)', 'dest': 'project/'}], ['plugins/Plugin_1']) self.assertEqual( {'plugins/Plugin_1': '/basepath/project'}, cmap.expand('/basepath')) def test_cant_dupe_destinations(self): """We cant clone multiple projects in the same directory""" cmap = CloneMapper( [{'name': 'plugins/(.*)', 'dest': 'catchall/'}], ['plugins/plugin1', 'plugins/plugin2'] ) self.assertRaises(Exception, cmap.expand, '/basepath') def test_map_with_dot_and_regex(self): """Combining relative path and regex""" cmap = CloneMapper( [{'name': 'plugins/(.*)', 'dest': './\\1'}], ['plugins/PluginInBasePath']) self.assertEqual( {'plugins/PluginInBasePath': '/basepath/PluginInBasePath'}, cmap.expand('/basepath'))