"""Tests for ows-contracts interface.""" import json from oto import response import pytest import requests from ows_product_physical.models import ows_contracts def _patch_owsrequest_head_response(mocker, status_code, content=None): """Patch owsrequest.request.head with provided status and content.""" mock_response = requests.Response() mock_response.status_code = status_code if content is not None: mock_response._content = content mock_head = mocker.patch.object( ows_contracts.request, 'head', return_value=mock_response) return mock_head def _patch_owsrequest_get_response(mocker, status_code, content=None): """Patch owsrequest.request.get with provided status and content.""" mock_response = requests.Response() mock_response.status_code = status_code if content is not None: mock_response._content = content mock_head = mocker.patch.object( ows_contracts.request, 'get', return_value=mock_response) return mock_head @pytest.mark.parametrize('grass_account_type', ['vendor', 'subaccount']) def test_is_mech_admin(mocker, grass_account_type): """Should determine whether user is mechadmin.""" expected_message = { 'mechadmin_digital': False, 'mechadmin_physical': True} expected_content = json.dumps(expected_message).encode('latin1') mock_get = _patch_owsrequest_get_response( mocker, status_code=200, content=expected_content) contracts_response = ows_contracts.is_mech_admin( account_type=grass_account_type, account_id='1') mock_get.assert_called_with( 'ows-contracts', '/{0}/1/mechadmin_for_account'.format( grass_account_type)) assert isinstance(contracts_response, response.Response) assert contracts_response.status == 200 assert contracts_response.message == expected_message @pytest.mark.parametrize('error_code', [403, 500]) def test_is_mech_admin_error_response(mocker, error_code): """Should return error if request wasn't successful.""" content = {'code': 'authorization_error', 'message': 'User is forbidden'} encoded_content = json.dumps(content).encode('latin1') _patch_owsrequest_get_response( mocker, status_code=error_code, content=encoded_content) contracts_response = ows_contracts.is_mech_admin( account_type='vendor', account_id='1') assert isinstance(contracts_response, response.Response) assert contracts_response.status == error_code assert contracts_response.errors == content def test_is_mech_admin_not_found_response(mocker): """Should return error if user was not found.""" _patch_owsrequest_get_response(mocker, status_code=404, content=b'') contracts_response = ows_contracts.is_mech_admin( account_type='vendor', account_id='1') assert isinstance(contracts_response, response.Response) assert contracts_response.status == 404