class CompareUnitTests(SemVerTestCase):
    STRING_VERSION = 'v1.2.3'
    SEMVER_VERSION = SemVer(1, 2, 3)

    @patch('gitflow_easyrelease.semver.SemVer.from_version', return_value=None)
    def test_semver_creation(self, mock_from):
        mock_from.assert_not_called()
        self.semver.compare(self.STRING_VERSION)
        mock_from.assert_called_once_with(self.STRING_VERSION)

    @patch('gitflow_easyrelease.semver.SemVer.from_version', return_value=None)
    def test_semver_creation_skipping(self, mock_from):
        mock_from.assert_not_called()
        self.semver.compare(self.SEMVER_VERSION)
        mock_from.assert_not_called()

    @patch('gitflow_easyrelease.semver.SemVer.compare_component',
           return_value=0)
    def test_equality_comparison(self, mock_comparison):
        mock_comparison.assert_not_called()
        self.assertEqual(self.semver.compare(self.SEMVER_VERSION), 0)
        mock_comparison.assert_has_calls([call(0, 1), call(0, 2), call(0, 3)])

    @patch('gitflow_easyrelease.semver.SemVer.compare_component',
           return_value=1)
    def test_difference_comparison(self, mock_comparison):
        mock_comparison.assert_not_called()
        self.assertEqual(self.semver.compare(self.SEMVER_VERSION), 1)
        mock_comparison.assert_called_once_with(0, 1)
 def setUp(self):
     SemVerTestCase.setUp(self)
     from_version_patcher = patch.object(SemVer,
                                         'from_version',
                                         return_value=self.FROM_VERSION)
     self.mock_from_version = from_version_patcher.start()
     self.addCleanup(from_version_patcher.stop)
     get_current_branch_patcher = patch.object(SemVer,
                                               'get_current_version',
                                               return_value=SemVer())
     self.mock_get_current_branch = get_current_branch_patcher.start()
     self.addCleanup(get_current_branch_patcher.stop)
     get_active_branch_patcher = patch.object(SemVer,
                                              'get_active_branch',
                                              return_value=SemVer())
     self.mock_get_active_branch = get_active_branch_patcher.start()
     self.addCleanup(get_active_branch_patcher.stop)
 def test_none(self, mock_component, mock_is):
     mock_is.assert_not_called()
     self.mock_from_version.assert_not_called()
     mock_component.assert_not_called()
     self.mock_get_current_branch.assert_not_called()
     self.mock_get_active_branch.assert_not_called()
     self.assertEqual(SemVer.process_version().__repr__(), '0.0.0')
     mock_is.assert_not_called()
     self.mock_from_version.assert_not_called()
     mock_component.assert_not_called()
     self.mock_get_current_branch.assert_not_called()
     self.mock_get_active_branch.assert_called_once_with()
 def test_weird_version(self, mock_component, mock_is):
     mock_is.assert_not_called()
     self.mock_from_version.assert_not_called()
     mock_component.assert_not_called()
     self.mock_get_current_branch.assert_not_called()
     self.mock_get_active_branch.assert_not_called()
     self.assertEqual(SemVer.process_version(self.WEIRD_VERSION),
                      self.WEIRD_VERSION)
     mock_is.assert_called_once_with(self.WEIRD_VERSION)
     self.mock_from_version.assert_not_called()
     mock_component.assert_called_once_with(self.WEIRD_VERSION)
     self.mock_get_current_branch.assert_not_called()
     self.mock_get_active_branch.assert_not_called()
 def execute(self, parsed_args):
     """Executes its action"""
     version = (
         SemVer.process_version(parsed_args.version)
         if self.has_version and hasattr(parsed_args, 'version')
         else SemVer()
     )
     if version is None:
         raise ValueError(
             'Version was not passed in and the repo is not on a release branch'
         )
     base = (
         parsed_args.base
         if self.has_base and hasattr(parsed_args, 'base')
         else None
     )
     options = (
         parsed_args.options
         if hasattr(parsed_args, 'options')
         else None
     )
     for command in self.release_commands:
         Subcommand.execute_release_command(command, version, base, options)
 def test_semver(self, mock_component, mock_is):
     mock_is.assert_not_called()
     self.mock_from_version.assert_not_called()
     mock_component.assert_not_called()
     self.mock_get_current_branch.assert_not_called()
     self.mock_get_active_branch.assert_not_called()
     self.assertEqual(
         SemVer.process_version(self.SEMVER).__repr__(),
         self.FROM_VERSION.__repr__())
     mock_is.assert_called_once_with(self.SEMVER)
     self.mock_from_version.assert_called_once_with(self.SEMVER)
     mock_component.assert_not_called()
     self.mock_get_current_branch.assert_not_called()
     self.mock_get_active_branch.assert_not_called()
