import unittest
import shutil
from pathlib import Path
from ontoenv import OntoEnv, Config
from rdflib import Graph, URIRef
from rdflib.namespace import RDF, OWL
class TestOntoEnvAPI(unittest.TestCase):
def setUp(self):
self.test_dir = Path("test_env_py")
if self.test_dir.exists():
shutil.rmtree(self.test_dir)
self.test_dir.mkdir()
self.brick_file_path = Path("../brick/Brick.ttl")
self.brick_name = "https://brickschema.org/schema/1.4-rc1/Brick"
self.brick_144_url = "https://brickschema.org/schema/1.4.4/Brick.ttl"
self.brick_144_name = "https://brickschema.org/schema/1.4/Brick"
self.env = None
if Path(".ontoenv").exists():
shutil.rmtree(".ontoenv")
def tearDown(self):
if self.env:
self.env.close()
if self.test_dir.exists():
shutil.rmtree(self.test_dir)
if Path(".ontoenv").exists():
shutil.rmtree(".ontoenv")
def test_constructor_default(self):
self.env = OntoEnv()
self.assertTrue(Path(".ontoenv").is_dir())
self.assertIn("ontologies", repr(self.env))
def test_constructor_path(self):
self.env = OntoEnv(path=self.test_dir)
self.assertTrue((self.test_dir / ".ontoenv").is_dir())
def test_constructor_with_config(self):
cfg = Config(search_directories=["../brick"])
self.env = OntoEnv(config=cfg, path=self.test_dir)
self.env.update() ontologies = self.env.get_ontology_names()
self.assertIn(self.brick_name, ontologies)
def test_add_local_file(self):
cfg = Config(offline=False)
self.env = OntoEnv(config=cfg, path=self.test_dir)
name = self.env.add(str(self.brick_file_path))
self.assertEqual(name, self.brick_name)
ontologies = self.env.get_ontology_names()
self.assertIn(self.brick_name, ontologies)
self.assertIn("http://qudt.org/2.1/schema/qudt", ontologies)
def test_add_url(self):
cfg = Config(offline=False)
self.env = OntoEnv(config=cfg, path=self.test_dir)
name = self.env.add(self.brick_144_url)
self.assertEqual(name, self.brick_144_name)
ontologies = self.env.get_ontology_names()
self.assertIn(self.brick_144_name, ontologies)
self.assertIn("http://qudt.org/3.1.0/schema/qudt", ontologies)
def test_add_no_fetch_imports(self):
self.env = OntoEnv(path=self.test_dir)
name = self.env.add(str(self.brick_file_path), fetch_imports=False)
self.assertEqual(name, self.brick_name)
ontologies = self.env.get_ontology_names()
self.assertIn(self.brick_name, ontologies)
self.assertEqual(len(ontologies), 1)
def test_get_graph(self):
self.env = OntoEnv(path=self.test_dir)
name = self.env.add(str(self.brick_file_path))
g = self.env.get_graph(name)
self.assertIsInstance(g, Graph)
self.assertGreater(len(g), 0)
self.assertIn((URIRef(self.brick_name), RDF.type, OWL.Ontology), g)
def test_get_closure(self):
cfg = Config(search_directories=["brick"])
self.env = OntoEnv(config=cfg, path=self.test_dir)
name = self.env.add(str(self.brick_file_path))
g = self.env.get_graph(name)
closure_g, imported_graphs = self.env.get_closure(name, recursion_depth=0)
self.assertIsInstance(closure_g, Graph)
self.assertEqual(len(imported_graphs), 1)
closure_g, imported_graphs = self.env.get_closure(name)
self.assertIsInstance(closure_g, Graph)
self.assertGreater(len(imported_graphs), 1)
self.assertGreater(len(closure_g), len(g))
def test_import_dependencies(self):
cfg = Config(search_directories=["brick"])
self.env = OntoEnv(config=cfg, path=self.test_dir)
self.env.add(str(self.brick_file_path))
g = Graph()
brick_ontology_uri = URIRef(self.brick_name)
g.add((brick_ontology_uri, RDF.type, OWL.Ontology))
g.add((brick_ontology_uri, OWL.imports, URIRef("http://qudt.org/2.1/schema/qudt")))
num_triples_before = len(g)
imported = self.env.import_dependencies(g)
self.assertGreater(len(imported), 0)
num_triples_after = len(g)
self.assertGreater(num_triples_after, num_triples_before)
def test_import_dependencies_fetch_missing(self):
cfg = Config(offline=False)
self.env = OntoEnv(config=cfg, path=self.test_dir)
g = Graph()
g.add(
(
URIRef("http://example.org/my-ontology"),
OWL.imports,
URIRef(self.brick_144_url),
)
)
num_triples_before = len(g)
imported = self.env.import_dependencies(g, fetch_missing=True)
self.assertGreater(len(imported), 0)
self.assertIn(self.brick_144_name, imported)
num_triples_after = len(g)
self.assertGreater(num_triples_after, num_triples_before)
ontologies = self.env.get_ontology_names()
self.assertIn(self.brick_144_name, ontologies)
def test_list_closure(self):
cfg = Config(search_directories=["brick"])
self.env = OntoEnv(config=cfg, path=self.test_dir)
name = self.env.add(str(self.brick_file_path))
closure_list = self.env.list_closure(name)
self.assertIn(name, closure_list)
self.assertIn("http://qudt.org/2.1/schema/qudt", closure_list)
self.assertIn("http://qudt.org/2.1/vocab/quantitykind", closure_list)
def test_get_importers(self):
cfg = Config(search_directories=["brick"])
self.env = OntoEnv(config=cfg, path=self.test_dir)
self.env.add(str(self.brick_file_path))
dependents = self.env.get_importers("http://qudt.org/2.1/vocab/quantitykind")
self.assertIn(self.brick_name, dependents)
def test_to_rdflib_dataset(self):
cfg = Config(search_directories=["brick"])
self.env = OntoEnv(config=cfg, path=self.test_dir)
self.env.add(str(self.brick_file_path))
self.env.update() self.env.flush()
ds = self.env.to_rdflib_dataset()
num_graphs = len(list(ds.graphs()))
self.assertGreater(num_graphs, 5)
def test_import_graph(self):
cfg = Config(offline=False)
self.env = OntoEnv(config=cfg, path=self.test_dir)
name = self.env.add(self.brick_144_url)
self.assertEqual(name, self.brick_144_name)
g = Graph()
self.assertEqual(len(g), 0)
self.env.import_graph(g, name)
self.assertGreater(len(g), 0)
def test_store_path(self):
self.env = OntoEnv(path=self.test_dir)
path = self.env.store_path()
self.assertIsNotNone(path)
self.assertTrue(Path(path).is_dir())
self.assertIn(".ontoenv", path)
cfg = Config(temporary=True)
mem_env = OntoEnv(config=cfg)
self.assertIsNone(mem_env.store_path())
mem_env.close()
def test_persistence(self):
env = OntoEnv(path=self.test_dir)
name = env.add(str(self.brick_file_path))
self.assertIn(name, env.get_ontology_names())
env.flush() env.close()
self.env = OntoEnv(path=self.test_dir)
self.assertIn(name, self.env.get_ontology_names())
g = self.env.get_graph(name)
self.assertGreater(len(g), 0)
def test_close(self):
self.env = OntoEnv(path=self.test_dir)
name = self.env.add(str(self.brick_file_path))
self.assertIn(name, self.env.get_ontology_names())
self.env.close()
with self.assertRaises(ValueError):
self.env.get_ontology_names()
with self.assertRaises(ValueError):
self.env.get_graph(name)
with self.assertRaises(ValueError):
self.env.add(str(self.brick_file_path))
self.assertIn("closed", repr(self.env))
self.assertIsNone(self.env.store_path())
self.env.close()
env2 = OntoEnv(path=self.test_dir)
self.assertIn(name, env2.get_ontology_names())
env2.close()
if __name__ == "__main__":
unittest.main()