"""Unit tests: exclude_encrypted"""
import pytest


@pytest.mark.parametrize(
    'exclude', ['missing', 'outdated', 'up-to-date'])
@pytest.mark.parametrize(
    'encrypt_exists', [True, False], ids=['encrypt', 'no-encrypt'])
@pytest.mark.parametrize(
    'auto_exclude', [True, False], ids=['enabled', 'disabled'])
def test_exclude_encrypted(
        runner, tmpdir, yadm, encrypt_exists, auto_exclude, exclude):
    """Test exclude_encrypted()"""

    header = (
        "# yadm-auto-excludes\n"
        "# This section is managed by yadm.\n"
        "# Any edits below will be lost.\n"
    )

    config_function = 'function config() { echo "false";}'
    if auto_exclude:
        config_function = 'function config() { return; }'

    encrypt_file = tmpdir.join('encrypt_file')
    repo_dir = tmpdir.join('repodir')
    exclude_file = repo_dir.join('info/exclude')

    if encrypt_exists:
        encrypt_file.write('test-encrypt-data\n', ensure=True)
    if exclude == 'outdated':
        exclude_file.write(
            f'original-exclude\n{header}outdated\n', ensure=True)
    elif exclude == 'up-to-date':
        exclude_file.write(
            f'original-exclude\n{header}test-encrypt-data\n', ensure=True)

    script = f"""
        YADM_TEST=1 source {yadm}
        {config_function}
        DEBUG=1
        YADM_ENCRYPT="{encrypt_file}"
        YADM_REPO="{repo_dir}"
        exclude_encrypted
    """
    run = runner(command=['bash'], inp=script)
    assert run.success
    assert run.err == ''

    if auto_exclude:
        if encrypt_exists:
            assert exclude_file.exists()
            if exclude == 'missing':
                assert exclude_file.read() == f'{header}test-encrypt-data\n'
            else:
                assert exclude_file.read() == (
                    'original-exclude\n'
                    f'{header}test-encrypt-data\n')
            if exclude != 'up-to-date':
                assert f'Updating {exclude_file}' in run.out
            else:
                assert run.out == ''
        else:
            assert run.out == ''
    else:
        assert run.out == ''
