"""Tests for tasks logic.""" from flexmock import flexmock from oto import response from availability.constants import models from availability.logic import task as task_logic from availability.models import task as task_model from availability.models import task_log def test_reset_stuck_tasks_success(): """Test reset_stuck_tasks() properly calls models layer functions.""" store_id = 1 task_id = 42 product_in_store_id = 128 kwargs = dict(king='arthur') mock_task_row = flexmock( product_in_store_id=product_in_store_id, task_id=task_id) mock_response = [mock_task_row] num_failed = 2 num_in_queue = 3 num_processing = 4 # Mock and check parameters for each fetch function call. (flexmock(task_model) .should_receive('get_failed_tasks') .with_args(store_id=store_id, **kwargs) .and_return(response.Response(mock_response * num_failed)) .once()) (flexmock(task_model) .should_receive('get_stuck_tasks') .with_args(store_id=store_id, task_status=models.TASK_STATUS_IN_QUEUE) .and_return(response.Response(mock_response * num_in_queue)) .once()) (flexmock(task_model) .should_receive('get_stuck_tasks') .with_args(store_id=store_id, task_status=models.TASK_STATUS_PROCESSING) .and_return(response.Response(mock_response * num_processing)) .once()) # Expect change_status to be called once for each task in each fetch # function result. (flexmock(task_model) .should_receive('change_status') .with_args(mock_task_row.product_in_store_id, models.TASK_STATUS_OK) .and_return(response.Response()) .times(num_failed + num_in_queue + num_processing)) # Expect to be called once for each fetch function call. (flexmock(task_log) .should_receive('bulk_create_task_log') .with_args( task_ids=[task_id] * num_failed, message=str, message_type=models.TASK_LOG_TYPE_ADD_FAILED) .once()) (flexmock(task_log) .should_receive('bulk_create_task_log') .with_args( task_ids=[task_id] * num_in_queue, message=str, message_type=models.TASK_LOG_TYPE_ADD_STUCK) .once()) (flexmock(task_log) .should_receive('bulk_create_task_log') .with_args( task_ids=[task_id] * num_processing, message=str, message_type=models.TASK_LOG_TYPE_ADD_STUCK) .once()) result = task_logic.reset_stuck_tasks(store_id=store_id, **kwargs) assert isinstance(result, response.Response) assert result def test_reset_stuck_tasks_fetch_func_error(): """Test reset_stuck_tasks() returns error from a fetch function.""" error_response = response.create_error_response(code='bad', message='') (flexmock(task_model) .should_receive('get_failed_tasks') .and_return(error_response) .once()) result = task_logic.reset_stuck_tasks(store_id=1) assert result is error_response assert not result def test_reset_stuck_tasks_change_func_error(): """Test reset_stuck_tasks() returns error from change_status() function.""" error_response = response.create_error_response(code='bad', message='') (flexmock(task_model) .should_receive('get_failed_tasks') .and_return(response.Response( [flexmock(product_in_store_id=1, id=42)])) .once()) (flexmock(task_model) .should_receive('change_status') .and_return(error_response) .once()) result = task_logic.reset_stuck_tasks(store_id=1) assert result is error_response assert not result