from __future__ import absolute_import
from __future__ import unicode_literals

from plumbum import local

from pre_commit_hooks.check_case_conflict import find_conflicting_filenames
from pre_commit_hooks.check_case_conflict import main
from testing.util import write_file


def test_nothing_added(temp_git_dir):
    with local.cwd(temp_git_dir):
        assert find_conflicting_filenames(['f.py']) == 0


def test_adding_something(temp_git_dir):
    with local.cwd(temp_git_dir):
        write_file('f.py', "print('hello world')")
        local['git']('add', 'f.py')

        assert find_conflicting_filenames(['f.py']) == 0


def test_adding_something_with_conflict(temp_git_dir):
    with local.cwd(temp_git_dir):
        write_file('f.py', "print('hello world')")
        local['git']('add', 'f.py')
        write_file('F.py', "print('hello world')")
        local['git']('add', 'F.py')

        assert find_conflicting_filenames(['f.py', 'F.py']) == 1


def test_added_file_not_in_pre_commits_list(temp_git_dir):
    with local.cwd(temp_git_dir):
        write_file('f.py', "print('hello world')")
        local['git']('add', 'f.py')

        assert find_conflicting_filenames(['g.py']) == 0


def test_file_conflicts_with_committed_file(temp_git_dir):
    with local.cwd(temp_git_dir):
        write_file('f.py', "print('hello world')")
        local['git']('add', 'f.py')
        local['git']('commit', '--no-verify', '-m', 'Add f.py')

        write_file('F.py', "print('hello world')")
        local['git']('add', 'F.py')

        assert find_conflicting_filenames(['F.py']) == 1


def test_integration(temp_git_dir):
    with local.cwd(temp_git_dir):
        assert main(argv=[]) == 0

        write_file('f.py', "print('hello world')")
        local['git']('add', 'f.py')

        assert main(argv=['f.py']) == 0

        write_file('F.py', "print('hello world')")
        local['git']('add', 'F.py')

        assert main(argv=['F.py']) == 1
