def __init__(self, name): BaseContainerConfigurationData.__init__(self, name) self._description = 'ProgramY AIML2.0 Client' self._bot_configs = [] self._bot_configs.append(BotConfiguration("bot")) self._bot_selector = None self._renderer = None self._scheduler = SchedulerConfiguration() self._storage = StorageConfiguration() self._email = EmailConfiguration() self._triggers = TriggerConfiguration()
def test_to_yaml_with_defaults(self): email_config = EmailConfiguration() data = {} email_config.to_yaml(data, defaults=True) self.assertEquals( { 'from_addr': None, 'host': None, 'password': None, 'port': None, 'username': None }, data)
def __init__(self, name): BaseContainerConfigurationData.__init__(self, name) self._description = 'ProgramY AIML2.0 Client' self._renderer = self._get_renderer_class() self._scheduler = SchedulerConfiguration() self._storage = StorageConfiguration() self._email = EmailConfiguration() self._triggers = TriggerConfiguration() self._responder = PingResponderConfig() self._bot_selector = self._get_bot_selector_class() bot_config = BotConfiguration('bot') self._bot_configs = [bot_config]
def test_send(self): config = EmailConfiguration() sender = EmailSender(config) sender.send("*****@*****.**", "New patio", "Do you need any help with the slabs?")
def test_with_no_data(self): yaml = YamlConfigurationFile() self.assertIsNotNone(yaml) yaml.load_from_text(""" console: """, ConsoleConfiguration(), ".") client_config = yaml.get_section("email") email_config = EmailConfiguration() email_config.load_config_section(yaml, client_config, ".") self.assertIsNone(email_config.host) self.assertIsNone(email_config.port) self.assertIsNone(email_config.username) self.assertIsNone(email_config.password) self.assertIsNone(email_config.from_addr)
def test_get_ctype_and_attachment(self): config = EmailConfiguration() sender = MockEmailSender(config, mock_sender=MockSMTPServer("127.0.0.1", 80)) attachment = os.path.dirname(__file__) + os.sep + "test.txt" sender._get_ctype_and_attachment(attachment, "utf-8")
def test_with_username_for_addr(self): yaml = YamlConfigurationFile() self.assertIsNotNone(yaml) yaml.load_from_text( """ console: email: host: 127.0.0.1 port: 80 username: emailuser password: emailpassword """, ConsoleConfiguration(), ".") client_config = yaml.get_section("console") email_config = EmailConfiguration() email_config.load_config_section(yaml, client_config, ".") self.assertEquals("emailuser", email_config.from_addr)
def test_send_message_with_unknown_file_attachment(self): config = EmailConfiguration() sender = MockEmailSender(config, mock_sender=MockSMTPServer("127.0.0.1", 80)) attachment = os.path.dirname(__file__) + os.sep + "unknown.???" sender.send("*****@*****.**", "New patio", "Do you need any help with the slabs?", [attachment]) self.assertFalse(sender.mock_sender.did_ehlo)
def test_send_message_multiple_recipients(self): config = EmailConfiguration() sender = MockEmailSender(config, mock_sender=MockSMTPServer("127.0.0.1", 80)) sender.send(["*****@*****.**", "*****@*****.**"], "New patio", "Do you need any help with the slabs?") self.assertTrue(sender.mock_sender.did_ehlo) self.assertTrue(sender.mock_sender.did_starttls) self.assertTrue(sender.mock_sender.did_login) self.assertTrue(sender.mock_sender.did_quit)
def test_get_ctype_and_attachment_attachment_not_nonw(self): config = EmailConfiguration() sender = MockEmailSender(config, mock_sender=MockSMTPServer("127.0.0.1", 80), ctype=None, attachment_encoding="utf-8") attachment = os.path.dirname(__file__) + os.sep + "test.txt" ctype, attachment_encoding = sender._get_ctype_and_attachment(attachment, None) self.assertEquals("application/octet-stream", ctype) self.assertEquals("utf-8", attachment_encoding)
def test_get_ctype_and_attachment_both_none(self): config = EmailConfiguration() sender = MockEmailSender(config, mock_sender=MockSMTPServer("127.0.0.1", 80), ctype=None, attachment_encoding=None) attachment = os.path.dirname(__file__) + os.sep + "test.txt" ctype, attachment_encoding = sender._get_ctype_and_attachment(attachment, None) self.assertEquals("text/plain", ctype) self.assertEquals("utf-8", attachment_encoding)
def test_to_yaml_without_defaults(self): yaml = YamlConfigurationFile() self.assertIsNotNone(yaml) yaml.load_from_text( """ console: email: host: 127.0.0.1 port: 80 username: emailuser password: emailpassword """, ConsoleConfiguration(), ".") client_config = yaml.get_section("console") email_config = EmailConfiguration() email_config.load_config_section(yaml, client_config, ".") data = {} email_config.to_yaml(data, defaults=False) self.assertEquals( { 'from_addr': 'emailuser', 'host': '127.0.0.1', 'password': '******', 'port': 80, 'username': '******' }, data)
def test_with_data(self): yaml = YamlConfigurationFile() self.assertIsNotNone(yaml) yaml.load_from_text( """ console: email: host: 127.0.0.1 port: 80 username: emailuser password: emailpassword from_addr: emailfromuser """, ConsoleConfiguration(), ".") client_config = yaml.get_section("console") email_config = EmailConfiguration() email_config.load_config_section(yaml, client_config, ".") license_keys = LicenseKeys() email_config.check_for_license_keys(license_keys) self.assertEqual("127.0.0.1", email_config.host) self.assertEqual(80, email_config.port) self.assertEqual("emailuser", email_config.username) self.assertEqual("emailpassword", email_config.password) self.assertEqual("emailfromuser", email_config.from_addr)
def test_add_attachement_ctype_ecoding(self): config = EmailConfiguration() sender = MockEmailSender(config, mock_sender=MockSMTPServer("127.0.0.1", 80)) msg = MIMEMultipart() attachment = os.path.dirname(__file__) + os.sep + "test.txt" sender._add_attachement(msg, attachment, ctype='text/plain', encoding="utf-8") self.assertEquals([('Content-Type', 'multipart/mixed'), ('MIME-Version', '1.0')], msg.items()) self.assertEquals(1, len(msg.get_payload()))
def test_add_attachement_no_ctype_no_encoding_compressed(self): config = EmailConfiguration() sender = MockEmailSender(config, mock_sender=MockSMTPServer("127.0.0.1", 80)) msg = MIMEMultipart() attachment = os.path.dirname(__file__) + os.sep + "something.zip" sender._add_attachement(msg, attachment, ctype=None, encoding=None) self.assertEquals([('Content-Type', 'multipart/mixed'), ('MIME-Version', '1.0')], msg.items()) self.assertEquals(1, len(msg.get_payload()))
def test_send_message_with_text_file_attachment(self): config = EmailConfiguration() sender = MockEmailSender(config, mock_sender=MockSMTPServer("127.0.0.1", 80)) attachment = os.path.dirname(__file__) + os.sep + "test.txt" sender.send("*****@*****.**", "New patio", "Do you need any help with the slabs?", [attachment]) self.assertTrue(sender.mock_sender.did_ehlo) self.assertTrue(sender.mock_sender.did_starttls) self.assertTrue(sender.mock_sender.did_login) self.assertTrue(sender.mock_sender.did_quit)
class ClientConfigurationData(BaseContainerConfigurationData): def __init__(self, name): BaseContainerConfigurationData.__init__(self, name) self._description = 'ProgramY AIML2.0 Client' self._renderer = self._get_renderer_class() self._scheduler = SchedulerConfiguration() self._storage = StorageConfiguration() self._email = EmailConfiguration() self._triggers = TriggerConfiguration() self._responder = PingResponderConfig() self._bot_selector = self._get_bot_selector_class() bot_config = BotConfiguration('bot') self._bot_configs = [bot_config] def _get_renderer_class(self): return "programy.clients.render.text.TextRenderer" def _get_bot_selector_class(self): return "programy.clients.botfactory.DefaultBotSelector" @property def description(self): return self._description @property def configurations(self): return self._bot_configs @property def bot_selector(self): return self._bot_selector @property def scheduler(self): return self._scheduler @property def storage(self): return self._storage @property def renderer(self): return self._renderer @property def email(self): return self._email @property def triggers(self): return self._triggers @property def responder(self): return self._responder def load_configuration(self, configuration_file, bot_root, subs: Substitutions = None): client = configuration_file.get_section(self.section_name) if client is None: YLogger.error( None, 'Client section named [%s] not found, trying "client"', self.section_name) client = configuration_file.get_section('client') if client is not None: self.load_configuration_section(configuration_file, client, bot_root, subs) else: YLogger.error(None, 'No client section not found!') def load_configuration_section(self, configuration_file, section, bot_root, subs: Substitutions = None): assert configuration_file is not None assert section is not None self._description = configuration_file.get_option( section, "description", missing_value='ProgramY AIML2.0 Client', subs=subs) self._scheduler.load_config_section(configuration_file, section, bot_root, subs=subs) self._storage.load_config_section(configuration_file, section, bot_root, subs=subs) self._renderer = configuration_file.get_option(section, "renderer", subs=subs) self._email.load_config_section(configuration_file, section, bot_root, subs=subs) self._triggers.load_config_section(configuration_file, section, bot_root, subs=subs) self._responder.load_config_section(configuration_file, section, bot_root, subs=subs) self._load_bot_configurations(configuration_file, section, bot_root, subs) def _load_bot_configurations(self, configuration_file, section, bot_root, subs): bots = configuration_file.get_section("bots", section) if bots is not None: bot_keys = configuration_file.get_keys(bots) first = True for name in bot_keys: if first is True: self._bot_configs.clear() first = False bot_config = configuration_file.get_section(name, bots) config = BotConfiguration(name) config.load_configuration_section(configuration_file, bot_config, bot_root, subs=subs) self._bot_configs.append(config) if len(self._bot_configs) == 0: YLogger.warning( self, "No bot name defined for client [%s], defaulting to 'bot'.", self.section_name) self._bot_configs.append(BotConfiguration("bot")) self._bot_configs[0].configurations.append( BrainConfiguration("brain")) self._bot_selector = configuration_file.get_option( section, "bot_selector", missing_value="programy.clients.botfactory.DefaultBotSelector", subs=subs) def to_yaml(self, data, defaults=True): assert data is not None if defaults is True: data['description'] = 'ProgramY AIML2.0 Client' data[ 'bot_selector'] = "programy.clients.botfactory.DefaultBotSelector" data['scheduler'] = {} self._scheduler.to_yaml(data['scheduler'], defaults) data['email'] = {} self._email.to_yaml(data['email'], defaults) data['triggers'] = {} self._triggers.to_yaml(data['triggers'], defaults) data['responder'] = {} self._responder.to_yaml(data['responder'], defaults) data['renderer'] = "programy.clients.render.text.TextRenderer" data['storage'] = {} self._storage.to_yaml(data['storage'], defaults) data['bots'] = {} data['bots']['bot'] = {} bot_config = BotConfiguration('bot') bot_config.to_yaml(data['bots']['bot'], defaults) else: data['description'] = self._description data['bot_selector'] = self.bot_selector data[self._scheduler.id] = {} self._scheduler.to_yaml(data[self._scheduler.id], defaults) data['email'] = {} self._email.to_yaml(data['email'], defaults) data['triggers'] = {} self._triggers.to_yaml(data['triggers'], defaults) data['responder'] = {} self._responder.to_yaml(data['responder'], defaults) data['renderer'] = self.renderer data['storage'] = {} self._storage.to_yaml(data['storage'], defaults) data['bots'] = {} for botconfig in self._bot_configs: data['bots'][botconfig.id] = {} botconfig.to_yaml(data['bots'][botconfig.id], defaults)
def test_send_message_multi_result(self): config = EmailConfiguration() sender = MockEmailSender(config, mock_sender=MockSMTPServer("127.0.0.1", 80), result=MockResult({1: "Failed", 2: "Bad"})) sender.send("*****@*****.**", "New patio", "Do you need any help with the slabs?")
class ClientConfigurationData(BaseContainerConfigurationData): def __init__(self, name): BaseContainerConfigurationData.__init__(self, name) self._description = 'ProgramY AIML2.0 Client' self._bot_configs = [] self._bot_configs.append(BotConfiguration("bot")) self._bot_selector = None self._renderer = None self._scheduler = SchedulerConfiguration() self._storage = StorageConfiguration() self._email = EmailConfiguration() self._triggers = TriggerConfiguration() @property def description(self): return self._description @property def configurations(self): return self._bot_configs @property def bot_selector(self): return self._bot_selector @property def scheduler(self): return self._scheduler @property def storage(self): return self._storage @property def renderer(self): return self._renderer @property def email(self): return self._email @property def triggers(self): return self._triggers def check_for_license_keys(self, license_keys): BaseContainerConfigurationData.check_for_license_keys( self, license_keys) def load_configuration(self, configuration_file, bot_root, subs: Substitutions = None): client = configuration_file.get_section(self.section_name) if client is None: YLogger.error( None, 'Client section named [%s] not found, trying "client"', self.section_name) client = configuration_file.get_section('client') if client is not None: self.load_configuration_section(configuration_file, client, bot_root, subs) else: YLogger.error(None, 'No client section not found!') def load_configuration_section(self, configuration_file, section, bot_root, subs: Substitutions = None): assert (configuration_file is not None) if section is not None: self._description = configuration_file.get_option( section, "description", missing_value='ProgramY AIML2.0 Client', subs=subs) bot_names = configuration_file.get_multi_option( section, "bot", missing_value="bot", subs=subs) first = True for name in bot_names: if first is True: config = self._bot_configs[0] first = False else: config = BotConfiguration(name) self._bot_configs.append(config) config.load_configuration(configuration_file, bot_root, subs=subs) self._bot_selector = configuration_file.get_option( section, "bot_selector", missing_value="programy.clients.client.DefaultBotSelector", subs=subs) self._scheduler.load_config_section(configuration_file, section, bot_root, subs=subs) self._storage.load_config_section(configuration_file, section, bot_root, subs=subs) self._renderer = configuration_file.get_option(section, "renderer", subs=subs) self._email.load_config_section(configuration_file, section, bot_root, subs=subs) self._triggers.load_config_section(configuration_file, section, bot_root, subs=subs) else: YLogger.warning( self, "No bot name defined for client [%s], defaulting to 'bot'.", self.section_name) self._bot_configs[0]._section_name = "bot" self._bot_configs[0].load_configuration(configuration_file, bot_root, subs=subs) def to_yaml(self, data, defaults=True): assert (data is not None) if defaults is True: data['description'] = 'ProgramY AIML2.0 Client' data['bot'] = 'bot' data['bot_selector'] = "programy.clients.client.DefaultBotSelector" data['renderer'] = "programy.clients.render.text.TextRenderer" else: data['description'] = self._description data['bot'] = self._bot_configs[0].id data['bot_selector'] = self.bot_selector data['renderer'] = self.renderer data[self._scheduler.id] = {} self._scheduler.to_yaml(data[self._scheduler.id], defaults) data['email'] = {} self._email.to_yaml(data['email'], defaults) data['triggers'] = {} self._triggers.to_yaml(data['triggers'], defaults)
def test_defaults(self): email_config = EmailConfiguration() data = {} email_config.to_yaml(data, True) EmailConfigurationTests.assert_defaults(self, data)