"""Tests for TaskLog model.""" from datetime import datetime from datetime import timedelta import pytest from availability.connectors import sql from availability.constants import models from availability.models import task_log TASK_ID = 42 @pytest.mark.parametrize('message_type', models.TASK_LOG_TYPES_ENUM) def test_create_task_log(test_database, message_type): """Test creation of single log record.""" task_log.create_task_log(TASK_ID, message_type, 'Test message') with sql.session_scope() as session: log_messages = session.query(task_log.TaskLog).all() assert len(log_messages) == 1 log_message = log_messages[0] assert log_message.task_id == TASK_ID assert log_message.message_type == message_type assert log_message.message == 'Test message' assert log_message.datetime >= datetime.utcnow() - timedelta(hours=1) def test_create_task_log_failed(test_database, mocker): """Test that creation of single record with wrong status is impossible. Assert that no records are created and error is sent to sentry. """ sentry_capture_exception_mock = mocker.patch('availability.models.error_handlers.capture_exception') task_log.create_task_log(TASK_ID, 'unknown status', 'Whatever') with sql.session_scope() as session: log_messages = session.query(task_log.TaskLog).all() assert len(log_messages) == 0 assert sentry_capture_exception_mock.called @pytest.mark.parametrize('message_type', models.TASK_LOG_TYPES_ENUM) def test_bulk_create_task_log(test_database, message_type): """Test creation of multiple log records.""" task_ids = list(range(TASK_ID, TASK_ID + 1000)) task_log.bulk_create_task_log(task_ids, message_type, 'Test message') with sql.session_scope() as session: log_messages = session.query(task_log.TaskLog).all() assert len(log_messages) == len(task_ids) hour_ago = datetime.utcnow() - timedelta(hours=1) for i, log_message in enumerate(log_messages): assert log_message.task_id == task_ids[i] assert log_message.message_type == message_type assert log_message.message == 'Test message' assert log_message.datetime >= hour_ago def test_bulk_create_task_log_failed(test_database, mocker): """Test that creation of multiple records with wrong status is impossible. Assert that no records are created and error is sent to sentry. Also assert that only one error is sent to sentry. """ sentry_capture_exception_mock = mocker.patch( 'availability.models.task_log.error_handlers.capture_exception') task_ids = list(range(TASK_ID, TASK_ID + 1000)) task_log.bulk_create_task_log(task_ids, 'unknown status', 'Whatever') with sql.session_scope() as session: log_messages = session.query(task_log.TaskLog).all() assert len(log_messages) == 0 assert sentry_capture_exception_mock.called assert sentry_capture_exception_mock.call_count == 1