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.TestUsingFileBasedSheerka import TestUsingFileBasedSheerka 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) assert sheerka.sdp.exists(Sheerka.CONCEPTS_BY_FIRST_KEYWORD_ENTRY, "+") 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 class TestSheerkaCreateNewConceptFileBased(TestUsingFileBasedSheerka): def test_i_can_add_several_concepts(self): sheerka, context, hello, greeting = self.init_concepts( Concept("Hello world a").def_prop("a"), Concept("Greeting a").def_prop("a"), use_dict=False ) res = sheerka.create_new_concept(self.get_context(sheerka), hello) assert res.status sheerka = self.get_sheerka(use_dict=False) res = sheerka.create_new_concept(self.get_context(sheerka), greeting) assert res.status assert sheerka.sdp.exists(Sheerka.CONCEPTS_ENTRY, hello.key) assert sheerka.sdp.exists(Sheerka.CONCEPTS_ENTRY, greeting.key) assert sheerka.sdp.exists(Sheerka.CONCEPTS_BY_ID_ENTRY, hello.id) assert sheerka.sdp.exists(Sheerka.CONCEPTS_BY_ID_ENTRY, greeting.id) assert sheerka.sdp.exists(Sheerka.CONCEPTS_BY_NAME_ENTRY, "Hello world a") assert sheerka.sdp.exists(Sheerka.CONCEPTS_BY_NAME_ENTRY, "Greeting a") assert sheerka.sdp.exists(Sheerka.CONCEPTS_BY_FIRST_KEYWORD_ENTRY, "Hello") assert sheerka.sdp.exists(Sheerka.CONCEPTS_BY_FIRST_KEYWORD_ENTRY, "Greeting")