# 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'))
