"""Tests for Bulk Product Update logic.""" import os import sys sys.path.append(os.getcwd()+'\scripts') from unittest.mock import MagicMock # noqa import bulk_update_physical_pricing as update_script # noqa import mock # noqa import pytest # noqa import requests # noqa @pytest.fixture def valid_pricing_row(): """Fixture for valid Pricing batch row.""" return {'release_id': '2115449', 'orchard_price_tier': {'name': 'Vinyl Tier #16'}, 'store_pricing': {'696': '34.78', '738': '24', '739': '0.34', '737': '34.78', '740': '3'}} @pytest.fixture def invalid_pricing_tier_pricing_row(): """Fixture for invalid Pricing tier for release_id.""" return {'release_id': '2115449', 'orchard_price_tier': {'name': 'Deluxe Three'}, 'store_pricing': {'696': '', '738': '24', '739': '0.34', '737': '34.78', '740': '3'}} @pytest.fixture def invalid_release_pricing_row(): """Fixture for invalid family (non-physical) for release_id.""" return {'release_id': '2', 'orchard_price_tier': { 'name': 'Vinyl Tier #16'}, 'store_pricing': { '696': '', '738': '24', '739': '0.34', '737': '34.78', '740': '3'}} @pytest.fixture def physical_pricing_tiers(): """Fixture for Physical pricing tiers against tier-id.""" return {'Vinyl Tier #15': 79, 'CD Tier #1': 1} @pytest.fixture def product_overrides(): """Pricing override response for a product.""" return {'items': [ {'activated': True, 'orchard_pricing_tier_id': 79, 'stores': [696], 'product_id': 1, 'pricing_family_id': 4, 'store_id': '', 'sort_order': 1, 'price_code': '3', 'territories': [], 'product_pricing_override_id': 5291548}, {'activated': True, 'orchard_pricing_tier_id': 79, 'stores': [737], 'product_id': 1, 'pricing_family_id': 4, 'store_id': '', 'sort_order': 2, 'price_code': '3', 'territories': [], 'product_pricing_override_id': 5291552}, {'activated': True, 'orchard_pricing_tier_id': 79, 'stores': [738], 'product_id': 1, 'pricing_family_id': 4, 'store_id': '', 'sort_order': 3, 'price_code': '3', 'territories': [], 'product_pricing_override_id': 5291550}, {'activated': True, 'orchard_pricing_tier_id': 79, 'stores': [739], 'product_id': 1, 'pricing_family_id': 4, 'store_id': '', 'sort_order': 4, 'price_code': '3', 'territories': [], 'product_pricing_override_id': 5291549}, {'activated': True, 'orchard_pricing_tier_id': 79, 'stores': [740], 'product_id': 1, 'pricing_family_id': 4, 'store_id': '', 'sort_order': 5, 'price_code': '3', 'territories': [], 'product_pricing_override_id': 5291551}]} @pytest.fixture def put_overrides_request_body(): """Pricing override response for a product.""" return {'items': [ {'sort_order': 1, 'price_code': '34.78', 'product_id': '2115449', 'applies_worldwide': True, 'activated': True, 'stores': [696], 'pricing_family_id': 4}, {'sort_order': 2, 'price_code': '24', 'product_id': '2115449', 'applies_worldwide': True, 'activated': True, 'stores': [738], 'pricing_family_id': 4}, {'sort_order': 3, 'price_code': '0.34', 'product_id': '2115449', 'applies_worldwide': True, 'activated': True, 'stores': [739], 'pricing_family_id': 4}, {'sort_order': 4, 'price_code': '34.78', 'product_id': '2115449', 'applies_worldwide': True, 'activated': True, 'stores': [737], 'pricing_family_id': 4}, {'sort_order': 5, 'price_code': '3', 'product_id': '2115449', 'applies_worldwide': True, 'activated': True, 'stores': [740], 'pricing_family_id': 4}]} @pytest.fixture def pricing_tiers(): """Pricing Tiers API response.""" return {'items': [{'name': 'CD Tier #1', 'orchard_pricing_tier_id': 40, 'sort_order': 1, 'pricing_family_id': 4, 'is_default': False}, {'name': 'CD Tier #2', 'orchard_pricing_tier_id': 42, 'sort_order': 2, 'pricing_family_id': 4, 'is_default': False}]} @pytest.fixture def pricingtiers_success_response(pricing_tiers): """Mock successful response from get_overrides.""" return MagicMock(json=lambda: pricing_tiers, spec=requests.models.Response, status_code=200) @pytest.fixture def overrides_success_response(product_overrides): """Mock successful response from get_overrides.""" return MagicMock( json=lambda: product_overrides, spec=requests.models.Response, status_code=200 ) def test_get_pricing_tiers( mocker, pricing_tiers, pricingtiers_success_response): """Test get pricing tiers.""" mocker.patch('requests.get', return_value=pricingtiers_success_response) result = update_script.get_physical_pricing_tiers() assert result.json() == pricing_tiers def test_get_pricing_override( mocker, valid_pricing_row, product_overrides, overrides_success_response): """Test get pricing overrides for a product.""" mocker.patch('requests.get', return_value=overrides_success_response) result = update_script.get_pricing_override( valid_pricing_row['release_id']) assert result.json() == product_overrides def test_validate_success(valid_pricing_row, physical_pricing_tiers): """Test validate pricing data.""" validate_result = update_script.validate(valid_pricing_row) assert validate_result == ('vinyl tier #16', '') def test_validate_failed_invalid_tier( invalid_pricing_tier_pricing_row, physical_pricing_tiers): """Test validate pricing data.""" validate_result = update_script.validate(invalid_pricing_tier_pricing_row) assert not validate_result[0] def test_validate_failed_invalid_release( invalid_release_pricing_row, physical_pricing_tiers): """Test validate pricing data.""" validate_result = update_script.validate(invalid_release_pricing_row) assert not validate_result[0] @mock.patch('bulk_update_physical_pricing.requests') def test_put_overrides_success( mock_request, valid_pricing_row, product_overrides, put_overrides_request_body): """Test put_overrides for success response.""" valid_pricing_tier = ('vinyl tier #16', '') data = {'items': put_overrides_request_body['items']} update_script.put_overrides( valid_pricing_row, valid_pricing_tier, product_overrides['items']) mock_request.put.assert_called() @mock.patch('bulk_update_physical_pricing.validate') @mock.patch('bulk_update_physical_pricing.put_overrides') @mock.patch('bulk_update_physical_pricing.get_pricing_override') @mock.patch('bulk_update_physical_pricing.requests') def test_ingest_pricing_row( mock_put_pricingtier, mock_get_overrides, mock_put_overrides, mock_validate, valid_pricing_row, overrides_success_response, product_overrides): """Test ingest pricing row.""" valid_pricing_tier = 79 mock_get_overrides.return_value = overrides_success_response mock_validate.return_value = ('vinyl tier #16', '') update_script.ingest_pricing_row(valid_pricing_row) mock_put_pricingtier.put.assert_called_with( 'https://qa-ows-pricing.theorchard.io/product/{}/pricing-family/4/\ orchard_pricing_tier'.format(valid_pricing_row['release_id']), json={'orchard_pricing_tier_id': valid_pricing_tier}) mock_put_overrides.assert_called_with( valid_pricing_row, valid_pricing_tier, product_overrides['items'])