def test_validate_non_admin_sender(self): valid_twilio_event[u'From'] = '+19999999' self.subject = TwilioReceiver(valid_twilio_event, root_logger) self.subject.client = MagicMock() self.subject.validator = MagicMock() self.subject.validator.validate.return_value = True self.assertEqual(self.subject.validate(), False) valid_twilio_event[u'From'] = u'%2B187654321'
def test_validate_inits_validator(self): with patch('twilio_receiver.RequestValidator' ) as mock_twilio_request_validator: TwilioReceiver({}, root_logger) mock_twilio_request_validator.assert_called_with( env.get('TWILIO_AUTH_TOKEN'))
def test_twilio_event_parse_failure(self): self.assertEqual(TwilioReceiver({}, root_logger).event, {})
def test_twilio_client_setup(self): with patch('twilio_receiver.Client') as mock_twilio_client_init: TwilioReceiver({}, root_logger) mock_twilio_client_init.assert_called_with( env.get('TWILIO_ACCOUNT_SID'), env.get('TWILIO_AUTH_TOKEN'))
def setUp(self): self.patch_environ(env) self.subject = TwilioReceiver(valid_twilio_event, root_logger) self.subject.client = MagicMock() self.subject.validator = MagicMock()
class TwilioReceiverTestCase(unittest.TestCase): def create_patch(self, name): patcher = patch(name) thing = patcher.start() self.addCleanup(patcher.stop) return thing def patch_environ(self, env): patcher = patch.dict('os.environ', env) thing = patcher.start() self.addCleanup(patcher.stop) return thing def setUp(self): self.patch_environ(env) self.subject = TwilioReceiver(valid_twilio_event, root_logger) self.subject.client = MagicMock() self.subject.validator = MagicMock() def test_twilio_client_setup(self): with patch('twilio_receiver.Client') as mock_twilio_client_init: TwilioReceiver({}, root_logger) mock_twilio_client_init.assert_called_with( env.get('TWILIO_ACCOUNT_SID'), env.get('TWILIO_AUTH_TOKEN')) def test_admin_number_setup(self): valid_admin_numbers = [ x.encode('utf8') for x in env['ADMIN_NUMBERS'].split(',') ] self.assertEqual(self.subject.admin_numbers, valid_admin_numbers) def test_twilio_event_parsed_correctly(self): self.assertEqual(self.subject.twilio_signature, valid_twilio_event[u'twilioSignature']) self.assertEqual(self.subject.event['Body'], valid_twilio_event[u'Body']) self.assertEqual(self.subject.event['To'], f'+{env.get("TWILIO_NUMBER")}') self.assertEqual(self.subject.event['From'], f'+187654321') self.assertEqual(self.subject.event.get('twilioSignature'), None) def test_twilio_event_parse_failure(self): self.assertEqual(TwilioReceiver({}, root_logger).event, {}) def test_validate_inits_validator(self): with patch('twilio_receiver.RequestValidator' ) as mock_twilio_request_validator: TwilioReceiver({}, root_logger) mock_twilio_request_validator.assert_called_with( env.get('TWILIO_AUTH_TOKEN')) def test_validate_success(self): self.subject.validator.validate.return_value = True self.assertEqual(self.subject.validate(), True) self.subject.validator.validate.assert_called_with( env.get('REQUEST_URL'), valid_twilio_params, valid_twilio_event[u'twilioSignature']) def test_validate_invalid_request(self): self.subject.validator.validate.return_value = False self.assertEqual(self.subject.validate(), False) def test_validate_non_admin_sender(self): valid_twilio_event[u'From'] = '+19999999' self.subject = TwilioReceiver(valid_twilio_event, root_logger) self.subject.client = MagicMock() self.subject.validator = MagicMock() self.subject.validator.validate.return_value = True self.assertEqual(self.subject.validate(), False) valid_twilio_event[u'From'] = u'%2B187654321' def test_message(self): valid_twilio_event[u'Body'] = 'bayorang baby' self.subject = TwilioReceiver(valid_twilio_event, root_logger) self.assertEqual(self.subject.message(), 'bayorang baby') valid_twilio_event[u'Body'] = 'Startup' def test_ip(self): valid_twilio_event[u'Body'] = 'whitelist add 1.2.3.4 as example' self.subject = TwilioReceiver(valid_twilio_event, root_logger) self.assertEqual(self.subject.ip(), '1.2.3.4') valid_twilio_event[u'Body'] = 'Startup' def test_ip_description(self): valid_twilio_event[u'Body'] = 'whitelist add 1.2.3.4 as example' self.subject = TwilioReceiver(valid_twilio_event, root_logger) self.assertEqual(self.subject.ip_description(), 'example') valid_twilio_event[u'Body'] = 'Startup' def test_sender(self): self.assertEqual( self.subject.sender(), urllib.parse.unquote_plus(valid_twilio_event[u'From'])) def test_send_sms(self): number = '987654321' message = 'Bingo! Unity.' self.subject.send_sms(number, message) self.subject.client.messages.create.assert_called_with( body=message, from_=self.subject.twilio_number, to=number)
def test_ip_description(self): valid_twilio_event[u'Body'] = 'whitelist add 1.2.3.4 as example' self.subject = TwilioReceiver(valid_twilio_event, root_logger) self.assertEqual(self.subject.ip_description(), 'example') valid_twilio_event[u'Body'] = 'Startup'
def test_message(self): valid_twilio_event[u'Body'] = 'bayorang baby' self.subject = TwilioReceiver(valid_twilio_event, root_logger) self.assertEqual(self.subject.message(), 'bayorang baby') valid_twilio_event[u'Body'] = 'Startup'
def lambda_handler(event, context): resp = MessagingResponse() root_logger = logging.getLogger() root_logger.setLevel(logging.INFO) handler = logging.StreamHandler(sys.stdout) handler.setLevel(logging.INFO) root_logger.addHandler(handler) incoming_twilio = TwilioReceiver(event, root_logger) twilio_response = MessagingResponse() print("Received event: " + str(event)) print(f'Form params: {incoming_twilio.event}') print(f'Incoming SMS: {incoming_twilio.message()}') if not incoming_twilio.validate(): twilio_response.message("I'm sorry, but I can't help you.") return str(twilio_response) else: ec2_manager = Ec2Manager(root_logger) minecraft_host = os.environ['MINECRAFT_HOST'] minecraft_port = os.environ['MINECRAFT_PORT'] if incoming_twilio.message().lower() == 'status': if ec2_manager.instance_status() == 'running': twilio_response.message( 'Minecraft server online: %s on port %d:' % (minecraft_host, int(minecraft_port))) else: twilio_response.message( 'Server instance is not running. Text "startup" to get it running.' ) elif incoming_twilio.message().lower() == 'startup': incoming_twilio.send_sms(incoming_twilio.sender(), 'Starting Minecraft server...') if ec2_manager.start_instance(): twilio_response.message( f'Minecraft server started at {minecraft_host}. Give it a minute to warm up :-)' ) else: twilio_response.message( "Unable to start the server at this time.") elif incoming_twilio.message().lower() == 'shutdown': incoming_twilio.send_sms(incoming_twilio.sender(), 'Stopping Minecraft server...') if ec2_manager.stop_instance(): twilio_response.message('Minecraft server shutting down.') else: twilio_response.message( "Unable to shutdown the server at this time.") elif incoming_twilio.message().lower().startswith('whitelist add '): if len(incoming_twilio.ip()) > 0: ec2_manager.add_ip_to_whitelist( incoming_twilio.ip(), minecraft_port, incoming_twilio.ip_description()) twilio_response.message( f'Added {incoming_twilio.ip()} to whitelist as "{incoming_twilio.ip_description()}"' ) else: twilio_response.message( "usage: whitelist add 123.456.78.9 as person's home") elif incoming_twilio.message().lower().startswith('whitelist remove '): if len(incoming_twilio.ip()) > 0: ec2_manager.remove_ip_from_whitelist( incoming_twilio.ip(), minecraft_port, incoming_twilio.ip_description()) twilio_response.message = f'Removed {incoming_twilio.ip()} from whitelist.' else: twilio_response.message( "usage: whitelist add 123.456.78.9 as person's home") else: twilio_response.message( 'Valid commands are: "status", "startup", "shutdown", or "whitelist"' ) return str(twilio_response)