Skip to content

Commit

Permalink
Merge pull request #150 from liampauling/UAT_without_available_fix
Browse files Browse the repository at this point in the history
Uat without available fix
  • Loading branch information
liampauling committed Jan 27, 2018
2 parents ae0f54e + efb3490 commit a0afce5
Show file tree
Hide file tree
Showing 16 changed files with 135 additions and 24 deletions.
2 changes: 1 addition & 1 deletion betfairlightweight/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from . import filters

__title__ = 'betfairlightweight'
__version__ = '1.5.9'
__version__ = '1.5.10'
__author__ = 'Liam Pauling'

# Set default logging handler to avoid "No handler found" warnings.
Expand Down
7 changes: 5 additions & 2 deletions betfairlightweight/endpoints/baseendpoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,12 @@ def request(self, method, params, session):
raise APIError(None, method, params, e)
elapsed_time = (datetime.datetime.utcnow()-date_time_sent).total_seconds()

response_data = response.json()

check_status_code(response)
try:
response_data = response.json()
except ValueError:
raise InvalidResponse(response.text)

if self._error_handler:
self._error_handler(response_data, method, params)
return response_data, elapsed_time
Expand Down
12 changes: 10 additions & 2 deletions betfairlightweight/endpoints/historic.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
import datetime
from requests import ConnectionError

from ..exceptions import APIError
from ..exceptions import (
APIError,
InvalidResponse,
)
from ..compat import json
# from .. import resources
from .baseendpoint import BaseEndpoint
Expand Down Expand Up @@ -156,8 +159,13 @@ def request(self, method, params, session):
except Exception as e:
raise APIError(None, method, params, e)
elapsed_time = (datetime.datetime.utcnow()-date_time_sent).total_seconds()
response_data = response.json()

check_status_code(response)
try:
response_data = response.json()
except ValueError:
raise InvalidResponse(response.text)

return response_data, elapsed_time

@property
Expand Down
2 changes: 1 addition & 1 deletion betfairlightweight/endpoints/inplayservice.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,12 @@ def request(self, method=None, params=None, session=None, url=None):
raise APIError(None, method, params, e)
elapsed_time = (datetime.datetime.utcnow() - date_time_sent).total_seconds()

check_status_code(response)
try:
response_data = response.json()
except ValueError:
raise InvalidResponse(response.text)

check_status_code(response)
return response_data, elapsed_time

@property
Expand Down
13 changes: 10 additions & 3 deletions betfairlightweight/endpoints/keepalive.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@

from .baseendpoint import BaseEndpoint
from ..resources import KeepAliveResource
from ..exceptions import KeepAliveError, APIError
from ..exceptions import (
KeepAliveError,
APIError,
InvalidResponse,
)
from ..utils import check_status_code


Expand Down Expand Up @@ -38,9 +42,12 @@ def request(self, payload=None, params=None, session=None):
raise APIError(None, exception=e)
elapsed_time = (datetime.datetime.utcnow() - date_time_sent).total_seconds()

response_data = response.json()

check_status_code(response)
try:
response_data = response.json()
except ValueError:
raise InvalidResponse(response.text)

if self._error_handler:
self._error_handler(response_data)
return response_data, elapsed_time
Expand Down
13 changes: 10 additions & 3 deletions betfairlightweight/endpoints/login.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@

from .baseendpoint import BaseEndpoint
from ..resources import LoginResource
from ..exceptions import LoginError, APIError
from ..exceptions import (
LoginError,
APIError,
InvalidResponse
)
from ..utils import check_status_code


Expand Down Expand Up @@ -38,9 +42,12 @@ def request(self, method=None, params=None, session=None):
raise APIError(None, exception=e)
elapsed_time = (datetime.datetime.utcnow() - date_time_sent).total_seconds()

response_data = response.json()

check_status_code(response)
try:
response_data = response.json()
except ValueError:
raise InvalidResponse(response.text)

if self._error_handler:
self._error_handler(response_data)
return response_data, elapsed_time
Expand Down
13 changes: 10 additions & 3 deletions betfairlightweight/endpoints/logout.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@

from .baseendpoint import BaseEndpoint
from ..resources import LogoutResource
from ..exceptions import LogoutError, APIError
from ..exceptions import (
LogoutError,
APIError,
InvalidResponse,
)
from ..utils import check_status_code


Expand Down Expand Up @@ -38,9 +42,12 @@ def request(self, payload=None, params=None, session=None):
raise APIError(None, exception=e)
elapsed_time = (datetime.datetime.utcnow() - date_time_sent).total_seconds()

