def test_ignore_staged(tmpcwd):
    '''
    When working directory is dirty, ignore staged changes
    '''
    create_release_project()
    write_file(Path('project.py'), '')  # Invalid project.py
    git_('add', 'project.py')
    result = release('1.0.0')
    assert result.exit_code == 0, result.output
 def test_ignore_unstaged(self, tmpcwd):
     '''
     Pre-commit must ignore unstaged changes
     '''
     self.create_project()
     git_('add', '.')
     mkproject & pb.FG  # install pre-commit hook
     remove_file(Path('README.md'))
     git_('commit', '-m', 'message')  # This fails if unstaged change is included
def test_ignore_staged(tmpcwd):
    '''
    When working directory is dirty, ignore staged changes
    '''
    create_release_project()
    write_file(Path('project.py'), '')  # Invalid project.py
    git_('add', 'project.py')
    result = release('1.0.0')
    assert result.exit_code == 0, result.output
 def test_ignore_untracked(self, tmpcwd):
     '''
     Pre-commit must ignore untracked changes
     '''
     self.create_project()
     git_('add', '.')
     mkproject & pb.FG  # install pre-commit hook
     test_fail_path = Path('operation/mittens/tests/test_fail.py')
     write_file(test_fail_path, extra_files[test_fail_path])
     git_('commit', '-m', 'message')  # This fails if the untracked test is included
 def test_invalid_project(self, tmpcwd):
     '''
     Invalid project cancels the commit
     '''
     self.create_project()
     mkproject & pb.FG  # install pre-commit hook
     remove_file(Path('README.md'))
     git_('add', '.')
     with assert_process_fails(stderr_matches='Missing file: README.md'):
         git_('commit', '-m', 'message')  # runs the hook
def test_happy_days(tmpcwd, mocked_release):
    '''
    When valid project with clean working dir and valid version, release
    '''
    create_release_project()
    result = release('1.0.0')
    git_('reset', '--hard')
    assert result.exit_code == 0, result.output
    assert mocked_release.call_args_list == [(('pypitest',),), (('pypi',),)]
    assert git_('tag').strip() == 'v1.0.0'
    setup_args = get_setup_args()
    assert setup_args['version'] == '1.0.0'
def test_happy_days(tmpcwd, mocked_release):
    '''
    When valid project with clean working dir and valid version, release
    '''
    create_release_project()
    result = release('1.0.0')
    git_('reset', '--hard')
    assert result.exit_code == 0, result.output
    assert mocked_release.call_args_list == [(('pypitest', ), ),
                                             (('pypi', ), )]
    assert git_('tag').strip() == 'v1.0.0'
    setup_args = get_setup_args()
    assert setup_args['version'] == '1.0.0'
def create_release_project(project=project1, test_index=True):
    '''
    Create valid project for release
    '''
    project = project.copy()
    test_succeed_path = Path('operation/mittens/tests/test_succeed.py')
    project.files[test_succeed_path] = extra_files[test_succeed_path] 
    if test_index:
        project.project_py['index_test'] = 'pypitest'
    create_project(project)
    
    git_('add', '.')
    mkproject()
    git_['commit', '-m', 'Initial commit'] & pb.FG
    
    # Create repo and use as remote
    path = Path.cwd() / '.cache'  # some location ignored by .gitignore
    path.mkdir()
    path /= 'other_repo'
    path.mkdir()
    with pb.local.cwd(str(path)):
        git_('init', '--bare')
    git_('remote', 'add', 'origin', path.as_uri())
    git_('push', '--set-upstream', 'origin', 'master')
    git_['status'] & pb.FG
