def test_empty_folder(mocked_empty_folder):
    conf_file, new_config = mocked_empty_folder
    validator = AnsibleTemplateValidator(
        conf_file,
        new_config,
    )
    with pytest.raises(IOError) as e:
        validator.validate()
    assert e.value.errno == errno.ENOENT
def test_no_command_specified(mocked_folder_both_files):
    conf_file, new_config = mocked_folder_both_files

    validator = AnsibleTemplateValidator(
        conf_file,
        new_config,
    )
    with pytest.raises(ValueError) as e:
        validator.validate()
    assert e.value.args[0] == 'validation_command must be specified'
def test_new_file_only(mocked_folder_new_file, mocker, new_config_content):
    conf_file, new_config = mocked_folder_new_file
    assert not os.path.exists(conf_file)

    def validate_config(self):
        with open(conf_file) as config:
            assert config.read() == new_config_content
        return 56

    mocker.patch.object(AnsibleTemplateValidator, 'validate_config',
                        validate_config)
    validator = AnsibleTemplateValidator(
        conf_file,
        new_config,
    )
    return_code = validator.validate()
    assert return_code == 56
    assert not os.path.exists(conf_file)
def test_exception(mocked_folder_both_files, mocker, new_config_content,
                   config_content):
    """
    Tests if original file is restored after exception
    """
    conf_file, new_config = mocked_folder_both_files

    mocker.patch.object(AnsibleTemplateValidator,
                        'validate_config',
                        side_effect=ValueError)
    validator = AnsibleTemplateValidator(
        conf_file,
        new_config,
    )
    with pytest.raises(ValueError):
        validator.validate()
    with open(conf_file) as conf:
        assert conf.read() == config_content
def test_file_content_replacement(mocked_folder_both_files, mocker,
                                  new_config_content, config_content):
    conf_file, new_config = mocked_folder_both_files

    def validate_config(self):
        with open(conf_file) as config:
            assert config.read() == new_config_content
        return 56

    mocker.patch.object(AnsibleTemplateValidator, 'validate_config',
                        validate_config)
    validator = AnsibleTemplateValidator(
        conf_file,
        new_config,
    )
    return_code = validator.validate()
    with open(conf_file) as conf:
        assert conf.read() == config_content
    assert return_code == 56
def test_create_sym_link(mocked_folder_both_files, tmp_path, mocker):
    conf_file, new_config = mocked_folder_both_files
    sym_link = str(tmp_path / "sym_link.txt")
    assert not os.path.exists(sym_link)

    def validate_config(self):
        assert os.path.exists(sym_link)
        # Paths are always absolute
        link_target = os.readlink(sym_link)
        assert conf_file == link_target
        return 0

    mocker.patch.object(AnsibleTemplateValidator, 'validate_config',
                        validate_config)
    validator = AnsibleTemplateValidator(
        conf_file,
        new_config,
        create_sym_link=sym_link,
    )
    validator.validate()
    assert not os.path.exists(sym_link)
def test_run_false_command(mocked_folder_both_files):
    conf_file, new_config = mocked_folder_both_files
    result = AnsibleTemplateValidator(
        str(conf_file), str(new_config),
        validation_command='/bin/false').validate()
    assert result == 1