"""Tests for handlers.""" from unittest.mock import patch from oto import response from owsrequest.constants import headers import pytest from ows_product_physical.logic import product_delivery @pytest.mark.parametrize( 'args,logic_params', [ ( {}, {'order_by': 'release_id', 'order_dir': 'desc', 'store_id': 1705} ), ( {'limit': '500'}, { 'limit': 500, 'order_by': 'release_id', 'order_dir': 'desc', 'store_id': 1705 } ), ( {'limit': '500', 'offset': '50'}, {'limit': 500, 'offset': 50, 'order_by': 'release_id', 'order_dir': 'desc', 'store_id': 1705} ), ( {'order_by': 'sale_start_date'}, { 'order_by': 'sale_start_date', 'order_dir': 'desc', 'store_id': 1705 } ), ( {'order_by': 'sale_start_date', 'order_dir': 'desc'}, { 'order_by': 'sale_start_date', 'order_dir': 'desc', 'store_id': 1705 } ), ( {'account': '15063'}, {'account': 15063, 'order_by': 'release_id', 'order_dir': 'desc', 'store_id': 1705} ), ( { 'limit': '500', 'offset': '50', 'account': '15063', 'order_by': 'sale_start_date', 'order_dir': 'desc' }, {'account': 15063, 'limit': 500, 'offset': 50, 'order_by': 'sale_start_date', 'order_dir': 'desc', 'store_id': 1705} ), ], ) def test_product_for_new_delivery( args, logic_params, client, distribution_profile_header ): """Test `GET /products//new-delivery` success.""" with patch.object( product_delivery, 'eligible_products_for_new_delivery', return_value=response.Response({'foo': 'bar'}) ) as mock_logic: result = client.get( '/products/1705/new-delivery', query_string=args, headers=distribution_profile_header) assert result.status_code == 200 mock_logic.assert_called_once_with(**logic_params) def test_eligible_product_no_headers(client, distribution_profile_header): """Test invalid `GET /products//new-delivery`.""" with patch.object( product_delivery, 'eligible_products_for_new_delivery', return_value=response.Response({'foo': 'bar'}) ) as mock_logic: result = client.get('/products/1705/new-delivery') assert result.status_code == 403 mock_logic.assert_not_called() def test_eligible_product_no_roles(client, distribution_profile_header): """Test invalid `GET /products//new-delivery`.""" headers1 = distribution_profile_header.copy() del headers1[headers.ORCHARD_ROLES] with patch.object( product_delivery, 'eligible_products_for_new_delivery', return_value=response.Response({'foo': 'bar'}) ) as mock_logic: result = client.get( '/products/1705/new-delivery', headers=headers1) assert result.status_code == 403 mock_logic.assert_not_called() def test_eligible_product_missing_roles(client, distribution_profile_header): """Test invalid `GET /products//new-delivery`.""" headers1 = distribution_profile_header.copy() headers1[headers.ORCHARD_ROLES] = 'manage_nr_deliveries' with patch.object( product_delivery, 'eligible_products_for_new_delivery', return_value=response.Response({'foo': 'bar'}) ) as mock_logic: result = client.get( '/products/1705/new-delivery', headers=headers1) assert result.status_code == 403 mock_logic.assert_not_called() def test_eligible_product_grass_headers(client, valid_get_header): """Test invalid `GET /products//new-delivery`.""" with patch.object( product_delivery, 'eligible_products_for_new_delivery', return_value=response.Response({'foo': 'bar'}) ) as mock_logic: result = client.get( '/products/1705/new-delivery', headers=valid_get_header) assert result.status_code == 403 mock_logic.assert_not_called() @pytest.mark.parametrize( 'args,error_message', [ ({'limit': '-2'}, {'limit': ['Invalid limit']}), ({'limit': '10', 'offset': -2}, {'offset': ['Invalid offset']}), ( {'order_by': 'status'}, {'order_by': ['Invalid order_by. It should be one of release_id,sale_start_date']} # noqa ), ( {'order_dir': 'LAST'}, {'order_dir': ['Invalid order_dir. It should be one of asc,desc']} ), ], ) def test_eligible_product_validations( args, error_message, client, distribution_profile_header ): """Test invalid `GET /products//new-delivery`.""" with patch.object( product_delivery, 'eligible_products_for_new_delivery', return_value=response.Response({'foo': 'bar'}) ) as mock_logic: result = client.get( '/products/1705/new-delivery', query_string=args, headers=distribution_profile_header) assert result.status_code == 400 mock_logic.assert_not_called() assert result.json['message'] == error_message