232 lines
8.9 KiB
Python
232 lines
8.9 KiB
Python
from core.builtin_concepts import BuiltinConcepts
|
|
from core.concept import PROPERTIES_TO_SERIALIZE, Concept, DEFINITION_TYPE_DEF
|
|
from core.sheerka.Sheerka import Sheerka
|
|
from sdp.sheerkaDataProvider import SheerkaDataProvider
|
|
|
|
from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka
|
|
|
|
|
|
class TestSheerkaCreateNewConcept(TestUsingMemoryBasedSheerka):
|
|
def test_i_can_add_a_concept(self):
|
|
sheerka = self.get_sheerka()
|
|
concept = self.get_default_concept()
|
|
|
|
res = sheerka.create_new_concept(self.get_context(sheerka), concept)
|
|
|
|
assert res.status
|
|
assert sheerka.isinstance(res.value, BuiltinConcepts.NEW_CONCEPT)
|
|
|
|
concept_found = res.value.body
|
|
for prop in PROPERTIES_TO_SERIALIZE:
|
|
assert getattr(concept_found.metadata, prop) == getattr(concept.metadata, prop)
|
|
|
|
assert concept_found.key == "__var__0 + __var__1"
|
|
assert concept_found.id == "1001"
|
|
|
|
assert concept.key in sheerka.cache_by_key
|
|
assert concept.id in sheerka.cache_by_id
|
|
assert concept.name in sheerka.cache_by_name
|
|
assert sheerka.sdp.io.exists(
|
|
sheerka.sdp.io.get_obj_path(SheerkaDataProvider.ObjectsFolder, concept_found.get_origin()))
|
|
assert sheerka.sdp.exists(Sheerka.CONCEPTS_BY_HASH_ENTRY, concept.get_definition_hash())
|
|
assert sheerka.sdp.exists(Sheerka.CONCEPTS_BY_ID_ENTRY, concept.id)
|
|
assert sheerka.sdp.exists(Sheerka.CONCEPTS_BY_NAME_ENTRY, concept.name)
|
|
assert sheerka.sdp.exists(Sheerka.CONCEPTS_ENTRY, concept.key)
|
|
|
|
def test_i_can_add_a_concept_when_name_differs_from_the_key(self):
|
|
sheerka = self.get_sheerka()
|
|
concept = Concept("greetings", definition="hello a", definition_type=DEFINITION_TYPE_DEF).def_prop("a")
|
|
|
|
res = sheerka.create_new_concept(self.get_context(sheerka), concept)
|
|
|
|
assert res.status
|
|
assert sheerka.isinstance(res.value, BuiltinConcepts.NEW_CONCEPT)
|
|
|
|
concept_found = res.value.body
|
|
for prop in PROPERTIES_TO_SERIALIZE:
|
|
assert getattr(concept_found.metadata, prop) == getattr(concept.metadata, prop)
|
|
|
|
assert concept_found.key == "hello __var__0"
|
|
assert concept_found.id == "1001"
|
|
|
|
assert concept.key in sheerka.cache_by_key
|
|
assert concept.id in sheerka.cache_by_id
|
|
assert concept.name in sheerka.cache_by_name
|
|
assert sheerka.sdp.io.exists(
|
|
sheerka.sdp.io.get_obj_path(SheerkaDataProvider.ObjectsFolder, concept_found.get_origin()))
|
|
assert sheerka.sdp.exists(Sheerka.CONCEPTS_BY_HASH_ENTRY, concept.get_definition_hash())
|
|
assert sheerka.sdp.exists(Sheerka.CONCEPTS_BY_ID_ENTRY, concept.id)
|
|
assert sheerka.sdp.exists(Sheerka.CONCEPTS_BY_NAME_ENTRY, concept.name)
|
|
assert sheerka.sdp.exists(Sheerka.CONCEPTS_ENTRY, concept.key)
|
|
|
|
def test_i_cannot_add_the_same_concept_twice(self):
|
|
"""
|
|
Checks that duplicated concepts are managed by sheerka, not by sheerka.sdp
|
|
:return:
|
|
"""
|
|
sheerka = self.get_sheerka()
|
|
concept = self.get_default_concept()
|
|
|
|
sheerka.create_new_concept(self.get_context(sheerka), concept)
|
|
res = sheerka.create_new_concept(self.get_context(sheerka), concept)
|
|
|
|
assert not res.status
|
|
assert sheerka.isinstance(res.value, BuiltinConcepts.CONCEPT_ALREADY_DEFINED)
|
|
assert res.value.body == concept
|
|
|
|
def test_i_can_get_a_newly_created_concept(self):
|
|
sheerka = self.get_sheerka()
|
|
concept = self.get_default_concept()
|
|
|
|
sheerka.create_new_concept(self.get_context(sheerka), concept)
|
|
|
|
from_cache = sheerka.get(concept.key)
|
|
assert from_cache is not None
|
|
assert from_cache == concept
|
|
|
|
from_cache = sheerka.get_by_id(concept.id)
|
|
assert from_cache is not None
|
|
assert from_cache == concept
|
|
|
|
def test_i_first_look_in_local_cache(self):
|
|
sheerka = self.get_sheerka()
|
|
concept = self.get_default_concept()
|
|
|
|
sheerka.create_new_concept(self.get_context(sheerka), concept)
|
|
sheerka.cache_by_key[concept.key].pre = "I have modified the concept in cache"
|
|
|
|
from_cache = sheerka.get(concept.key)
|
|
assert from_cache is not None
|
|
assert from_cache.key == concept.key
|
|
assert from_cache.pre == "I have modified the concept in cache"
|
|
|
|
def test_i_can_get_a_known_concept_when_not_in_cache(self):
|
|
"""
|
|
When not in cache, uses sdp
|
|
:return:
|
|
"""
|
|
sheerka = self.get_sheerka()
|
|
concept = self.get_default_concept()
|
|
sheerka.create_new_concept(self.get_context(sheerka), concept)
|
|
|
|
sheerka.reset_cache()
|
|
loaded = sheerka.get(concept.key)
|
|
|
|
assert loaded == concept
|
|
|
|
# I can also get it by its id
|
|
loaded = sheerka.sdp.get(sheerka.CONCEPTS_BY_ID_ENTRY, concept.id)
|
|
assert loaded == concept
|
|
|
|
def test_i_can_instantiate_a_concept_from_sdp(self):
|
|
sheerka = self.get_sheerka()
|
|
concept = Concept("foo")
|
|
sheerka.create_new_concept(self.get_context(sheerka), concept)
|
|
|
|
sheerka.reset_cache()
|
|
loaded = sheerka.new("foo")
|
|
|
|
assert loaded == concept
|
|
|
|
def test_i_can_get_a_concept_by_its_id(self):
|
|
sheerka = self.get_sheerka()
|
|
concept = self.get_default_concept()
|
|
sheerka.create_new_concept(self.get_context(sheerka), concept)
|
|
|
|
sheerka.cache_by_key = {} # reset the cache
|
|
loaded = sheerka.get_by_id(concept.id)
|
|
|
|
assert loaded == concept
|
|
|
|
def test_i_can_get_list_of_concept_when_same_key_when_no_cache(self):
|
|
sheerka = self.get_sheerka()
|
|
concept1 = self.get_default_concept()
|
|
concept2 = self.get_default_concept()
|
|
concept2.metadata.body = "a+b"
|
|
|
|
res1 = sheerka.create_new_concept(self.get_context(sheerka), concept1)
|
|
res2 = sheerka.create_new_concept(self.get_context(sheerka), concept2)
|
|
|
|
assert res1.status
|
|
assert res2.status
|
|
assert res1.value.body.key == res2.value.body.key # same key
|
|
|
|
sheerka.cache_by_key = {} # reset the cache
|
|
|
|
result = sheerka.get(concept1.key)
|
|
assert len(result) == 2
|
|
assert result[0] == concept1
|
|
assert result[1] == concept2
|
|
|
|
def test_i_can_get_list_of_concept_when_same_key_when_cache(self):
|
|
sheerka = self.get_sheerka()
|
|
concept1 = self.get_default_concept()
|
|
concept2 = self.get_default_concept()
|
|
concept2.metadata.body = "a+b"
|
|
|
|
res1 = sheerka.create_new_concept(self.get_context(sheerka), concept1)
|
|
res2 = sheerka.create_new_concept(self.get_context(sheerka), concept2)
|
|
|
|
assert res1.value.body.key == res2.value.body.key # same key
|
|
|
|
# sheerka.cache_by_key = {} # Do not reset the cache
|
|
|
|
result = sheerka.get(concept1.key)
|
|
assert len(result) == 2
|
|
assert result[0] == concept1
|
|
assert result[1] == concept2
|
|
|
|
def test_i_can_get_the_correct_concept_using_the_id_when_same_key_when_no_cache(self):
|
|
sheerka = self.get_sheerka()
|
|
concept1 = self.get_default_concept()
|
|
concept2 = self.get_default_concept()
|
|
concept2.metadata.body = "a+b"
|
|
|
|
res1 = sheerka.create_new_concept(self.get_context(sheerka), concept1)
|
|
res2 = sheerka.create_new_concept(self.get_context(sheerka), concept2)
|
|
|
|
assert res1.value.body.key == res2.value.body.key # same key
|
|
|
|
result = sheerka.get(concept1.key, res2.body.body.id)
|
|
assert result.name == "a + b"
|
|
assert result.metadata.body == "a+b"
|
|
|
|
def test_i_can_get_the_correct_concept_using_the_id__when_same_key_when_cache(self):
|
|
sheerka = self.get_sheerka()
|
|
concept1 = self.get_default_concept()
|
|
concept2 = self.get_default_concept()
|
|
concept2.metadata.body = "a+b"
|
|
|
|
res1 = sheerka.create_new_concept(self.get_context(sheerka), concept1)
|
|
res2 = sheerka.create_new_concept(self.get_context(sheerka), concept2)
|
|
|
|
assert res1.value.body.key == res2.value.body.key # same key
|
|
|
|
result = sheerka.get(concept1.key, res2.body.body.id)
|
|
assert result.name == "a + b"
|
|
assert result.metadata.body == "a+b"
|
|
|
|
def test_i_cannot_get_the_correct_concept_id_the_id_is_wrong(self):
|
|
sheerka = self.get_sheerka()
|
|
concept1 = self.get_default_concept()
|
|
concept2 = self.get_default_concept()
|
|
concept2.metadata.body = "a+b"
|
|
|
|
res1 = sheerka.create_new_concept(self.get_context(sheerka), concept1)
|
|
res2 = sheerka.create_new_concept(self.get_context(sheerka), concept2)
|
|
|
|
assert res1.value.body.key == res2.value.body.key # same key
|
|
|
|
result = sheerka.get(concept1.key, "wrong id")
|
|
assert sheerka.isinstance(result, BuiltinConcepts.UNKNOWN_CONCEPT)
|
|
|
|
def test_concept_that_references_itself_is_correctly_created(self):
|
|
sheerka = self.get_sheerka()
|
|
concept = Concept("foo", body="foo")
|
|
|
|
res = sheerka.create_new_concept(self.get_context(sheerka), concept)
|
|
|
|
assert res.status
|
|
|
|
|