mirror of
https://github.com/natelandau/obsidian-metadata.git
synced 2025-11-08 13:13:47 -05:00
875 lines
31 KiB
Python
875 lines
31 KiB
Python
# type: ignore
|
|
"""Test metadata.py."""
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from obsidian_metadata.models.enums import MetadataType
|
|
from obsidian_metadata.models.metadata import (
|
|
Frontmatter,
|
|
InlineMetadata,
|
|
InlineTags,
|
|
VaultMetadata,
|
|
)
|
|
from tests.helpers import Regex, remove_ansi
|
|
|
|
FILE_CONTENT: str = Path("tests/fixtures/test_vault/test1.md").read_text()
|
|
TAG_LIST: list[str] = ["tag 1", "tag 2", "tag 3"]
|
|
METADATA: dict[str, list[str]] = {
|
|
"frontmatter_Key1": ["author name"],
|
|
"frontmatter_Key2": ["note", "article"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"shared_key2": ["shared_key2_value"],
|
|
"tags": ["tag 2", "tag 1", "tag 3"],
|
|
"top_key1": ["top_key1_value"],
|
|
"top_key2": ["top_key2_value"],
|
|
"top_key3": ["top_key3_value"],
|
|
"intext_key": ["intext_key_value"],
|
|
}
|
|
METADATA_2: dict[str, list[str]] = {"key1": ["value1"], "key2": ["value2", "value3"]}
|
|
FRONTMATTER_CONTENT: str = """
|
|
---
|
|
tags:
|
|
- tag_1
|
|
- tag_2
|
|
-
|
|
- 📅/tag_3
|
|
frontmatter_Key1: "frontmatter_Key1_value"
|
|
frontmatter_Key2: ["note", "article"]
|
|
shared_key1: "shared_key1_value"
|
|
---
|
|
more content
|
|
|
|
---
|
|
horizontal: rule
|
|
---
|
|
"""
|
|
INLINE_CONTENT = """\
|
|
repeated_key:: repeated_key_value1
|
|
#inline_tag_top1,#inline_tag_top2
|
|
**bold_key1**:: bold_key1_value
|
|
**bold_key2:: bold_key2_value**
|
|
link_key:: [[link_key_value]]
|
|
tag_key:: #tag_key_value
|
|
emoji_📅_key:: emoji_📅_key_value
|
|
**#bold_tag**
|
|
|
|
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. [in_text_key1:: in_text_key1_value] Ut enim ad minim veniam, quis nostrud exercitation [in_text_key2:: in_text_key2_value] ullamco laboris nisi ut aliquip ex ea commodo consequat. #in_text_tag Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
|
|
|
```python
|
|
#ffffff
|
|
# This is sample text [no_key:: value]with tags and metadata
|
|
#in_codeblock_tag1
|
|
#ffffff;
|
|
in_codeblock_key:: in_codeblock_value
|
|
The quick brown fox jumped over the #in_codeblock_tag2
|
|
```
|
|
repeated_key:: repeated_key_value2
|
|
"""
|
|
|
|
|
|
def test_frontmatter_create_1() -> None:
|
|
"""Test frontmatter creation.
|
|
|
|
GIVEN valid frontmatter content
|
|
WHEN a Frontmatter object is created
|
|
THEN parse the YAML frontmatter and add it to the object
|
|
"""
|
|
frontmatter = Frontmatter(INLINE_CONTENT)
|
|
assert frontmatter.dict == {}
|
|
|
|
frontmatter = Frontmatter(FRONTMATTER_CONTENT)
|
|
assert frontmatter.dict == {
|
|
"frontmatter_Key1": ["frontmatter_Key1_value"],
|
|
"frontmatter_Key2": ["article", "note"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"tags": ["tag_1", "tag_2", "📅/tag_3"],
|
|
}
|
|
assert frontmatter.dict_original == {
|
|
"frontmatter_Key1": ["frontmatter_Key1_value"],
|
|
"frontmatter_Key2": ["article", "note"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"tags": ["tag_1", "tag_2", "📅/tag_3"],
|
|
}
|
|
|
|
|
|
def test_frontmatter_create_2() -> None:
|
|
"""Test frontmatter creation error.
|
|
|
|
GIVEN invalid frontmatter content
|
|
WHEN a Frontmatter object is created
|
|
THEN raise ValueError
|
|
"""
|
|
fn = """---
|
|
tags: tag
|
|
invalid = = "content"
|
|
---
|
|
"""
|
|
with pytest.raises(AttributeError):
|
|
Frontmatter(fn)
|
|
|
|
|
|
def test_frontmatter_create_3():
|
|
"""Test frontmatter creation error.
|
|
|
|
GIVEN empty frontmatter content
|
|
WHEN a Frontmatter object is created
|
|
THEN set the dict to an empty dict
|
|
"""
|
|
content = "---\n\n---"
|
|
frontmatter = Frontmatter(content)
|
|
assert frontmatter.dict == {}
|
|
|
|
|
|
def test_frontmatter_create_4():
|
|
"""Test frontmatter creation error.
|
|
|
|
GIVEN empty frontmatter content with a yaml marker
|
|
WHEN a Frontmatter object is created
|
|
THEN set the dict to an empty dict
|
|
"""
|
|
content = "---\n-\n---"
|
|
frontmatter = Frontmatter(content)
|
|
assert frontmatter.dict == {}
|
|
|
|
|
|
def test_frontmatter_contains_1():
|
|
"""Test frontmatter contains() method.
|
|
|
|
GIVEN a Frontmatter object
|
|
WHEN the contains() method is called with a key
|
|
THEN return True if the key is found
|
|
"""
|
|
frontmatter = Frontmatter(FRONTMATTER_CONTENT)
|
|
assert frontmatter.contains("frontmatter_Key1") is True
|
|
|
|
|
|
def test_frontmatter_contains_2():
|
|
"""Test frontmatter contains() method.
|
|
|
|
GIVEN a Frontmatter object
|
|
WHEN the contains() method is called with a key
|
|
THEN return False if the key is not found
|
|
"""
|
|
frontmatter = Frontmatter(FRONTMATTER_CONTENT)
|
|
assert frontmatter.contains("no_key") is False
|
|
|
|
|
|
def test_frontmatter_contains_3():
|
|
"""Test frontmatter contains() method.
|
|
|
|
GIVEN a Frontmatter object
|
|
WHEN the contains() method is called with a key and a value
|
|
THEN return True if the key and value is found
|
|
"""
|
|
frontmatter = Frontmatter(FRONTMATTER_CONTENT)
|
|
assert frontmatter.contains("frontmatter_Key2", "article") is True
|
|
|
|
|
|
def test_frontmatter_contains_4():
|
|
"""Test frontmatter contains() method.
|
|
|
|
GIVEN a Frontmatter object
|
|
WHEN the contains() method is called with a key and a value
|
|
THEN return False if the key and value is not found
|
|
"""
|
|
frontmatter = Frontmatter(FRONTMATTER_CONTENT)
|
|
assert frontmatter.contains("frontmatter_Key2", "no value") is False
|
|
|
|
|
|
def test_frontmatter_contains_5():
|
|
"""Test frontmatter contains() method.
|
|
|
|
GIVEN a Frontmatter object
|
|
WHEN the contains() method is called with a key regex
|
|
THEN return True if a key matches the regex
|
|
"""
|
|
frontmatter = Frontmatter(FRONTMATTER_CONTENT)
|
|
assert frontmatter.contains(r"\d$", is_regex=True) is True
|
|
|
|
|
|
def test_frontmatter_contains_6():
|
|
"""Test frontmatter contains() method.
|
|
|
|
GIVEN a Frontmatter object
|
|
WHEN the contains() method is called with a key regex
|
|
THEN return False if no key matches the regex
|
|
"""
|
|
frontmatter = Frontmatter(FRONTMATTER_CONTENT)
|
|
assert frontmatter.contains(r"^\d", is_regex=True) is False
|
|
|
|
|
|
def test_frontmatter_contains_7():
|
|
"""Test frontmatter contains() method.
|
|
|
|
GIVEN a Frontmatter object
|
|
WHEN the contains() method is called with a key and value regex
|
|
THEN return True if a value matches the regex
|
|
"""
|
|
frontmatter = Frontmatter(FRONTMATTER_CONTENT)
|
|
assert frontmatter.contains("key", r"\w\d_", is_regex=True) is True
|
|
|
|
|
|
def test_frontmatter_contains_8():
|
|
"""Test frontmatter contains() method.
|
|
|
|
GIVEN a Frontmatter object
|
|
WHEN the contains() method is called with a key and value regex
|
|
THEN return False if a value does not match the regex
|
|
"""
|
|
frontmatter = Frontmatter(FRONTMATTER_CONTENT)
|
|
assert frontmatter.contains("key", r"_\d", is_regex=True) is False
|
|
|
|
|
|
def test_frontmatter_add() -> None:
|
|
"""Test frontmatter add."""
|
|
frontmatter = Frontmatter(FRONTMATTER_CONTENT)
|
|
|
|
assert frontmatter.add("frontmatter_Key1") is False
|
|
assert frontmatter.add("added_key") is True
|
|
assert frontmatter.dict == {
|
|
"added_key": [],
|
|
"frontmatter_Key1": ["frontmatter_Key1_value"],
|
|
"frontmatter_Key2": ["article", "note"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"tags": ["tag_1", "tag_2", "📅/tag_3"],
|
|
}
|
|
|
|
assert frontmatter.add("added_key", "added_value") is True
|
|
assert frontmatter.dict == {
|
|
"added_key": ["added_value"],
|
|
"frontmatter_Key1": ["frontmatter_Key1_value"],
|
|
"frontmatter_Key2": ["article", "note"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"tags": ["tag_1", "tag_2", "📅/tag_3"],
|
|
}
|
|
|
|
assert frontmatter.add("added_key", "added_value_2") is True
|
|
assert frontmatter.dict == {
|
|
"added_key": ["added_value", "added_value_2"],
|
|
"frontmatter_Key1": ["frontmatter_Key1_value"],
|
|
"frontmatter_Key2": ["article", "note"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"tags": ["tag_1", "tag_2", "📅/tag_3"],
|
|
}
|
|
|
|
assert frontmatter.add("added_key", ["added_value_3", "added_value_4"]) is True
|
|
assert frontmatter.dict == {
|
|
"added_key": ["added_value", "added_value_2", "added_value_3", "added_value_4"],
|
|
"frontmatter_Key1": ["frontmatter_Key1_value"],
|
|
"frontmatter_Key2": ["article", "note"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"tags": ["tag_1", "tag_2", "📅/tag_3"],
|
|
}
|
|
|
|
assert frontmatter.add("added_key2", ["added_value_1", "added_value_2"]) is True
|
|
assert frontmatter.dict == {
|
|
"added_key": ["added_value", "added_value_2", "added_value_3", "added_value_4"],
|
|
"added_key2": ["added_value_1", "added_value_2"],
|
|
"frontmatter_Key1": ["frontmatter_Key1_value"],
|
|
"frontmatter_Key2": ["article", "note"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"tags": ["tag_1", "tag_2", "📅/tag_3"],
|
|
}
|
|
|
|
assert frontmatter.add("added_key3", "added_value_1") is True
|
|
assert frontmatter.dict == {
|
|
"added_key": ["added_value", "added_value_2", "added_value_3", "added_value_4"],
|
|
"added_key2": ["added_value_1", "added_value_2"],
|
|
"added_key3": ["added_value_1"],
|
|
"frontmatter_Key1": ["frontmatter_Key1_value"],
|
|
"frontmatter_Key2": ["article", "note"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"tags": ["tag_1", "tag_2", "📅/tag_3"],
|
|
}
|
|
|
|
assert frontmatter.add("added_key3", "added_value_1") is False
|
|
|
|
|
|
def test_frontmatter_rename() -> None:
|
|
"""Test frontmatter rename."""
|
|
frontmatter = Frontmatter(FRONTMATTER_CONTENT)
|
|
assert frontmatter.dict == {
|
|
"frontmatter_Key1": ["frontmatter_Key1_value"],
|
|
"frontmatter_Key2": ["article", "note"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"tags": ["tag_1", "tag_2", "📅/tag_3"],
|
|
}
|
|
|
|
assert frontmatter.rename("no key", "new key") is False
|
|
assert frontmatter.rename("tags", "no tag", "new key") is False
|
|
|
|
assert frontmatter.has_changes() is False
|
|
assert frontmatter.rename("tags", "tag_2", "new tag") is True
|
|
|
|
assert frontmatter.dict["tags"] == ["new tag", "tag_1", "📅/tag_3"]
|
|
assert frontmatter.rename("tags", "old_tags") is True
|
|
assert frontmatter.dict["old_tags"] == ["new tag", "tag_1", "📅/tag_3"]
|
|
assert "tags" not in frontmatter.dict
|
|
|
|
assert frontmatter.has_changes() is True
|
|
|
|
|
|
def test_frontmatter_delete() -> None:
|
|
"""Test Frontmatter delete method."""
|
|
frontmatter = Frontmatter(FRONTMATTER_CONTENT)
|
|
assert frontmatter.dict == {
|
|
"frontmatter_Key1": ["frontmatter_Key1_value"],
|
|
"frontmatter_Key2": ["article", "note"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"tags": ["tag_1", "tag_2", "📅/tag_3"],
|
|
}
|
|
|
|
assert frontmatter.delete("no key") is False
|
|
assert frontmatter.delete("tags", "no value") is False
|
|
assert frontmatter.delete(r"\d{3}") is False
|
|
assert frontmatter.has_changes() is False
|
|
assert frontmatter.delete("tags", "tag_2") is True
|
|
assert frontmatter.dict["tags"] == ["tag_1", "📅/tag_3"]
|
|
assert frontmatter.delete("tags") is True
|
|
assert "tags" not in frontmatter.dict
|
|
assert frontmatter.has_changes() is True
|
|
assert frontmatter.delete("shared_key1", r"\w+") is True
|
|
assert frontmatter.dict["shared_key1"] == []
|
|
assert frontmatter.delete(r"\w.tter") is True
|
|
assert frontmatter.dict == {"shared_key1": []}
|
|
|
|
|
|
def test_frontmatter_delete_all():
|
|
"""Test Frontmatter delete_all method.
|
|
|
|
GIVEN Frontmatter with multiple keys
|
|
WHEN delete_all is called
|
|
THEN all keys and values are deleted
|
|
"""
|
|
frontmatter = Frontmatter(FRONTMATTER_CONTENT)
|
|
frontmatter.delete_all()
|
|
assert frontmatter.dict == {}
|
|
|
|
|
|
def test_frontmatter_yaml_conversion():
|
|
"""Test Frontmatter to_yaml method."""
|
|
new_frontmatter: str = """\
|
|
tags:
|
|
- tag_1
|
|
- tag_2
|
|
- 📅/tag_3
|
|
frontmatter_Key1: frontmatter_Key1_value
|
|
frontmatter_Key2:
|
|
- article
|
|
- note
|
|
shared_key1: shared_key1_value
|
|
"""
|
|
new_frontmatter_sorted: str = """\
|
|
frontmatter_Key1: frontmatter_Key1_value
|
|
frontmatter_Key2:
|
|
- article
|
|
- note
|
|
shared_key1: shared_key1_value
|
|
tags:
|
|
- tag_1
|
|
- tag_2
|
|
- 📅/tag_3
|
|
"""
|
|
frontmatter = Frontmatter(FRONTMATTER_CONTENT)
|
|
assert frontmatter.to_yaml() == new_frontmatter
|
|
assert frontmatter.to_yaml(sort_keys=True) == new_frontmatter_sorted
|
|
|
|
|
|
def test_inline_metadata_add() -> None:
|
|
"""Test inline add."""
|
|
inline = InlineMetadata(INLINE_CONTENT)
|
|
|
|
assert inline.add("bold_key1") is False
|
|
assert inline.add("bold_key1", "bold_key1_value") is False
|
|
assert inline.add("added_key") is True
|
|
assert inline.dict == {
|
|
"added_key": [],
|
|
"bold_key1": ["bold_key1_value"],
|
|
"bold_key2": ["bold_key2_value"],
|
|
"emoji_📅_key": ["emoji_📅_key_value"],
|
|
"in_text_key1": ["in_text_key1_value"],
|
|
"in_text_key2": ["in_text_key2_value"],
|
|
"link_key": ["link_key_value"],
|
|
"repeated_key": ["repeated_key_value1", "repeated_key_value2"],
|
|
"tag_key": ["tag_key_value"],
|
|
}
|
|
|
|
assert inline.add("added_key1", "added_value") is True
|
|
assert inline.dict == {
|
|
"added_key": [],
|
|
"added_key1": ["added_value"],
|
|
"bold_key1": ["bold_key1_value"],
|
|
"bold_key2": ["bold_key2_value"],
|
|
"emoji_📅_key": ["emoji_📅_key_value"],
|
|
"in_text_key1": ["in_text_key1_value"],
|
|
"in_text_key2": ["in_text_key2_value"],
|
|
"link_key": ["link_key_value"],
|
|
"repeated_key": ["repeated_key_value1", "repeated_key_value2"],
|
|
"tag_key": ["tag_key_value"],
|
|
}
|
|
|
|
assert inline.dict == {
|
|
"added_key": [],
|
|
"added_key1": ["added_value"],
|
|
"bold_key1": ["bold_key1_value"],
|
|
"bold_key2": ["bold_key2_value"],
|
|
"emoji_📅_key": ["emoji_📅_key_value"],
|
|
"in_text_key1": ["in_text_key1_value"],
|
|
"in_text_key2": ["in_text_key2_value"],
|
|
"link_key": ["link_key_value"],
|
|
"repeated_key": ["repeated_key_value1", "repeated_key_value2"],
|
|
"tag_key": ["tag_key_value"],
|
|
}
|
|
|
|
assert inline.add("added_key", "added_value")
|
|
assert inline.dict == {
|
|
"added_key": ["added_value"],
|
|
"added_key1": ["added_value"],
|
|
"bold_key1": ["bold_key1_value"],
|
|
"bold_key2": ["bold_key2_value"],
|
|
"emoji_📅_key": ["emoji_📅_key_value"],
|
|
"in_text_key1": ["in_text_key1_value"],
|
|
"in_text_key2": ["in_text_key2_value"],
|
|
"link_key": ["link_key_value"],
|
|
"repeated_key": ["repeated_key_value1", "repeated_key_value2"],
|
|
"tag_key": ["tag_key_value"],
|
|
}
|
|
assert inline.add("repeated_key", "repeated_key_value1") is False
|
|
assert inline.add("repeated_key", "new_value") is True
|
|
|
|
|
|
def test_inline_metadata_contains() -> None:
|
|
"""Test inline metadata contains method."""
|
|
inline = InlineMetadata(INLINE_CONTENT)
|
|
|
|
assert inline.contains("bold_key1") is True
|
|
assert inline.contains("bold_key2", "bold_key2_value") is True
|
|
assert inline.contains("bold_key3") is False
|
|
assert inline.contains("bold_key2", "no value") is False
|
|
|
|
assert inline.contains(r"\w{4}_key", is_regex=True) is True
|
|
assert inline.contains(r"^\d", is_regex=True) is False
|
|
assert inline.contains("1$", r"\d_value", is_regex=True) is True
|
|
assert inline.contains("key", r"^\d_value", is_regex=True) is False
|
|
|
|
|
|
def test_inline_metadata_create() -> None:
|
|
"""Test inline metadata creation."""
|
|
inline = InlineMetadata(FRONTMATTER_CONTENT)
|
|
assert inline.dict == {}
|
|
inline = InlineMetadata(INLINE_CONTENT)
|
|
assert inline.dict == {
|
|
"bold_key1": ["bold_key1_value"],
|
|
"bold_key2": ["bold_key2_value"],
|
|
"emoji_📅_key": ["emoji_📅_key_value"],
|
|
"in_text_key1": ["in_text_key1_value"],
|
|
"in_text_key2": ["in_text_key2_value"],
|
|
"link_key": ["link_key_value"],
|
|
"repeated_key": ["repeated_key_value1", "repeated_key_value2"],
|
|
"tag_key": ["tag_key_value"],
|
|
}
|
|
assert inline.dict_original == {
|
|
"bold_key1": ["bold_key1_value"],
|
|
"bold_key2": ["bold_key2_value"],
|
|
"emoji_📅_key": ["emoji_📅_key_value"],
|
|
"in_text_key1": ["in_text_key1_value"],
|
|
"in_text_key2": ["in_text_key2_value"],
|
|
"link_key": ["link_key_value"],
|
|
"repeated_key": ["repeated_key_value1", "repeated_key_value2"],
|
|
"tag_key": ["tag_key_value"],
|
|
}
|
|
|
|
|
|
def test_inline_metadata_delete() -> None:
|
|
"""Test inline metadata delete."""
|
|
inline = InlineMetadata(INLINE_CONTENT)
|
|
assert inline.dict == {
|
|
"bold_key1": ["bold_key1_value"],
|
|
"bold_key2": ["bold_key2_value"],
|
|
"emoji_📅_key": ["emoji_📅_key_value"],
|
|
"in_text_key1": ["in_text_key1_value"],
|
|
"in_text_key2": ["in_text_key2_value"],
|
|
"link_key": ["link_key_value"],
|
|
"repeated_key": ["repeated_key_value1", "repeated_key_value2"],
|
|
"tag_key": ["tag_key_value"],
|
|
}
|
|
|
|
assert inline.delete("no key") is False
|
|
assert inline.delete("repeated_key", "no value") is False
|
|
assert inline.has_changes() is False
|
|
assert inline.delete("repeated_key", "repeated_key_value1") is True
|
|
assert inline.dict["repeated_key"] == ["repeated_key_value2"]
|
|
assert inline.delete("repeated_key") is True
|
|
assert "repeated_key" not in inline.dict
|
|
assert inline.has_changes() is True
|
|
assert inline.delete(r"\d{3}") is False
|
|
assert inline.delete(r"bold_key\d") is True
|
|
assert inline.dict == {
|
|
"emoji_📅_key": ["emoji_📅_key_value"],
|
|
"in_text_key1": ["in_text_key1_value"],
|
|
"in_text_key2": ["in_text_key2_value"],
|
|
"link_key": ["link_key_value"],
|
|
"tag_key": ["tag_key_value"],
|
|
}
|
|
assert inline.delete("emoji_📅_key", ".*📅.*") is True
|
|
assert inline.dict == {
|
|
"emoji_📅_key": [],
|
|
"in_text_key1": ["in_text_key1_value"],
|
|
"in_text_key2": ["in_text_key2_value"],
|
|
"link_key": ["link_key_value"],
|
|
"tag_key": ["tag_key_value"],
|
|
}
|
|
|
|
|
|
def test_inline_metadata_rename() -> None:
|
|
"""Test inline metadata rename."""
|
|
inline = InlineMetadata(INLINE_CONTENT)
|
|
assert inline.dict == {
|
|
"bold_key1": ["bold_key1_value"],
|
|
"bold_key2": ["bold_key2_value"],
|
|
"emoji_📅_key": ["emoji_📅_key_value"],
|
|
"in_text_key1": ["in_text_key1_value"],
|
|
"in_text_key2": ["in_text_key2_value"],
|
|
"link_key": ["link_key_value"],
|
|
"repeated_key": ["repeated_key_value1", "repeated_key_value2"],
|
|
"tag_key": ["tag_key_value"],
|
|
}
|
|
|
|
assert inline.rename("no key", "new key") is False
|
|
assert inline.rename("repeated_key", "no value", "new key") is False
|
|
assert inline.has_changes() is False
|
|
assert inline.rename("repeated_key", "repeated_key_value1", "new value") is True
|
|
assert inline.dict["repeated_key"] == ["new value", "repeated_key_value2"]
|
|
assert inline.rename("repeated_key", "old_key") is True
|
|
assert inline.dict["old_key"] == ["new value", "repeated_key_value2"]
|
|
assert "repeated_key" not in inline.dict
|
|
assert inline.has_changes() is True
|
|
|
|
|
|
def test_inline_tags_add() -> None:
|
|
"""Test inline tags add."""
|
|
tags = InlineTags(INLINE_CONTENT)
|
|
|
|
assert tags.add("bold_tag") is False
|
|
assert tags.add("new_tag") is True
|
|
assert tags.list == [
|
|
"bold_tag",
|
|
"in_text_tag",
|
|
"inline_tag_top1",
|
|
"inline_tag_top2",
|
|
"new_tag",
|
|
"tag_key_value",
|
|
]
|
|
|
|
|
|
def test_inline_tags_contains() -> None:
|
|
"""Test inline tags contains."""
|
|
tags = InlineTags(INLINE_CONTENT)
|
|
assert tags.contains("bold_tag") is True
|
|
assert tags.contains("no tag") is False
|
|
|
|
assert tags.contains(r"\w_\w", is_regex=True) is True
|
|
assert tags.contains(r"\d_\d", is_regex=True) is False
|
|
|
|
|
|
def test_inline_tags_create() -> None:
|
|
"""Test inline tags creation."""
|
|
tags = InlineTags(FRONTMATTER_CONTENT)
|
|
tags.metadata_key
|
|
assert tags.list == []
|
|
|
|
tags = InlineTags(INLINE_CONTENT)
|
|
assert tags.list == [
|
|
"bold_tag",
|
|
"in_text_tag",
|
|
"inline_tag_top1",
|
|
"inline_tag_top2",
|
|
"tag_key_value",
|
|
]
|
|
assert tags.list_original == [
|
|
"bold_tag",
|
|
"in_text_tag",
|
|
"inline_tag_top1",
|
|
"inline_tag_top2",
|
|
"tag_key_value",
|
|
]
|
|
|
|
|
|
def test_inline_tags_delete() -> None:
|
|
"""Test inline tags delete."""
|
|
tags = InlineTags(INLINE_CONTENT)
|
|
assert tags.list == [
|
|
"bold_tag",
|
|
"in_text_tag",
|
|
"inline_tag_top1",
|
|
"inline_tag_top2",
|
|
"tag_key_value",
|
|
]
|
|
|
|
assert tags.delete("no tag") is False
|
|
assert tags.has_changes() is False
|
|
assert tags.delete("bold_tag") is True
|
|
assert tags.list == [
|
|
"in_text_tag",
|
|
"inline_tag_top1",
|
|
"inline_tag_top2",
|
|
"tag_key_value",
|
|
]
|
|
assert tags.has_changes() is True
|
|
assert tags.delete(r"\d{3}") is False
|
|
assert tags.delete(r"inline_tag_top\d") is True
|
|
assert tags.list == ["in_text_tag", "tag_key_value"]
|
|
|
|
|
|
def test_inline_tags_rename() -> None:
|
|
"""Test inline tags rename."""
|
|
tags = InlineTags(INLINE_CONTENT)
|
|
assert tags.list == [
|
|
"bold_tag",
|
|
"in_text_tag",
|
|
"inline_tag_top1",
|
|
"inline_tag_top2",
|
|
"tag_key_value",
|
|
]
|
|
|
|
assert tags.rename("no tag", "new tag") is False
|
|
assert tags.has_changes() is False
|
|
assert tags.rename("bold_tag", "new tag") is True
|
|
assert tags.list == [
|
|
"in_text_tag",
|
|
"inline_tag_top1",
|
|
"inline_tag_top2",
|
|
"new tag",
|
|
"tag_key_value",
|
|
]
|
|
assert tags.has_changes() is True
|
|
|
|
|
|
def test_vault_metadata() -> None:
|
|
"""Test VaultMetadata class."""
|
|
vm = VaultMetadata()
|
|
assert vm.dict == {}
|
|
|
|
vm.index_metadata(area=MetadataType.FRONTMATTER, metadata=METADATA)
|
|
vm.index_metadata(area=MetadataType.INLINE, metadata=METADATA_2)
|
|
vm.index_metadata(area=MetadataType.TAGS, metadata=TAG_LIST)
|
|
assert vm.dict == {
|
|
"frontmatter_Key1": ["author name"],
|
|
"frontmatter_Key2": ["article", "note"],
|
|
"intext_key": ["intext_key_value"],
|
|
"key1": ["value1"],
|
|
"key2": ["value2", "value3"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"shared_key2": ["shared_key2_value"],
|
|
"tags": ["tag 1", "tag 2", "tag 3"],
|
|
"top_key1": ["top_key1_value"],
|
|
"top_key2": ["top_key2_value"],
|
|
"top_key3": ["top_key3_value"],
|
|
}
|
|
assert vm.frontmatter == {
|
|
"frontmatter_Key1": ["author name"],
|
|
"frontmatter_Key2": ["article", "note"],
|
|
"intext_key": ["intext_key_value"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"shared_key2": ["shared_key2_value"],
|
|
"tags": ["tag 1", "tag 2", "tag 3"],
|
|
"top_key1": ["top_key1_value"],
|
|
"top_key2": ["top_key2_value"],
|
|
"top_key3": ["top_key3_value"],
|
|
}
|
|
assert vm.inline_metadata == {"key1": ["value1"], "key2": ["value2", "value3"]}
|
|
assert vm.tags == ["tag 1", "tag 2", "tag 3"]
|
|
|
|
new_metadata = {"added_key": ["added_value"], "frontmatter_Key2": ["new_value"]}
|
|
new_tags = ["tag 4", "tag 5"]
|
|
vm.index_metadata(area=MetadataType.FRONTMATTER, metadata=new_metadata)
|
|
vm.index_metadata(area=MetadataType.TAGS, metadata=new_tags)
|
|
assert vm.dict == {
|
|
"added_key": ["added_value"],
|
|
"frontmatter_Key1": ["author name"],
|
|
"frontmatter_Key2": ["article", "new_value", "note"],
|
|
"intext_key": ["intext_key_value"],
|
|
"key1": ["value1"],
|
|
"key2": ["value2", "value3"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"shared_key2": ["shared_key2_value"],
|
|
"tags": ["tag 1", "tag 2", "tag 3"],
|
|
"top_key1": ["top_key1_value"],
|
|
"top_key2": ["top_key2_value"],
|
|
"top_key3": ["top_key3_value"],
|
|
}
|
|
assert vm.frontmatter == {
|
|
"added_key": ["added_value"],
|
|
"frontmatter_Key1": ["author name"],
|
|
"frontmatter_Key2": ["article", "new_value", "note"],
|
|
"intext_key": ["intext_key_value"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"shared_key2": ["shared_key2_value"],
|
|
"tags": ["tag 1", "tag 2", "tag 3"],
|
|
"top_key1": ["top_key1_value"],
|
|
"top_key2": ["top_key2_value"],
|
|
"top_key3": ["top_key3_value"],
|
|
}
|
|
assert vm.inline_metadata == {"key1": ["value1"], "key2": ["value2", "value3"]}
|
|
assert vm.tags == ["tag 1", "tag 2", "tag 3", "tag 4", "tag 5"]
|
|
|
|
|
|
def test_vault_metadata_print(capsys) -> None:
|
|
"""Test print_metadata method."""
|
|
vm = VaultMetadata()
|
|
vm.index_metadata(area=MetadataType.FRONTMATTER, metadata=METADATA)
|
|
vm.index_metadata(area=MetadataType.INLINE, metadata=METADATA_2)
|
|
vm.index_metadata(area=MetadataType.TAGS, metadata=TAG_LIST)
|
|
|
|
vm.print_metadata(area=MetadataType.ALL)
|
|
captured = remove_ansi(capsys.readouterr().out)
|
|
assert "All metadata" in captured
|
|
assert "All inline tags" in captured
|
|
assert "┃ Keys ┃ Values ┃" in captured
|
|
assert "│ shared_key1 │ shared_key1_value │" in captured
|
|
assert captured == Regex("#tag 1 +#tag 2")
|
|
|
|
vm.print_metadata(area=MetadataType.FRONTMATTER)
|
|
captured = remove_ansi(capsys.readouterr().out)
|
|
assert "All frontmatter" in captured
|
|
assert "┃ Keys ┃ Values ┃" in captured
|
|
assert "│ shared_key1 │ shared_key1_value │" in captured
|
|
assert "value1" not in captured
|
|
|
|
vm.print_metadata(area=MetadataType.INLINE)
|
|
captured = remove_ansi(capsys.readouterr().out)
|
|
assert "All inline" in captured
|
|
assert "┃ Keys ┃ Values ┃" in captured
|
|
assert "shared_key1" not in captured
|
|
assert "│ key1 │ value1 │" in captured
|
|
|
|
vm.print_metadata(area=MetadataType.TAGS)
|
|
captured = remove_ansi(capsys.readouterr().out)
|
|
assert "All inline tags " in captured
|
|
assert "┃ Keys ┃ Values ┃" not in captured
|
|
assert captured == Regex("#tag 1 +#tag 2")
|
|
|
|
vm.print_metadata(area=MetadataType.KEYS)
|
|
captured = remove_ansi(capsys.readouterr().out)
|
|
assert "All Keys " in captured
|
|
assert "┃ Keys ┃ Values ┃" not in captured
|
|
assert captured != Regex("#tag 1 +#tag 2")
|
|
assert captured == Regex("frontmatter_Key1 +frontmatter_Key2")
|
|
|
|
|
|
def test_vault_metadata_contains() -> None:
|
|
"""Test contains method."""
|
|
vm = VaultMetadata()
|
|
vm.index_metadata(area=MetadataType.FRONTMATTER, metadata=METADATA)
|
|
vm.index_metadata(area=MetadataType.INLINE, metadata=METADATA_2)
|
|
vm.index_metadata(area=MetadataType.TAGS, metadata=TAG_LIST)
|
|
assert vm.dict == {
|
|
"frontmatter_Key1": ["author name"],
|
|
"frontmatter_Key2": ["article", "note"],
|
|
"intext_key": ["intext_key_value"],
|
|
"key1": ["value1"],
|
|
"key2": ["value2", "value3"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"shared_key2": ["shared_key2_value"],
|
|
"tags": ["tag 1", "tag 2", "tag 3"],
|
|
"top_key1": ["top_key1_value"],
|
|
"top_key2": ["top_key2_value"],
|
|
"top_key3": ["top_key3_value"],
|
|
}
|
|
assert vm.frontmatter == {
|
|
"frontmatter_Key1": ["author name"],
|
|
"frontmatter_Key2": ["article", "note"],
|
|
"intext_key": ["intext_key_value"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"shared_key2": ["shared_key2_value"],
|
|
"tags": ["tag 1", "tag 2", "tag 3"],
|
|
"top_key1": ["top_key1_value"],
|
|
"top_key2": ["top_key2_value"],
|
|
"top_key3": ["top_key3_value"],
|
|
}
|
|
assert vm.inline_metadata == {"key1": ["value1"], "key2": ["value2", "value3"]}
|
|
assert vm.tags == ["tag 1", "tag 2", "tag 3"]
|
|
|
|
with pytest.raises(ValueError):
|
|
vm.contains(area=MetadataType.ALL, value="key1")
|
|
|
|
assert vm.contains(area=MetadataType.ALL, key="no_key") is False
|
|
assert vm.contains(area=MetadataType.ALL, key="key1") is True
|
|
assert vm.contains(area=MetadataType.ALL, key="frontmatter_Key2", value="article") is True
|
|
assert vm.contains(area=MetadataType.ALL, key="frontmatter_Key2", value="none") is False
|
|
assert vm.contains(area=MetadataType.ALL, key="1$", is_regex=True) is True
|
|
assert vm.contains(area=MetadataType.ALL, key=r"\d\d", is_regex=True) is False
|
|
|
|
assert vm.contains(area=MetadataType.FRONTMATTER, key="no_key") is False
|
|
assert vm.contains(area=MetadataType.FRONTMATTER, key="frontmatter_Key1") is True
|
|
assert (
|
|
vm.contains(area=MetadataType.FRONTMATTER, key="frontmatter_Key2", value="article") is True
|
|
)
|
|
assert vm.contains(area=MetadataType.FRONTMATTER, key="frontmatter_Key2", value="none") is False
|
|
assert vm.contains(area=MetadataType.FRONTMATTER, key="1$", is_regex=True) is True
|
|
assert vm.contains(area=MetadataType.FRONTMATTER, key=r"\d\d", is_regex=True) is False
|
|
|
|
assert vm.contains(area=MetadataType.INLINE, key="no_key") is False
|
|
assert vm.contains(area=MetadataType.INLINE, key="key1") is True
|
|
assert vm.contains(area=MetadataType.INLINE, key="key2", value="value3") is True
|
|
assert vm.contains(area=MetadataType.INLINE, key="key2", value="none") is False
|
|
assert vm.contains(area=MetadataType.INLINE, key="1$", is_regex=True) is True
|
|
assert vm.contains(area=MetadataType.INLINE, key=r"\d\d", is_regex=True) is False
|
|
|
|
assert vm.contains(area=MetadataType.TAGS, value="no_tag") is False
|
|
assert vm.contains(area=MetadataType.TAGS, value="tag 1") is True
|
|
assert vm.contains(area=MetadataType.TAGS, value=r"\w+ \d$", is_regex=True) is True
|
|
assert vm.contains(area=MetadataType.TAGS, value=r"\w+ \d\d$", is_regex=True) is False
|
|
with pytest.raises(ValueError):
|
|
vm.contains(area=MetadataType.TAGS, key="key1")
|
|
|
|
|
|
def test_vault_metadata_delete() -> None:
|
|
"""Test delete method."""
|
|
vm = VaultMetadata()
|
|
vm.index_metadata(area=MetadataType.FRONTMATTER, metadata=METADATA)
|
|
assert vm.dict == {
|
|
"frontmatter_Key1": ["author name"],
|
|
"frontmatter_Key2": ["article", "note"],
|
|
"intext_key": ["intext_key_value"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"shared_key2": ["shared_key2_value"],
|
|
"tags": ["tag 1", "tag 2", "tag 3"],
|
|
"top_key1": ["top_key1_value"],
|
|
"top_key2": ["top_key2_value"],
|
|
"top_key3": ["top_key3_value"],
|
|
}
|
|
|
|
assert vm.delete("no key") is False
|
|
assert vm.delete("tags", "no value") is False
|
|
assert vm.delete("tags", "tag 2") is True
|
|
assert vm.dict["tags"] == ["tag 1", "tag 3"]
|
|
assert vm.delete("tags") is True
|
|
assert "tags" not in vm.dict
|
|
|
|
|
|
def test_vault_metadata_rename() -> None:
|
|
"""Test rename method."""
|
|
vm = VaultMetadata()
|
|
vm.index_metadata(area=MetadataType.FRONTMATTER, metadata=METADATA)
|
|
assert vm.dict == {
|
|
"frontmatter_Key1": ["author name"],
|
|
"frontmatter_Key2": ["article", "note"],
|
|
"intext_key": ["intext_key_value"],
|
|
"shared_key1": ["shared_key1_value"],
|
|
"shared_key2": ["shared_key2_value"],
|
|
"tags": ["tag 1", "tag 2", "tag 3"],
|
|
"top_key1": ["top_key1_value"],
|
|
"top_key2": ["top_key2_value"],
|
|
"top_key3": ["top_key3_value"],
|
|
}
|
|
|
|
assert vm.rename("no key", "new key") is False
|
|
assert vm.rename("tags", "no tag", "new key") is False
|
|
assert vm.rename("tags", "tag 2", "new tag") is True
|
|
assert vm.dict["tags"] == ["new tag", "tag 1", "tag 3"]
|
|
assert vm.rename("tags", "old_tags") is True
|
|
assert vm.dict["old_tags"] == ["new tag", "tag 1", "tag 3"]
|
|
assert "tags" not in vm.dict
|