64 lines
2.1 KiB
Python
64 lines
2.1 KiB
Python
from ragas.testset.graph import KnowledgeGraph, Node, NodeType, Relationship
|
|
|
|
|
|
def test_knowledge_graph_save_with_problematic_chars(tmp_path):
|
|
# Create a knowledge graph with special characters
|
|
kg = KnowledgeGraph()
|
|
|
|
# Create nodes with various Unicode characters including ones that might cause charmap codec issues
|
|
problematic_chars = [
|
|
chr(i)
|
|
for i in range(0x0080, 0x00FF) # Extended ASCII/Latin-1 characters
|
|
] + [
|
|
"\u2022", # bullet
|
|
"\u2192", # arrow
|
|
"\u2665", # heart
|
|
"\u2605", # star
|
|
"\u221e", # infinity
|
|
"\u00b5", # micro
|
|
"\u2264", # less than or equal
|
|
"\u2265", # greater than or equal
|
|
"\u0391", # Greek letters
|
|
"\u0392",
|
|
"\u0393",
|
|
"\uffff", # Special Unicode characters
|
|
]
|
|
|
|
# Create multiple nodes with combinations of problematic characters
|
|
for i, char in enumerate(problematic_chars):
|
|
text = f"Test{char}Text with special char at position {i}"
|
|
node = Node(
|
|
properties={
|
|
"text": text,
|
|
"description": f"Node {i} with {char}",
|
|
"metadata": f"Extra {char} info",
|
|
},
|
|
type=NodeType.CHUNK,
|
|
)
|
|
kg.add(node)
|
|
|
|
# Add some relationships to make it more realistic
|
|
nodes = kg.nodes
|
|
for i in range(len(nodes) - 1):
|
|
rel = Relationship(
|
|
source=nodes[i],
|
|
target=nodes[i + 1],
|
|
type="next",
|
|
properties={"info": f"Link {i} with special char {problematic_chars[i]}"},
|
|
)
|
|
kg.add(rel)
|
|
|
|
# Try to save to a temporary file
|
|
save_path = tmp_path / "test_knowledge_graph.json"
|
|
kg.save(str(save_path))
|
|
|
|
# Try to load it back to verify
|
|
loaded_kg = KnowledgeGraph.load(str(save_path))
|
|
|
|
# Verify the content was preserved
|
|
assert len(loaded_kg.nodes) == len(kg.nodes)
|
|
assert len(loaded_kg.relationships) == len(kg.relationships)
|
|
|
|
# Verify the special characters were preserved in the first node
|
|
assert loaded_kg.nodes[0].properties["text"] == nodes[0].properties["text"]
|