Skip to content

Commit 005d9cb

Browse files
Add files via upload
1 parent f332483 commit 005d9cb

File tree

2 files changed

+172
-0
lines changed

2 files changed

+172
-0
lines changed

tests/test_unit.py

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import os
2+
import pytest
3+
from customize_schema import validate_metadata as validator43
4+
from helpers import load_json_path
5+
import logging
6+
from tqdm import tqdm
7+
8+
# Directories for valid and invalid JSON files
9+
VALID_DATACITE43_DIR = "../tests/data/datacite43/"
10+
INVALID_DATACITE43_DIR = "../tests/data/invalid_datacite43/"
11+
12+
# Function to get all JSON files in the directory
13+
def get_all_json_files(directory):
14+
return [os.path.join(directory, f) for f in os.listdir(directory) if f.endswith('.json')]
15+
16+
# Get list of all valid JSON files in the directory
17+
VALID_DATACITE43_FILES = get_all_json_files(VALID_DATACITE43_DIR)
18+
INVALID_DATACITE43_FILES = get_all_json_files(INVALID_DATACITE43_DIR)
19+
20+
@pytest.mark.parametrize("valid_file", VALID_DATACITE43_FILES)
21+
def test_valid_json(valid_file):
22+
"""Test that valid example files validate successfully."""
23+
print(f"\nValidating file: {valid_file}") # Log for file being tested
24+
json_data = load_json_path(valid_file)
25+
validation_errors = None
26+
try:
27+
validation_errors = validator43(json_data)
28+
except ValueError as e:
29+
pytest.fail(f"Validation failed for: {valid_file}\nErrors: {str(e)}")
30+
31+
if validation_errors:
32+
pytest.fail(f"Validation failed for: {valid_file}\nErrors: {validation_errors}")
33+
else:
34+
print(f"Validation passed for: {valid_file}")
35+
36+
@pytest.mark.parametrize("invalid_file", INVALID_DATACITE43_FILES)
37+
def test_invalid_json(invalid_file):
38+
"""Test that invalid example files do not validate successfully."""
39+
print(f"\nValidating file: {invalid_file}") # Log for file being tested
40+
json_data = load_json_path(invalid_file)
41+
validation_errors = None
42+
try:
43+
validation_errors = validator43(json_data)
44+
except ValueError:
45+
print(f"Validation failed as expected for: {invalid_file}")
46+
return # Test passes if validation raises a ValueError
47+
48+
if validation_errors:
49+
print(f"Validation failed as expected for: {invalid_file}")
50+
else:
51+
pytest.fail(f"Validation passed unexpectedly for: {invalid_file}")
52+
53+
@pytest.mark.parametrize("missing_field_file", [
54+
{"file": "../tests/data/missing_creators.json", "missing_field": "creators"},
55+
{"file": "../tests/data/missing_titles.json", "missing_field": "titles"},
56+
])
57+
def test_missing_required_fields(missing_field_file):
58+
"""Test that JSON files missing required fields fail validation."""
59+
print(f"\nTesting missing field: {missing_field_file['missing_field']} in file: {missing_field_file['file']}")
60+
json_data = load_json_path(missing_field_file['file'])
61+
with pytest.raises(ValueError, match=f"Missing required metadata field: {missing_field_file['missing_field']}"):
62+
validator43(json_data)
63+
64+
@pytest.mark.parametrize("type_error_file", [
65+
{"file": "../tests/data/type_error_creators.json", "field": "creators"},
66+
{"file": "../tests/data/type_error_dates.json", "field": "dates"},
67+
])
68+
def test_incorrect_field_types(type_error_file):
69+
"""Test that JSON files with incorrect field types fail validation."""
70+
print(f"\nTesting incorrect type in field: {type_error_file['field']} for file: {type_error_file['file']}")
71+
json_data = load_json_path(type_error_file['file'])
72+
with pytest.raises(ValueError, match=f"Incorrect type for field: {type_error_file['field']}"):
73+
validator43(json_data)
74+
75+
def test_multiple_errors():
76+
"""Test JSON file with multiple issues to check all errors are raised."""
77+
json_data = load_json_path("../tests/data/multiple_errors.json")
78+
with pytest.raises(ValueError, match="Multiple validation errors"):
79+
validator43(json_data)
80+
81+
def test_error_logging(caplog):
82+
"""Test that errors are logged correctly during validation."""
83+
json_data = load_json_path("../tests/data/invalid_datacite43/some_invalid_file.json")
84+
with caplog.at_level(logging.ERROR):
85+
with pytest.raises(ValueError):
86+
validator43(json_data)
87+
assert "Validation failed" in caplog.text
88+
89+
if __name__ == "__main__":
90+
# Manual test runner for valid files
91+
failed_valid_files = []
92+
print("\nRunning validation for valid files...")
93+
for file in tqdm(VALID_DATACITE43_FILES, desc="Valid files"):
94+
try:
95+
test_valid_json(file)
96+
except AssertionError as e:
97+
failed_valid_files.append(file)
98+
print(f"Error occurred in valid file: {file}\nError details: {e}")
99+
100+
if not failed_valid_files:
101+
print("\n✅ All valid files passed validation. Test complete.")
102+
else:
103+
print("\n❌ The following valid files failed validation:")
104+
for failed_file in failed_valid_files:
105+
print(f"- {failed_file}")
106+
107+
# Manual test runner for invalid files
108+
passed_invalid_files = []
109+
print("\nRunning validation for invalid files...")
110+
for file in tqdm(INVALID_DATACITE43_FILES, desc="Invalid files"):
111+
try:
112+
test_invalid_json(file)
113+
except AssertionError as e:
114+
passed_invalid_files.append(file)
115+
print(f"Error occurred in invalid file: {file}\nError details: {e}")
116+
117+
if not passed_invalid_files:
118+
print("\n✅ All invalid files failed validation as expected. Test is a success.")
119+
else:
120+
print("\n❌ The following invalid files unexpectedly passed validation:")
121+
for passed_file in passed_invalid_files:
122+
print(f"- {passed_file}")