def create_release_project(project=project1, test_index=True):
    '''
    Create valid project for release
    '''
    project = project.copy()
    test_succeed_path = Path('operation/mittens/tests/test_succeed.py')
    project.files[test_succeed_path] = extra_files[test_succeed_path]
    if test_index:
        project.project_py['index_test'] = 'pypitest'
    create_project(project)

    git_('add', '.')
    mkproject()
    git_['commit', '-m', 'Initial commit'] & pb.FG

    # Create repo and use as remote
    path = Path.cwd() / '.cache'  # some location ignored by .gitignore
    path.mkdir()
    path /= 'other_repo'
    path.mkdir()
    with pb.local.cwd(str(path)):
        git_('init', '--bare')
    git_('remote', 'add', 'origin', path.as_uri())
    git_('push', '--set-upstream', 'origin', 'master')
    git_['status'] & pb.FG
 def test_no_ignore(self, tmpcwd):
     '''
     When well-behaved pre_commit_no_ignore, copy matched files to pre-commit
     tmp dir
     '''
     project = self.project
     project.project_py['pre_commit_no_ignore'] = ['operation/mittens/test/mah_*']
     project.files[Path('operation/mittens/test/mah_file')] = 'content'
     project.files[Path('operation/mittens/test/mah_dir/some_file')] = 'some file content'
     project.files[Path('operation/mittens/test/test_it.py')] = dedent('''\
         from pathlib import Path
         def test_it():
             # file is there
             dir = Path(__file__).parent
             with (dir / 'mah_file').open('r') as f:
                 assert f.read() == 'content'
                 
             # recursively copied directory is there
             with (dir / 'mah_dir/some_file').open('r') as f:
                 assert f.read() == 'some file content'
         ''')
     create_project(project)
     mkproject() # install pre commit hook
     git_('add', '.')
     git_('reset', 'operation/mittens/test/mah_file')
     git_('reset', 'operation/mittens/test/mah_dir')
     git_('commit', '-m', 'message') # run pre-commit
 def test_happy_days(self, tmpcwd):
     '''
     If all well, commit
     '''
     project = self.project
     create_project(project)
     mkproject & pb.FG  # install pre-commit hook
     git_('add', '.')
     
     project.project_py['entry_points'] = {
         'console_scripts': [
             'mycli = operation.mittens.main:main',
         ],
     }
     project.files[Path('operation/mittens/main.py')] = 'def main(): pass'
     update_project(project)  # without staging it
     mkproject()
     
     git_('commit', '-m', 'message')  # runs the hook
     pb.local['sh']('-c', '. venv/bin/activate; mycli')  # mycli should be available in the venv, even though it wasn't part of the commit (it shouldn't be available in the venv during the pre-commit test run)
def test_older_than_ancestor(tmpcwd):
    '''
    Ask user before releasing with an older version than an ancestor commit 
    '''
    create_release_project()
    git_('tag', 'v2.0.0')
    Path('dummy1').touch()
    git_('add', '.')
    git_('commit', '-m', 'message')
    git_('tag', 'v0.5.0')
    
    result = release('1.0.0', input='y\n')
    assert result.exit_code == 0, result.output
    assert '2.0.0' in result.output
    assert 'less than' in result.output
    assert 'Do you want to' in result.output
def test_older_than_ancestor(tmpcwd):
    '''
    Ask user before releasing with an older version than an ancestor commit 
    '''
    create_release_project()
    git_('tag', 'v2.0.0')
    Path('dummy1').touch()
    git_('add', '.')
    git_('commit', '-m', 'message')
    git_('tag', 'v0.5.0')

    result = release('1.0.0', input='y\n')
    assert result.exit_code == 0, result.output
    assert '2.0.0' in result.output
    assert 'less than' in result.output
    assert 'Do you want to' in result.output
 def test_include_changes(self, tmpcwd):
     '''
     Changes made by mkproject must be staged, especially during precommit
     '''
     self.create_project()
     mkproject & pb.FG  # install pre-commit hook
     write_file('requirements.in', 'pytest')
     git_('add', '.')
     git_('commit', '-m', 'message')  # runs the hook, which calls ct-mkproject, which changes setup.py in this case
     
     # Expected change happened and is part of the commit
     git_('reset', '--hard')
     assert get_setup_args()['install_requires'] == ['pytest']
def test_older_than_other_branch(tmpcwd):
    '''
    Don't ask user before releasing with an older version than a commit in another branch (i.e. not an ancestor) 
    '''
    create_release_project()
    git_('tag', 'v0.5.0')
    
    git_('checkout', '-b', 'other')
    Path('dummy1').touch()
    git_('add', '.')
    git_('commit', '-m', 'message')
    git_('tag', 'v2.0.0')
    
    git_('checkout', 'master')
    Path('dummy2').touch()
    git_('add', '.')
    git_('commit', '-m', 'message')
    git_('tag', 'v0.8.0')
    
    result = release('1.0.0')
    assert result.exit_code == 0, result.output
    assert 'v2.0.0' not in result.output
    assert 'less than' not in result.output
    assert 'Do you want to' not in result.output
def test_older_than_other_branch(tmpcwd):
    '''
    Don't ask user before releasing with an older version than a commit in another branch (i.e. not an ancestor) 
    '''
    create_release_project()
    git_('tag', 'v0.5.0')

    git_('checkout', '-b', 'other')
    Path('dummy1').touch()
    git_('add', '.')
    git_('commit', '-m', 'message')
    git_('tag', 'v2.0.0')

    git_('checkout', 'master')
    Path('dummy2').touch()
    git_('add', '.')
    git_('commit', '-m', 'message')
    git_('tag', 'v0.8.0')

    result = release('1.0.0')
    assert result.exit_code == 0, result.output
    assert 'v2.0.0' not in result.output
    assert 'less than' not in result.output
    assert 'Do you want to' not in result.output