mirror of
https://github.com/basicmachines-co/basic-memory
synced 2026-06-21 13:47:35 +00:00
c97733d785
Signed-off-by: phernandez <paul@basicmachines.co> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
84 lines
3.4 KiB
Python
84 lines
3.4 KiB
Python
"""Integration tests for the Picoschema parser using real fixture files."""
|
|
|
|
import pytest
|
|
|
|
from basic_memory.schema.parser import parse_schema_note
|
|
|
|
|
|
class TestPersonSchemaParsing:
|
|
"""Parse the Person.md schema fixture and verify all fields."""
|
|
|
|
def test_person_schema_entity(self, person_schema_frontmatter):
|
|
schema = parse_schema_note(person_schema_frontmatter)
|
|
assert schema.entity == "Person"
|
|
|
|
def test_person_schema_version(self, person_schema_frontmatter):
|
|
schema = parse_schema_note(person_schema_frontmatter)
|
|
assert schema.version == 1
|
|
|
|
def test_person_schema_validation_mode(self, person_schema_frontmatter):
|
|
schema = parse_schema_note(person_schema_frontmatter)
|
|
assert schema.validation_mode == "warn"
|
|
|
|
def test_person_schema_field_count(self, person_schema_frontmatter):
|
|
schema = parse_schema_note(person_schema_frontmatter)
|
|
assert len(schema.fields) == 5
|
|
|
|
def test_person_name_field_is_required(self, person_schema_frontmatter):
|
|
schema = parse_schema_note(person_schema_frontmatter)
|
|
name_field = next(f for f in schema.fields if f.name == "name")
|
|
assert name_field.required is True
|
|
assert name_field.type == "string"
|
|
assert name_field.description == "full name"
|
|
|
|
def test_person_role_field_is_optional(self, person_schema_frontmatter):
|
|
schema = parse_schema_note(person_schema_frontmatter)
|
|
role_field = next(f for f in schema.fields if f.name == "role")
|
|
assert role_field.required is False
|
|
|
|
def test_person_works_at_is_entity_ref(self, person_schema_frontmatter):
|
|
schema = parse_schema_note(person_schema_frontmatter)
|
|
works_at = next(f for f in schema.fields if f.name == "works_at")
|
|
assert works_at.is_entity_ref is True
|
|
assert works_at.type == "Organization"
|
|
|
|
def test_person_expertise_is_array(self, person_schema_frontmatter):
|
|
schema = parse_schema_note(person_schema_frontmatter)
|
|
expertise = next(f for f in schema.fields if f.name == "expertise")
|
|
assert expertise.is_array is True
|
|
|
|
def test_person_email_is_optional(self, person_schema_frontmatter):
|
|
schema = parse_schema_note(person_schema_frontmatter)
|
|
email = next(f for f in schema.fields if f.name == "email")
|
|
assert email.required is False
|
|
|
|
|
|
class TestBookSchemaParsing:
|
|
"""Parse the Book.md schema fixture."""
|
|
|
|
def test_book_genre_is_enum(self, book_schema_frontmatter):
|
|
schema = parse_schema_note(book_schema_frontmatter)
|
|
genre = next(f for f in schema.fields if f.name == "genre")
|
|
assert genre.is_enum is True
|
|
assert set(genre.enum_values) == {"fiction", "nonfiction", "technical"}
|
|
|
|
|
|
class TestStrictSchemaParsing:
|
|
"""Verify strict validation mode is parsed."""
|
|
|
|
def test_strict_validation_mode(self, strict_schema_frontmatter):
|
|
schema = parse_schema_note(strict_schema_frontmatter)
|
|
assert schema.validation_mode == "strict"
|
|
|
|
|
|
class TestSchemaParsingErrors:
|
|
"""Verify parser raises on invalid frontmatter."""
|
|
|
|
def test_missing_entity_raises(self):
|
|
with pytest.raises(ValueError, match="entity"):
|
|
parse_schema_note({"type": "schema", "schema": {"name": "string"}})
|
|
|
|
def test_missing_schema_dict_raises(self):
|
|
with pytest.raises(ValueError, match="schema"):
|
|
parse_schema_note({"type": "schema", "entity": "Person"})
|