response_data = response.json()

check_status_code(response)
try:
response_data = response.json()
except ValueError:
raise InvalidResponse(response.text)

if self._error_handler:
self._error_handler(response_data)
return response_data, elapsed_time
Expand Down
12 changes: 10 additions & 2 deletions betfairlightweight/endpoints/navigation.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
from requests import ConnectionError

from ..exceptions import APIError
from ..exceptions import (
APIError,
InvalidResponse,
)
from ..utils import check_status_code
from .baseendpoint import BaseEndpoint

Expand Down Expand Up @@ -32,7 +35,12 @@ def request(self, method=None, params=None, session=None):
raise APIError(None, method, params, e)

check_status_code(response)
return response.json()
try:
response_data = response.json()
except ValueError:
raise InvalidResponse(response.text)

return response_data

@property
def url(self):
Expand Down
2 changes: 1 addition & 1 deletion betfairlightweight/endpoints/racecard.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,12 @@ def request(self, method=None, params=None, session=None):
raise APIError(None, method, params, e)
elapsed_time = (datetime.datetime.utcnow() - date_time_sent).total_seconds()

check_status_code(response)
try:
response_data = response.json()
except ValueError:
raise InvalidResponse(response.text)

check_status_code(response)
return response_data, elapsed_time

@staticmethod
Expand Down
7 changes: 5 additions & 2 deletions betfairlightweight/streaming/betfairstream.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,8 +211,11 @@ def _receive_all(self):
try:
part = self._socket.recv(self.buffer_size)
except (socket.timeout, socket.error) as e:
self.stop()
raise SocketError('[Connect: %s]: Socket %s' % (self._unique_id, e))
if self._running:
self.stop()
raise SocketError('[Connect: %s]: Socket %s' % (self._unique_id, e))
else:
return # 133, prevents error if stop is called mid recv

# an empty string indicates the server shutdown the socket
if len(part) == 0:
Expand Down
8 changes: 8 additions & 0 deletions examples/examplestreaminghistorical.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@ def on_process(self, market_books):
with open('output.txt', 'a') as output:
for market_book in market_books:
for runner in market_book.runners:

# how to get runner details from the market definition
market_def = market_book.market_definition
runner_def = market_def.runners_dict.get(
(runner.selection_id, runner.handicap)
)