class LesserUnitTests(SemVerTestCase):
    VERSION = SemVer(1, 2, 3)

    @patch.object(SemVer, 'compare', return_value=1)
    def test_lesser(self, mock_compare):
        mock_compare.assert_not_called()
        self.assertTrue(self.semver.lesser(self.VERSION))
        mock_compare.assert_called_once_with(self.VERSION)

    @patch.object(SemVer, 'compare', return_value=0)
    def test_equal(self, mock_compare):
        mock_compare.assert_not_called()
        self.assertFalse(self.semver.lesser(self.VERSION))
        mock_compare.assert_called_once_with(self.VERSION)

    @patch.object(SemVer, 'compare', return_value=-1)
    def test_greater(self, mock_compare):
        mock_compare.assert_not_called()
        self.assertFalse(self.semver.lesser(self.VERSION))
        mock_compare.assert_called_once_with(self.VERSION)
class GetCurrentVersionUnitTests(SemVerTestCase):

    RETURN_NONE = MagicMock(return_value=None)
    TAGS = ['0.0.0', '1.0.0', '0.1.0', '0.0.1']

    @patch('gitflow_easyrelease.semver.SemVer.get_active_branch',
           return_value=SemVer(1, 2, 3))
    def test_with_active_release_branch(self, mock_active):
        mock_active.assert_not_called()
        self.assertEqual(SemVer.get_current_version().__repr__(), '1.2.3')
        mock_active.assert_called_once_with()

    @patch('gitflow_easyrelease.semver.SemVer.get_active_branch', RETURN_NONE)
    @patch('gitflow_easyrelease.semver.RepoInfo.get_semver_tags', RETURN_NONE)
    def test_no_versions(self):
        self.assertEqual(SemVer.get_current_version().__repr__(), '0.0.0')

    @patch('gitflow_easyrelease.semver.SemVer.get_active_branch', RETURN_NONE)
    @patch('gitflow_easyrelease.semver.RepoInfo.get_semver_tags',
           return_value=TAGS)
    def test_tagged_versions(self, mock_tags):
        mock_tags.assert_not_called()
        self.assertEqual(SemVer.get_current_version().__repr__(), '1.0.0')
        mock_tags.assert_called_once_with()
 def reset_semver(self):
     self.semver = SemVer(self.MAJOR, self.MINOR, self.PATCH)
def test_compare_component(first, second, result):
    assert result == SemVer.compare_component(first, second)
 def test_without_semver_version(self, mock_is_semver):
     mock_is_semver.assert_not_called()
     result = SemVer.from_version(self.VERSION)
     mock_is_semver.assert_called_once_with(self.VERSION)
     self.assertEqual(result.__repr__(), '0.0.0')
class ProcessVersionUnitTests(SemVerTestCase):
    FROM_VERSION = SemVer(1, 2, 3)
    WEIRD_VERSION = ' '.join(SemVer.ALL_KEYS)
    SEMVER = '1.2.3'
    COMPONENT = SemVer.MAJOR_KEYS[0]

    def setUp(self):
        SemVerTestCase.setUp(self)
        from_version_patcher = patch.object(SemVer,
                                            'from_version',
                                            return_value=self.FROM_VERSION)
        self.mock_from_version = from_version_patcher.start()
        self.addCleanup(from_version_patcher.stop)
        get_current_branch_patcher = patch.object(SemVer,
                                                  'get_current_version',
                                                  return_value=SemVer())
        self.mock_get_current_branch = get_current_branch_patcher.start()
        self.addCleanup(get_current_branch_patcher.stop)
        get_active_branch_patcher = patch.object(SemVer,
                                                 'get_active_branch',
                                                 return_value=SemVer())
        self.mock_get_active_branch = get_active_branch_patcher.start()
        self.addCleanup(get_active_branch_patcher.stop)

    @patch('gitflow_easyrelease.semver.is_semver', return_value=False)
    @patch('gitflow_easyrelease.semver.SemVer.is_component',
           return_value=False)
    def test_weird_version(self, mock_component, mock_is):
        mock_is.assert_not_called()
        self.mock_from_version.assert_not_called()
        mock_component.assert_not_called()
        self.mock_get_current_branch.assert_not_called()
        self.mock_get_active_branch.assert_not_called()
        self.assertEqual(SemVer.process_version(self.WEIRD_VERSION),
                         self.WEIRD_VERSION)
        mock_is.assert_called_once_with(self.WEIRD_VERSION)
        self.mock_from_version.assert_not_called()
        mock_component.assert_called_once_with(self.WEIRD_VERSION)
        self.mock_get_current_branch.assert_not_called()
        self.mock_get_active_branch.assert_not_called()

    @patch('gitflow_easyrelease.semver.is_semver', return_value=True)
    @patch('gitflow_easyrelease.semver.SemVer.is_component',
           return_value=False)
    def test_semver(self, mock_component, mock_is):
        mock_is.assert_not_called()
        self.mock_from_version.assert_not_called()
        mock_component.assert_not_called()
        self.mock_get_current_branch.assert_not_called()
        self.mock_get_active_branch.assert_not_called()
        self.assertEqual(
            SemVer.process_version(self.SEMVER).__repr__(),
            self.FROM_VERSION.__repr__())
        mock_is.assert_called_once_with(self.SEMVER)
        self.mock_from_version.assert_called_once_with(self.SEMVER)
        mock_component.assert_not_called()
        self.mock_get_current_branch.assert_not_called()
        self.mock_get_active_branch.assert_not_called()

    @patch('gitflow_easyrelease.semver.is_semver', return_value=False)
    @patch('gitflow_easyrelease.semver.SemVer.is_component', return_value=True)
    def test_component(self, mock_component, mock_is):
        mock_is.assert_not_called()
        self.mock_from_version.assert_not_called()
        mock_component.assert_not_called()
        self.mock_get_current_branch.assert_not_called()
        self.mock_get_active_branch.assert_not_called()
        self.assertEqual(
            SemVer.process_version(self.COMPONENT).__repr__(), '1.0.0')
        mock_is.assert_called_once_with(self.COMPONENT)
        self.mock_from_version.assert_not_called()
        mock_component.assert_called_once_with(self.COMPONENT)
        self.mock_get_current_branch.assert_called_once_with()
        self.mock_get_active_branch.assert_not_called()

    @patch('gitflow_easyrelease.semver.is_semver', return_value=True)
    @patch('gitflow_easyrelease.semver.SemVer.is_component', return_value=True)
    def test_none(self, mock_component, mock_is):
        mock_is.assert_not_called()
        self.mock_from_version.assert_not_called()
        mock_component.assert_not_called()
        self.mock_get_current_branch.assert_not_called()
        self.mock_get_active_branch.assert_not_called()
        self.assertEqual(SemVer.process_version().__repr__(), '0.0.0')
        mock_is.assert_not_called()
        self.mock_from_version.assert_not_called()
        mock_component.assert_not_called()
        self.mock_get_current_branch.assert_not_called()
        self.mock_get_active_branch.assert_called_once_with()
 def test_tagged_versions(self, mock_tags):
     mock_tags.assert_not_called()
     self.assertEqual(SemVer.get_current_version().__repr__(), '1.0.0')
     mock_tags.assert_called_once_with()
 def test_no_versions(self):
     self.assertEqual(SemVer.get_current_version().__repr__(), '0.0.0')