tests/tester.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import os
2+
import pytest
3+
from customize_schema import validate_metadata as validator43
4+
from helpers import load_json_path
5+
6+
# Define the directory containing the test JSON files
7+
VALID_DATACITE43_DIR = "../tests/data/datacite43/" # Directory for valid JSON files
8+
9+
# Function to get all JSON files in the directory
10+
def get_all_json_files(directory):
11+
return [os.path.join(directory, f) for f in os.listdir(directory) if f.endswith('.json')]
12+
13+
# Get list of all valid JSON files in the directory
14+
VALID_DATACITE43_FILES = get_all_json_files(VALID_DATACITE43_DIR)
15+
16+
@pytest.mark.parametrize("valid_file", VALID_DATACITE43_FILES)
17+
def test_valid_json(valid_file):
18+
"""Test that valid example files validate successfully."""
19+
print(f"Validating file: {valid_file}") # Added log for file being tested
20+
json_data = load_json_path(valid_file)
21+
validation_errors = None
22+
try:
23+
validation_errors = validator43(json_data)
24+
except ValueError as e:
25+
pytest.fail(f"Validation failed for: {valid_file}\nErrors: {str(e)}")
26+
27+
if validation_errors:
28+
pytest.fail(f"Validation failed for: {valid_file}\nErrors: {validation_errors}")
29+
else:
30+
print(f"Validation passed for: {valid_file}")
31+
32+
if __name__ == "__main__":
33+
# Track failures for manual testing
34+
failed_files = []
35+
36+
# Run the tests and print results for each file
37+
for file in VALID_DATACITE43_FILES:
38+
try:
39+
test_valid_json(file)
40+
except AssertionError as e:
41+
failed_files.append(file)
42+
print(f"Error occurred in file: {file}\nError details: {e}")
43+
44+
# Print a summary of all failed files
45+
if failed_files:
46+
print("\nThe following files failed validation:")
47+
for failed_file in failed_files:
48+
print(f"- {failed_file}")
49+
else:
50+
print("\nAll files passed validation.")

0 commit comments

Comments
 (0)