def test_defaulting(self, mock_parse):
        parsed_options = {
            'url': None,
            'working_dir': None,
            'output_dir': None,
            'path': None,
            'branch': None,
            'tag': None
        }

        # working_dir defaulted to CWD
        mock_parse.return_value = (Values(defaults=parsed_options), [])
        options = builder.get_options()
        self.assertEqual(options.working_dir, os.getcwd())

        # working_dir defaulted to args[0]
        mock_parse.return_value = (Values(defaults=parsed_options), ['/tmp'])
        options = builder.get_options()
        self.assertEqual(options.working_dir, '/tmp')

        # output_dir defaulted to working_dir
        parsed_options['working_dir'] = '/abc'
        mock_parse.return_value = (Values(defaults=parsed_options), ['/tmp'])
        options = builder.get_options()
        self.assertEqual(options.output_dir, '/abc')
    def test_options(self, mock_parser, mock_group):
        parser = OptionParser()
        mock_parser.return_value = parser
        parser.add_option = Mock(side_effect=parser.add_option)
        parser.add_option_group = Mock(side_effect=parser.add_option_group)
        parser._get_args = Mock(return_value=[])

        group = OptionGroup(parser, '')
        mock_group.return_value = group
        group.add_option = Mock(side_effect=group.add_option)

        # test

        builder.get_options()

        # validation

        parser.add_option.assert_any_call(
            '-w', '--working-dir', dest='working_dir', help=builder.WORKING_DIR)
        parser.add_option.assert_any_call(
            '-o', '--output-dir', dest='output_dir', help=builder.OUTPUT_DIR)
        parser.add_option.assert_any_call(
            '-c', '--clean', default=False, action='store_true', help=builder.CLEAN)

        parser.add_option.assert_any_call('-p', '--path', help=builder.PATH)
        parser.add_option_group.assert_called_with(group)

        group.add_option.assert_any_call('-u', '--url', help=builder.URL)
        group.add_option.assert_any_call('-b', '--branch', help=builder.BRANCH)
        group.add_option.assert_any_call('-t', '--tag', help=builder.TAG)
    def test_options(self, mock_parser, mock_group):
        parser = OptionParser()
        mock_parser.return_value = parser
        parser.add_option = Mock(side_effect=parser.add_option)
        parser.add_option_group = Mock(side_effect=parser.add_option_group)
        parser._get_args = Mock(return_value=[])

        group = OptionGroup(parser, '')
        mock_group.return_value = group
        group.add_option = Mock(side_effect=group.add_option)

        # test

        builder.get_options()

        # validation

        parser.add_option.assert_any_call(
            '-w', '--working-dir', dest='working_dir', help=builder.WORKING_DIR)
        parser.add_option.assert_any_call(
            '-o', '--output-dir', dest='output_dir', help=builder.OUTPUT_DIR)
        parser.add_option.assert_any_call(
            '-c', '--clean', default=False, action='store_true', help=builder.CLEAN)

        parser.add_option.assert_any_call('-p', '--path', help=builder.PATH)
        parser.add_option_group.assert_called_with(group)

        group.add_option.assert_any_call('-u', '--url', help=builder.URL)
        group.add_option.assert_any_call('-b', '--branch', help=builder.BRANCH)
        group.add_option.assert_any_call('-t', '--tag', help=builder.TAG)
    def test_defaulting(self, mock_parse):
        parsed_options = {
            'url': None,
            'working_dir': None,
            'output_dir': None,
            'path': None,
            'branch': None,
            'tag': None
        }

        # working_dir defaulted to CWD
        mock_parse.return_value = (Values(defaults=parsed_options), [])
        options = builder.get_options()
        self.assertEqual(options.working_dir, os.getcwd())

        # working_dir defaulted to args[0]
        mock_parse.return_value = (Values(defaults=parsed_options), ['/tmp'])
        options = builder.get_options()
        self.assertEqual(options.working_dir, '/tmp')

        # output_dir defaulted to working_dir
        parsed_options['working_dir'] = '/abc'
        mock_parse.return_value = (Values(defaults=parsed_options), ['/tmp'])
        options = builder.get_options()
        self.assertEqual(options.output_dir, '/abc')
    def test_parser(self, mock_parser):
        parser = OptionParser()
        parser._get_args = Mock(return_value=[])
        mock_parser.return_value = parser

        # test

        builder.get_options()

        # validation

        mock_parser.assert_called_with(usage=builder.USAGE, description=builder.DESCRIPTION)
    def test_parser(self, mock_parser):
        parser = OptionParser()
        parser._get_args = Mock(return_value=[])
        mock_parser.return_value = parser

        # test

        builder.get_options()

        # validation

        mock_parser.assert_called_with(usage=builder.USAGE, description=builder.DESCRIPTION)
    def test_validate_both_branch_and_tag(self, mock_parse, mock_stdout, mock_exit):
        parsed_options = {
            'working_dir': None,
            'output_dir': None,
            'path': None,
            'branch': 'br',
            'tag': 'tg'
        }

        mock_parse.return_value = (Values(defaults=parsed_options), [])

        # test

        builder.get_options()

        # validation

        mock_stdout.assert_any_call(builder.BAD_BRANCH_AND_TAG)
        mock_exit.assert_called_with(os.EX_USAGE)
    def test_validate_both_branch_and_tag(self, mock_parse, mock_stdout, mock_exit):
        parsed_options = {
            'working_dir': None,
            'output_dir': None,
            'path': None,
            'branch': 'br',
            'tag': 'tg'
        }

        mock_parse.return_value = (Values(defaults=parsed_options), [])

        # test

        builder.get_options()

        # validation

        mock_stdout.assert_any_call(builder.BAD_BRANCH_AND_TAG)
        mock_exit.assert_called_with(os.EX_USAGE)
    def test_validate_path(self, mock_parse, mock_stdout, mock_exit):
        parsed_options = {
            'url': None,
            'working_dir': None,
            'output_dir': None,
            'path': '/',
            'branch': None,
            'tag': None
        }

        mock_parse.return_value = (Values(defaults=parsed_options), [])

        # test

        builder.get_options()

        # validation

        mock_stdout.assert_any_call(builder.BAD_PATH)
        mock_exit.assert_called_with(os.EX_USAGE)
    def test_validate_path(self, mock_parse, mock_stdout, mock_exit):
        parsed_options = {
            'url': None,
            'working_dir': None,
            'output_dir': None,
            'path': '/',
            'branch': None,
            'tag': None
        }

        mock_parse.return_value = (Values(defaults=parsed_options), [])

        # test

        builder.get_options()

        # validation

        mock_stdout.assert_any_call(builder.BAD_PATH)
        mock_exit.assert_called_with(os.EX_USAGE)
    def test_clean_url(self, mock_parse):
        parsed_options = {
            'url': 'git@test:/pulp/',
            'working_dir': '~/',
            'output_dir': '~/',
            'path': None,
            'branch': None,
            'tag': None
        }

        mock_parse.return_value = (Values(defaults=parsed_options), [])

        # test
        options = builder.get_options()

        # validation
        self.assertEqual(options.url, parsed_options['url'].rstrip('/'))
    def test_clean_url(self, mock_parse):
        parsed_options = {
            'url': 'git@test:/pulp/',
            'working_dir': '~/',
            'output_dir': '~/',
            'path': None,
            'branch': None,
            'tag': None
        }

        mock_parse.return_value = (Values(defaults=parsed_options), [])

        # test
        options = builder.get_options()

        # validation
        self.assertEqual(options.url, parsed_options['url'].rstrip('/'))
    def test_expanded_paths(self, mock_parse):
        parsed_options = {
            'working_dir': '~/',
            'output_dir': '~/',
            'path': None,
            'branch': None,
            'tag': None
        }

        mock_parse.return_value = (Values(defaults=parsed_options), [])

        # test

        options = builder.get_options()

        # validation

        self.assertEqual(options.working_dir, os.path.expanduser('~/'))
        self.assertEqual(options.output_dir, os.path.expanduser('~/'))
    def test_expanded_paths(self, mock_parse):
        parsed_options = {
            'working_dir': '~/',
            'output_dir': '~/',
            'path': None,
            'branch': None,
            'tag': None
        }

        mock_parse.return_value = (Values(defaults=parsed_options), [])

        # test

        options = builder.get_options()

        # validation

        self.assertEqual(options.working_dir, os.path.expanduser('~/'))
        self.assertEqual(options.output_dir, os.path.expanduser('~/'))