import pytest
import tempfile

from pre_commit_hooks.pretty_format_json import pretty_format_json
from testing.util import get_resource_path


@pytest.mark.parametrize(('filename', 'expected_retval'), (
    ('not_pretty_formatted_json.json', 1),
    ('pretty_formatted_json.json', 0),
))
def test_pretty_format_json(filename, expected_retval):
    ret = pretty_format_json([get_resource_path(filename)])
    assert ret == expected_retval


def test_autofix_pretty_format_json():
    toformat_file = tempfile.NamedTemporaryFile(delete=False, mode='w+')

    # copy our file to format there
    model_file = open(get_resource_path('not_pretty_formatted_json.json'), 'r')
    model_contents = model_file.read()
    model_file.close()

    toformat_file.write(model_contents)
    toformat_file.close()

    # now launch the autofix on that file
    ret = pretty_format_json(['--autofix', toformat_file.name])
    # it should have formatted it
    assert ret == 1

    # file already good
    ret = pretty_format_json([toformat_file.name])
    assert ret == 0


def test_badfile_pretty_format_json():
    ret = pretty_format_json([get_resource_path('ok_yaml.yaml')])
    assert ret == 1
