# Path: scripnix/pybin/backup_file.py
# COMMAND_NAME = "backup-file"
# BACKUP_DATE_FORMAT = "%Y%m%d"
# def assemble_dry_run_message(backups):
# def collect_backups(file_paths):
# def execute_backups(backups):
# def main(file, dry_run):
# 
# Path: tests/command.py
# def common_help_option(command_entry, command_name):
#     """ Test help message for both standard option switches."""
#     def version_option_switch(option_switch):
#         runner = CliRunner()
#         result = runner.invoke(command_entry, [option_switch])
#         assert result.exit_code == 0
#         match = HELP_OPTION_REGEX.match(result.output.replace("\n", ""))
#         assert match.group(1) == command_name
# 
#     version_option_switch("-h")
#     version_option_switch("--help")
# 
# def common_version_option(command_entry, command_name):
#     """ Test version message for both standard option switches."""
#     def version_option_switch(option_switch):
#         runner = CliRunner()
#         result = runner.invoke(command_entry, [option_switch])
#         assert result.exit_code == 0
#         match = VERSION_OPTION_REGEX.match(result.output.replace("\n", ""))
#         assert match.group(1) == command_name
#         assert match.group(2) == __version__
# 
#     version_option_switch("-V")
#     version_option_switch("--version")


import datetime
import os
import re
import time
import pytest
from click import ClickException
from click.testing import CliRunner
from scripnix.pybin.backup_file import assemble_dry_run_message, Backup, collect_backups, COMMAND_NAME, execute_backups, main
from .command import common_help_option, common_version_option

@pytest.mark.parametrize('file_name_permissions,expected', [
    ([], []),
    ([("test.tst", 0o0644)], [Backup("test.tst", "test.tst.20140702", False)]),
    ([("test.exe", 0o0755)], [Backup("test.exe", "test.exe.20140702", True)]),
    ([("test.suid", 0o4644)], [Backup("test.suid", "test.suid.20140702", True)]),
    ([("test.tst", 0o0644), ("test.exe", 0o0755)],
     [Backup("test.tst", "test.tst.20140702", False), Backup("test.exe", "test.exe.20140702", True)]),
    ([("test.tst", 0o0644), ("test.tst.20140702", 0o0644)],
     [Backup("test.tst", "test.tst.20140702.1", False), Backup("test.tst.20140702", "test.tst.20140702.20140702", False)]),
])
def test_collect_backups(file_name_permissions, expected):
    with CliRunner().isolated_filesystem():
        backups, test_path = _create_files(file_name_permissions, datetime.datetime(2014, 7, 2, 0, 0).timestamp())
        assert len(backups) == len(expected)

        for i, backup in enumerate(backups):
            assert backup.from_path == os.path.join(test_path, expected[i].from_path)
            assert backup.to_path == os.path.join(test_path, expected[i].to_path)
            assert backup.is_exec_or_suid == expected[i].is_exec_or_suid


@pytest.mark.parametrize('file_name_permissions,expected', [
    ([("test.tst", 0o0644)], [("test.tst", 0o100644)]),
    ([("test.tst", 0o0644), ("test.exe", 0o0755)], [("test.tst", 0o100644), ("test.exe", 0o100755)]),
])
def test_execute_backups_failure(file_name_permissions, expected):
    with CliRunner().isolated_filesystem():
        backups, test_path = _create_files(file_name_permissions, datetime.datetime(2013, 8, 31, 0, 0).timestamp())


# Path: scripnix/pybin/backup_file.py
# COMMAND_NAME = "backup-file"
# BACKUP_DATE_FORMAT = "%Y%m%d"
# def assemble_dry_run_message(backups):
# def collect_backups(file_paths):
# def execute_backups(backups):
# def main(file, dry_run):
# 
# Path: tests/command.py
# def common_help_option(command_entry, command_name):
#     """ Test help message for both standard option switches."""
#     def version_option_switch(option_switch):
#         runner = CliRunner()
#         result = runner.invoke(command_entry, [option_switch])
#         assert result.exit_code == 0
#         match = HELP_OPTION_REGEX.match(result.output.replace("\n", ""))
#         assert match.group(1) == command_name
# 
#     version_option_switch("-h")
#     version_option_switch("--help")
# 
# def common_version_option(command_entry, command_name):
#     """ Test version message for both standard option switches."""
#     def version_option_switch(option_switch):
#         runner = CliRunner()
#         result = runner.invoke(command_entry, [option_switch])
#         assert result.exit_code == 0
#         match = VERSION_OPTION_REGEX.match(result.output.replace("\n", ""))
#         assert match.group(1) == command_name
#         assert match.group(2) == __version__
# 
#     version_option_switch("-V")
#     version_option_switch("--version")


# Path: tests/test_backup_file.py
import datetime
import os
import re
import time
import pytest
from click import ClickException
from click.testing import CliRunner
from scripnix.pybin.backup_file import assemble_dry_run_message, Backup, collect_backups, COMMAND_NAME, execute_backups, main
from .command import common_help_option, common_version_option


@pytest.mark.parametrize('file_name_permissions,expected', [
    ([], []),
    ([("test.tst", 0o0644)], [Backup("test.tst", "test.tst.20140702", False)]),
    ([("test.exe", 0o0755)], [Backup("test.exe", "test.exe.20140702", True)]),
    ([("test.suid", 0o4644)], [Backup("test.suid", "test.suid.20140702", True)]),
    ([("test.tst", 0o0644), ("test.exe", 0o0755)],
     [Backup("test.tst", "test.tst.20140702", False), Backup("test.exe", "test.exe.20140702", True)]),
    ([("test.tst", 0o0644), ("test.tst.20140702", 0o0644)],
     [Backup("test.tst", "test.tst.20140702.1", False), Backup("test.tst.20140702", "test.tst.20140702.20140702", False)]),
])
def test_collect_backups(file_name_permissions, expected):
    with CliRunner().isolated_filesystem():
        backups, test_path = _create_files(file_name_permissions, datetime.datetime(2014, 7, 2, 0, 0).timestamp())
        assert len(backups) == len(expected)

        for i, backup in enumerate(backups):
            assert backup.from_path == os.path.join(test_path, expected[i].from_path)
            assert backup.to_path == os.path.join(test_path, expected[i].to_path)
            assert backup.is_exec_or_suid == expected[i].is_exec_or_suid


@pytest.mark.parametrize('file_name_permissions,expected', [
    ([("test.tst", 0o0644)], [("test.tst", 0o100644)]),
    ([("test.tst", 0o0644), ("test.exe", 0o0755)], [("test.tst", 0o100644), ("test.exe", 0o100755)]),
])
def test_execute_backups_failure(file_name_permissions, expected):
    with CliRunner().isolated_filesystem():
        backups, test_path = _create_files(file_name_permissions, datetime.datetime(2013, 8, 31, 0, 0).timestamp())


        monkeyed_backups = [Backup(b.from_path + '.bad', b.to_path, b.is_exec_or_suid) for b in backups]