"""Tests for release fetching logic.""" from datetime import datetime from itertools import product from oto import response as oto_response from oto import status import pytest from availability.constants import models from availability.constants import stores from availability.logic import release_fetching from availability.models import product_in_store from tests import utils PRODUCT_ID = 1 SALES_START_DATE = datetime.utcnow() STORE_INTERNAL_ID = 'internal-id' GO_LIVE_DATE = datetime.utcnow() STATUS = models.RELEASE_STATUS_LIVE COUNTRIES = ['UK', 'USA'] def test_get_products_status_by_id(test_database, mocker): """Assert can get status of products by ids.""" mocker.patch( 'availability.models.product_in_store.product_model.get_product_by_id', return_value=True) expected_stores_data = [] for store_id in stores.STORE_IDS: utils.create_product_per_store( store_id=store_id, product_id=PRODUCT_ID, product_in_store_status=STATUS, sales_start_date=SALES_START_DATE, store_internal_id=STORE_INTERNAL_ID, countries=COUNTRIES, go_live_date=GO_LIVE_DATE, ) expected_stores_data.append({ 'store_id': store_id, 'status': STATUS, 'go_live_date': GO_LIVE_DATE.strftime(models.ISO8601_DATE_FORMAT), 'link': stores.STOREFRONT_URLS[store_id].format( store_internal_id=STORE_INTERNAL_ID), 'countries': COUNTRIES}) expected_data = { 'items': [{'product_id': PRODUCT_ID, 'stores': expected_stores_data}]} product_ids = [PRODUCT_ID] response = release_fetching.get_status_for_products(product_ids) assert isinstance(response, oto_response.Response) assert response.status == status.OK assert response.message == expected_data def test_get_stores_data_from_product_in_store(test_database, mocker): """Assert _make_stores_data returns correct structure.""" mocker.patch( 'availability.models.product_in_store.product_model.get_product_by_id', return_value=True) expected_stores_data = [] for store_id in stores.STORE_IDS: utils.create_product_per_store( store_id=store_id, product_id=PRODUCT_ID, product_in_store_status=STATUS, sales_start_date=SALES_START_DATE, store_internal_id=STORE_INTERNAL_ID, countries=COUNTRIES, go_live_date=GO_LIVE_DATE, ) expected_stores_data.append({ 'store_id': store_id, 'status': STATUS, 'go_live_date': GO_LIVE_DATE.strftime(models.ISO8601_DATE_FORMAT), 'link': stores.STOREFRONT_URLS[store_id].format( store_internal_id=STORE_INTERNAL_ID), 'countries': COUNTRIES}) response = product_in_store.list_store_statuses_for_products([PRODUCT_ID]) expected_data = [{'product_id': 1, 'stores': expected_stores_data}] stores_data = release_fetching._make_stores_data(response.message) assert sorted(stores_data) == sorted(expected_data) @pytest.mark.parametrize( 'store_internal_id, store_id', product( ('abcdefghij', '1234567890', ''), (stores.STOREFRONT_URLS.keys()), )) def test_make_storefront_url(store_internal_id, store_id): """Assert can generate storefront links for all configured stores.""" if store_internal_id: expected_url = stores.STOREFRONT_URLS[store_id].format( store_internal_id=store_internal_id) else: expected_url = '' result = release_fetching._make_storefront_url(store_internal_id, store_id) assert result == expected_url def test_get_status_for_products_checks_for_model_error(mocker): """Assert model response is checked for error.""" mock_store_product = mocker.patch('availability.logic.release_fetching.ps') mock_store_product.list_store_statuses_for_products.return_value = ( oto_response.create_fatal_response('something bad')) response = release_fetching.get_status_for_products([1, 2]) assert response.status == status.INTERNAL_ERROR