from unittest.mock import MagicMock from ows_accounting import response from ows_accounting.constants import error from ows_accounting.logic import period from ows_accounting.validation import validators def test_get_account_info_from_request(monkeypatch): """Tests if account information is retrieved from request header. """ expected_type = 'account-type' expected_id = 'account-id' mock_request = MagicMock() mock_request.headers.get.side_effect = [expected_type, expected_id] result = validators.get_account_info_from_request(request=mock_request) assert result == (expected_type, expected_id) def test_get_period_from_request(monkeypatch): """Tests if period is retrieved from request. """ expected_period = 123 mock_request_post = MagicMock() mock_request_post.method = 'POST' mock_request_post.get_json.side_effect = [{'periods': 123}] post_result = validators.get_period_from_request(request=mock_request_post) assert post_result == expected_period mock_request_get = MagicMock() mock_request_get.args.get.side_effect = ['123'] get_result = validators.get_period_from_request(request=mock_request_get) assert get_result == str(expected_period) def test_validate_periods_success(monkeypatch): """Tests valid periods assuming all the previous checks are ok. """ expected_periods = [200, 201, 202] monkeypatch.setattr( validators, 'get_account_info_from_request', MagicMock( return_value=('vendor', 123))) monkeypatch.setattr( period, 'get_available_periods', MagicMock(return_value=True)) monkeypatch.setattr( validators, 'validate_account_type', MagicMock(return_value=True)) mock_period = MagicMock() mock_period.return_value = response.Response([201, 200, 202]) monkeypatch.setattr( period, 'get_available_periods', mock_period) mock_period_from_request = MagicMock() mock_period_from_request.return_value = '200' monkeypatch.setattr( validators, 'get_period_from_request', mock_period_from_request) result = validators.validate_periods(request='request') assert result.status == 200 assert result.message == expected_periods def test_validate_periods_fail_no_account(monkeypatch): """Tests periods if no valid account. """ expected_message = '{error} {account}'.format( error=error.ERROR_MESSAGE_INVALID_ACCOUNT, account=123) monkeypatch.setattr( validators, 'get_account_info_from_request', MagicMock( return_value=('testaccount', 123))) result = validators.validate_periods(request='request') assert result.status == 400 assert result.errors.get('message') == expected_message def test_validate_periods_fail_invalid_period(monkeypatch): """Tests periods if no periods in DB. """ monkeypatch.setattr( validators, 'get_account_info_from_request', MagicMock( return_value=('vendor', 123))) monkeypatch.setattr( validators, 'validate_account_type', MagicMock(return_value=True)) mock_period = MagicMock() mock_period.return_value = response.create_error_response( message=error.ERROR_MESSAGE_INVALID_PERIOD, code=error.ERROR_CODE_INVALID_PERIOD) monkeypatch.setattr( period, 'get_available_periods', mock_period) result = validators.validate_periods(request='request') assert result.status == 400 assert result.errors.get( 'message') == error.ERROR_MESSAGE_INVALID_PERIOD def test_validate_periods_fail_request_db_mismatch(monkeypatch): """Tests periods if there is mismatch in request and db. """ monkeypatch.setattr( validators, 'get_account_info_from_request', MagicMock( return_value=('vendor', 123))) monkeypatch.setattr( period, 'get_available_periods', MagicMock(return_value=True)) monkeypatch.setattr( validators, 'validate_account_type', MagicMock(return_value=True)) mock_period = MagicMock() mock_period.return_value = response.Response([201, 200, 202]) monkeypatch.setattr( period, 'get_available_periods', mock_period) mock_period_from_request = MagicMock() mock_period_from_request.return_value = '500' monkeypatch.setattr( validators, 'get_period_from_request', mock_period_from_request) result = validators.validate_periods(request='request') assert result.status == 400 assert result.errors.get( 'message') == error.ERROR_MESSAGE_INVALID_PERIOD def test_validate_account_type(): """Test if account type checked against GRASS headers is valid. """ success_value = 'vendor' response_success = validators.validate_account_type(success_value) assert response_success.status == 200 failure_value = 'label' failure_message = '{error} {account}'.format( error=error.ERROR_MESSAGE_INVALID_ACCOUNT, account=failure_value) response_failure = validators.validate_account_type(failure_value) assert response_failure.status == 400 assert response_failure.errors.get('message') == failure_message