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'
示例#9
0
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)