mirror of
https://github.com/pre-commit/pre-commit.git
synced 2026-02-17 00:04:42 +04:00
Merge branch 'master' of github.com:pre-commit/pre-commit
Conflicts: tests/git_test.py
This commit is contained in:
commit
3b0f03d0e0
11 changed files with 243 additions and 160 deletions
67
tests/clientlib/validate_base_test.py
Normal file
67
tests/clientlib/validate_base_test.py
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
|
||||
import __builtin__
|
||||
|
||||
import os.path
|
||||
import mock
|
||||
import pytest
|
||||
|
||||
from pre_commit import git
|
||||
from pre_commit.clientlib.validate_base import get_validator
|
||||
|
||||
|
||||
class AdditionalValidatorError(ValueError): pass
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def noop_validator():
|
||||
return get_validator('example_manifest.yaml', {}, ValueError)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def array_validator():
|
||||
return get_validator('', {'type': 'array'}, ValueError)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def additional_validator():
|
||||
def raises_always(obj):
|
||||
raise AdditionalValidatorError
|
||||
|
||||
return get_validator(
|
||||
'example_manifest.yaml',
|
||||
{},
|
||||
ValueError,
|
||||
additional_validation_strategy=raises_always,
|
||||
)
|
||||
|
||||
|
||||
def test_raises_for_non_existent_file(noop_validator):
|
||||
with pytest.raises(ValueError):
|
||||
noop_validator('file_that_does_not_exist.yaml')
|
||||
|
||||
|
||||
def test_raises_for_invalid_yaml_file(noop_validator):
|
||||
with pytest.raises(ValueError):
|
||||
noop_validator('tests/data/non_parseable_yaml_file.yaml')
|
||||
|
||||
|
||||
def test_defaults_to_backup_filename(noop_validator):
|
||||
with mock.patch.object(__builtin__, 'open', side_effect=open) as mock_open:
|
||||
noop_validator()
|
||||
mock_open.assert_called_once_with(
|
||||
os.path.join(git.get_root(), 'example_manifest.yaml'), 'r',
|
||||
)
|
||||
|
||||
|
||||
def test_raises_for_failing_schema(array_validator):
|
||||
with pytest.raises(ValueError):
|
||||
array_validator('tests/data/valid_yaml_but_invalid_manifest.yaml')
|
||||
|
||||
|
||||
def test_passes_array_schema(array_validator):
|
||||
array_validator('tests/data/array_yaml_file.yaml')
|
||||
|
||||
|
||||
def test_raises_when_additional_validation_fails(additional_validator):
|
||||
with pytest.raises(AdditionalValidatorError):
|
||||
additional_validator()
|
||||
|
|
@ -1,86 +1,62 @@
|
|||
|
||||
import __builtin__
|
||||
import jsonschema
|
||||
import jsonschema.exceptions
|
||||
import pytest
|
||||
import mock
|
||||
|
||||
from pre_commit.clientlib.validate_manifest import check_is_valid_manifest
|
||||
from pre_commit.clientlib.validate_manifest import additional_manifest_check
|
||||
from pre_commit.clientlib.validate_manifest import InvalidManifestError
|
||||
from pre_commit.clientlib.validate_manifest import MANIFEST_JSON_SCHEMA
|
||||
from pre_commit.clientlib.validate_manifest import run
|
||||
|
||||
|
||||
@pytest.yield_fixture
|
||||
def print_mock():
|
||||
with mock.patch.object(__builtin__, 'print', autospec=True) as print_mock_obj:
|
||||
yield print_mock_obj
|
||||
|
||||
|
||||
def test_run_returns_1_for_non_existent_module(print_mock):
|
||||
non_existent_filename = 'file_that_does_not_exist'
|
||||
ret = run(['--filename', non_existent_filename])
|
||||
assert ret == 1
|
||||
print_mock.assert_called_once_with(
|
||||
'File {0} does not exist'.format(non_existent_filename),
|
||||
)
|
||||
|
||||
|
||||
def test_run_returns_1_for_non_yaml_file(print_mock):
|
||||
non_parseable_filename = 'tests/data/non_parseable_yaml_file.yaml'
|
||||
ret = run(['--filename', non_parseable_filename])
|
||||
assert ret == 1
|
||||
print_mock.assert_any_call(
|
||||
'File {0} is not a valid yaml file'.format(non_parseable_filename),
|
||||
)
|
||||
|
||||
|
||||
def test_returns_1_for_valid_yaml_file_but_invalid_manifest(print_mock):
|
||||
invalid_manifest = 'tests/data/valid_yaml_but_invalid_manifest.yaml'
|
||||
ret = run(['--filename', invalid_manifest])
|
||||
assert ret == 1
|
||||
print_mock.assert_any_call(
|
||||
'File {0} is not a valid manifest file'.format(invalid_manifest)
|
||||
)
|
||||
|
||||
|
||||
def test_returns_0_for_valid_manifest():
|
||||
valid_manifest = 'example_manifest.yaml'
|
||||
ret = run(['--filename', valid_manifest])
|
||||
assert ret == 0
|
||||
assert run(['example_manifest.yaml']) == 0
|
||||
|
||||
|
||||
@pytest.mark.parametrize(('manifest', 'expected_exception_type'), (
|
||||
def test_returns_0_for_our_manifest():
|
||||
assert run([]) == 0
|
||||
|
||||
|
||||
def test_returns_1_for_failing():
|
||||
assert run(['tests/data/valid_yaml_but_invalid_manifest.yaml']) == 1
|
||||
|
||||
|
||||
def test_additional_manifest_check_raises_for_bad_language():
|
||||
with pytest.raises(InvalidManifestError):
|
||||
additional_manifest_check([{'id': 'foo', 'language': 'not valid'}])
|
||||
|
||||
|
||||
@pytest.mark.parametrize(('obj'), (
|
||||
[{}],
|
||||
[{'language': 'python'}],
|
||||
[{'language': 'python>2.6'}],
|
||||
))
|
||||
def test_additional_manifest_check_is_ok_with_missing_language(obj):
|
||||
additional_manifest_check(obj)
|
||||
|
||||
|
||||
def is_valid_according_to_schema(obj, schema):
|
||||
try:
|
||||
jsonschema.validate(obj, schema)
|
||||
return True
|
||||
except jsonschema.exceptions.ValidationError:
|
||||
return False
|
||||
|
||||
|
||||
@pytest.mark.parametrize(('manifest_obj', 'expected'), (
|
||||
([], False),
|
||||
([{'id': 'a', 'name': 'b', 'entry': 'c'}], True),
|
||||
(
|
||||
"""
|
||||
hooks:
|
||||
-
|
||||
id: foo
|
||||
entry: foo
|
||||
""",
|
||||
jsonschema.exceptions.ValidationError,
|
||||
),
|
||||
(
|
||||
"""
|
||||
hooks:
|
||||
-
|
||||
id: foo
|
||||
name: Foo
|
||||
language: Not a Language lol
|
||||
entry: foo
|
||||
""",
|
||||
InvalidManifestError,
|
||||
[{
|
||||
'id': 'a',
|
||||
'name': 'b',
|
||||
'entry': 'c',
|
||||
'language': 'python',
|
||||
'expected_return_value': 0,
|
||||
}],
|
||||
True,
|
||||
),
|
||||
))
|
||||
def test_check_invalid_manifests(manifest, expected_exception_type):
|
||||
with pytest.raises(expected_exception_type):
|
||||
check_is_valid_manifest(manifest)
|
||||
|
||||
|
||||
def test_valid_manifest_is_valid():
|
||||
check_is_valid_manifest("""
|
||||
hooks:
|
||||
-
|
||||
id: foo
|
||||
name: Foo
|
||||
entry: foo
|
||||
language: python>2.6
|
||||
""")
|
||||
def test_is_valid_according_to_schema(manifest_obj, expected):
|
||||
ret = is_valid_according_to_schema(manifest_obj, MANIFEST_JSON_SCHEMA)
|
||||
assert ret is expected
|
||||
10
tests/conftest.py
Normal file
10
tests/conftest.py
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
|
||||
import pytest
|
||||
from plumbum import local
|
||||
|
||||
|
||||
@pytest.yield_fixture
|
||||
def empty_git_dir(tmpdir):
|
||||
with local.cwd(tmpdir.strpath):
|
||||
local['git']['init']()
|
||||
yield tmpdir.strpath
|
||||
2
tests/data/array_yaml_file.yaml
Normal file
2
tests/data/array_yaml_file.yaml
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
- foo
|
||||
- bar
|
||||
|
|
@ -16,14 +16,6 @@ def get_sha(git_repo):
|
|||
with local.cwd(git_repo):
|
||||
return (local['git']['log', '--format="%H"'] | local['head']['-n1'])().strip('"\n')
|
||||
|
||||
|
||||
@pytest.yield_fixture
|
||||
def empty_git_dir(tmpdir):
|
||||
with local.cwd(tmpdir.strpath):
|
||||
local['git']['init']()
|
||||
yield tmpdir.strpath
|
||||
|
||||
|
||||
@pytest.yield_fixture
|
||||
def dummy_git_repo(empty_git_dir):
|
||||
local['touch']['dummy']()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue