Files
obsidian-metadata/tests/metadata_test.py
Nathaniel Landau 2e61a92ad1 feat: greatly improve capturing all formats of inline metadata (#41)
feat: greatly improve capturing metadata all formats of inline metadata
2023-05-05 13:09:59 -04:00

210 lines
6.1 KiB
Python

# type: ignore
"""Test the InlineField class."""
import pytest
from obsidian_metadata.models.enums import MetadataType, Wrapping
from obsidian_metadata.models.metadata import InlineField, dict_to_yaml
def test_dict_to_yaml_1():
"""Test dict_to_yaml() function.
GIVEN a dictionary
WHEN values contain lists
THEN confirm the output is not sorted
"""
test_dict = {"k2": ["v1", "v2"], "k1": ["v1", "v2"]}
assert dict_to_yaml(test_dict) == "k2:\n - v1\n - v2\nk1:\n - v1\n - v2\n"
def test_dict_to_yaml_2():
"""Test dict_to_yaml() function.
GIVEN a dictionary
WHEN values contain lists and sort_keys is True
THEN confirm the output is sorted
"""
test_dict = {"k2": ["v1", "v2"], "k1": ["v1", "v2"]}
assert dict_to_yaml(test_dict, sort_keys=True) == "k1:\n - v1\n - v2\nk2:\n - v1\n - v2\n"
def test_dict_to_yaml_3():
"""Test dict_to_yaml() function.
GIVEN a dictionary
WHEN values contain a list with a single value
THEN confirm single-value lists are converted to strings
"""
test_dict = {"k2": ["v1"], "k1": ["v1", "v2"]}
assert dict_to_yaml(test_dict, sort_keys=True) == "k1:\n - v1\n - v2\nk2: v1\n"
def test_init_1():
"""Test creating an InlineField object.
GIVEN an inline tag
WHEN an InlineField object is created
THEN confirm the object's attributes match the expected values
"""
obj = InlineField(
meta_type=MetadataType.TAGS,
key=None,
value="tag1",
)
assert obj.meta_type == MetadataType.TAGS
assert obj.key is None
assert obj.value == "tag1"
assert obj.normalized_value == "tag1"
assert obj.wrapping == Wrapping.NONE
assert obj.clean_key is None
assert obj.normalized_key is None
assert not obj.key_open
assert not obj.key_close
assert obj.is_changed is False
def test_init_2():
"""Test creating an InlineField object.
GIVEN an inline key/value pair
WHEN an InlineField object is created
THEN confirm the object's attributes match the expected values
"""
obj = InlineField(meta_type=MetadataType.INLINE, key="key", value="value")
assert obj.meta_type == MetadataType.INLINE
assert obj.key == "key"
assert obj.value == "value"
assert obj.normalized_value == "value"
assert obj.wrapping == Wrapping.NONE
assert obj.clean_key == "key"
assert obj.normalized_key == "key"
assert not obj.key_open
assert not obj.key_close
assert obj.is_changed is False
obj = InlineField(
meta_type=MetadataType.INLINE,
key="key",
value="value",
wrapping=Wrapping.PARENS,
)
assert obj.meta_type == MetadataType.INLINE
assert obj.key == "key"
assert obj.value == "value"
assert obj.normalized_value == "value"
assert obj.wrapping == Wrapping.PARENS
assert obj.clean_key == "key"
assert obj.normalized_key == "key"
assert not obj.key_open
assert not obj.key_close
assert obj.is_changed is False
obj = InlineField(
meta_type=MetadataType.INLINE,
key="**key**",
value="value",
wrapping=Wrapping.BRACKETS,
)
assert obj.meta_type == MetadataType.INLINE
assert obj.key == "**key**"
assert obj.value == "value"
assert obj.normalized_value == "value"
assert obj.wrapping == Wrapping.BRACKETS
assert obj.clean_key == "key"
assert obj.normalized_key == "key"
assert obj.key_open == "**"
assert obj.key_close == "**"
assert obj.is_changed is False
@pytest.mark.parametrize(
(
"original",
"cleaned",
"normalized",
"key_open",
"key_close",
),
[
("foo", "foo", "foo", "", ""),
("🌱/🌿", "🌱/🌿", "🌱/🌿", "", ""),
("FOO 1", "FOO 1", "foo-1", "", ""),
("**key foo**", "key foo", "key-foo", "**", "**"),
("## KEY", "KEY", "key", "## ", ""),
],
)
def test_init_3(original, cleaned, normalized, key_open, key_close):
"""Test creating an InlineField object.
GIVEN an InlineField object is created
WHEN the key needs to be normalized
THEN confirm clean_key() returns the expected value
"""
obj = InlineField(meta_type=MetadataType.INLINE, key=original, value="value")
assert obj.clean_key == cleaned
assert obj.normalized_key == normalized
assert obj.key_open == key_open
assert obj.key_close == key_close
@pytest.mark.parametrize(
("original", "normalized"),
[("foo", "foo"), ("🌱/🌿", "🌱/🌿"), (" value ", "value"), (" ", "-"), ("", "-")],
)
def test_init_4(original, normalized):
"""Test creating an InlineField object.
GIVEN an InlineField object is created
WHEN the value needs to be normalized
THEN create the normalized_value attribute
"""
obj = InlineField(meta_type=MetadataType.INLINE, key="key", value=original)
assert obj.value == original
assert obj.normalized_value == normalized
def test_inline_field_init_5():
"""Test updating the is_changed attribute.
GIVEN creating an object
WHEN is_changed set to True at init
THEN confirm is_changed is True
"""
obj = InlineField(meta_type=MetadataType.TAGS, key="key", value="tag1", is_changed=True)
assert obj.is_changed is True
def test_inline_field_init_6():
"""Test updating the is_changed attribute.
GIVEN creating an object
WHEN is_changed set to True at after init
THEN confirm is_changed is True
"""
obj = InlineField(meta_type=MetadataType.TAGS, key="key", value="tag1", is_changed=False)
assert obj.is_changed is False
obj.is_changed = True
assert obj.is_changed is True
def test_inline_field_init_4():
"""Test updating the is_changed attribute.
GIVEN creating an object
WHEN key_open and key_close are set after init
THEN confirm they are set correctly
"""
obj = InlineField(
meta_type=MetadataType.INLINE,
key="_key_",
value="value",
is_changed=False,
)
assert obj.key_open == "_"
assert obj.key_close == "_"
obj.key_open = "**"
obj.key_close = "**"
assert obj.key_open == "**"
assert obj.key_close == "**"