"""Test GET /orders endpoint.""" from unittest.mock import patch import pytest from ows_product_physical.logic import orders @pytest.mark.parametrize('url,logic_kwargs', [ ['/orders?ids=1,2', { 'ids': [1, 2] }], ['/orders?limit=200', { 'limit': 200 }], ['/orders?limit=200&offset=50', { 'limit': 200, 'offset': 50 }], ['/orders?limit=50&order_by=last_updated&order_dir=desc', { 'limit': 50, 'order_by': 'last_updated', 'order_dir': 'desc' }], ['/orders?limit=50&order_by=last_updated&order_dir=desc', { 'limit': 50, 'order_by': 'last_updated', 'order_dir': 'desc' }], ['/orders?limit=50&order_by=last_updated&order_dir=desc', { 'limit': 50, 'order_by': 'last_updated', 'order_dir': 'desc' }], ['/orders?delivery_statuses=in_progress,complete&delivery_store_ids=1705', { # noqa 'delivery_statuses': ['in_progress', 'complete'], 'delivery_store_ids': [1705] }], ['/orders?delivery_statuses=in_progress,complete&delivery_types=new', { 'delivery_statuses': ['in_progress', 'complete'], 'delivery_types': ['new'] }] ]) def test_get_orders_schema_valid_payload( url, logic_kwargs, fixture_response_ok, client, distribution_profile_header ): """Test that a valid payload will be serialized correctly.""" with patch.object( orders, 'get_orders', return_value=fixture_response_ok ) as mock_logic: result = client.get(url, headers=distribution_profile_header) assert result.status_code == 200 mock_logic.assert_called_once_with(**logic_kwargs) def test_orders_no_headers( client, distribution_profile_header, fixture_response_ok ): """Test invalid `GET /orders`.""" with patch.object( orders, 'get_orders', return_value=fixture_response_ok ) as mock_logic: result = client.get('/orders') assert result.status_code == 403 mock_logic.assert_not_called() def test_orders_grass_headers( client, valid_get_header, fixture_response_ok ): """Test invalid `GET /orders`.""" with patch.object( orders, 'get_orders', return_value=fixture_response_ok ) as mock_logic: result = client.get( '/orders', headers=valid_get_header) assert result.status_code == 403 mock_logic.assert_not_called() @pytest.mark.parametrize( 'args,error_message', [ ({'limit': '-2'}, {'limit': ['Must be greater than or equal to 1.']}), ({'limit': '10', 'offset': -2}, {'offset': ['Must be greater than or equal to 0.']}), ( {'order_by': 'status'}, {'order_by': ['Invalid order_by value: status']} ), ( {'order_dir': 'LAST'}, {'order_dir': ['Invalid order_dir value: LAST']} ), ( {'delivery_type': 'LAST'}, {'delivery_type': ['Must be one of: new, update, takedown.']} ), ( {'status': 'done'}, {'status': ['Must be one of: in_progress, complete, cancelled, ready_for_delivery, error.']} # noqa ), ( {'delivery_store_ids': 'Above Beyond'}, {'delivery_store_ids': {'0': ['Not a valid integer.']}} ), ], ) def test_orders_validations( args, error_message, fixture_response_ok, client, distribution_profile_header ): """Test invalid `GET /orders`.""" with patch.object( orders, 'get_orders', return_value=fixture_response_ok ) as mock_logic: result = client.get( '/orders', query_string=args, headers=distribution_profile_header) assert result.status_code == 400 mock_logic.assert_not_called() assert result.json['message'] == error_message