"""Tests for products model.""" import pytest from src.configs import config from src.constants import fields from src.constants import services from src.models import products def request_result(upcs): """Generate fake service response.""" items = [] for i in upcs: items.append({ fields.UPC: 10 + i, fields.DISPLAY_UPC: '00{}'.format(i), fields.PRODUCT_ID: i}) return {fields.RESULT_ITEMS: items} def processed_result(upcs): """Generate fake processed response.""" items = {} for i in upcs: items[10 + i] = { fields.DISPLAY_UPC: '00{}'.format(i), fields.PRODUCT_ID: i} return items @pytest.mark.parametrize( 'post_result, expected_result, upcs', ( (request_result([1, 2, 3]), processed_result([1, 2, 3]), [1, 2, 3]), (None, {}, [1]), ({fields.RESULT_ITEMS: []}, {}, [1]), ({fields.RESULT_ITEMS: None}, {}, [1]), ) ) def test_get_release_bulk( post_result, expected_result, upcs, mocker): """Test get_release_bulk function.""" mocked_config = mocker.patch('src.models.products.config') mocked_config.OWS_PRODUCT_UPC_BATCH_SIZE = len(upcs) + 1 mocked_request = mocker.patch('src.models.products.request') mocked_post = mocked_request.post mocked_post.return_value = post_result result = products.get_release_bulk(upcs) assert result == expected_result mocked_post.assert_called_once_with( services.OWS_PRODUCT, '/bulk-upc', json={fields.PRODUCT_UPCS: upcs}) def test_get_release_bulk_batches(mocker): """Test get_release_bulk function with batch requests.""" upcs = [1, 2, 3] request_results = [ request_result([1, 2]), request_result([3]), ] expected_result = processed_result([1, 2, 3]) mocked_config = mocker.patch('src.models.products.config') mocked_config.OWS_PRODUCT_UPC_BATCH_SIZE = 2 mocked_request = mocker.patch('src.models.products.request') mocked_post = mocked_request.post mocked_post.side_effect = request_results result = products.get_release_bulk(upcs) assert result == expected_result assert mocked_post.call_count == 2 assert mocked_post.call_args_list == [ mocker.call(services.OWS_PRODUCT, '/bulk-upc', json={ fields.PRODUCT_UPCS: [1, 2]}), mocker.call(services.OWS_PRODUCT, '/bulk-upc', json={ fields.PRODUCT_UPCS: [3]}), ] def test_ows_product_batch_size_is_valid(): """Test OWS_PRODUCT_UPC_BATCH_SIZE has valid value.""" assert isinstance(config.OWS_PRODUCT_UPC_BATCH_SIZE, int) assert 0 < config.OWS_PRODUCT_UPC_BATCH_SIZE <= 100