示例#1
0
    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')
示例#2
0
    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')
示例#3
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')
示例#4
0
    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')
示例#5
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')
示例#6
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)
示例#7
0
    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')])
示例#8
0
    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')
示例#9
0
    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')
示例#10
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')
示例#11
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')