spark: add json validator utility with tests
This commit is contained in:
1 parent
599e35566a
commit
d6a89e75c8
3 files changed
+137
No files matched your search
@@ -0,0 +1,31 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Simple JSON validator - validates JSON files and reports errors."""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
|
||||||
|
def validate_json(filepath):
|
||||||
|
"""Validate a JSON file. Returns (is_valid, error_message)."""
|
||||||
|
try:
|
||||||
|
with open(filepath, 'r') as f:
|
||||||
|
json.load(f)
|
||||||
|
return True, None
|
||||||
|
except FileNotFoundError:
|
||||||
|
return False, f"File not found: {filepath}"
|
||||||
|
except json.JSONDecodeError as e:
|
||||||
|
return False, f"Invalid JSON: {e}"
|
||||||
|
except Exception as e:
|
||||||
|
return False, f"Error: {e}"
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) != 2:
|
||||||
|
print(f"Usage: {sys.argv[0]} <json-file>", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
is_valid, error = validate_json(sys.argv[1])
|
||||||
|
if is_valid:
|
||||||
|
print("VALID")
|
||||||
|
sys.exit(0)
|
||||||
|
else:
|
||||||
|
print(error, file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Test for json_validate_simple.py - verifies the validator works correctly."""
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import tempfile
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
|
||||||
|
def test_json_validator():
|
||||||
|
"""Run tests on json_validate_simple.py"""
|
||||||
|
results = []
|
||||||
|
|
||||||
|
# Create temp files for testing
|
||||||
|
temp_dir = tempfile.mkdtemp()
|
||||||
|
|
||||||
|
# Test 1: Valid JSON object
|
||||||
|
valid_obj = os.path.join(temp_dir, "valid_obj.json")
|
||||||
|
with open(valid_obj, 'w') as f:
|
||||||
|
json.dump({"key": "value", "num": 42}, f)
|
||||||
|
|
||||||
|
result = subprocess.run(['python3', '/root/.hermes/wizard-outputs/spark/json_validate_simple.py', valid_obj],
|
||||||
|
capture_output=True, text=True)
|
||||||
|
if result.returncode == 0 and 'VALID' in result.stdout:
|
||||||
|
results.append(("Test 1 (valid JSON object)", "PASS"))
|
||||||
|
else:
|
||||||
|
results.append(("Test 1 (valid JSON object)", f"FAIL: stdout={result.stdout}, stderr={result.stderr}, code={result.returncode}"))
|
||||||
|
|
||||||
|
# Test 2: Valid JSON array
|
||||||
|
valid_arr = os.path.join(temp_dir, "valid_arr.json")
|
||||||
|
with open(valid_arr, 'w') as f:
|
||||||
|
json.dump([1, 2, 3], f)
|
||||||
|
|
||||||
|
result = subprocess.run(['python3', '/root/.hermes/wizard-outputs/spark/json_validate_simple.py', valid_arr],
|
||||||
|
capture_output=True, text=True)
|
||||||
|
if result.returncode == 0 and 'VALID' in result.stdout:
|
||||||
|
results.append(("Test 2 (valid JSON array)", "PASS"))
|
||||||
|
else:
|
||||||
|
results.append(("Test 2 (valid JSON array)", f"FAIL: {result.stdout} {result.stderr}"))
|
||||||
|
|
||||||
|
# Test 3: Invalid JSON (missing comma)
|
||||||
|
invalid_json = os.path.join(temp_dir, "invalid.json")
|
||||||
|
with open(invalid_json, 'w') as f:
|
||||||
|
f.write('{"key": "value" "num": 42}')
|
||||||
|
|
||||||
|
result = subprocess.run(['python3', '/root/.hermes/wizard-outputs/spark/json_validate_simple.py', invalid_json],
|
||||||
|
capture_output=True, text=True)
|
||||||
|
if result.returncode != 0 and 'Invalid JSON' in result.stderr:
|
||||||
|
results.append(("Test 3 (invalid JSON)", "PASS"))
|
||||||
|
else:
|
||||||
|
results.append(("Test 3 (invalid JSON)", f"FAIL: should have stderr with 'Invalid JSON'"))
|
||||||
|
|
||||||
|
# Test 4: Nonexistent file
|
||||||
|
result = subprocess.run(['python3', '/root/.hermes/wizard-outputs/spark/json_validate_simple.py', '/nonexistent.json'],
|
||||||
|
capture_output=True, text=True)
|
||||||
|
if result.returncode != 0:
|
||||||
|
results.append(("Test 4 (nonexistent file)", "PASS"))
|
||||||
|
else:
|
||||||
|
results.append(("Test 4 (nonexistent file)", "FAIL: should have exited nonzero"))
|
||||||
|
|
||||||
|
# Test 5: Empty string (valid JSON null)
|
||||||
|
empty_valid = os.path.join(temp_dir, "empty_val.json")
|
||||||
|
with open(empty_valid, 'w') as f:
|
||||||
|
f.write("null")
|
||||||
|
|
||||||
|
result = subprocess.run(['python3', '/root/.hermes/wizard-outputs/spark/json_validate_simple.py', empty_valid],
|
||||||
|
capture_output=True, text=True)
|
||||||
|
if result.returncode == 0 and 'VALID' in result.stdout:
|
||||||
|
results.append(("Test 5 (null JSON)", "PASS"))
|
||||||
|
else:
|
||||||
|
results.append(("Test 5 (null JSON)", f"FAIL: {result.stdout} {result.stderr}"))
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
for f in os.listdir(temp_dir):
|
||||||
|
os.unlink(os.path.join(temp_dir, f))
|
||||||
|
os.rmdir(temp_dir)
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
results = test_json_validator()
|
||||||
|
all_pass = True
|
||||||
|
for name, status in results:
|
||||||
|
print(f"{status}: {name}")
|
||||||
|
if status != "PASS":
|
||||||
|
all_pass = False
|
||||||
|
|
||||||
|
if all_pass:
|
||||||
|
print("\nALL TESTS PASSED")
|
||||||
|
exit(0)
|
||||||
|
else:
|
||||||
|
print("\nSOME TESTS FAILED")
|
||||||
|
exit(1)
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
VERIFICATION RESULT
|
||||||
|
===================
|
||||||
|
Artifact: json_validate_simple.py
|
||||||
|
Purpose: Simple JSON validator utility
|
||||||
|
Status: WORKING
|
||||||
|
|
||||||
|
Tests Executed:
|
||||||
|
- Test 1 (valid JSON object): PASS
|
||||||
|
- Test 2 (valid JSON array): PASS
|
||||||
|
- Test 3 (invalid JSON): PASS
|
||||||
|
- Test 4 (nonexistent file): PASS
|
||||||
|
- Test 5 (null JSON): PASS
|
||||||
|
|
||||||
|
All tests passed.
|
||||||
Reference in new issue
Block a user