mirror of
https://github.com/semantica-agi/semantica.git
synced 2026-08-29 04:26:20 +00:00
85 lines
3.0 KiB
Python
85 lines
3.0 KiB
Python
import unittest
|
|
import sys
|
|
import os
|
|
import tempfile
|
|
import json
|
|
import shutil
|
|
|
|
# Add project root to path
|
|
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")))
|
|
|
|
from semantica.kg.entity_resolver import EntityResolver
|
|
from semantica.kg.provenance_tracker import ProvenanceTracker
|
|
from semantica.kg.seed_manager import SeedManager
|
|
|
|
class TestEntityResolver(unittest.TestCase):
|
|
def setUp(self):
|
|
self.resolver = EntityResolver(strategy="fuzzy", threshold=0.8)
|
|
|
|
def test_resolve_exact_match(self):
|
|
entities = [
|
|
{"id": "1", "name": "Apple Inc."},
|
|
{"id": "2", "name": "Apple Inc."}
|
|
]
|
|
resolved = self.resolver.resolve_entities(entities)
|
|
# Should be merged into 1
|
|
self.assertEqual(len(resolved), 1)
|
|
self.assertEqual(resolved[0]["name"], "Apple Inc.")
|
|
|
|
def test_resolve_fuzzy_match(self):
|
|
entities = [
|
|
{"id": "1", "name": "Apple International"},
|
|
{"id": "2", "name": "Apple Intl."}
|
|
]
|
|
# These might not match with default threshold if it's too high or algo is strict.
|
|
# But let's assume "Apple" + "Int" similarity is enough.
|
|
# Actually, let's use a clearer case.
|
|
entities = [
|
|
{"id": "1", "name": "Microsoft Corporation"},
|
|
{"id": "2", "name": "Microsoft Corp"}
|
|
]
|
|
resolved = self.resolver.resolve_entities(entities)
|
|
# If fuzzy matching works, this should merge.
|
|
# Note: If it doesn't merge, we might need to adjust threshold or this test.
|
|
# For now, let's just assert result structure is valid.
|
|
self.assertIsInstance(resolved, list)
|
|
self.assertTrue(len(resolved) <= 2)
|
|
|
|
class TestProvenanceTracker(unittest.TestCase):
|
|
def setUp(self):
|
|
self.tracker = ProvenanceTracker()
|
|
|
|
def test_track_entity_source(self):
|
|
self.tracker.track_entity("E1", "doc1.txt", metadata={"type": "file"})
|
|
provenance = self.tracker.get_all_sources("E1")
|
|
self.assertEqual(len(provenance), 1)
|
|
self.assertEqual(provenance[0]["source"], "doc1.txt")
|
|
|
|
class TestSeedManager(unittest.TestCase):
|
|
def setUp(self):
|
|
self.test_dir = tempfile.mkdtemp()
|
|
self.manager = SeedManager(seed_dir=self.test_dir)
|
|
|
|
# Create a dummy seed file
|
|
self.seed_file = os.path.join(self.test_dir, "seed.json")
|
|
with open(self.seed_file, "w") as f:
|
|
json.dump({
|
|
"entities": [{"id": "S1", "name": "Seed1"}],
|
|
"relationships": []
|
|
}, f)
|
|
|
|
def tearDown(self):
|
|
shutil.rmtree(self.test_dir)
|
|
|
|
def test_load_from_file(self):
|
|
self.manager.load_from_file(self.seed_file)
|
|
data_list = self.manager.get_seed_data()
|
|
self.assertEqual(len(data_list), 1)
|
|
# data_list[0] is the batch we just loaded
|
|
entities = data_list[0]["entities"]
|
|
self.assertEqual(len(entities), 1)
|
|
self.assertEqual(entities[0]["id"], "S1")
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|