class BumpUnitTests(SemVerTestCase):
    MAJOR = 1
    MINOR = 2
    PATCH = 3

    def setUp(self):
        SemVerTestCase.setUp(self)
        self.reset_semver()

    def reset_semver(self):
        self.semver = SemVer(self.MAJOR, self.MINOR, self.PATCH)

    def test_bump_nothing(self):
        self.assertEqual(self.semver.__repr__(), '1.2.3')
        self.semver.bump(' '.join(SemVer.ALL_KEYS))
        self.assertEqual(self.semver.__repr__(), '1.2.3')

    def test_patch_bump(self):
        for component in SemVer.PATCH_KEYS:
            self.reset_semver()
            self.assertEqual(self.semver.__repr__(), '1.2.3')
            self.semver.bump(component)
            self.assertEqual(self.semver.__repr__(), '1.2.4')

    def test_minor_bump(self):
        for component in SemVer.MINOR_KEYS:
            self.reset_semver()
            self.assertEqual(self.semver.__repr__(), '1.2.3')
            self.semver.bump(component)
            self.assertEqual(self.semver.__repr__(), '1.3.0')

    def test_major_bump(self):
        for component in SemVer.MAJOR_KEYS:
            self.reset_semver()
            self.assertEqual(self.semver.__repr__(), '1.2.3')
            self.semver.bump(component)
            self.assertEqual(self.semver.__repr__(), '2.0.0')
 def test_with_release_branch(self, mock_args):
     mock_args.assert_not_called()
     self.assertEqual(SemVer.get_active_branch().__repr__(), '1.2.3')
     mock_args.assert_called_once_with()
 def construct_semver(self):
     self.semver = SemVer()
 def test_without_release_branch(self, mock_args):
     mock_args.assert_not_called()
     self.assertIsNone(SemVer.get_active_branch())
     mock_args.assert_called_once_with()
def test_is_component(version, result):
    assert result == SemVer.is_component(version)
    def test_add_call(self, mock_branches):
        mock_branches.assert_not_called()
        self.mock_add.assert_not_called()
        Subcommand.attach_base_argument(self.parser)
        self.mock_add.assert_called_once()
        mock_branches.assert_called_once_with()

COMMON_SIGNATURE = ['git', 'flow', 'release']


@mark.parametrize(
    "command,version,base,options,call_signature",
    [
        (
            'start',
            SemVer(),
            None,
            None,
            COMMON_SIGNATURE + ['start', '0.0.0']
        ),
        (
            'finish',
            SemVer(),
            'master',
            None,
            COMMON_SIGNATURE + ['finish', '0.0.0', 'master']
        ),
        (
            'publish',
            SemVer(),
            None,
 def test_with_active_release_branch(self, mock_active):
     mock_active.assert_not_called()
     self.assertEqual(SemVer.get_current_version().__repr__(), '1.2.3')
     mock_active.assert_called_once_with()