import json import unittest from http import HTTPStatus from unittest.mock import MagicMock import pytest from requests import Response from requests.exceptions import HTTPError from slz_downloader.dsp.brandwatch.api_client import BWClient from slz_downloader.dsp.brandwatch.exceptions import ( BrandWatchException, IncompatibleRequestException, RateLimitException, ) def test_success_send_query(): db_client = unittest.mock.Mock() resp_mock = unittest.mock.MagicMock(spec=Response) resp_mock.status_code = 200 resp_mock.ok = True resp_mock.url = '' resp_mock.json.return_value = json.dumps({'test': 1}) resp_mock.headers = {'x-rate-limit-used': 0, 'x-rate-limit': '10/10'} with unittest.mock.patch('requests.request') as mock_request: mock_request.return_value = resp_mock bw_client = BWClient(db_client=db_client, bw_api_key='bw_api_key', env_requests_limit=2) res = bw_client.create_request(run_id=1, data={}) assert res == '{"test": 1}' assert mock_request.call_args_list == [ ( dict( data='{}', headers={ 'Content-Type': 'application/json', 'Authorization': 'bw_api_key' }, method='post', url='https://api.brandwatch.com/analysis/' ), ) ] assert bw_client.env_request_used == 1 def test_success_get_result(): db_client = unittest.mock.Mock() resp_mock = unittest.mock.MagicMock(spec=Response) resp_mock.status_code = 200 resp_mock.ok = True resp_mock.url = '' resp_mock.json.return_value = json.dumps({'test': 1}) resp_mock.headers = {'x-rate-limit-used': 0, 'x-rate-limit': '10/10'} with unittest.mock.patch('requests.request') as mock_request: mock_request.return_value = resp_mock bw_client = BWClient(db_client=db_client, bw_api_key='bw_api_key', env_requests_limit=2) res = bw_client.get_result(run_id=1, result_id=1) assert res == '{"test": 1}' assert mock_request.call_args_list == [ ( dict( data='{}', headers={'Authorization': 'bw_api_key'}, method='get', url='https://api.brandwatch.com/analysis/1' ), ) ] def test_too_many_requests(): db_client = unittest.mock.Mock() resp_mock = unittest.mock.MagicMock(spec=Response) resp_mock.status_code = HTTPStatus.TOO_MANY_REQUESTS resp_mock.raise_for_status.side_effect = HTTPError() resp_mock.headers = {'x-rate-limit-used': 0, 'x-rate-limit': '10/10'} with unittest.mock.patch('requests.request') as mock_request: mock_request.return_value = resp_mock bw_client = BWClient(db_client=db_client, bw_api_key='bw_api_key', env_requests_limit=2) with pytest.raises(RateLimitException): bw_client.get_result(run_id=1, result_id=1) assert bw_client.limit_reached is True def test_bad_request(): db_client = unittest.mock.Mock() resp_mock = unittest.mock.MagicMock(spec=Response) resp_mock.status_code = HTTPStatus.BAD_REQUEST resp_mock.raise_for_status.side_effect = HTTPError() resp_mock.headers = {'x-rate-limit-used': 0, 'x-rate-limit': '10/10'} with unittest.mock.patch('requests.request') as mock_request: mock_request.return_value = resp_mock bw_client = BWClient(db_client=db_client, bw_api_key='bw_api_key', env_requests_limit=2) with pytest.raises(IncompatibleRequestException): bw_client.get_result(run_id=1, result_id=1) def test_brandwatch_error(): db_client = unittest.mock.Mock() resp_mock = unittest.mock.MagicMock(spec=Response) resp_mock.status_code = 200 resp_mock.ok = True resp_mock.url = '' resp_mock.raise_for_status.side_effect = HTTPError() resp_mock.json.return_value = {'error': 'test_error'} resp_mock.headers = {'x-rate-limit-used': 0, 'x-rate-limit': '10/10'} with unittest.mock.patch('requests.request') as mock_request: mock_request.return_value = resp_mock bw_client = BWClient(db_client=db_client, bw_api_key='bw_api_key', env_requests_limit=2) with pytest.raises(BrandWatchException): bw_client.get_result(run_id=1, result_id=1) def test_check_limits_reached(): db_client = unittest.mock.Mock() resp_mock = unittest.mock.MagicMock(spec=Response) resp_mock.status_code = 200 resp_mock.ok = True resp_mock.url = '' resp_mock.json.return_value = json.dumps({'test': 1}) resp_mock.headers = {'x-rate-limit-used': 0, 'x-rate-limit': '10/10'} with unittest.mock.patch('requests.request') as mock_request: mock_request.return_value = resp_mock bw_client = BWClient(db_client=db_client, bw_api_key='bw_api_key', env_requests_limit=2) bw_client.limit_reached = True with pytest.raises(RateLimitException): bw_client.get_result(run_id=1, result_id=1) def test_check_limits_used_more_then_limit(): db_client = unittest.mock.Mock() resp_mock = unittest.mock.MagicMock(spec=Response) resp_mock.status_code = 200 resp_mock.ok = True resp_mock.url = '' resp_mock.json.return_value = json.dumps({'test': 1}) resp_mock.headers = {'x-rate-limit-used': 0, 'x-rate-limit': '10/10'} with unittest.mock.patch('requests.request') as mock_request: mock_request.return_value = resp_mock bw_client = BWClient(db_client=db_client, bw_api_key='bw_api_key', env_requests_limit=2) bw_client.env_request_used = 2 with pytest.raises(RateLimitException): bw_client.get_result(run_id=1, result_id=1)