def test_resolve_with_defaults(self): root = TemplateNode() self.assertIsNotNone(root) self.assertIsNotNone(root.children) self.assertEqual(len(root.children), 0) node = TemplateInputNode() self.assertIsNotNone(node) root.append(node) self.assertEqual(len(root.children), 1) self.assertEqual(0, node.index) conversation = Conversation(self._client_context) question = Question.create_from_text( self._client_context.brain.nlp.tokenizer, "Hello world") question.current_sentence()._response = "Hello matey" conversation.record_question(question) self._client_context.bot._conversations["testid"] = conversation response = root.resolve(self._client_context) self.assertIsNotNone(response) self.assertEqual(response, "Hello world")
def test_node_no_sentences(self): root = TemplateNode() node = TemplateStarNode() root.append(node) conversation = Conversation(self._client_context) question = Question() conversation.record_question(question) self._client_context.bot._conversations["testid"] = conversation self.assertEqual("", root.resolve(self._client_context))
def test_node_with_star_with_none(self): root = TemplateNode() node = TemplateThatStarNode() root.append(node) conversation = Conversation(self._client_context) question = Question.create_from_text( self._client_context.brain.nlp.tokenizer, "Hello world") question.current_sentence()._response = "Hello matey" conversation.record_question(question) question = Question.create_from_text( self._client_context.brain.nlp.tokenizer, "How are you") question.current_sentence()._response = "Very well thanks" conversation.record_question(question) match = PatternOneOrMoreWildCardNode("*") context = MatchContext( max_search_depth=100, max_search_timeout=-1, tokenizer=self._client_context.brain.nlp.tokenizer) context.add_match(Match(Match.THAT, match, None)) question.current_sentence()._matched_context = context conversation.record_question(question) self._client_context.bot._conversations["testid"] = conversation self.assertEqual("", root.resolve(self._client_context))
def test_persistence(self): storage_config = BotConversationsRedisStorageConfiguration("redis") redis = ConversationRedisStorage(storage_config, factory=MockRedisFactory()) self.assertIsNotNone(redis) client = TestClient() client_context = client.create_client_context("testid") conversation1 = Conversation(client_context) conversation1.set_property("topic", "topic1") redis.save_conversation(conversation1, client_context.userid) conversation2 = Conversation(client_context) redis.load_conversation(conversation2, client_context.userid) self.assertIsNotNone(conversation2) self.assertIsNotNone(conversation2.properties) self.assertEquals(conversation1.properties, conversation2.properties)
def test_resolve_no_sentence(self): root = TemplateNode() self.assertIsNotNone(root) self.assertIsNotNone(root.children) self.assertEqual(len(root.children), 0) node = TemplateRequestNode(index=3) self.assertIsNotNone(node) root.append(node) self.assertEqual(len(root.children), 1) self.assertEqual(3, node.index) conversation = Conversation(self._client_context) question = Question.create_from_text( self._client_context.brain.nlp.tokenizer, "Hello world") question.current_sentence()._response = "Hello matey" conversation.record_question(question) question = Question.create_from_text( self._client_context.brain.nlp.tokenizer, "How are you. Are you well") question.current_sentence()._response = "Fine thanks" conversation.record_question(question) self._client_context.bot._conversations["testid"] = conversation response = root.resolve(self._client_context) self.assertIsNotNone(response) self.assertEqual(response, "")
def test_resolve_with_no_defaults(self): root = TemplateNode() self.assertIsNotNone(root) self.assertIsNotNone(root.children) self.assertEqual(len(root.children), 0) node = TemplateThatNode(question=1, sentence=1) self.assertIsNotNone(node) root.append(node) self.assertEqual(len(root.children), 1) self.assertEqual(1, node.question) self.assertEqual(1, node.sentence) conversation = Conversation(self._client_context) question = Question.create_from_text( self._client_context.brain.nlp.tokenizer, "Hello world") question.current_sentence()._response = "Hello matey" conversation.record_question(question) question = Question.create_from_text( self._client_context.brain.nlp.tokenizer, "How are you") question.current_sentence()._response = "Very well thanks" conversation.record_question(question) self._client_context.bot._conversations["testid"] = conversation self.assertEqual("Hello matey", node.resolve(self._client_context))
def get_conversation(self, client_context): # TODO move this to Conversations base class if client_context.userid in self._conversations: YLogger.info(client_context, "Retrieving conversation for client %s", client_context.userid) return self._conversations[client_context.userid] else: YLogger.info(client_context, "Creating new conversation for client %s", client_context.userid) conversation = Conversation(client_context) if client_context.brain.properties is not None: conversation.load_initial_variables( client_context.brain.variables) self._conversations[client_context.userid] = conversation self.load_conversation(client_context.userid) return conversation
def test_resolve_no_defaults_inside_topic(self): root = TemplateNode() self.assertIsNotNone(root) self.assertIsNotNone(root.children) self.assertEqual(len(root.children), 0) node = TemplateTopicStarNode(index=1) self.assertIsNotNone(node) self.assertEqual(1, node.index) root.append(node) self.assertEqual(len(root.children), 1) conversation = Conversation(self._client_context) question = Question.create_from_text( self._client_context.brain.nlp.tokenizer, "Hello world") question.current_sentence()._response = "Hello matey" conversation.record_question(question) question = Question.create_from_text( self._client_context.brain.nlp.tokenizer, "How are you") question.current_sentence()._response = "Very well thanks" conversation.record_question(question) match = PatternOneOrMoreWildCardNode("*") context = MatchContext( max_search_depth=100, max_search_timeout=-1, tokenizer=self._client_context.brain.nlp.tokenizer) context.add_match(Match(Match.TOPIC, match, "Matched")) question.current_sentence()._matched_context = context conversation.record_question(question) self._client_context.bot._conversations["testid"] = conversation self.assertEqual("Matched", node.resolve(self._client_context))
def test_node_no_star(self): root = TemplateNode() node = TemplateStarNode() root.append(node) conversation = Conversation(self._client_context) question = Question.create_from_text( self._client_context.brain.nlp.tokenizer, "Hello world") question.current_sentence()._response = "Hello matey" conversation.record_question(question) question = Question.create_from_text( self._client_context.brain.nlp.tokenizer, "How are you") question.current_sentence()._response = "Very well thanks" conversation.record_question(question) self._client_context.bot._conversations["testid"] = conversation self.assertEqual("", root.resolve(self._client_context))
def test_persistence(self): storage_config = BotConversationsRedisStorageConfiguration("redis") redis = ConversationRedisStorage(storage_config) self.assertIsNotNone(redis) client = TestClient() client_context = client.create_client_context("testid") conversation1 = Conversation(client_context) conversation1.set_property("topic", "topic1") question = client_context.bot.get_question(client_context, "hello", srai=False) conversation1.record_question(question) redis.save_conversation(conversation1, client_context.userid) conversation2 = Conversation(client_context) redis.load_conversation(conversation2, client_context.userid) self.assertIsNotNone(conversation2) self.assertIsNotNone(conversation2.properties) self.assertEquals(conversation1.properties, conversation2.properties)
def test_conversation(self): client_context = ClientContext(TestClient(), "testid") client_context.bot = Bot(BotConfiguration()) client_context.bot.configuration.conversations._max_histories = 3 client_context.brain = client_context.bot.brain conversation = Conversation(client_context) self.assertIsNotNone(conversation) self.assertEqual(0, len(conversation._questions)) self.assertEqual(3, conversation._max_histories) self.assertEqual(1, len(conversation._properties)) with self.assertRaises(Exception): conversation.current_question() with self.assertRaises(Exception): conversation.previous_nth_question(0) question1 = Question.create_from_text( client_context.brain.nlp.tokenizer, "Hello There") conversation.record_question(question1) self.assertEqual(question1, conversation.current_question()) with self.assertRaises(Exception): conversation.previous_nth_question(1) question2 = Question.create_from_text( client_context.brain.nlp.tokenizer, "Hello There Again") conversation.record_question(question2) self.assertEqual(question2, conversation.current_question()) self.assertEqual(question1, conversation.previous_nth_question(1)) with self.assertRaises(Exception): conversation.previous_nth_question(3) question3 = Question.create_from_text( client_context.brain.nlp.tokenizer, "Hello There Again Again") conversation.record_question(question3) self.assertEqual(question3, conversation.current_question()) self.assertEqual(question2, conversation.previous_nth_question(1)) with self.assertRaises(Exception): conversation.previous_nth_question(4) # Max Histories for this test is 3 # Therefore we should see the first question, pop of the stack question4 = Question.create_from_text( client_context.brain.nlp.tokenizer, "Hello There Again Again Again") conversation.record_question(question4) self.assertEqual(question4, conversation.current_question()) self.assertEqual(question3, conversation.previous_nth_question(1)) with self.assertRaises(Exception): conversation.previous_nth_question(5)