def test_writes_incomplete_fraud_event_to_audit_events_table_but_not_to_fraud_events_table(self): self.__setup_s3() with LogCapture('event-recorder', propagate=False) as log_capture: message_ids = self.__encrypt_and_send_to_sqs( [ create_fraud_event_without_idp_fraud_event_id_string('sample-id-1', 'session-id-1'), ] ) event_handler.store_queued_events(None, None) self.__assert_audit_events_table_has_fraud_event_records([('sample-id-1', 'session-id-1', None)]) self.__assert_billing_events_table_has_no_billing_event_records self.__assert_fraud_events_table_has_no_fraud_event_records log_capture.check( ('event-recorder', 'INFO', 'Got decryption key from S3'), ('event-recorder', 'INFO', 'Decrypted key successfully'), ('event-recorder', 'INFO', 'Created connection to DB'), ('event-recorder', 'INFO', 'Decrypted event with ID: sample-id-1'), ('event-recorder', 'INFO', 'Stored audit event: sample-id-1'), ('event-recorder', 'WARNING', 'Failed to store a fraud event [Event ID sample-id-1] due to key error'), ('event-recorder', 'ERROR', 'Failed to store event {0}, event type "{1}" from SQS message ID {2}'.format( 'sample-id-1', EVENT_TYPE, message_ids[0])), ('event-recorder', 'INFO', 'Queue is empty - finishing after 1 events') ) self.assertEqual(self.__number_of_visible_messages(), '0') self.assertEqual(self.__number_of_hidden_messages(), '1')
def test_reads_messages_from_queue_with_key_from_s3(self): self.__setup_s3() event_id_3 = str(uuid.uuid4()) event_id_4 = str(uuid.uuid4()) self.__encrypt_and_send_to_sqs( [ create_event_string('sample-id-1', 'session-id-1'), create_event_string('sample-id-2', 'session-id-2'), create_fraud_event_string(event_id_3, 'session-id-3', 'fraud-event-id-1'), create_fraud_event_string(event_id_4, 'session-id-4', 'fraud-event-id-2'), ] ) event_handler.store_queued_events(None, None) self.__assert_audit_events_table_has_billing_event_records( [('sample-id-1', 'session-id-1'), ('sample-id-2', 'session-id-2')], MINIMUM_LEVEL_OF_ASSURANCE) self.__assert_audit_events_table_has_fraud_event_records( [(event_id_3, 'session-id-3', 'fraud-event-id-1'), (event_id_4, 'session-id-4', 'fraud-event-id-2')]) self.__assert_billing_events_table_has_billing_event_records( [('session-id-1', 'sample-id-1'), ('session-id-2', 'sample-id-2')]) self.__assert_fraud_events_table_has_fraud_event_records( [(event_id_3, 'session-id-3', 'fraud-event-id-1'), (event_id_4, 'session-id-4', 'fraud-event-id-2')]) self.assertEqual(self.__number_of_visible_messages(), '0') self.assertEqual(self.__number_of_hidden_messages(), '0')
def test_does_not_delete_invalid_messages(self): self.__setup_s3() with LogCapture('event-recorder', propagate=False) as log_capture: message_ids = self.__encrypt_and_send_to_sqs( [ 'invalid event', create_event_string('sample-id-2', 'session-id-2'), ] ) event_handler.store_queued_events(None, None) self.__assert_audit_events_table_has_billing_event_records( [('sample-id-2', 'session-id-2')], MINIMUM_LEVEL_OF_ASSURANCE) self.__assert_billing_events_table_has_billing_event_records([('session-id-2', 'sample-id-2')]) self.__assert_fraud_events_table_has_no_fraud_event_records log_capture.check( ('event-recorder', 'INFO', 'Got decryption key from S3'), ('event-recorder', 'INFO', 'Decrypted key successfully'), ('event-recorder', 'INFO', 'Created connection to DB'), ('event-recorder', 'ERROR', 'Failed to decrypt message, SQS ID = {0}'.format(message_ids[0])), ('event-recorder', 'INFO', 'Decrypted event with ID: sample-id-2'), ('event-recorder', 'INFO', 'Stored audit event: sample-id-2'), ('event-recorder', 'INFO', 'Stored billing event: sample-id-2'), ('event-recorder', 'INFO', 'Deleted event from queue with ID: sample-id-2'), ('event-recorder', 'INFO', 'Queue is empty - finishing after 2 events') ) self.assertEqual(self.__number_of_visible_messages(), '0') self.assertEqual(self.__number_of_hidden_messages(), '1')
def test_records_error_but_does_delete_messages_for_duplicate_events(self): self.__setup_s3() with LogCapture('event-recorder', propagate=False) as log_capture: self.__encrypt_and_send_to_sqs( [ create_event_string('sample-id-1', 'session-id-1'), create_event_string('sample-id-1', 'session-id-1'), ] ) event_handler.store_queued_events(None, None) self.__assert_audit_events_table_has_billing_event_records([('sample-id-1', 'session-id-1')], MINIMUM_LEVEL_OF_ASSURANCE) self.__assert_billing_events_table_has_billing_event_records([('session-id-1', 'sample-id-1')]) self.__assert_fraud_events_table_has_no_fraud_event_records log_capture.check( ('event-recorder', 'INFO', 'Got decryption key from S3'), ('event-recorder', 'INFO', 'Decrypted key successfully'), ('event-recorder', 'INFO', 'Created connection to DB'), ('event-recorder', 'INFO', 'Decrypted event with ID: sample-id-1'), ('event-recorder', 'INFO', 'Stored audit event: sample-id-1'), ('event-recorder', 'INFO', 'Stored billing event: sample-id-1'), ('event-recorder', 'INFO', 'Deleted event from queue with ID: sample-id-1'), ('event-recorder', 'INFO', 'Decrypted event with ID: sample-id-1'), ('event-recorder', 'WARNING', 'Failed to store an audit event. The Event ID sample-id-1 already exists in the database'), ('event-recorder', 'INFO', 'Stored audit event: sample-id-1'), ('event-recorder', 'INFO', 'Stored billing event: sample-id-1'), ('event-recorder', 'INFO', 'Deleted event from queue with ID: sample-id-1'), ('event-recorder', 'INFO', 'Queue is empty - finishing after 2 events') ) self.assertEqual(self.__number_of_visible_messages(), '0') self.assertEqual(self.__number_of_hidden_messages(), '0')
def test_reads_messages_from_queue(self): self.__encrypt_and_send_to_sqs([ create_event_string('sample-id-1'), create_event_string('sample-id-2'), ]) event_handler.store_queued_events(None, None) self.__assert_database_has_records(['sample-id-1', 'sample-id-2']) self.assertEqual(self.__number_of_visible_messages(), '0') self.assertEqual(self.__number_of_hidden_messages(), '0')
def test_event_handler_logs_event_to_stdout(self): self.__setup_s3() with OutputCapture() as output: events = [ create_event_string('sample-id-1', 'session-id-1'), create_event_string('sample-id-1', 'session-id-1'), ] self.__encrypt_and_send_to_sqs(events) event_handler.store_queued_events(None, None) for event in events: self.assertIn(event, output.captured)
def test_writes_messages_to_db_with_password_from_env(self): self.__setup_s3() self.__setup_db_connection_string(True) self.__encrypt_and_send_to_sqs( [ create_event_string('sample-id-1', 'session-id-1'), create_event_string('sample-id-2', 'session-id-2'), ] ) event_handler.store_queued_events(None, None) self.__assert_audit_events_table_has_billing_event_records([('sample-id-1', 'session-id-1'), ('sample-id-2', 'session-id-2')], MINIMUM_LEVEL_OF_ASSURANCE) self.__assert_billing_events_table_has_billing_event_records([('session-id-1', 'sample-id-1'), ('session-id-2','sample-id-2')])
def test_does_not_delete_invalid_messages(self): with LogCapture('event-recorder', propagate=False) as log_capture: self.__encrypt_and_send_to_sqs([ 'invalid event', create_event_string('sample-id-2'), ]) event_handler.store_queued_events(None, None) self.__assert_database_has_records(['sample-id-2']) log_capture.check( ('event-recorder', 'ERROR', 'Failed to store message')) self.assertEqual(self.__number_of_visible_messages(), '0') self.assertEqual(self.__number_of_hidden_messages(), '1')
def test_reads_messages_from_queue_with_key_from_env(self): os.environ['ENCRYPTION_KEY'] = self.__encrypt(ENCRYPTION_KEY) self.__encrypt_and_send_to_sqs( [ create_event_string('sample-id-1', 'session-id-1'), create_event_string('sample-id-2', 'session-id-2'), ] ) event_handler.store_queued_events(None, None) self.__assert_audit_events_table_has_billing_event_records([('sample-id-1', 'session-id-1'), ('sample-id-2', 'session-id-2')], MINIMUM_LEVEL_OF_ASSURANCE) self.__assert_billing_events_table_has_billing_event_records([('session-id-1', 'sample-id-1'), ('session-id-2','sample-id-2')]) self.__assert_fraud_events_table_has_no_fraud_event_records self.assertEqual(self.__number_of_visible_messages(), '0') self.assertEqual(self.__number_of_hidden_messages(), '0')
def test_reads_fraud_events_from_queue(self): self.__setup_s3() self.__encrypt_and_send_to_sqs( [ create_fraud_event_string('sample-id-1', 'session-id-1', 'fraud-event-id-1'), create_fraud_event_string('sample-id-2', 'session-id-2', 'fraud-event-id-2'), ] ) event_handler.store_queued_events(None, None) self.__assert_audit_events_table_has_fraud_event_records([('sample-id-1', 'session-id-1', 'fraud-event-id-1'), ('sample-id-2', 'session-id-2', 'fraud-event-id-2')]) self.__assert_billing_events_table_has_no_billing_event_records self.__assert_fraud_events_table_has_fraud_event_records([('session-id-1', 'fraud-event-id-1'), ('session-id-2', 'fraud-event-id-2')]) self.assertEqual(self.__number_of_visible_messages(), '0') self.assertEqual(self.__number_of_hidden_messages(), '0')
def test_records_error_but_does_delete_messages_for_duplicate_events(self): with LogCapture('event-recorder', propagate=False) as log_capture: self.__encrypt_and_send_to_sqs([ create_event_string('sample-id-1'), create_event_string('sample-id-1'), ]) event_handler.store_queued_events(None, None) self.__assert_database_has_records(['sample-id-1']) log_capture.check(( 'event-recorder', 'WARNING', 'Failed to store message. The Event ID sample-id-1 already exists in the database' )) self.assertEqual(self.__number_of_visible_messages(), '0') self.assertEqual(self.__number_of_hidden_messages(), '0')