"""Test account logic layer.""" from unittest.mock import MagicMock import pytest from oto import response from owsfeatures import features from reporting.constants import field, header from reporting.logic import account from reporting.models import ows_account test_case_one = [ lambda: {'param_limit': 200}, {header.GRASS_ACCOUNT_TYPE: 'vendor', header.GRASS_ACCOUNT_ID: 7123}, {field.SUBACCOUNT_ID: None, field.VENDOR_ID: 7123}, {'param_limit': 200, 'param_subaccount_id': None, 'param_vendor_id': 7123}, ] test_case_two = [ lambda: None, {header.GRASS_ACCOUNT_TYPE: 'vendor', header.GRASS_ACCOUNT_ID: 7123}, {field.SUBACCOUNT_ID: None, field.VENDOR_ID: 7123}, {'param_subaccount_id': None, 'param_vendor_id': 7123}, ] test_case_three = [ lambda: {'param_limit': 200}, {header.GRASS_ACCOUNT_TYPE: 'subaccount', header.GRASS_ACCOUNT_ID: 1}, {field.SUBACCOUNT_ID: 1, field.VENDOR_ID: 7123}, {'param_limit': 200, 'param_subaccount_id': 1, 'param_vendor_id': 7123}, ] test_case_four = [ lambda: None, {header.GRASS_ACCOUNT_TYPE: 'subaccount', header.GRASS_ACCOUNT_ID: 1}, {field.SUBACCOUNT_ID: 1, field.VENDOR_ID: 7123}, {'param_limit': 200, 'param_subaccount_id': 1, 'param_vendor_id': 7123}, ] @pytest.mark.parametrize( 'mock_params, mock_headers, mock_account_response, expected_return_value', (test_case_one, test_case_two, test_case_three), ) def test_update_params_with_vendor_info_success( mocker, mock_params, mock_headers, mock_account_response, expected_return_value, ): """Test if request params are updated with vendor info.""" request = MagicMock(get_json=mock_params, headers=mock_headers) account_response = response.Response( status=200, message=mock_account_response ) mocker.patch.object( ows_account, 'get_vendor_id_from_grass_headers', return_value=account_response, ) mocker.patch.object(features, 'check_feature', return_value=False) params_with_account_info = account.update_params_with_vendor_info(request) assert expected_return_value == params_with_account_info def test_update_params_with_vendor_info_failure(mocker): """Test request dies with 500 when ows-account is unsuccessful.""" request = MagicMock(get_json=lambda: {'param_limit': 200}, headers={}) mocker.patch.object( ows_account, 'get_vendor_id_from_grass_headers', return_value=response.Response(status=500), ) mocker.patch.object(features, 'check_feature', return_value=False) params_with_account_info = account.update_params_with_vendor_info(request) assert params_with_account_info.status == 500 def test_update_params_with_vendor_info_success_from_OA(mocker): """Test if request params are updated with vendor info from OA user.""" request = MagicMock( get_json=lambda: {'vector_report_cache': 3600}, headers={header.ORCHARD_USER_ID: 'oa:123'}, ) mocker.patch.object(features, 'check_feature', return_value=True) expected_return_value = {'vector_report_cache': 3600} params_with_account_info = account.update_params_with_vendor_info(request) assert expected_return_value == params_with_account_info oa_user = ['oa:123', True] alw_user = ['alw:123', False] @pytest.mark.parametrize( 'request_user_id, expected_response', (oa_user, alw_user) ) def test_is_oa_user(mocker, request_user_id, expected_response): """Test if request is from OA user or not.""" request = MagicMock( get_json=lambda: {'vector_report_cache': 3600}, headers={header.ORCHARD_USER_ID: request_user_id}, ) actual_response = account.is_oa_user(request) assert actual_response == expected_response