test_cli.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. from unittest import TestCase
  2. import json
  3. import subprocess
  4. import sys
  5. from jsonschema import Draft4Validator, ValidationError, cli, __version__
  6. from jsonschema.compat import NativeIO
  7. from jsonschema.exceptions import SchemaError
  8. def fake_validator(*errors):
  9. errors = list(reversed(errors))
  10. class FakeValidator(object):
  11. def __init__(self, *args, **kwargs):
  12. pass
  13. def iter_errors(self, instance):
  14. if errors:
  15. return errors.pop()
  16. return []
  17. def check_schema(self, schema):
  18. pass
  19. return FakeValidator
  20. class TestParser(TestCase):
  21. FakeValidator = fake_validator()
  22. instance_file = "foo.json"
  23. schema_file = "schema.json"
  24. def setUp(self):
  25. cli.open = self.fake_open
  26. self.addCleanup(delattr, cli, "open")
  27. def fake_open(self, path):
  28. if path == self.instance_file:
  29. contents = ""
  30. elif path == self.schema_file:
  31. contents = {}
  32. else: # pragma: no cover
  33. self.fail("What is {!r}".format(path))
  34. return NativeIO(json.dumps(contents))
  35. def test_find_validator_by_fully_qualified_object_name(self):
  36. arguments = cli.parse_args(
  37. [
  38. "--validator",
  39. "jsonschema.tests.test_cli.TestParser.FakeValidator",
  40. "--instance", self.instance_file,
  41. self.schema_file,
  42. ]
  43. )
  44. self.assertIs(arguments["validator"], self.FakeValidator)
  45. def test_find_validator_in_jsonschema(self):
  46. arguments = cli.parse_args(
  47. [
  48. "--validator", "Draft4Validator",
  49. "--instance", self.instance_file,
  50. self.schema_file,
  51. ]
  52. )
  53. self.assertIs(arguments["validator"], Draft4Validator)
  54. class TestCLI(TestCase):
  55. def test_draft3_schema_draft4_validator(self):
  56. stdout, stderr = NativeIO(), NativeIO()
  57. with self.assertRaises(SchemaError):
  58. cli.run(
  59. {
  60. "validator": Draft4Validator,
  61. "schema": {
  62. "anyOf": [
  63. {"minimum": 20},
  64. {"type": "string"},
  65. {"required": True},
  66. ],
  67. },
  68. "instances": [1],
  69. "error_format": "{error.message}",
  70. },
  71. stdout=stdout,
  72. stderr=stderr,
  73. )
  74. def test_successful_validation(self):
  75. stdout, stderr = NativeIO(), NativeIO()
  76. exit_code = cli.run(
  77. {
  78. "validator": fake_validator(),
  79. "schema": {},
  80. "instances": [1],
  81. "error_format": "{error.message}",
  82. },
  83. stdout=stdout,
  84. stderr=stderr,
  85. )
  86. self.assertFalse(stdout.getvalue())
  87. self.assertFalse(stderr.getvalue())
  88. self.assertEqual(exit_code, 0)
  89. def test_unsuccessful_validation(self):
  90. error = ValidationError("I am an error!", instance=1)
  91. stdout, stderr = NativeIO(), NativeIO()
  92. exit_code = cli.run(
  93. {
  94. "validator": fake_validator([error]),
  95. "schema": {},
  96. "instances": [1],
  97. "error_format": "{error.instance} - {error.message}",
  98. },
  99. stdout=stdout,
  100. stderr=stderr,
  101. )
  102. self.assertFalse(stdout.getvalue())
  103. self.assertEqual(stderr.getvalue(), "1 - I am an error!")
  104. self.assertEqual(exit_code, 1)
  105. def test_unsuccessful_validation_multiple_instances(self):
  106. first_errors = [
  107. ValidationError("9", instance=1),
  108. ValidationError("8", instance=1),
  109. ]
  110. second_errors = [ValidationError("7", instance=2)]
  111. stdout, stderr = NativeIO(), NativeIO()
  112. exit_code = cli.run(
  113. {
  114. "validator": fake_validator(first_errors, second_errors),
  115. "schema": {},
  116. "instances": [1, 2],
  117. "error_format": "{error.instance} - {error.message}\t",
  118. },
  119. stdout=stdout,
  120. stderr=stderr,
  121. )
  122. self.assertFalse(stdout.getvalue())
  123. self.assertEqual(stderr.getvalue(), "1 - 9\t1 - 8\t2 - 7\t")
  124. self.assertEqual(exit_code, 1)
  125. def test_version(self):
  126. version = subprocess.check_output(
  127. [sys.executable, "-m", "jsonschema", "--version"],
  128. stderr=subprocess.STDOUT,
  129. )
  130. version = version.decode("utf-8").strip()
  131. self.assertEqual(version, __version__)