203 lines
6.2 KiB
Python
203 lines
6.2 KiB
Python
import json
|
|
import pytest
|
|
from utils import metadata
|
|
import yaml
|
|
|
|
|
|
def test_load_metadata_file_yaml(tmp_path):
|
|
data = {'a': 1, 'b': 'test'}
|
|
yaml_path = tmp_path / 'meta.yaml'
|
|
yaml_path.write_text(yaml.dump(data))
|
|
result = metadata.load_metadata_file(yaml_path)
|
|
assert result == data
|
|
|
|
|
|
def test_load_metadata_file_json(tmp_path):
|
|
data = {'x': 42, 'y': 'hello'}
|
|
json_path = tmp_path / 'meta.json'
|
|
json_path.write_text(json.dumps(data))
|
|
result = metadata.load_metadata_file(json_path)
|
|
assert result == data
|
|
|
|
|
|
def test_load_metadata_file_missing(tmp_path):
|
|
missing_path = tmp_path / 'nope.yaml'
|
|
result = metadata.load_metadata_file(missing_path)
|
|
assert result == {}
|
|
|
|
|
|
def test_load_metadata_file_yml_extension(tmp_path):
|
|
data = {'test': 'yml_format'}
|
|
yml_path = tmp_path / 'meta.yml'
|
|
yml_path.write_text(yaml.dump(data))
|
|
result = metadata.load_metadata_file(yml_path)
|
|
assert result == data
|
|
|
|
|
|
def test_load_metadata_file_unknown_format(tmp_path):
|
|
txt_path = tmp_path / 'meta.txt'
|
|
txt_path.write_text('some text')
|
|
result = metadata.load_metadata_file(txt_path)
|
|
assert result == {}
|
|
|
|
|
|
def test_load_metadata_file_malformed_yaml(tmp_path):
|
|
yaml_path = tmp_path / 'bad.yaml'
|
|
yaml_path.write_text('invalid: yaml: content: [')
|
|
with pytest.raises(yaml.YAMLError):
|
|
metadata.load_metadata_file(yaml_path)
|
|
|
|
|
|
def test_load_metadata_file_malformed_json(tmp_path):
|
|
json_path = tmp_path / 'bad.json'
|
|
json_path.write_text('{"invalid": json}')
|
|
with pytest.raises(json.JSONDecodeError):
|
|
metadata.load_metadata_file(json_path)
|
|
|
|
|
|
def test_load_folder_metadata_yaml(tmp_path):
|
|
data = {'folder': 'metadata'}
|
|
metadata_path = tmp_path / 'metadata.yaml'
|
|
metadata_path.write_text(yaml.dump(data))
|
|
result = metadata.load_folder_metadata(tmp_path)
|
|
assert result == data
|
|
|
|
|
|
def test_load_folder_metadata_yml(tmp_path):
|
|
data = {'folder': 'metadata_yml'}
|
|
metadata_path = tmp_path / 'metadata.yml'
|
|
metadata_path.write_text(yaml.dump(data))
|
|
result = metadata.load_folder_metadata(tmp_path)
|
|
assert result == data
|
|
|
|
|
|
def test_load_folder_metadata_json(tmp_path):
|
|
data = {'folder': 'metadata_json'}
|
|
metadata_path = tmp_path / 'metadata.json'
|
|
metadata_path.write_text(json.dumps(data))
|
|
result = metadata.load_folder_metadata(tmp_path)
|
|
assert result == data
|
|
|
|
|
|
def test_load_folder_metadata_missing(tmp_path):
|
|
result = metadata.load_folder_metadata(tmp_path)
|
|
assert result == {}
|
|
|
|
|
|
def test_get_metadata_file_path_existing_yaml(tmp_path):
|
|
metadata_path = tmp_path / 'metadata.yaml'
|
|
metadata_path.write_text('test: data')
|
|
result = metadata.get_metadata_file_path(tmp_path)
|
|
assert result == str(metadata_path)
|
|
|
|
|
|
def test_get_metadata_file_path_existing_yml(tmp_path):
|
|
metadata_path = tmp_path / 'metadata.yml'
|
|
metadata_path.write_text('test: data')
|
|
result = metadata.get_metadata_file_path(tmp_path)
|
|
assert result == str(metadata_path)
|
|
|
|
|
|
def test_get_metadata_file_path_existing_json(tmp_path):
|
|
metadata_path = tmp_path / 'metadata.json'
|
|
metadata_path.write_text('{"test": "data"}')
|
|
result = metadata.get_metadata_file_path(tmp_path)
|
|
assert result == str(metadata_path)
|
|
|
|
|
|
def test_get_metadata_file_path_none_existing(tmp_path):
|
|
result = metadata.get_metadata_file_path(tmp_path)
|
|
expected = str(tmp_path / 'metadata.yaml')
|
|
assert result == expected
|
|
|
|
|
|
def test_merge_metadata():
|
|
parent = {'project': 'Test', 'version': '1.0', 'author': 'Parent'}
|
|
child = {'experiment': 'A', 'version': '1.1'}
|
|
merged = metadata.merge_metadata(parent, child)
|
|
expected = {'project': 'Test', 'version': '1.1',
|
|
'author': 'Parent', 'experiment': 'A'}
|
|
assert merged == expected
|
|
|
|
|
|
def test_merge_metadata_empty_parent():
|
|
parent = {}
|
|
child = {'experiment': 'A', 'version': '1.1'}
|
|
merged = metadata.merge_metadata(parent, child)
|
|
assert merged == child
|
|
|
|
|
|
def test_merge_metadata_empty_child():
|
|
parent = {'project': 'Test', 'version': '1.0'}
|
|
child = {}
|
|
merged = metadata.merge_metadata(parent, child)
|
|
assert merged == parent
|
|
|
|
|
|
def test_resolve_metadata_for_plot_with_specific_yaml(tmp_path):
|
|
# Create plot-specific metadata file
|
|
plot_path = tmp_path / 'test_plot.pdf'
|
|
plot_metadata_path = tmp_path / 'test_plot.yaml'
|
|
plot_metadata = {'specific': 'plot_data', 'override': 'plot_value'}
|
|
plot_metadata_path.write_text(yaml.dump(plot_metadata))
|
|
|
|
inherited = {'general': 'data', 'override': 'inherited_value'}
|
|
result = metadata.resolve_metadata_for_plot(plot_path, inherited)
|
|
|
|
expected = {'general': 'data',
|
|
'override': 'plot_value', 'specific': 'plot_data'}
|
|
assert result == expected
|
|
|
|
|
|
def test_resolve_metadata_for_plot_with_specific_json(tmp_path):
|
|
plot_path = tmp_path / 'test_plot.pdf'
|
|
plot_metadata_path = tmp_path / 'test_plot.json'
|
|
plot_metadata = {'specific': 'plot_data_json'}
|
|
plot_metadata_path.write_text(json.dumps(plot_metadata))
|
|
|
|
inherited = {'general': 'data'}
|
|
result = metadata.resolve_metadata_for_plot(plot_path, inherited)
|
|
|
|
expected = {'general': 'data', 'specific': 'plot_data_json'}
|
|
assert result == expected
|
|
|
|
|
|
def test_resolve_metadata_for_plot_no_specific(tmp_path):
|
|
plot_path = tmp_path / 'test_plot.pdf'
|
|
inherited = {'general': 'data', 'inherited': 'value'}
|
|
result = metadata.resolve_metadata_for_plot(plot_path, inherited)
|
|
|
|
# Should return copy of inherited metadata
|
|
assert result == inherited
|
|
assert result is not inherited # Should be a copy
|
|
|
|
|
|
def test_save_metadata_cache(tmp_path):
|
|
cache_data = {
|
|
'plot1': {'title': 'Plot 1', 'author': 'Test'},
|
|
'plot2': {'title': 'Plot 2', 'experiment': 'B'}
|
|
}
|
|
|
|
metadata.save_metadata_cache(tmp_path, cache_data)
|
|
|
|
cache_file = tmp_path / 'meta_cache.json'
|
|
assert cache_file.exists()
|
|
|
|
with cache_file.open('r') as f:
|
|
loaded_data = json.load(f)
|
|
|
|
assert loaded_data == cache_data
|
|
|
|
|
|
def test_save_metadata_cache_empty(tmp_path):
|
|
cache_data = {}
|
|
metadata.save_metadata_cache(tmp_path, cache_data)
|
|
|
|
cache_file = tmp_path / 'meta_cache.json'
|
|
assert cache_file.exists()
|
|
|
|
with cache_file.open('r') as f:
|
|
loaded_data = json.load(f)
|
|
|
|
assert loaded_data == {}
|