output.write('%s,%s,%s,%s,%s,%s\n' % (
market_book.publish_time, market_book.market_id, market_book.status, market_book.inplay,
runner.selection_id, runner.last_price_traded or ''
Expand All @@ -39,6 +46,7 @@ def _add_stream(self, unique_id, stream_type):
if stream_type == 'marketSubscription':
return HistoricalStream(self)


# create listener
listener = HistoricalListener(
max_latency=1e100
Expand Down
13 changes: 13 additions & 0 deletions tests/unit/test_baseendpoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,19 @@ def test_request_error(self, mock_post, mock_request_headers, mock_cert, mock_cr
with self.assertRaises(APIError):
self.base_endpoint.request(None, None, None)

@mock.patch('betfairlightweight.endpoints.baseendpoint.BaseEndpoint.create_req')
@mock.patch('betfairlightweight.baseclient.BaseClient.cert')
@mock.patch('betfairlightweight.baseclient.BaseClient.request_headers')
@mock.patch('betfairlightweight.baseclient.requests.post')
def test_request_json_error(self, mock_post, mock_request_headers, mock_cert, mock_create_req):
mock_response = mock.Mock()
mock_response.status_code = 200
mock_response.json.side_effect = ValueError()
mock_post.return_value = mock_response

with self.assertRaises(InvalidResponse):
self.base_endpoint.request(None, None, None)

def test_base_endpoint_error_handler(self):
mock_response = create_mock_json('tests/resources/base_endpoint_success.json')
assert self.base_endpoint._error_handler(mock_response.json()) is None
Expand Down
13 changes: 12 additions & 1 deletion tests/unit/test_keepalive.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from betfairlightweight import APIClient
from betfairlightweight.endpoints.keepalive import KeepAlive, APIError
from betfairlightweight.exceptions import KeepAliveError
from betfairlightweight.exceptions import KeepAliveError, InvalidResponse
from betfairlightweight.resources.authresources import KeepAliveResource
from tests import mock
from tests.unit.tools import create_mock_json
Expand Down Expand Up @@ -50,6 +50,17 @@ def test_request_error(self, mock_post, mock_keep_alive_headers):
with self.assertRaises(APIError):
self.keep_alive.request()

@mock.patch('betfairlightweight.baseclient.BaseClient.keep_alive_headers')
@mock.patch('betfairlightweight.baseclient.requests.post')
def test_request_json_error(self, mock_post, mock_keep_alive_headers):
mock_response = mock.Mock()
mock_response.status_code = 200
mock_response.json.side_effect = ValueError()
mock_post.return_value = mock_response

with self.assertRaises(InvalidResponse):
self.keep_alive.request()

def test_keep_alive_error_handler(self):
mock_response = create_mock_json('tests/resources/keep_alive_success.json')
assert self.keep_alive._error_handler(mock_response.json()) is None
Expand Down
14 changes: 13 additions & 1 deletion tests/unit/test_login.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from betfairlightweight import APIClient
from betfairlightweight.endpoints.login import Login
from betfairlightweight.exceptions import LoginError, APIError
from betfairlightweight.exceptions import LoginError, APIError, InvalidResponse
from betfairlightweight.resources import LoginResource
from tests import mock
from tests.unit.tools import create_mock_json
Expand Down Expand Up @@ -52,6 +52,18 @@ def test_request_error(self, mock_post, mock_login_headers, mock_cert):
with self.assertRaises(APIError):
self.login.request()

@mock.patch('betfairlightweight.baseclient.BaseClient.cert')
@mock.patch('betfairlightweight.baseclient.BaseClient.login_headers')
@mock.patch('betfairlightweight.baseclient.requests.post')
def test_request_json_error(self, mock_post, mock_login_headers, mock_cert):
mock_response = mock.Mock()
mock_response.status_code = 200
mock_response.json.side_effect = ValueError()
mock_post.return_value = mock_response

with self.assertRaises(InvalidResponse):
self.login.request()

def test_login_error_handler(self):
mock_response = create_mock_json('tests/resources/login_success.json')
assert self.login._error_handler(mock_response.json()) is None
Expand Down
14 changes: 13 additions & 1 deletion tests/unit/test_logout.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from betfairlightweight import APIClient
from betfairlightweight.endpoints.logout import Logout
from betfairlightweight.exceptions import LogoutError, APIError
from betfairlightweight.exceptions import LogoutError, APIError, InvalidResponse
from betfairlightweight.resources import LogoutResource
from tests import mock
from tests.unit.tools import create_mock_json
Expand Down Expand Up @@ -50,6 +50,18 @@ def test_request_error(self, mock_post, mock_logout_headers, mock_cert):
with self.assertRaises(APIError):
self.logout.request()

@mock.patch('betfairlightweight.baseclient.BaseClient.cert')
@mock.patch('betfairlightweight.baseclient.BaseClient.keep_alive_headers')
@mock.patch('betfairlightweight.baseclient.requests.post')
def test_request_json_error(self, mock_post, mock_logout_headers, mock_cert):
mock_response = mock.Mock()
mock_response.status_code = 200
mock_response.json.side_effect = ValueError()
mock_post.return_value = mock_response

with self.assertRaises(InvalidResponse):
self.logout.request()

def test_logout_error_handler(self):
mock_response = create_mock_json('tests/resources/logout_success.json')
assert self.logout._error_handler(mock_response.json()) is None
Expand Down
14 changes: 13 additions & 1 deletion tests/unit/test_navigation.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from betfairlightweight import APIClient
from betfairlightweight.endpoints.navigation import Navigation
from betfairlightweight.exceptions import APIError
from betfairlightweight.exceptions import APIError, InvalidResponse
from tests import mock
from tests.unit.tools import create_mock_json

Expand Down Expand Up @@ -58,5 +58,17 @@ def test_request_error(self, mock_get, mock_request_headers, mock_cert):
with self.assertRaises(APIError):
self.navigation.request()

@mock.patch('betfairlightweight.baseclient.BaseClient.cert')
@mock.patch('betfairlightweight.baseclient.BaseClient.request_headers')
@mock.patch('betfairlightweight.baseclient.requests.get')
def test_request_json_error(self, mock_get, mock_request_headers, mock_cert):
mock_response = mock.Mock()
mock_response.status_code = 200
mock_response.json.side_effect = ValueError()
mock_get.return_value = mock_response

with self.assertRaises(InvalidResponse):
self.navigation.request()

def test_url(self):
assert self.navigation.url == self.navigation.client.navigation_uri

0 comments on commit a0afce5

Please sign in to comment.