From ba8adce69f359fa8e32d6e848802922c3124ea1d Mon Sep 17 00:00:00 2001 From: Alex Golec Date: Fri, 3 May 2024 08:54:11 -0400 Subject: [PATCH 1/8] Tests for get_orders_for_all_linked_accounts --- schwab/client/base.py | 3 +- tests/client_test.py | 145 +++++++++++++++++++----------------------- 2 files changed, 67 insertions(+), 81 deletions(-) diff --git a/schwab/client/base.py b/schwab/client/base.py index 737d752..8e219e9 100644 --- a/schwab/client/base.py +++ b/schwab/client/base.py @@ -266,8 +266,7 @@ def get_orders_for_all_linked_accounts(self, max_results=None, from_entered_datetime=None, to_entered_datetime=None, - status=None, - statuses=None): + status=None): '''Orders for all linked accounts. Optionally specify a single status on which to filter. diff --git a/tests/client_test.py b/tests/client_test.py index 4b86a4c..d658583 100644 --- a/tests/client_test.py +++ b/tests/client_test.py @@ -352,6 +352,7 @@ def test_cancel_order_str(self): self.mock_session.delete.assert_called_once_with( self.make_url('/trader/v1/accounts/{accountHash}/orders/{orderId}')) + # get_orders_for_account @patch('schwab.client.base.datetime.datetime', mockdatetime) @@ -457,123 +458,109 @@ def test_get_orders_for_account_status_unchecked(self): }) - ''' - - - # get_orders_by_query + # get_orders_for_all_linked_accounts - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_vanilla(self): - self.client.get_orders_by_query() + def test_get_orders_for_all_linked_accounts_vanilla(self): + self.client.get_orders_for_all_linked_accounts() self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': MIN_ISO, + self.make_url('/trader/v1/orders'), params={ + 'fromEnteredTime': NOW_DATETIME_MINUS_60_DAYS_ISO, 'toEnteredTime': NOW_DATETIME_ISO }) - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_max_results(self): - self.client.get_orders_by_query(max_results=100) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': MIN_ISO, - 'toEnteredTime': NOW_DATETIME_ISO, - 'maxResults': 100, - }) - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_from_entered_datetime(self): - self.client.get_orders_by_query(from_entered_datetime=EARLIER_DATETIME) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': EARLIER_ISO, - 'toEnteredTime': NOW_DATETIME_ISO, - }) + def test_get_orders_for_all_linked_accounts_from_not_datetime(self): + with self.assertRaises(ValueError) as cm: + self.client.get_orders_for_all_linked_accounts( + from_entered_datetime='2020-01-02') + self.assertEqual( + str(cm.exception), + "expected type in (datetime.date, datetime.datetime) for " + + "from_entered_datetime, got 'builtins.str'") - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_to_entered_datetime(self): - self.client.get_orders_by_query(to_entered_datetime=EARLIER_DATETIME) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': MIN_ISO, - 'toEnteredTime': EARLIER_ISO, - }) - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_status_and_statuses(self): - with self.assertRaises( - ValueError, msg='at most one of status or statuses may be set'): - self.client.get_orders_by_query( - to_entered_datetime=EARLIER_DATETIME, - status='EXPIRED', statuses=[ - self.client_class.Order.Status.FILLED, - self.client_class.Order.Status.EXPIRED]) + def test_get_orders_for_all_linked_accounts_to_not_datetime(self): + with self.assertRaises(ValueError) as cm: + self.client.get_orders_for_all_linked_accounts( + to_entered_datetime='2020-01-02') + self.assertEqual( + str(cm.exception), + "expected type in (datetime.date, datetime.datetime) for " + + "to_entered_datetime, got 'builtins.str'") + - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_status(self): - self.client.get_orders_by_query(status=self.client_class.Order.Status.FILLED) + def test_get_orders_for_all_linked_accounts_max_results(self): + self.client.get_orders_for_all_linked_accounts(max_results=100) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': MIN_ISO, + self.make_url('/trader/v1/orders'), params={ + 'fromEnteredTime': NOW_DATETIME_MINUS_60_DAYS_ISO, 'toEnteredTime': NOW_DATETIME_ISO, - 'status': 'FILLED' + 'maxResults': 100, }) - + @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_status_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_orders_by_query(status='FILLED') + def test_get_orders_for_all_linked_accounts_from_entered_datetime(self): + self.client.get_orders_for_all_linked_accounts( + from_entered_datetime=datetime.datetime( + year=2024, month=6, day=5, hour=4, minute=3, second=2)) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': MIN_ISO, + self.make_url('/trader/v1/orders'), params={ + 'fromEnteredTime': '2024-06-05T04:03:02Z', 'toEnteredTime': NOW_DATETIME_ISO, - 'status': 'FILLED' }) - + @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_statuses(self): - self.client.get_orders_by_query(statuses=[ - self.client_class.Order.Status.FILLED, - self.client_class.Order.Status.EXPIRED]) + def test_get_orders_for_all_linked_accounts_to_entered_datetime(self): + self.client.get_orders_for_all_linked_accounts( + to_entered_datetime=datetime.datetime( + year=2024, month=6, day=5, hour=4, minute=3, second=2)) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': MIN_ISO, - 'toEnteredTime': NOW_DATETIME_ISO, - 'status': 'FILLED,EXPIRED' + self.make_url('/trader/v1/orders'), params={ + 'fromEnteredTime': NOW_DATETIME_MINUS_60_DAYS_ISO, + 'toEnteredTime': '2024-06-05T04:03:02Z', }) - + @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_statuses_scalar(self): - self.client.get_orders_by_query(statuses=self.client_class.Order.Status.FILLED) + def test_get_orders_for_all_linked_accounts_status(self): + self.client.get_orders_for_all_linked_accounts( + status=self.client_class.Order.Status.FILLED) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': MIN_ISO, + self.make_url('/trader/v1/orders'), params={ + 'fromEnteredTime': NOW_DATETIME_MINUS_60_DAYS_ISO, 'toEnteredTime': NOW_DATETIME_ISO, 'status': 'FILLED' }) - + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_orders_for_all_linked_accounts_multiple_statuses(self): + with self.assertRaises(ValueError) as cm: + self.client.get_orders_for_all_linked_accounts( + status=[self.client_class.Order.Status.FILLED, + self.client_class.Order.Status.REJECTED]) + self.assertIn( + 'expected type "Status", got type "list"', + str(cm.exception)) + + @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_statuses_unchecked(self): + def test_get_orders_for_all_linked_accounts_status_unchecked(self): self.client.set_enforce_enums(False) - self.client.get_orders_by_query(statuses=['FILLED', 'EXPIRED']) + self.client.get_orders_for_all_linked_accounts(status='NOT_A_STATUS') self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': MIN_ISO, + self.make_url('/trader/v1/orders'), params={ + 'fromEnteredTime': NOW_DATETIME_MINUS_60_DAYS_ISO, 'toEnteredTime': NOW_DATETIME_ISO, - 'status': 'FILLED,EXPIRED' + 'status': 'NOT_A_STATUS' }) - ''' ''' # search_instruments From 5ac64e79b0f02f860d9b3d49ff7d4f9ad668199f Mon Sep 17 00:00:00 2001 From: Alex Golec Date: Sat, 4 May 2024 09:50:47 -0400 Subject: [PATCH 2/8] merge stashed files --- schwab/client/base.py | 10 +- tests/client_test.py | 2209 ++++++++++++++++++++++------------------- 2 files changed, 1168 insertions(+), 1051 deletions(-) diff --git a/schwab/client/base.py b/schwab/client/base.py index 8e219e9..1bd1ff0 100644 --- a/schwab/client/base.py +++ b/schwab/client/base.py @@ -171,16 +171,16 @@ def get_accounts(self, *, fields=None): ########################################################################## # Orders - def cancel_order(self, order_id, account_hash): - '''Cancel a specific order for a specific account''' - path = '/trader/v1/accounts/{}/orders/{}'.format(account_hash, order_id) - return self._delete_request(path) - def get_order(self, order_id, account_hash): '''Get a specific order for a specific account by its order ID''' path = '/trader/v1/accounts/{}/orders/{}'.format(account_hash, order_id) return self._get_request(path, {}) + def cancel_order(self, order_id, account_hash): + '''Cancel a specific order for a specific account''' + path = '/trader/v1/accounts/{}/orders/{}'.format(account_hash, order_id) + return self._delete_request(path) + class Order: class Status(Enum): '''Order statuses passed to :meth:`get_orders_for_account` and diff --git a/tests/client_test.py b/tests/client_test.py index d658583..a4d5985 100644 --- a/tests/client_test.py +++ b/tests/client_test.py @@ -95,164 +95,6 @@ def test_set_timeout(self): self.assertEqual(timeout, self.client.session.timeout) - ''' - # place_order - - - def test_place_order(self): - order_spec = {'order': 'spec'} - self.client.place_order(ACCOUNT_HASH, order_spec) - self.mock_session.post.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/orders'), json=order_spec) - - - def test_place_order_order_builder(self): - order_spec = OrderBuilder(enforce_enums=False).set_order_type('LIMIT') - expected_spec = {'orderType': 'LIMIT'} - self.client.place_order(ACCOUNT_HASH, order_spec) - self.mock_session.post.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/orders'), - json=expected_spec) - - - def test_place_order_str(self): - order_spec = {'order': 'spec'} - self.client.place_order(str(ACCOUNT_HASH), order_spec) - self.mock_session.post.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/orders'), json=order_spec) - - # replace_order - - - def test_replace_order(self): - order_spec = {'order': 'spec'} - self.client.replace_order(ACCOUNT_HASH, ORDER_ID, order_spec) - self.mock_session.put.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/orders/{orderId}'), - json=order_spec) - - - def test_replace_order_order_builder(self): - order_spec = OrderBuilder(enforce_enums=False).set_order_type('LIMIT') - expected_spec = {'orderType': 'LIMIT'} - self.client.replace_order(ACCOUNT_HASH, ORDER_ID, order_spec) - self.mock_session.put.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/orders/{orderId}'), - json=expected_spec) - - - def test_replace_order_str(self): - order_spec = {'order': 'spec'} - self.client.replace_order(str(ACCOUNT_HASH), str(ORDER_ID), order_spec) - self.mock_session.put.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/orders/{orderId}'), - json=order_spec) - - # create_saved_order - - - def test_create_saved_order(self): - order_spec = {'order': 'spec'} - self.client.create_saved_order(ACCOUNT_HASH, order_spec) - self.mock_session.post.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/savedorders'), - json=order_spec) - - - def test_create_saved_order_order_builder(self): - order_spec = OrderBuilder(enforce_enums=False).set_order_type('LIMIT') - expected_spec = {'orderType': 'LIMIT'} - self.client.create_saved_order(ACCOUNT_HASH, order_spec) - self.mock_session.post.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/savedorders'), - json=expected_spec) - - - def test_create_saved_order_str(self): - order_spec = {'order': 'spec'} - self.client.create_saved_order(str(ACCOUNT_HASH), order_spec) - self.mock_session.post.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/savedorders'), - json=order_spec) - - # delete_saved_order - - - def test_delete_saved_order(self): - self.client.delete_saved_order(ACCOUNT_HASH, SAVED_ORDER_ID) - self.mock_session.delete.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/savedorders/{savedOrderId}')) - - - def test_delete_saved_order_str(self): - self.client.delete_saved_order(str(ACCOUNT_HASH), str(SAVED_ORDER_ID)) - self.mock_session.delete.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/savedorders/{savedOrderId}')) - - # delete_saved_order - - - def test_get_saved_order(self): - self.client.get_saved_order(ACCOUNT_HASH, SAVED_ORDER_ID) - self.mock_session.get.assert_called_once_with( - self.make_url( - '/v1/accounts/{accountHash}/savedorders/{savedOrderId}'), - params={}) - - - def test_get_saved_order_str(self): - self.client.get_saved_order(str(ACCOUNT_HASH), str(SAVED_ORDER_ID)) - self.mock_session.get.assert_called_once_with( - self.make_url( - '/v1/accounts/{accountHash}/savedorders/{savedOrderId}'), - params={}) - - # get_saved_orders_by_path - - - def test_get_saved_orders_by_path(self): - self.client.get_saved_orders_by_path(ACCOUNT_HASH) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/savedorders'), params={}) - - - def test_get_saved_orders_by_path_str(self): - self.client.get_saved_orders_by_path(str(ACCOUNT_HASH)) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/savedorders'), params={}) - - # replace_saved_order - - - def test_replace_saved_order(self): - order_spec = {'order': 'spec'} - self.client.replace_saved_order(ACCOUNT_HASH, SAVED_ORDER_ID, order_spec) - self.mock_session.put.assert_called_once_with( - self.make_url( - '/v1/accounts/{accountHash}/savedorders/{savedOrderId}'), - json=order_spec) - - - def test_replace_saved_order_order_builder(self): - order_spec = OrderBuilder(enforce_enums=False).set_order_type('LIMIT') - expected_spec = {'orderType': 'LIMIT'} - self.client.replace_saved_order(ACCOUNT_HASH, SAVED_ORDER_ID, order_spec) - self.mock_session.put.assert_called_once_with( - self.make_url( - '/v1/accounts/{accountHash}/savedorders/{savedOrderId}'), - json=expected_spec) - - - def test_replace_saved_order_str(self): - order_spec = {'order': 'spec'} - self.client.replace_saved_order( - str(ACCOUNT_HASH), str(SAVED_ORDER_ID), order_spec) - self.mock_session.put.assert_called_once_with( - self.make_url( - '/v1/accounts/{accountHash}/savedorders/{savedOrderId}'), - json=order_spec) - ''' - # get_account @@ -352,7 +194,6 @@ def test_cancel_order_str(self): self.mock_session.delete.assert_called_once_with( self.make_url('/trader/v1/accounts/{accountHash}/orders/{orderId}')) - # get_orders_for_account @patch('schwab.client.base.datetime.datetime', mockdatetime) @@ -562,552 +403,440 @@ def test_get_orders_for_all_linked_accounts_status_unchecked(self): }) - ''' - # search_instruments + # get_price_history - def test_search_instruments(self): - self.client.search_instruments( - ['AAPL', 'MSFT'], self.client_class.Instrument.Projection.FUNDAMENTAL) + def test_get_price_history_vanilla(self): + self.client.get_price_history(SYMBOL) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/instruments'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL,MSFT', - 'projection': 'fundamental'}) + self.make_url('/marketdata/v1/pricehistory'), params={ + 'symbol': SYMBOL}) - def test_search_instruments_one_instrument(self): - self.client.search_instruments( - 'AAPL', self.client_class.Instrument.Projection.FUNDAMENTAL) + def test_get_price_history_period_type(self): + self.client.get_price_history( + SYMBOL, period_type=self.client_class.PriceHistory.PeriodType.MONTH) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/instruments'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'projection': 'fundamental'}) + self.make_url('/marketdata/v1/pricehistory'), params={ + 'symbol': SYMBOL, + 'periodType': 'month'}) - def test_search_instruments_unchecked(self): + def test_get_price_history_period_type_unchecked(self): self.client.set_enforce_enums(False) - self.client.search_instruments(['AAPL', 'MSFT'], 'fundamental') + self.client.get_price_history(SYMBOL, period_type='month') self.mock_session.get.assert_called_once_with( - self.make_url('/v1/instruments'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL,MSFT', - 'projection': 'fundamental'}) - - # get_instrument + self.make_url('/marketdata/v1/pricehistory'), params={ + 'symbol': SYMBOL, + 'periodType': 'month'}) - def test_get_instrument(self): - self.client.get_instrument(CUSIP) + def test_get_price_history_num_periods(self): + self.client.get_price_history( + SYMBOL, period=self.client_class.PriceHistory.Period.TEN_DAYS) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/instruments/{cusip}'), - params={'apikey': API_KEY}) + self.make_url('/marketdata/v1/pricehistory'), params={ + 'symbol': SYMBOL, + 'period': 10}) - def test_get_instrument_cusip_must_be_string(self): - msg = 'CUSIPs must be passed as strings to preserve leading zeroes' - with self.assertRaises(ValueError, msg=msg): - self.client.get_instrument(123456) - - # get_hours_for_multiple_markets + def test_get_price_history_num_periods_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_price_history(SYMBOL, period=10) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/pricehistory'), params={ + 'symbol': SYMBOL, + 'period': 10}) - def test_get_hours_for_multiple_markets_datetime(self): - self.client.get_hours_for_multiple_markets([ - self.client_class.Markets.EQUITY, - self.client_class.Markets.BOND], NOW_DATETIME) + def test_get_price_history_frequency_type(self): + self.client.get_price_history( + SYMBOL, + frequency_type=self.client_class.PriceHistory.FrequencyType.DAILY) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/hours'), params={ - 'apikey': API_KEY, - 'markets': 'EQUITY,BOND', - 'date': NOW_DATE_ISO}) + self.make_url('/marketdata/v1/pricehistory'), params={ + 'symbol': SYMBOL, + 'frequencyType': 'daily'}) - def test_get_hours_for_multiple_markets_single_market(self): - self.client.get_hours_for_multiple_markets( - self.client_class.Markets.EQUITY, NOW_DATETIME) + def test_get_price_history_frequency_type_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_price_history(SYMBOL, frequency_type='daily') self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/hours'), params={ - 'apikey': API_KEY, - 'markets': 'EQUITY', - 'date': NOW_DATE_ISO}) + self.make_url('/marketdata/v1/pricehistory'), params={ + 'symbol': SYMBOL, + 'frequencyType': 'daily'}) - def test_get_hours_for_multiple_markets_date(self): - self.client.get_hours_for_multiple_markets([ - self.client_class.Markets.EQUITY, - self.client_class.Markets.BOND], NOW_DATE) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/hours'), params={ - 'apikey': API_KEY, - 'markets': 'EQUITY,BOND', - 'date': NOW_DATE_ISO}) - - - def test_get_hours_for_multiple_markets_str(self): - with self.assertRaises(ValueError) as cm: - self.client.get_hours_for_multiple_markets([ - self.client_class.Markets.EQUITY, - self.client_class.Markets.BOND], '2020-01-01') - self.assertEqual(str(cm.exception), - "expected type in (datetime.date, datetime.datetime) " - "for date, got 'builtins.str'") - - - def test_get_hours_for_multiple_markets_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_hours_for_multiple_markets( - ['EQUITY', 'BOND'], NOW_DATETIME) + def test_get_price_history_frequency(self): + self.client.get_price_history( + SYMBOL, + frequency=self.client_class.PriceHistory.Frequency.EVERY_FIVE_MINUTES) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/hours'), params={ - 'apikey': API_KEY, - 'markets': 'EQUITY,BOND', - 'date': NOW_DATE_ISO}) + self.make_url('/marketdata/v1/pricehistory'), params={ + 'symbol': SYMBOL, + 'frequency': 5}) - # get_hours_for_single_market - - def test_get_hours_for_single_market_datetime(self): - self.client.get_hours_for_single_market( - self.client_class.Markets.EQUITY, NOW_DATETIME) + def test_get_price_history_frequency_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_price_history(SYMBOL, frequency=5) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/{market}/hours'), params={ - 'apikey': API_KEY, - 'date': NOW_DATE_ISO}) + self.make_url('/marketdata/v1/pricehistory'), params={ + 'symbol': SYMBOL, + 'frequency': 5}) - def test_get_hours_for_single_market_date(self): - self.client.get_hours_for_single_market( - self.client_class.Markets.EQUITY, NOW_DATE) + def test_get_price_history_start_datetime(self): + self.client.get_price_history( + SYMBOL, start_datetime=EARLIER_DATETIME) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/{market}/hours'), params={ - 'apikey': API_KEY, - 'date': NOW_DATE_ISO}) + self.make_url('/marketdata/v1/pricehistory'), params={ + 'symbol': SYMBOL, + 'startDate': EARLIER_MILLIS}) - def test_get_hours_for_single_market_str(self): + def test_get_price_history_start_datetime_str(self): with self.assertRaises(ValueError) as cm: - self.client.get_hours_for_single_market( - self.client_class.Markets.EQUITY, '2020-01-01') + self.client.get_price_history(SYMBOL, start_datetime='2020-01-01') self.assertEqual(str(cm.exception), - "expected type in (datetime.date, datetime.datetime) for " + - "date, got 'builtins.str'") + "expected type 'datetime.datetime' for " + + "start_datetime, got 'builtins.str'") - def test_get_hours_for_single_market_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_hours_for_single_market('EQUITY', NOW_DATETIME) + def test_get_price_history_end_datetime(self): + self.client.get_price_history(SYMBOL, end_datetime=EARLIER_DATETIME) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/{market}/hours'), params={ - 'apikey': API_KEY, - 'date': NOW_DATE_ISO}) - - # get_movers + self.make_url('/marketdata/v1/pricehistory'), params={ + 'symbol': SYMBOL, + 'endDate': EARLIER_MILLIS}) - def test_get_movers(self): - self.client.get_movers( - INDEX, self.client_class.Movers.Direction.UP, self.client_class.Movers.Change.PERCENT) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/{index}/movers'), params={ - 'apikey': API_KEY, - 'direction': 'up', - 'change': 'percent'}) + def test_get_price_history_end_datetime_str(self): + with self.assertRaises(ValueError) as cm: + self.client.get_price_history(SYMBOL, end_datetime='2020-01-01') + self.assertEqual(str(cm.exception), + "expected type 'datetime.datetime' for " + + "end_datetime, got 'builtins.str'") - def test_get_movers_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_movers(INDEX, 'up', 'percent') + def test_get_price_history_need_extended_hours_data(self): + self.client.get_price_history(SYMBOL, need_extended_hours_data=True) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/{index}/movers'), params={ - 'apikey': API_KEY, - 'direction': 'up', - 'change': 'percent'}) + self.make_url('/marketdata/v1/pricehistory'), params={ + 'symbol': SYMBOL, + 'needExtendedHoursData': True}) - # get_option_chain - - def test_get_option_chain_vanilla(self): - self.client.get_option_chain('AAPL') + def test_get_price_history_need_previous_close(self): + self.client.get_price_history(SYMBOL, need_previous_close=True) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL'}) + self.make_url('/marketdata/v1/pricehistory'), params={ + 'symbol': SYMBOL, + 'needPreviousClose': True}) - - def test_get_option_chain_contract_type(self): - self.client.get_option_chain( - 'AAPL', contract_type=self.client_class.Options.ContractType.PUT) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'contractType': 'PUT'}) - - def test_get_option_chain_contract_type_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_option_chain('AAPL', contract_type='PUT') - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'contractType': 'PUT'}) + # get_price_history_every_minute - - def test_get_option_chain_strike_count(self): - self.client.get_option_chain('AAPL', strike_count=100) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'strikeCount': 100}) - - def test_get_option_chain_include_quotes(self): - self.client.get_option_chain('AAPL', include_quotes=True) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_price_history_every_minute_vanilla(self): + self.client.get_price_history_every_minute('AAPL') + params = { 'symbol': 'AAPL', - 'includeQuotes': True}) - - - def test_get_option_chain_strategy(self): - self.client.get_option_chain( - 'AAPL', strategy=self.client_class.Options.Strategy.STRANGLE) + 'periodType': 'day', + # ONE_DAY + 'period': 1, + 'frequencyType': 'minute', + # EVERY_MINUTE + 'frequency': 1, + 'startDate': MIN_TIMESTAMP_MILLIS, + 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, + } self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'strategy': 'STRANGLE'}) + self.make_url('/marketdata/v1/pricehistory'), + params=params) - - def test_get_option_chain_strategy_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_option_chain('AAPL', strategy='STRANGLE') - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'strategy': 'STRANGLE'}) - - def test_get_option_chain_interval(self): - self.client.get_option_chain('AAPL', interval=10.0) + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_price_history_every_minute_start_datetime(self): + self.client.get_price_history_every_minute( + 'AAPL', start_datetime=EARLIER_DATETIME) + params = { + 'symbol': SYMBOL, + 'periodType': 'day', + # ONE_DAY + 'period': 1, + 'frequencyType': 'minute', + # EVERY_MINUTE + 'frequency': 1, + 'startDate': EARLIER_MILLIS, + 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, + } self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'interval': 10.0}) + self.make_url('/marketdata/v1/pricehistory'), + params=params) - - def test_get_option_chain_strike(self): - self.client.get_option_chain('AAPL', strike=123) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'strike': 123}) - - def test_get_option_chain_strike_range(self): - self.client.get_option_chain( - 'AAPL', strike_range=self.client_class.Options.StrikeRange.IN_THE_MONEY) + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_price_history_every_minute_end_datetime(self): + self.client.get_price_history_every_minute( + 'AAPL', end_datetime=EARLIER_DATETIME) + params = { + 'symbol': SYMBOL, + 'periodType': 'day', + # ONE_DAY + 'period': 1, + 'frequencyType': 'minute', + # EVERY_MINUTE + 'frequency': 1, + 'startDate': MIN_TIMESTAMP_MILLIS, + 'endDate': EARLIER_MILLIS, + } self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'range': 'ITM'}) + self.make_url('/marketdata/v1/pricehistory'), + params=params) - - def test_get_option_chain_strike_range_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_option_chain('AAPL', strike_range='ITM') - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'range': 'ITM'}) - - def test_get_option_chain_from_date_datetime(self): - self.client.get_option_chain( - 'AAPL', from_date=NOW_DATETIME) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'fromDate': NOW_DATE_ISO}) - - - def test_get_option_chain_from_date_date(self): - self.client.get_option_chain('AAPL', from_date=NOW_DATE) + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_price_history_every_minute_empty_extendedhours(self): + self.client.get_price_history_every_minute( + 'AAPL', need_extended_hours_data=None) + params = { + 'symbol': SYMBOL, + 'periodType': 'day', + # ONE_DAY + 'period': 1, + 'frequencyType': 'minute', + # EVERY_MINUTE + 'frequency': 1, + 'startDate': MIN_TIMESTAMP_MILLIS, + 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, + } self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'fromDate': NOW_DATE_ISO}) + self.make_url('/marketdata/v1/pricehistory'), + params=params) - - def test_get_option_chain_from_date_str(self): - with self.assertRaises(ValueError) as cm: - self.client.get_option_chain('AAPL', from_date='2020-01-01') - self.assertEqual(str(cm.exception), - "expected type in (datetime.date, datetime.datetime) for " + - "from_date, got 'builtins.str'") - - def test_get_option_chain_to_date_datetime(self): - self.client.get_option_chain('AAPL', to_date=NOW_DATETIME) + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_price_history_every_minute_extendedhours(self): + self.client.get_price_history_every_minute( + 'AAPL', need_extended_hours_data=True) + params = { + 'symbol': SYMBOL, + 'periodType': 'day', + # ONE_DAY + 'period': 1, + 'frequencyType': 'minute', + # EVERY_MINUTE + 'frequency': 1, + 'startDate': MIN_TIMESTAMP_MILLIS, + 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, + 'needExtendedHoursData': True, + } self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'toDate': NOW_DATE_ISO}) + self.make_url('/marketdata/v1/pricehistory'), + params=params) - - def test_get_option_chain_to_date_date(self): - self.client.get_option_chain('AAPL', to_date=NOW_DATE) + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_price_history_every_minute_empty_previous_close(self): + self.client.get_price_history_every_minute( + 'AAPL', need_previous_close=None) + params = { + 'symbol': SYMBOL, + 'periodType': 'day', + # ONE_DAY + 'period': 1, + 'frequencyType': 'minute', + # EVERY_MINUTE + 'frequency': 1, + 'startDate': MIN_TIMESTAMP_MILLIS, + 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, + } self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'toDate': NOW_DATE_ISO}) + self.make_url('/marketdata/v1/pricehistory'), + params=params) - - def test_get_option_chain_to_date_str(self): - with self.assertRaises(ValueError) as cm: - self.client.get_option_chain('AAPL', to_date='2020-01-01') - self.assertEqual(str(cm.exception), - "expected type in (datetime.date, datetime.datetime) for " + - "to_date, got 'builtins.str'") - - def test_get_option_chain_volatility(self): - self.client.get_option_chain('AAPL', volatility=40.0) + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_price_history_every_minute_previous_close(self): + self.client.get_price_history_every_minute( + 'AAPL', need_previous_close=True) + params = { + 'symbol': SYMBOL, + 'periodType': 'day', + # ONE_DAY + 'period': 1, + 'frequencyType': 'minute', + # EVERY_MINUTE + 'frequency': 1, + 'startDate': MIN_TIMESTAMP_MILLIS, + 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, + 'needPreviousClose': True, + } self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'volatility': 40.0}) + self.make_url('/marketdata/v1/pricehistory'), + params=params) - - def test_get_option_chain_underlying_price(self): - self.client.get_option_chain('AAPL', underlying_price=234.0) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'underlyingPrice': 234.0}) - - def test_get_option_chain_interest_rate(self): - self.client.get_option_chain('AAPL', interest_rate=0.07) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'interestRate': 0.07}) - - def test_get_option_chain_days_to_expiration(self): - self.client.get_option_chain('AAPL', days_to_expiration=12) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'daysToExpiration': 12}) + # get_price_history_every_five_minutes - - def test_get_option_chain_exp_month(self): - self.client.get_option_chain( - 'AAPL', exp_month=self.client_class.Options.ExpirationMonth.JANUARY) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'expMonth': 'JAN'}) - - def test_get_option_chain_exp_month_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_option_chain('AAPL', exp_month='JAN') + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_price_history_every_five_minutes_vanilla(self): + self.client.get_price_history_every_five_minutes('AAPL') + params = { + 'symbol': SYMBOL, + 'periodType': 'day', + # ONE_DAY + 'period': 1, + 'frequencyType': 'minute', + # EVERY_FIVE_MINUTES + 'frequency': 5, + 'startDate': MIN_TIMESTAMP_MILLIS, + 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, + } self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'expMonth': 'JAN'}) + self.make_url('/marketdata/v1/pricehistory'), + params=params) - - def test_get_option_chain_option_type(self): - self.client.get_option_chain( - 'AAPL', option_type=self.client_class.Options.Type.STANDARD) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'optionType': 'S'}) - - def test_get_option_chain_option_type_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_option_chain('AAPL', option_type='S') + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_price_history_every_five_minutes_start_datetime(self): + self.client.get_price_history_every_five_minutes( + 'AAPL', start_datetime=EARLIER_DATETIME) + params = { + 'symbol': SYMBOL, + 'periodType': 'day', + # ONE_DAY + 'period': 1, + 'frequencyType': 'minute', + # EVERY_FIVE_MINUTES + 'frequency': 5, + 'startDate': EARLIER_MILLIS, + 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, + } self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'optionType': 'S'}) - ''' - - # get_price_history + self.make_url('/marketdata/v1/pricehistory'), + params=params) - - def test_get_price_history_vanilla(self): - self.client.get_price_history(SYMBOL) - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), params={ - 'symbol': SYMBOL}) - - def test_get_price_history_period_type(self): - self.client.get_price_history( - SYMBOL, period_type=self.client_class.PriceHistory.PeriodType.MONTH) - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), params={ + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_price_history_every_five_minutes_end_datetime(self): + self.client.get_price_history_every_five_minutes( + 'AAPL', end_datetime=EARLIER_DATETIME) + params = { 'symbol': SYMBOL, - 'periodType': 'month'}) - - - def test_get_price_history_period_type_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_price_history(SYMBOL, period_type='month') + 'periodType': 'day', + # ONE_DAY + 'period': 1, + 'frequencyType': 'minute', + # EVERY_FIVE_MINUTES + 'frequency': 5, + 'startDate': MIN_TIMESTAMP_MILLIS, + 'endDate': EARLIER_MILLIS, + } self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), params={ - 'symbol': SYMBOL, - 'periodType': 'month'}) + self.make_url('/marketdata/v1/pricehistory'), + params=params) - - def test_get_price_history_num_periods(self): - self.client.get_price_history( - SYMBOL, period=self.client_class.PriceHistory.Period.TEN_DAYS) - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), params={ - 'symbol': SYMBOL, - 'period': 10}) - - def test_get_price_history_num_periods_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_price_history(SYMBOL, period=10) - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), params={ - 'symbol': SYMBOL, - 'period': 10}) - - - def test_get_price_history_frequency_type(self): - self.client.get_price_history( - SYMBOL, - frequency_type=self.client_class.PriceHistory.FrequencyType.DAILY) - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), params={ - 'symbol': SYMBOL, - 'frequencyType': 'daily'}) - - - def test_get_price_history_frequency_type_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_price_history(SYMBOL, frequency_type='daily') - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), params={ + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_price_history_every_five_minutes_empty_extendedhours(self): + self.client.get_price_history_every_five_minutes( + 'AAPL', need_extended_hours_data=None) + params = { 'symbol': SYMBOL, - 'frequencyType': 'daily'}) - - - def test_get_price_history_frequency(self): - self.client.get_price_history( - SYMBOL, - frequency=self.client_class.PriceHistory.Frequency.EVERY_FIVE_MINUTES) + 'periodType': 'day', + # ONE_DAY + 'period': 1, + 'frequencyType': 'minute', + # EVERY_FIVE_MINUTES + 'frequency': 5, + 'startDate': MIN_TIMESTAMP_MILLIS, + 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, + } self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), params={ - 'symbol': SYMBOL, - 'frequency': 5}) + self.make_url('/marketdata/v1/pricehistory'), + params=params) - def test_get_price_history_frequency_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_price_history(SYMBOL, frequency=5) - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), params={ + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_price_history_every_five_minutes_extendedhours(self): + self.client.get_price_history_every_five_minutes( + 'AAPL', need_extended_hours_data=True) + params = { 'symbol': SYMBOL, - 'frequency': 5}) - - - def test_get_price_history_start_datetime(self): - self.client.get_price_history( - SYMBOL, start_datetime=EARLIER_DATETIME) + 'periodType': 'day', + # ONE_DAY + 'period': 1, + 'frequencyType': 'minute', + # EVERY_FIVE_MINUTES + 'frequency': 5, + 'startDate': MIN_TIMESTAMP_MILLIS, + 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, + 'needExtendedHoursData': True, + } self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), params={ - 'symbol': SYMBOL, - 'startDate': EARLIER_MILLIS}) - - - def test_get_price_history_start_datetime_str(self): - with self.assertRaises(ValueError) as cm: - self.client.get_price_history(SYMBOL, start_datetime='2020-01-01') - self.assertEqual(str(cm.exception), - "expected type 'datetime.datetime' for " + - "start_datetime, got 'builtins.str'") + self.make_url('/marketdata/v1/pricehistory'), + params=params) - - def test_get_price_history_end_datetime(self): - self.client.get_price_history(SYMBOL, end_datetime=EARLIER_DATETIME) - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), params={ + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_price_history_every_five_minutes_empty_previous_close(self): + self.client.get_price_history_every_five_minutes( + 'AAPL', need_previous_close=None) + params = { 'symbol': SYMBOL, - 'endDate': EARLIER_MILLIS}) - - - def test_get_price_history_end_datetime_str(self): - with self.assertRaises(ValueError) as cm: - self.client.get_price_history(SYMBOL, end_datetime='2020-01-01') - self.assertEqual(str(cm.exception), - "expected type 'datetime.datetime' for " + - "end_datetime, got 'builtins.str'") - - - def test_get_price_history_need_extended_hours_data(self): - self.client.get_price_history(SYMBOL, need_extended_hours_data=True) + 'periodType': 'day', + # ONE_DAY + 'period': 1, + 'frequencyType': 'minute', + # EVERY_FIVE_MINUTES + 'frequency': 5, + 'startDate': MIN_TIMESTAMP_MILLIS, + 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, + } self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), params={ - 'symbol': SYMBOL, - 'needExtendedHoursData': True}) + self.make_url('/marketdata/v1/pricehistory'), + params=params) - def test_get_price_history_need_previous_close(self): - self.client.get_price_history(SYMBOL, need_previous_close=True) - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), params={ + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_price_history_every_five_minutes_previous_close(self): + self.client.get_price_history_every_five_minutes( + 'AAPL', need_previous_close=True) + params = { 'symbol': SYMBOL, - 'needPreviousClose': True}) + 'periodType': 'day', + # ONE_DAY + 'period': 1, + 'frequencyType': 'minute', + # EVERY_FIVE_MINUTES + 'frequency': 5, + 'startDate': MIN_TIMESTAMP_MILLIS, + 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, + 'needPreviousClose': True, + } + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/pricehistory'), + params=params) - # get_price_history_every_minute + # get_price_history_every_ten_minutes @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_minute_vanilla(self): - self.client.get_price_history_every_minute('AAPL') + def test_get_price_history_every_ten_minutes_vanilla(self): + self.client.get_price_history_every_ten_minutes('AAPL') params = { - 'symbol': 'AAPL', + 'symbol': SYMBOL, 'periodType': 'day', # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_MINUTE - 'frequency': 1, + # EVERY_TEN_MINUTES + 'frequency': 10, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1117,8 +846,8 @@ def test_get_price_history_every_minute_vanilla(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_minute_start_datetime(self): - self.client.get_price_history_every_minute( + def test_get_price_history_every_ten_minutes_start_datetime(self): + self.client.get_price_history_every_ten_minutes( 'AAPL', start_datetime=EARLIER_DATETIME) params = { 'symbol': SYMBOL, @@ -1126,8 +855,8 @@ def test_get_price_history_every_minute_start_datetime(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_MINUTE - 'frequency': 1, + # EVERY_TEN_MINUTES + 'frequency': 10, 'startDate': EARLIER_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1137,8 +866,8 @@ def test_get_price_history_every_minute_start_datetime(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_minute_end_datetime(self): - self.client.get_price_history_every_minute( + def test_get_price_history_every_ten_minutes_end_datetime(self): + self.client.get_price_history_every_ten_minutes( 'AAPL', end_datetime=EARLIER_DATETIME) params = { 'symbol': SYMBOL, @@ -1146,8 +875,8 @@ def test_get_price_history_every_minute_end_datetime(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_MINUTE - 'frequency': 1, + # EVERY_TEN_MINUTES + 'frequency': 10, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': EARLIER_MILLIS, } @@ -1157,8 +886,8 @@ def test_get_price_history_every_minute_end_datetime(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_minute_empty_extendedhours(self): - self.client.get_price_history_every_minute( + def test_get_price_history_every_ten_minutes_empty_extendedhours(self): + self.client.get_price_history_every_ten_minutes( 'AAPL', need_extended_hours_data=None) params = { 'symbol': SYMBOL, @@ -1166,8 +895,8 @@ def test_get_price_history_every_minute_empty_extendedhours(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_MINUTE - 'frequency': 1, + # EVERY_TEN_MINUTES + 'frequency': 10, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1177,8 +906,8 @@ def test_get_price_history_every_minute_empty_extendedhours(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_minute_extendedhours(self): - self.client.get_price_history_every_minute( + def test_get_price_history_every_ten_minutes_extendedhours(self): + self.client.get_price_history_every_ten_minutes( 'AAPL', need_extended_hours_data=True) params = { 'symbol': SYMBOL, @@ -1186,8 +915,8 @@ def test_get_price_history_every_minute_extendedhours(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_MINUTE - 'frequency': 1, + # EVERY_TEN_MINUTES + 'frequency': 10, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, 'needExtendedHoursData': True, @@ -1197,8 +926,8 @@ def test_get_price_history_every_minute_extendedhours(self): params=params) @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_minute_empty_previous_close(self): - self.client.get_price_history_every_minute( + def test_get_price_history_every_ten_minutes_empty_previous_close(self): + self.client.get_price_history_every_ten_minutes( 'AAPL', need_previous_close=None) params = { 'symbol': SYMBOL, @@ -1206,8 +935,8 @@ def test_get_price_history_every_minute_empty_previous_close(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_MINUTE - 'frequency': 1, + # EVERY_TEN_MINUTES + 'frequency': 10, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1217,8 +946,8 @@ def test_get_price_history_every_minute_empty_previous_close(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_minute_previous_close(self): - self.client.get_price_history_every_minute( + def test_get_price_history_every_ten_minutes_previous_close(self): + self.client.get_price_history_every_ten_minutes( 'AAPL', need_previous_close=True) params = { 'symbol': SYMBOL, @@ -1226,8 +955,8 @@ def test_get_price_history_every_minute_previous_close(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_MINUTE - 'frequency': 1, + # EVERY_TEN_MINUTES + 'frequency': 10, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, 'needPreviousClose': True, @@ -1237,21 +966,20 @@ def test_get_price_history_every_minute_previous_close(self): params=params) - - # get_price_history_every_five_minutes + # get_price_history_every_fifteen_minutes @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_five_minutes_vanilla(self): - self.client.get_price_history_every_five_minutes('AAPL') + def test_get_price_history_every_fifteen_minutes_vanilla(self): + self.client.get_price_history_every_fifteen_minutes('AAPL') params = { 'symbol': SYMBOL, 'periodType': 'day', # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_FIVE_MINUTES - 'frequency': 5, + # EVERY_FIFTEEN_MINUTES + 'frequency': 15, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1261,8 +989,8 @@ def test_get_price_history_every_five_minutes_vanilla(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_five_minutes_start_datetime(self): - self.client.get_price_history_every_five_minutes( + def test_get_price_history_every_fifteen_minutes_start_datetime(self): + self.client.get_price_history_every_fifteen_minutes( 'AAPL', start_datetime=EARLIER_DATETIME) params = { 'symbol': SYMBOL, @@ -1270,8 +998,8 @@ def test_get_price_history_every_five_minutes_start_datetime(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_FIVE_MINUTES - 'frequency': 5, + # EVERY_FIFTEEN_MINUTES + 'frequency': 15, 'startDate': EARLIER_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1281,8 +1009,8 @@ def test_get_price_history_every_five_minutes_start_datetime(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_five_minutes_end_datetime(self): - self.client.get_price_history_every_five_minutes( + def test_get_price_history_every_fifteen_minutes_end_datetime(self): + self.client.get_price_history_every_fifteen_minutes( 'AAPL', end_datetime=EARLIER_DATETIME) params = { 'symbol': SYMBOL, @@ -1290,8 +1018,8 @@ def test_get_price_history_every_five_minutes_end_datetime(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_FIVE_MINUTES - 'frequency': 5, + # EVERY_FIFTEEN_MINUTES + 'frequency': 15, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': EARLIER_MILLIS, } @@ -1301,8 +1029,8 @@ def test_get_price_history_every_five_minutes_end_datetime(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_five_minutes_empty_extendedhours(self): - self.client.get_price_history_every_five_minutes( + def test_get_price_history_every_fifteen_minutes_empty_extendedhours(self): + self.client.get_price_history_every_fifteen_minutes( 'AAPL', need_extended_hours_data=None) params = { 'symbol': SYMBOL, @@ -1310,8 +1038,8 @@ def test_get_price_history_every_five_minutes_empty_extendedhours(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_FIVE_MINUTES - 'frequency': 5, + # EVERY_FIFTEEN_MINUTES + 'frequency': 15, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1321,8 +1049,8 @@ def test_get_price_history_every_five_minutes_empty_extendedhours(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_five_minutes_extendedhours(self): - self.client.get_price_history_every_five_minutes( + def test_get_price_history_every_fifteen_minutes_extendedhours(self): + self.client.get_price_history_every_fifteen_minutes( 'AAPL', need_extended_hours_data=True) params = { 'symbol': SYMBOL, @@ -1330,8 +1058,8 @@ def test_get_price_history_every_five_minutes_extendedhours(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_FIVE_MINUTES - 'frequency': 5, + # EVERY_FIFTEEN_MINUTES + 'frequency': 15, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, 'needExtendedHoursData': True, @@ -1341,8 +1069,8 @@ def test_get_price_history_every_five_minutes_extendedhours(self): params=params) @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_five_minutes_empty_previous_close(self): - self.client.get_price_history_every_five_minutes( + def test_get_price_history_every_fifteen_minutes_empty_previous_close(self): + self.client.get_price_history_every_fifteen_minutes( 'AAPL', need_previous_close=None) params = { 'symbol': SYMBOL, @@ -1350,8 +1078,8 @@ def test_get_price_history_every_five_minutes_empty_previous_close(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_FIVE_MINUTES - 'frequency': 5, + # EVERY_FIFTEEN_MINUTES + 'frequency': 15, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1361,8 +1089,8 @@ def test_get_price_history_every_five_minutes_empty_previous_close(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_five_minutes_previous_close(self): - self.client.get_price_history_every_five_minutes( + def test_get_price_history_every_fifteen_minutes_previous_close(self): + self.client.get_price_history_every_fifteen_minutes( 'AAPL', need_previous_close=True) params = { 'symbol': SYMBOL, @@ -1370,8 +1098,8 @@ def test_get_price_history_every_five_minutes_previous_close(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_FIVE_MINUTES - 'frequency': 5, + # EVERY_FIFTEEN_MINUTES + 'frequency': 15, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, 'needPreviousClose': True, @@ -1381,20 +1109,20 @@ def test_get_price_history_every_five_minutes_previous_close(self): params=params) - # get_price_history_every_ten_minutes + # get_price_history_every_thirty_minutes @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_ten_minutes_vanilla(self): - self.client.get_price_history_every_ten_minutes('AAPL') + def test_get_price_history_every_thirty_minutes_vanilla(self): + self.client.get_price_history_every_thirty_minutes('AAPL') params = { 'symbol': SYMBOL, 'periodType': 'day', # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_TEN_MINUTES - 'frequency': 10, + # EVERY_THIRTY_MINUTES + 'frequency': 30, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1404,8 +1132,8 @@ def test_get_price_history_every_ten_minutes_vanilla(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_ten_minutes_start_datetime(self): - self.client.get_price_history_every_ten_minutes( + def test_get_price_history_every_thirty_minutes_start_datetime(self): + self.client.get_price_history_every_thirty_minutes( 'AAPL', start_datetime=EARLIER_DATETIME) params = { 'symbol': SYMBOL, @@ -1413,8 +1141,8 @@ def test_get_price_history_every_ten_minutes_start_datetime(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_TEN_MINUTES - 'frequency': 10, + # EVERY_THIRTY_MINUTES + 'frequency': 30, 'startDate': EARLIER_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1424,8 +1152,8 @@ def test_get_price_history_every_ten_minutes_start_datetime(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_ten_minutes_end_datetime(self): - self.client.get_price_history_every_ten_minutes( + def test_get_price_history_every_thirty_minutes_end_datetime(self): + self.client.get_price_history_every_thirty_minutes( 'AAPL', end_datetime=EARLIER_DATETIME) params = { 'symbol': SYMBOL, @@ -1433,8 +1161,8 @@ def test_get_price_history_every_ten_minutes_end_datetime(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_TEN_MINUTES - 'frequency': 10, + # EVERY_THIRTY_MINUTES + 'frequency': 30, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': EARLIER_MILLIS, } @@ -1444,8 +1172,8 @@ def test_get_price_history_every_ten_minutes_end_datetime(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_ten_minutes_empty_extendedhours(self): - self.client.get_price_history_every_ten_minutes( + def test_get_price_history_every_thirty_minutes_empty_extendedhours(self): + self.client.get_price_history_every_thirty_minutes( 'AAPL', need_extended_hours_data=None) params = { 'symbol': SYMBOL, @@ -1453,8 +1181,8 @@ def test_get_price_history_every_ten_minutes_empty_extendedhours(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_TEN_MINUTES - 'frequency': 10, + # EVERY_THIRTY_MINUTES + 'frequency': 30, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1464,8 +1192,8 @@ def test_get_price_history_every_ten_minutes_empty_extendedhours(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_ten_minutes_extendedhours(self): - self.client.get_price_history_every_ten_minutes( + def test_get_price_history_every_thirty_minutes_extendedhours(self): + self.client.get_price_history_every_thirty_minutes( 'AAPL', need_extended_hours_data=True) params = { 'symbol': SYMBOL, @@ -1473,8 +1201,8 @@ def test_get_price_history_every_ten_minutes_extendedhours(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_TEN_MINUTES - 'frequency': 10, + # EVERY_THIRTY_MINUTES + 'frequency': 30, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, 'needExtendedHoursData': True, @@ -1484,8 +1212,8 @@ def test_get_price_history_every_ten_minutes_extendedhours(self): params=params) @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_ten_minutes_empty_previous_close(self): - self.client.get_price_history_every_ten_minutes( + def test_get_price_history_every_thirty_minutes_empty_previous_close(self): + self.client.get_price_history_every_thirty_minutes( 'AAPL', need_previous_close=None) params = { 'symbol': SYMBOL, @@ -1493,8 +1221,8 @@ def test_get_price_history_every_ten_minutes_empty_previous_close(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_TEN_MINUTES - 'frequency': 10, + # EVERY_THIRTY_MINUTES + 'frequency': 30, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1504,8 +1232,8 @@ def test_get_price_history_every_ten_minutes_empty_previous_close(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_ten_minutes_previous_close(self): - self.client.get_price_history_every_ten_minutes( + def test_get_price_history_every_thirty_minutes_previous_close(self): + self.client.get_price_history_every_thirty_minutes( 'AAPL', need_previous_close=True) params = { 'symbol': SYMBOL, @@ -1513,8 +1241,8 @@ def test_get_price_history_every_ten_minutes_previous_close(self): # ONE_DAY 'period': 1, 'frequencyType': 'minute', - # EVERY_TEN_MINUTES - 'frequency': 10, + # EVERY_THIRTY_MINUTES + 'frequency': 30, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, 'needPreviousClose': True, @@ -1524,20 +1252,20 @@ def test_get_price_history_every_ten_minutes_previous_close(self): params=params) - # get_price_history_every_fifteen_minutes + # get_price_history_every_day @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_fifteen_minutes_vanilla(self): - self.client.get_price_history_every_fifteen_minutes('AAPL') + def test_get_price_history_every_day_vanilla(self): + self.client.get_price_history_every_day('AAPL') params = { 'symbol': SYMBOL, - 'periodType': 'day', - # ONE_DAY - 'period': 1, - 'frequencyType': 'minute', - # EVERY_FIFTEEN_MINUTES - 'frequency': 15, + 'periodType': 'year', + # TWENTY_YEARS + 'period': 20, + 'frequencyType': 'daily', + # DAILY + 'frequency': 1, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1547,17 +1275,17 @@ def test_get_price_history_every_fifteen_minutes_vanilla(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_fifteen_minutes_start_datetime(self): - self.client.get_price_history_every_fifteen_minutes( + def test_get_price_history_every_day_start_datetime(self): + self.client.get_price_history_every_day( 'AAPL', start_datetime=EARLIER_DATETIME) params = { 'symbol': SYMBOL, - 'periodType': 'day', - # ONE_DAY - 'period': 1, - 'frequencyType': 'minute', - # EVERY_FIFTEEN_MINUTES - 'frequency': 15, + 'periodType': 'year', + # TWENTY_YEARS + 'period': 20, + 'frequencyType': 'daily', + # DAILY + 'frequency': 1, 'startDate': EARLIER_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1567,17 +1295,17 @@ def test_get_price_history_every_fifteen_minutes_start_datetime(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_fifteen_minutes_end_datetime(self): - self.client.get_price_history_every_fifteen_minutes( + def test_get_price_history_every_day_end_datetime(self): + self.client.get_price_history_every_day( 'AAPL', end_datetime=EARLIER_DATETIME) params = { 'symbol': SYMBOL, - 'periodType': 'day', - # ONE_DAY - 'period': 1, - 'frequencyType': 'minute', - # EVERY_FIFTEEN_MINUTES - 'frequency': 15, + 'periodType': 'year', + # TWENTY_YEARS + 'period': 20, + 'frequencyType': 'daily', + # DAILY + 'frequency': 1, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': EARLIER_MILLIS, } @@ -1587,17 +1315,17 @@ def test_get_price_history_every_fifteen_minutes_end_datetime(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_fifteen_minutes_empty_extendedhours(self): - self.client.get_price_history_every_fifteen_minutes( + def test_get_price_history_every_day_empty_extendedhours(self): + self.client.get_price_history_every_day( 'AAPL', need_extended_hours_data=None) params = { 'symbol': SYMBOL, - 'periodType': 'day', - # ONE_DAY - 'period': 1, - 'frequencyType': 'minute', - # EVERY_FIFTEEN_MINUTES - 'frequency': 15, + 'periodType': 'year', + # TWENTY_YEARS + 'period': 20, + 'frequencyType': 'daily', + # DAILY + 'frequency': 1, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1607,17 +1335,17 @@ def test_get_price_history_every_fifteen_minutes_empty_extendedhours(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_fifteen_minutes_extendedhours(self): - self.client.get_price_history_every_fifteen_minutes( + def test_get_price_history_every_day_extendedhours(self): + self.client.get_price_history_every_day( 'AAPL', need_extended_hours_data=True) params = { 'symbol': SYMBOL, - 'periodType': 'day', - # ONE_DAY - 'period': 1, - 'frequencyType': 'minute', - # EVERY_FIFTEEN_MINUTES - 'frequency': 15, + 'periodType': 'year', + # TWENTY_YEARS + 'period': 20, + 'frequencyType': 'daily', + # DAILY + 'frequency': 1, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, 'needExtendedHoursData': True, @@ -1627,17 +1355,17 @@ def test_get_price_history_every_fifteen_minutes_extendedhours(self): params=params) @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_fifteen_minutes_empty_previous_close(self): - self.client.get_price_history_every_fifteen_minutes( + def test_get_price_history_every_day_empty_previous_close(self): + self.client.get_price_history_every_day( 'AAPL', need_previous_close=None) params = { 'symbol': SYMBOL, - 'periodType': 'day', - # ONE_DAY - 'period': 1, - 'frequencyType': 'minute', - # EVERY_FIFTEEN_MINUTES - 'frequency': 15, + 'periodType': 'year', + # TWENTY_YEARS + 'period': 20, + 'frequencyType': 'daily', + # DAILY + 'frequency': 1, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1647,17 +1375,17 @@ def test_get_price_history_every_fifteen_minutes_empty_previous_close(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_fifteen_minutes_previous_close(self): - self.client.get_price_history_every_fifteen_minutes( + def test_get_price_history_every_day_previous_close(self): + self.client.get_price_history_every_day( 'AAPL', need_previous_close=True) params = { 'symbol': SYMBOL, - 'periodType': 'day', - # ONE_DAY - 'period': 1, - 'frequencyType': 'minute', - # EVERY_FIFTEEN_MINUTES - 'frequency': 15, + 'periodType': 'year', + # TWENTY_YEARS + 'period': 20, + 'frequencyType': 'daily', + # DAILY + 'frequency': 1, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, 'needPreviousClose': True, @@ -1667,20 +1395,20 @@ def test_get_price_history_every_fifteen_minutes_previous_close(self): params=params) - # get_price_history_every_thirty_minutes + # get_price_history_every_week @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_thirty_minutes_vanilla(self): - self.client.get_price_history_every_thirty_minutes('AAPL') + def test_get_price_history_every_week_vanilla(self): + self.client.get_price_history_every_week('AAPL') params = { 'symbol': SYMBOL, - 'periodType': 'day', - # ONE_DAY - 'period': 1, - 'frequencyType': 'minute', - # EVERY_THIRTY_MINUTES - 'frequency': 30, + 'periodType': 'year', + # TWENTY_YEARS + 'period': 20, + 'frequencyType': 'weekly', + # DAILY + 'frequency': 1, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1690,17 +1418,17 @@ def test_get_price_history_every_thirty_minutes_vanilla(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_thirty_minutes_start_datetime(self): - self.client.get_price_history_every_thirty_minutes( + def test_get_price_history_every_week_start_datetime(self): + self.client.get_price_history_every_week( 'AAPL', start_datetime=EARLIER_DATETIME) params = { 'symbol': SYMBOL, - 'periodType': 'day', - # ONE_DAY - 'period': 1, - 'frequencyType': 'minute', - # EVERY_THIRTY_MINUTES - 'frequency': 30, + 'periodType': 'year', + # TWENTY_YEARS + 'period': 20, + 'frequencyType': 'weekly', + # DAILY + 'frequency': 1, 'startDate': EARLIER_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1710,17 +1438,17 @@ def test_get_price_history_every_thirty_minutes_start_datetime(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_thirty_minutes_end_datetime(self): - self.client.get_price_history_every_thirty_minutes( + def test_get_price_history_every_week_end_datetime(self): + self.client.get_price_history_every_week( 'AAPL', end_datetime=EARLIER_DATETIME) params = { 'symbol': SYMBOL, - 'periodType': 'day', - # ONE_DAY - 'period': 1, - 'frequencyType': 'minute', - # EVERY_THIRTY_MINUTES - 'frequency': 30, + 'periodType': 'year', + # TWENTY_YEARS + 'period': 20, + 'frequencyType': 'weekly', + # DAILY + 'frequency': 1, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': EARLIER_MILLIS, } @@ -1730,17 +1458,17 @@ def test_get_price_history_every_thirty_minutes_end_datetime(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_thirty_minutes_empty_extendedhours(self): - self.client.get_price_history_every_thirty_minutes( + def test_get_price_history_every_week_empty_extendedhours(self): + self.client.get_price_history_every_week( 'AAPL', need_extended_hours_data=None) params = { 'symbol': SYMBOL, - 'periodType': 'day', - # ONE_DAY - 'period': 1, - 'frequencyType': 'minute', - # EVERY_THIRTY_MINUTES - 'frequency': 30, + 'periodType': 'year', + # TWENTY_YEARS + 'period': 20, + 'frequencyType': 'weekly', + # DAILY + 'frequency': 1, 'startDate': MIN_TIMESTAMP_MILLIS, 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, } @@ -1750,158 +1478,15 @@ def test_get_price_history_every_thirty_minutes_empty_extendedhours(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_thirty_minutes_extendedhours(self): - self.client.get_price_history_every_thirty_minutes( - 'AAPL', need_extended_hours_data=True) - params = { - 'symbol': SYMBOL, - 'periodType': 'day', - # ONE_DAY - 'period': 1, - 'frequencyType': 'minute', - # EVERY_THIRTY_MINUTES - 'frequency': 30, - 'startDate': MIN_TIMESTAMP_MILLIS, - 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, - 'needExtendedHoursData': True, - } - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), - params=params) - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_thirty_minutes_empty_previous_close(self): - self.client.get_price_history_every_thirty_minutes( - 'AAPL', need_previous_close=None) - params = { - 'symbol': SYMBOL, - 'periodType': 'day', - # ONE_DAY - 'period': 1, - 'frequencyType': 'minute', - # EVERY_THIRTY_MINUTES - 'frequency': 30, - 'startDate': MIN_TIMESTAMP_MILLIS, - 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, - } - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), - params=params) - - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_thirty_minutes_previous_close(self): - self.client.get_price_history_every_thirty_minutes( - 'AAPL', need_previous_close=True) - params = { - 'symbol': SYMBOL, - 'periodType': 'day', - # ONE_DAY - 'period': 1, - 'frequencyType': 'minute', - # EVERY_THIRTY_MINUTES - 'frequency': 30, - 'startDate': MIN_TIMESTAMP_MILLIS, - 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, - 'needPreviousClose': True, - } - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), - params=params) - - - # get_price_history_every_day - - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_day_vanilla(self): - self.client.get_price_history_every_day('AAPL') - params = { - 'symbol': SYMBOL, - 'periodType': 'year', - # TWENTY_YEARS - 'period': 20, - 'frequencyType': 'daily', - # DAILY - 'frequency': 1, - 'startDate': MIN_TIMESTAMP_MILLIS, - 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, - } - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), - params=params) - - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_day_start_datetime(self): - self.client.get_price_history_every_day( - 'AAPL', start_datetime=EARLIER_DATETIME) - params = { - 'symbol': SYMBOL, - 'periodType': 'year', - # TWENTY_YEARS - 'period': 20, - 'frequencyType': 'daily', - # DAILY - 'frequency': 1, - 'startDate': EARLIER_MILLIS, - 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, - } - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), - params=params) - - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_day_end_datetime(self): - self.client.get_price_history_every_day( - 'AAPL', end_datetime=EARLIER_DATETIME) - params = { - 'symbol': SYMBOL, - 'periodType': 'year', - # TWENTY_YEARS - 'period': 20, - 'frequencyType': 'daily', - # DAILY - 'frequency': 1, - 'startDate': MIN_TIMESTAMP_MILLIS, - 'endDate': EARLIER_MILLIS, - } - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), - params=params) - - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_day_empty_extendedhours(self): - self.client.get_price_history_every_day( - 'AAPL', need_extended_hours_data=None) - params = { - 'symbol': SYMBOL, - 'periodType': 'year', - # TWENTY_YEARS - 'period': 20, - 'frequencyType': 'daily', - # DAILY - 'frequency': 1, - 'startDate': MIN_TIMESTAMP_MILLIS, - 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, - } - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), - params=params) - - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_day_extendedhours(self): - self.client.get_price_history_every_day( + def test_get_price_history_every_week_extendedhours(self): + self.client.get_price_history_every_week( 'AAPL', need_extended_hours_data=True) params = { 'symbol': SYMBOL, 'periodType': 'year', # TWENTY_YEARS 'period': 20, - 'frequencyType': 'daily', + 'frequencyType': 'weekly', # DAILY 'frequency': 1, 'startDate': MIN_TIMESTAMP_MILLIS, @@ -1913,15 +1498,15 @@ def test_get_price_history_every_day_extendedhours(self): params=params) @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_day_empty_previous_close(self): - self.client.get_price_history_every_day( + def test_get_price_history_every_week_empty_previous_close(self): + self.client.get_price_history_every_week( 'AAPL', need_previous_close=None) params = { 'symbol': SYMBOL, 'periodType': 'year', # TWENTY_YEARS 'period': 20, - 'frequencyType': 'daily', + 'frequencyType': 'weekly', # DAILY 'frequency': 1, 'startDate': MIN_TIMESTAMP_MILLIS, @@ -1933,15 +1518,15 @@ def test_get_price_history_every_day_empty_previous_close(self): @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_day_previous_close(self): - self.client.get_price_history_every_day( + def test_get_price_history_every_week_previous_close(self): + self.client.get_price_history_every_week( 'AAPL', need_previous_close=True) params = { 'symbol': SYMBOL, 'periodType': 'year', # TWENTY_YEARS 'period': 20, - 'frequencyType': 'daily', + 'frequencyType': 'weekly', # DAILY 'frequency': 1, 'startDate': MIN_TIMESTAMP_MILLIS, @@ -1953,148 +1538,680 @@ def test_get_price_history_every_day_previous_close(self): params=params) - # get_price_history_every_week + ''' + # place_order + + def test_place_order(self): + order_spec = {'order': 'spec'} + self.client.place_order(ACCOUNT_HASH, order_spec) + self.mock_session.post.assert_called_once_with( + self.make_url('/v1/accounts/{accountHash}/orders'), json=order_spec) - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_week_vanilla(self): - self.client.get_price_history_every_week('AAPL') - params = { - 'symbol': SYMBOL, - 'periodType': 'year', - # TWENTY_YEARS - 'period': 20, - 'frequencyType': 'weekly', - # DAILY - 'frequency': 1, - 'startDate': MIN_TIMESTAMP_MILLIS, - 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, - } - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), - params=params) + + def test_place_order_order_builder(self): + order_spec = OrderBuilder(enforce_enums=False).set_order_type('LIMIT') + expected_spec = {'orderType': 'LIMIT'} + self.client.place_order(ACCOUNT_HASH, order_spec) + self.mock_session.post.assert_called_once_with( + self.make_url('/v1/accounts/{accountHash}/orders'), + json=expected_spec) + + def test_place_order_str(self): + order_spec = {'order': 'spec'} + self.client.place_order(str(ACCOUNT_HASH), order_spec) + self.mock_session.post.assert_called_once_with( + self.make_url('/v1/accounts/{accountHash}/orders'), json=order_spec) - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_week_start_datetime(self): - self.client.get_price_history_every_week( - 'AAPL', start_datetime=EARLIER_DATETIME) - params = { - 'symbol': SYMBOL, - 'periodType': 'year', - # TWENTY_YEARS - 'period': 20, - 'frequencyType': 'weekly', - # DAILY - 'frequency': 1, - 'startDate': EARLIER_MILLIS, - 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, - } - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), - params=params) + # replace_order + + def test_replace_order(self): + order_spec = {'order': 'spec'} + self.client.replace_order(ACCOUNT_HASH, ORDER_ID, order_spec) + self.mock_session.put.assert_called_once_with( + self.make_url('/v1/accounts/{accountHash}/orders/{orderId}'), + json=order_spec) - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_week_end_datetime(self): - self.client.get_price_history_every_week( - 'AAPL', end_datetime=EARLIER_DATETIME) - params = { - 'symbol': SYMBOL, - 'periodType': 'year', - # TWENTY_YEARS - 'period': 20, - 'frequencyType': 'weekly', - # DAILY - 'frequency': 1, - 'startDate': MIN_TIMESTAMP_MILLIS, - 'endDate': EARLIER_MILLIS, - } - self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), - params=params) + + def test_replace_order_order_builder(self): + order_spec = OrderBuilder(enforce_enums=False).set_order_type('LIMIT') + expected_spec = {'orderType': 'LIMIT'} + self.client.replace_order(ACCOUNT_HASH, ORDER_ID, order_spec) + self.mock_session.put.assert_called_once_with( + self.make_url('/v1/accounts/{accountHash}/orders/{orderId}'), + json=expected_spec) + + def test_replace_order_str(self): + order_spec = {'order': 'spec'} + self.client.replace_order(str(ACCOUNT_HASH), str(ORDER_ID), order_spec) + self.mock_session.put.assert_called_once_with( + self.make_url('/v1/accounts/{accountHash}/orders/{orderId}'), + json=order_spec) - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_week_empty_extendedhours(self): - self.client.get_price_history_every_week( - 'AAPL', need_extended_hours_data=None) - params = { - 'symbol': SYMBOL, - 'periodType': 'year', - # TWENTY_YEARS - 'period': 20, - 'frequencyType': 'weekly', - # DAILY - 'frequency': 1, - 'startDate': MIN_TIMESTAMP_MILLIS, - 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, - } + # create_saved_order + + + def test_create_saved_order(self): + order_spec = {'order': 'spec'} + self.client.create_saved_order(ACCOUNT_HASH, order_spec) + self.mock_session.post.assert_called_once_with( + self.make_url('/v1/accounts/{accountHash}/savedorders'), + json=order_spec) + + + def test_create_saved_order_order_builder(self): + order_spec = OrderBuilder(enforce_enums=False).set_order_type('LIMIT') + expected_spec = {'orderType': 'LIMIT'} + self.client.create_saved_order(ACCOUNT_HASH, order_spec) + self.mock_session.post.assert_called_once_with( + self.make_url('/v1/accounts/{accountHash}/savedorders'), + json=expected_spec) + + + def test_create_saved_order_str(self): + order_spec = {'order': 'spec'} + self.client.create_saved_order(str(ACCOUNT_HASH), order_spec) + self.mock_session.post.assert_called_once_with( + self.make_url('/v1/accounts/{accountHash}/savedorders'), + json=order_spec) + + # delete_saved_order + + + def test_delete_saved_order(self): + self.client.delete_saved_order(ACCOUNT_HASH, SAVED_ORDER_ID) + self.mock_session.delete.assert_called_once_with( + self.make_url('/v1/accounts/{accountHash}/savedorders/{savedOrderId}')) + + + def test_delete_saved_order_str(self): + self.client.delete_saved_order(str(ACCOUNT_HASH), str(SAVED_ORDER_ID)) + self.mock_session.delete.assert_called_once_with( + self.make_url('/v1/accounts/{accountHash}/savedorders/{savedOrderId}')) + + # delete_saved_order + + + def test_get_saved_order(self): + self.client.get_saved_order(ACCOUNT_HASH, SAVED_ORDER_ID) self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), - params=params) + self.make_url( + '/v1/accounts/{accountHash}/savedorders/{savedOrderId}'), + params={}) + + def test_get_saved_order_str(self): + self.client.get_saved_order(str(ACCOUNT_HASH), str(SAVED_ORDER_ID)) + self.mock_session.get.assert_called_once_with( + self.make_url( + '/v1/accounts/{accountHash}/savedorders/{savedOrderId}'), + params={}) + + # get_saved_orders_by_path + + + def test_get_saved_orders_by_path(self): + self.client.get_saved_orders_by_path(ACCOUNT_HASH) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/accounts/{accountHash}/savedorders'), params={}) + + + def test_get_saved_orders_by_path_str(self): + self.client.get_saved_orders_by_path(str(ACCOUNT_HASH)) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/accounts/{accountHash}/savedorders'), params={}) + + # replace_saved_order + + + def test_replace_saved_order(self): + order_spec = {'order': 'spec'} + self.client.replace_saved_order(ACCOUNT_HASH, SAVED_ORDER_ID, order_spec) + self.mock_session.put.assert_called_once_with( + self.make_url( + '/v1/accounts/{accountHash}/savedorders/{savedOrderId}'), + json=order_spec) + + def test_replace_saved_order_order_builder(self): + order_spec = OrderBuilder(enforce_enums=False).set_order_type('LIMIT') + expected_spec = {'orderType': 'LIMIT'} + self.client.replace_saved_order(ACCOUNT_HASH, SAVED_ORDER_ID, order_spec) + self.mock_session.put.assert_called_once_with( + self.make_url( + '/v1/accounts/{accountHash}/savedorders/{savedOrderId}'), + json=expected_spec) + + + def test_replace_saved_order_str(self): + order_spec = {'order': 'spec'} + self.client.replace_saved_order( + str(ACCOUNT_HASH), str(SAVED_ORDER_ID), order_spec) + self.mock_session.put.assert_called_once_with( + self.make_url( + '/v1/accounts/{accountHash}/savedorders/{savedOrderId}'), + json=order_spec) + ''' + + ''' + + + # get_orders_by_query + + @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_week_extendedhours(self): - self.client.get_price_history_every_week( - 'AAPL', need_extended_hours_data=True) - params = { - 'symbol': SYMBOL, - 'periodType': 'year', - # TWENTY_YEARS - 'period': 20, - 'frequencyType': 'weekly', - # DAILY - 'frequency': 1, - 'startDate': MIN_TIMESTAMP_MILLIS, - 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, - 'needExtendedHoursData': True, - } + def test_get_orders_by_query_vanilla(self): + self.client.get_orders_by_query() self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), - params=params) + self.make_url('/v1/orders'), params={ + 'fromEnteredTime': MIN_ISO, + 'toEnteredTime': NOW_DATETIME_ISO + }) + @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_week_empty_previous_close(self): - self.client.get_price_history_every_week( - 'AAPL', need_previous_close=None) - params = { - 'symbol': SYMBOL, - 'periodType': 'year', - # TWENTY_YEARS - 'period': 20, - 'frequencyType': 'weekly', - # DAILY - 'frequency': 1, - 'startDate': MIN_TIMESTAMP_MILLIS, - 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, - } + def test_get_orders_by_query_max_results(self): + self.client.get_orders_by_query(max_results=100) self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), - params=params) + self.make_url('/v1/orders'), params={ + 'fromEnteredTime': MIN_ISO, + 'toEnteredTime': NOW_DATETIME_ISO, + 'maxResults': 100, + }) + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_orders_by_query_from_entered_datetime(self): + self.client.get_orders_by_query(from_entered_datetime=EARLIER_DATETIME) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/orders'), params={ + 'fromEnteredTime': EARLIER_ISO, + 'toEnteredTime': NOW_DATETIME_ISO, + }) + @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_price_history_every_week_previous_close(self): - self.client.get_price_history_every_week( - 'AAPL', need_previous_close=True) - params = { - 'symbol': SYMBOL, - 'periodType': 'year', - # TWENTY_YEARS - 'period': 20, - 'frequencyType': 'weekly', - # DAILY - 'frequency': 1, - 'startDate': MIN_TIMESTAMP_MILLIS, - 'endDate': NOW_DATETIME_PLUS_SEVEN_DAYS_TIMESTAMP_MILLIS, - 'needPreviousClose': True, - } + def test_get_orders_by_query_to_entered_datetime(self): + self.client.get_orders_by_query(to_entered_datetime=EARLIER_DATETIME) self.mock_session.get.assert_called_once_with( - self.make_url('/marketdata/v1/pricehistory'), - params=params) + self.make_url('/v1/orders'), params={ + 'fromEnteredTime': MIN_ISO, + 'toEnteredTime': EARLIER_ISO, + }) + + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_orders_by_query_status_and_statuses(self): + with self.assertRaises( + ValueError, msg='at most one of status or statuses may be set'): + self.client.get_orders_by_query( + to_entered_datetime=EARLIER_DATETIME, + status='EXPIRED', statuses=[ + self.client_class.Order.Status.FILLED, + self.client_class.Order.Status.EXPIRED]) + + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_orders_by_query_status(self): + self.client.get_orders_by_query(status=self.client_class.Order.Status.FILLED) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/orders'), params={ + 'fromEnteredTime': MIN_ISO, + 'toEnteredTime': NOW_DATETIME_ISO, + 'status': 'FILLED' + }) + + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_orders_by_query_status_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_orders_by_query(status='FILLED') + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/orders'), params={ + 'fromEnteredTime': MIN_ISO, + 'toEnteredTime': NOW_DATETIME_ISO, + 'status': 'FILLED' + }) + + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_orders_by_query_statuses(self): + self.client.get_orders_by_query(statuses=[ + self.client_class.Order.Status.FILLED, + self.client_class.Order.Status.EXPIRED]) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/orders'), params={ + 'fromEnteredTime': MIN_ISO, + 'toEnteredTime': NOW_DATETIME_ISO, + 'status': 'FILLED,EXPIRED' + }) + + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_orders_by_query_statuses_scalar(self): + self.client.get_orders_by_query(statuses=self.client_class.Order.Status.FILLED) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/orders'), params={ + 'fromEnteredTime': MIN_ISO, + 'toEnteredTime': NOW_DATETIME_ISO, + 'status': 'FILLED' + }) + + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_orders_by_query_statuses_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_orders_by_query(statuses=['FILLED', 'EXPIRED']) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/orders'), params={ + 'fromEnteredTime': MIN_ISO, + 'toEnteredTime': NOW_DATETIME_ISO, + 'status': 'FILLED,EXPIRED' + }) + + ''' + + ''' + # search_instruments + + + def test_search_instruments(self): + self.client.search_instruments( + ['AAPL', 'MSFT'], self.client_class.Instrument.Projection.FUNDAMENTAL) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/instruments'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL,MSFT', + 'projection': 'fundamental'}) + + + def test_search_instruments_one_instrument(self): + self.client.search_instruments( + 'AAPL', self.client_class.Instrument.Projection.FUNDAMENTAL) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/instruments'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'projection': 'fundamental'}) + + def test_search_instruments_unchecked(self): + self.client.set_enforce_enums(False) + self.client.search_instruments(['AAPL', 'MSFT'], 'fundamental') + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/instruments'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL,MSFT', + 'projection': 'fundamental'}) + + # get_instrument + + + def test_get_instrument(self): + self.client.get_instrument(CUSIP) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/instruments/{cusip}'), + params={'apikey': API_KEY}) + + + def test_get_instrument_cusip_must_be_string(self): + msg = 'CUSIPs must be passed as strings to preserve leading zeroes' + with self.assertRaises(ValueError, msg=msg): + self.client.get_instrument(123456) + + # get_hours_for_multiple_markets + + + def test_get_hours_for_multiple_markets_datetime(self): + self.client.get_hours_for_multiple_markets([ + self.client_class.Markets.EQUITY, + self.client_class.Markets.BOND], NOW_DATETIME) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/hours'), params={ + 'apikey': API_KEY, + 'markets': 'EQUITY,BOND', + 'date': NOW_DATE_ISO}) + + + def test_get_hours_for_multiple_markets_single_market(self): + self.client.get_hours_for_multiple_markets( + self.client_class.Markets.EQUITY, NOW_DATETIME) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/hours'), params={ + 'apikey': API_KEY, + 'markets': 'EQUITY', + 'date': NOW_DATE_ISO}) + + + def test_get_hours_for_multiple_markets_date(self): + self.client.get_hours_for_multiple_markets([ + self.client_class.Markets.EQUITY, + self.client_class.Markets.BOND], NOW_DATE) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/hours'), params={ + 'apikey': API_KEY, + 'markets': 'EQUITY,BOND', + 'date': NOW_DATE_ISO}) + + + def test_get_hours_for_multiple_markets_str(self): + with self.assertRaises(ValueError) as cm: + self.client.get_hours_for_multiple_markets([ + self.client_class.Markets.EQUITY, + self.client_class.Markets.BOND], '2020-01-01') + self.assertEqual(str(cm.exception), + "expected type in (datetime.date, datetime.datetime) " + "for date, got 'builtins.str'") + + + def test_get_hours_for_multiple_markets_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_hours_for_multiple_markets( + ['EQUITY', 'BOND'], NOW_DATETIME) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/hours'), params={ + 'apikey': API_KEY, + 'markets': 'EQUITY,BOND', + 'date': NOW_DATE_ISO}) + + # get_hours_for_single_market + + + def test_get_hours_for_single_market_datetime(self): + self.client.get_hours_for_single_market( + self.client_class.Markets.EQUITY, NOW_DATETIME) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/{market}/hours'), params={ + 'apikey': API_KEY, + 'date': NOW_DATE_ISO}) + + + def test_get_hours_for_single_market_date(self): + self.client.get_hours_for_single_market( + self.client_class.Markets.EQUITY, NOW_DATE) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/{market}/hours'), params={ + 'apikey': API_KEY, + 'date': NOW_DATE_ISO}) + + + def test_get_hours_for_single_market_str(self): + with self.assertRaises(ValueError) as cm: + self.client.get_hours_for_single_market( + self.client_class.Markets.EQUITY, '2020-01-01') + self.assertEqual(str(cm.exception), + "expected type in (datetime.date, datetime.datetime) for " + + "date, got 'builtins.str'") + + + def test_get_hours_for_single_market_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_hours_for_single_market('EQUITY', NOW_DATETIME) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/{market}/hours'), params={ + 'apikey': API_KEY, + 'date': NOW_DATE_ISO}) + + # get_movers + + + def test_get_movers(self): + self.client.get_movers( + INDEX, self.client_class.Movers.Direction.UP, self.client_class.Movers.Change.PERCENT) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/{index}/movers'), params={ + 'apikey': API_KEY, + 'direction': 'up', + 'change': 'percent'}) + + + def test_get_movers_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_movers(INDEX, 'up', 'percent') + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/{index}/movers'), params={ + 'apikey': API_KEY, + 'direction': 'up', + 'change': 'percent'}) + + # get_option_chain + + + def test_get_option_chain_vanilla(self): + self.client.get_option_chain('AAPL') + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL'}) + + + def test_get_option_chain_contract_type(self): + self.client.get_option_chain( + 'AAPL', contract_type=self.client_class.Options.ContractType.PUT) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'contractType': 'PUT'}) + + + def test_get_option_chain_contract_type_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_option_chain('AAPL', contract_type='PUT') + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'contractType': 'PUT'}) + + + def test_get_option_chain_strike_count(self): + self.client.get_option_chain('AAPL', strike_count=100) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'strikeCount': 100}) + + + def test_get_option_chain_include_quotes(self): + self.client.get_option_chain('AAPL', include_quotes=True) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'includeQuotes': True}) + + + def test_get_option_chain_strategy(self): + self.client.get_option_chain( + 'AAPL', strategy=self.client_class.Options.Strategy.STRANGLE) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'strategy': 'STRANGLE'}) + + + def test_get_option_chain_strategy_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_option_chain('AAPL', strategy='STRANGLE') + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'strategy': 'STRANGLE'}) + + + def test_get_option_chain_interval(self): + self.client.get_option_chain('AAPL', interval=10.0) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'interval': 10.0}) + + + def test_get_option_chain_strike(self): + self.client.get_option_chain('AAPL', strike=123) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'strike': 123}) + + + def test_get_option_chain_strike_range(self): + self.client.get_option_chain( + 'AAPL', strike_range=self.client_class.Options.StrikeRange.IN_THE_MONEY) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'range': 'ITM'}) + + + def test_get_option_chain_strike_range_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_option_chain('AAPL', strike_range='ITM') + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'range': 'ITM'}) + + + def test_get_option_chain_from_date_datetime(self): + self.client.get_option_chain( + 'AAPL', from_date=NOW_DATETIME) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'fromDate': NOW_DATE_ISO}) + + + def test_get_option_chain_from_date_date(self): + self.client.get_option_chain('AAPL', from_date=NOW_DATE) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'fromDate': NOW_DATE_ISO}) + + + def test_get_option_chain_from_date_str(self): + with self.assertRaises(ValueError) as cm: + self.client.get_option_chain('AAPL', from_date='2020-01-01') + self.assertEqual(str(cm.exception), + "expected type in (datetime.date, datetime.datetime) for " + + "from_date, got 'builtins.str'") + + + def test_get_option_chain_to_date_datetime(self): + self.client.get_option_chain('AAPL', to_date=NOW_DATETIME) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'toDate': NOW_DATE_ISO}) + + + def test_get_option_chain_to_date_date(self): + self.client.get_option_chain('AAPL', to_date=NOW_DATE) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'toDate': NOW_DATE_ISO}) + + + def test_get_option_chain_to_date_str(self): + with self.assertRaises(ValueError) as cm: + self.client.get_option_chain('AAPL', to_date='2020-01-01') + self.assertEqual(str(cm.exception), + "expected type in (datetime.date, datetime.datetime) for " + + "to_date, got 'builtins.str'") + + + def test_get_option_chain_volatility(self): + self.client.get_option_chain('AAPL', volatility=40.0) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'volatility': 40.0}) + + + def test_get_option_chain_underlying_price(self): + self.client.get_option_chain('AAPL', underlying_price=234.0) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'underlyingPrice': 234.0}) + + + def test_get_option_chain_interest_rate(self): + self.client.get_option_chain('AAPL', interest_rate=0.07) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'interestRate': 0.07}) + + + def test_get_option_chain_days_to_expiration(self): + self.client.get_option_chain('AAPL', days_to_expiration=12) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'daysToExpiration': 12}) + + + def test_get_option_chain_exp_month(self): + self.client.get_option_chain( + 'AAPL', exp_month=self.client_class.Options.ExpirationMonth.JANUARY) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'expMonth': 'JAN'}) + + + def test_get_option_chain_exp_month_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_option_chain('AAPL', exp_month='JAN') + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'expMonth': 'JAN'}) + + + def test_get_option_chain_option_type(self): + self.client.get_option_chain( + 'AAPL', option_type=self.client_class.Options.Type.STANDARD) + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'optionType': 'S'}) + + + def test_get_option_chain_option_type_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_option_chain('AAPL', option_type='S') + self.mock_session.get.assert_called_once_with( + self.make_url('/v1/marketdata/chains'), params={ + 'apikey': API_KEY, + 'symbol': 'AAPL', + 'optionType': 'S'}) + ''' ''' # get_quote From 0333654168fe9f73d38a7db40c25f48ad374071a Mon Sep 17 00:00:00 2001 From: Alex Golec Date: Sat, 4 May 2024 09:52:27 -0400 Subject: [PATCH 3/8] Added place_order tests --- tests/client_test.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tests/client_test.py b/tests/client_test.py index a4d5985..8644f06 100644 --- a/tests/client_test.py +++ b/tests/client_test.py @@ -403,6 +403,31 @@ def test_get_orders_for_all_linked_accounts_status_unchecked(self): }) + # place_order + + + def test_place_order(self): + order_spec = {'order': 'spec'} + self.client.place_order(ACCOUNT_HASH, order_spec) + self.mock_session.post.assert_called_once_with( + self.make_url('/trader/v1/accounts/{accountHash}/orders'), json=order_spec) + + + def test_place_order_order_builder(self): + order_spec = OrderBuilder(enforce_enums=False).set_order_type('LIMIT') + expected_spec = {'orderType': 'LIMIT'} + self.client.place_order(ACCOUNT_HASH, order_spec) + self.mock_session.post.assert_called_once_with( + self.make_url('/trader/v1/accounts/{accountHash}/orders'), + json=expected_spec) + + + def test_place_order_str(self): + order_spec = {'order': 'spec'} + self.client.place_order(str(ACCOUNT_HASH), order_spec) + self.mock_session.post.assert_called_once_with( + self.make_url('/trader/v1/accounts/{accountHash}/orders'), json=order_spec) + # get_price_history From 1c126e8975a508df1ad5590c4ed956665e49a60e Mon Sep 17 00:00:00 2001 From: Alex Golec Date: Sat, 4 May 2024 09:53:37 -0400 Subject: [PATCH 4/8] replace_order tests --- tests/client_test.py | 79 +++++++++++++++----------------------------- 1 file changed, 27 insertions(+), 52 deletions(-) diff --git a/tests/client_test.py b/tests/client_test.py index 8644f06..499f710 100644 --- a/tests/client_test.py +++ b/tests/client_test.py @@ -428,6 +428,33 @@ def test_place_order_str(self): self.mock_session.post.assert_called_once_with( self.make_url('/trader/v1/accounts/{accountHash}/orders'), json=order_spec) + # replace_order + + + def test_replace_order(self): + order_spec = {'order': 'spec'} + self.client.replace_order(ACCOUNT_HASH, ORDER_ID, order_spec) + self.mock_session.put.assert_called_once_with( + self.make_url('/trader/v1/accounts/{accountHash}/orders/{orderId}'), + json=order_spec) + + + def test_replace_order_order_builder(self): + order_spec = OrderBuilder(enforce_enums=False).set_order_type('LIMIT') + expected_spec = {'orderType': 'LIMIT'} + self.client.replace_order(ACCOUNT_HASH, ORDER_ID, order_spec) + self.mock_session.put.assert_called_once_with( + self.make_url('/trader/v1/accounts/{accountHash}/orders/{orderId}'), + json=expected_spec) + + + def test_replace_order_str(self): + order_spec = {'order': 'spec'} + self.client.replace_order(str(ACCOUNT_HASH), str(ORDER_ID), order_spec) + self.mock_session.put.assert_called_once_with( + self.make_url('/trader/v1/accounts/{accountHash}/orders/{orderId}'), + json=order_spec) + # get_price_history @@ -1564,58 +1591,6 @@ def test_get_price_history_every_week_previous_close(self): ''' - # place_order - - - def test_place_order(self): - order_spec = {'order': 'spec'} - self.client.place_order(ACCOUNT_HASH, order_spec) - self.mock_session.post.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/orders'), json=order_spec) - - - def test_place_order_order_builder(self): - order_spec = OrderBuilder(enforce_enums=False).set_order_type('LIMIT') - expected_spec = {'orderType': 'LIMIT'} - self.client.place_order(ACCOUNT_HASH, order_spec) - self.mock_session.post.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/orders'), - json=expected_spec) - - - def test_place_order_str(self): - order_spec = {'order': 'spec'} - self.client.place_order(str(ACCOUNT_HASH), order_spec) - self.mock_session.post.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/orders'), json=order_spec) - - # replace_order - - - def test_replace_order(self): - order_spec = {'order': 'spec'} - self.client.replace_order(ACCOUNT_HASH, ORDER_ID, order_spec) - self.mock_session.put.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/orders/{orderId}'), - json=order_spec) - - - def test_replace_order_order_builder(self): - order_spec = OrderBuilder(enforce_enums=False).set_order_type('LIMIT') - expected_spec = {'orderType': 'LIMIT'} - self.client.replace_order(ACCOUNT_HASH, ORDER_ID, order_spec) - self.mock_session.put.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/orders/{orderId}'), - json=expected_spec) - - - def test_replace_order_str(self): - order_spec = {'order': 'spec'} - self.client.replace_order(str(ACCOUNT_HASH), str(ORDER_ID), order_spec) - self.mock_session.put.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/orders/{orderId}'), - json=order_spec) - # create_saved_order From ba612d5030a3f01a2b9fe75adf2521c4be5b91ca Mon Sep 17 00:00:00 2001 From: Alex Golec Date: Sat, 4 May 2024 10:25:56 -0400 Subject: [PATCH 5/8] added get_transactions tests --- tests/client_test.py | 228 ++++++++++++++++++++++--------------------- 1 file changed, 118 insertions(+), 110 deletions(-) diff --git a/tests/client_test.py b/tests/client_test.py index 499f710..3f6dded 100644 --- a/tests/client_test.py +++ b/tests/client_test.py @@ -33,6 +33,7 @@ NOW_DATETIME = datetime.datetime(2020, 1, 2, 3, 4, 5) NOW_DATE = datetime.date(2020, 1, 2) NOW_DATETIME_ISO = '2020-01-02T03:04:05Z' +NOW_DATETIME_TRUNCATED_ISO = '2020-01-02T00:00:00Z' NOW_DATE_ISO = '2020-01-02' NOW_DATETIME_MINUS_60_DAYS = NOW_DATE - datetime.timedelta(days=60) @@ -455,8 +456,124 @@ def test_replace_order_str(self): self.make_url('/trader/v1/accounts/{accountHash}/orders/{orderId}'), json=order_spec) - # get_price_history + # get_transactions + + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_transactions(self): + self.client.get_transactions(ACCOUNT_HASH) + self.mock_session.get.assert_called_once_with( + self.make_url('/trader/v1/accounts/{accountHash}/transactions'), + params={ + 'types': ','.join(t.value for t in self.client.Transactions.TransactionType), + 'startDate': NOW_DATETIME_MINUS_60_DAYS_ISO, + 'endDate': NOW_DATETIME_ISO}) + + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_transactions_one_type(self): + self.client.get_transactions( + ACCOUNT_HASH, + transaction_types=self.client.Transactions.TransactionType.TRADE) + self.mock_session.get.assert_called_once_with( + self.make_url('/trader/v1/accounts/{accountHash}/transactions'), + params={ + 'types': 'TRADE', + 'startDate': NOW_DATETIME_MINUS_60_DAYS_ISO, + 'endDate': NOW_DATETIME_ISO}) + + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_transactions_type_list(self): + self.client.get_transactions( + ACCOUNT_HASH, + transaction_types=[ + self.client.Transactions.TransactionType.TRADE, + self.client.Transactions.TransactionType.JOURNAL]) + self.mock_session.get.assert_called_once_with( + self.make_url('/trader/v1/accounts/{accountHash}/transactions'), + params={ + 'types': 'TRADE,JOURNAL', + 'startDate': NOW_DATETIME_MINUS_60_DAYS_ISO, + 'endDate': NOW_DATETIME_ISO}) + + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_transactions_type_list_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_transactions( + ACCOUNT_HASH, transaction_types=['TRADE', 'JOURNAL']) + self.mock_session.get.assert_called_once_with( + self.make_url('/trader/v1/accounts/{accountHash}/transactions'), + params={ + 'types': 'TRADE,JOURNAL', + 'startDate': NOW_DATETIME_MINUS_60_DAYS_ISO, + 'endDate': NOW_DATETIME_ISO}) + + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_transactions_symbol(self): + self.client.get_transactions(ACCOUNT_HASH, symbol='AAPL') + self.mock_session.get.assert_called_once_with( + self.make_url('/trader/v1/accounts/{accountHash}/transactions'), + params={ + 'types': ','.join(t.value for t in self.client.Transactions.TransactionType), + 'startDate': NOW_DATETIME_MINUS_60_DAYS_ISO, + 'endDate': NOW_DATETIME_ISO, + 'symbol': 'AAPL'}) + + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_transactions_symbol_start_date_as_datetime(self): + self.client.get_transactions( + ACCOUNT_HASH, start_date=NOW_DATETIME) + self.mock_session.get.assert_called_once_with( + self.make_url('/trader/v1/accounts/{accountHash}/transactions'), + params={ + 'types': ','.join(t.value for t in self.client.Transactions.TransactionType), + 'startDate': NOW_DATETIME_ISO, + 'endDate': NOW_DATETIME_ISO}) + + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_transactions_symbol_start_date_as_date(self): + self.client.get_transactions( + ACCOUNT_HASH, start_date=NOW_DATE) + self.mock_session.get.assert_called_once_with( + self.make_url('/trader/v1/accounts/{accountHash}/transactions'), + params={ + 'types': ','.join(t.value for t in self.client.Transactions.TransactionType), + 'startDate': NOW_DATETIME_TRUNCATED_ISO, + 'endDate': NOW_DATETIME_ISO}) + + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_transactions_symbol_end_date_as_datetime(self): + self.client.get_transactions( + ACCOUNT_HASH, + # NOW_DATETIME is the default, use something different + end_date=datetime.datetime(2020, 6, 7, 8, 9, 0)) + self.mock_session.get.assert_called_once_with( + self.make_url('/trader/v1/accounts/{accountHash}/transactions'), + params={ + 'types': ','.join(t.value for t in self.client.Transactions.TransactionType), + 'startDate': NOW_DATETIME_MINUS_60_DAYS_ISO, + 'endDate': '2020-06-07T08:09:00Z'}) + + + @patch('schwab.client.base.datetime.datetime', mockdatetime) + def test_get_transactions_symbol_end_date_as_date(self): + self.client.get_transactions(ACCOUNT_HASH, end_date=NOW_DATE) + self.mock_session.get.assert_called_once_with( + self.make_url('/trader/v1/accounts/{accountHash}/transactions'), + params={ + 'types': ','.join(t.value for t in self.client.Transactions.TransactionType), + 'startDate': NOW_DATETIME_MINUS_60_DAYS_ISO, + 'endDate': NOW_DATETIME_TRUNCATED_ISO}) + + + # get_price_history def test_get_price_history_vanilla(self): self.client.get_price_history(SYMBOL) @@ -2241,115 +2358,6 @@ def test_get_quotes_single_symbol(self): 'apikey': API_KEY, 'symbol': 'AAPL'}) - # get_transaction - - - def test_get_transaction(self): - self.client.get_transaction(ACCOUNT_HASH, TRANSACTION_ID) - self.mock_session.get.assert_called_once_with( - self.make_url( - '/v1/accounts/{accountHash}/transactions/{transactionId}'), - params={'apikey': API_KEY}) - - - def test_get_transaction_str(self): - self.client.get_transaction(str(ACCOUNT_HASH), str(TRANSACTION_ID)) - self.mock_session.get.assert_called_once_with( - self.make_url( - '/v1/accounts/{accountHash}/transactions/{transactionId}'), - params={'apikey': API_KEY}) - - # get_transactions - - - def test_get_transactions(self): - self.client.get_transactions(ACCOUNT_HASH) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/transactions'), params={ - 'apikey': API_KEY}) - - - def test_get_transactions_str(self): - self.client.get_transactions(str(ACCOUNT_HASH)) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/transactions'), params={ - 'apikey': API_KEY}) - - - def test_get_transactions_type(self): - self.client.get_transactions( - ACCOUNT_HASH, - transaction_type=self.client_class.Transactions.TransactionType.DIVIDEND) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/transactions'), params={ - 'apikey': API_KEY, - 'type': 'DIVIDEND'}) - - - def test_get_transactions_type_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_transactions(ACCOUNT_HASH, transaction_type='DIVIDEND') - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/transactions'), params={ - 'apikey': API_KEY, - 'type': 'DIVIDEND'}) - - - def test_get_transactions_symbol(self): - self.client.get_transactions(ACCOUNT_HASH, symbol='AAPL') - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/transactions'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL'}) - - - def test_get_transactions_start_date_datetime(self): - self.client.get_transactions(ACCOUNT_HASH, start_date=NOW_DATETIME) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/transactions'), params={ - 'apikey': API_KEY, - 'startDate': NOW_DATE_ISO}) - - - def test_get_transactions_start_date_date(self): - self.client.get_transactions(ACCOUNT_HASH, start_date=NOW_DATE) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/transactions'), params={ - 'apikey': API_KEY, - 'startDate': NOW_DATE_ISO}) - - - def test_get_transactions_start_date_str(self): - with self.assertRaises(ValueError) as cm: - self.client.get_transactions(ACCOUNT_HASH, start_date='2020-01-01') - self.assertEqual(str(cm.exception), - "expected type in (datetime.date, datetime.datetime) for " + - "start_date, got 'builtins.str'") - - - def test_get_transactions_end_date(self): - self.client.get_transactions(ACCOUNT_HASH, end_date=NOW_DATETIME) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/transactions'), params={ - 'apikey': API_KEY, - 'endDate': NOW_DATE_ISO}) - - - def test_get_transactions_end_date_datetime(self): - self.client.get_transactions(ACCOUNT_HASH, end_date=NOW_DATETIME) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/transactions'), params={ - 'apikey': API_KEY, - 'endDate': NOW_DATE_ISO}) - - - def test_get_transactions_end_date_str(self): - with self.assertRaises(ValueError) as cm: - self.client.get_transactions(ACCOUNT_HASH, end_date='2020-01-01') - self.assertEqual(str(cm.exception), - "expected type in (datetime.date, datetime.datetime) for " + - "end_date, got 'builtins.str'") - # get_preferences From 309bd141d530f4ed0f7107f0fb4429addc67f2e9 Mon Sep 17 00:00:00 2001 From: Alex Golec Date: Sat, 4 May 2024 11:15:55 -0400 Subject: [PATCH 6/8] fix make test invocation --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6407cac..4571b7a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ test: - pytest + python -m pytest tests/ fix: autopep8 --in-place -r -a schwab From f4e09573932897293c50d38e96ffbca40219005a Mon Sep 17 00:00:00 2001 From: Alex Golec Date: Sun, 5 May 2024 08:42:56 -0400 Subject: [PATCH 7/8] added quote and options chain tests --- schwab/client/base.py | 16 +- tests/client_test.py | 574 +++++++++++++++++++++++------------------- 2 files changed, 321 insertions(+), 269 deletions(-) diff --git a/schwab/client/base.py b/schwab/client/base.py index 1bd1ff0..67a9ccc 100644 --- a/schwab/client/base.py +++ b/schwab/client/base.py @@ -424,13 +424,13 @@ def get_user_preferences(self): '''Preferences for the logged in account, including all linked accounts.''' path = '/trader/v1/userPreference' - return self._get_request(path, ()) + return self._get_request(path, {}) ########################################################################## # Quotes - class GetQuote: + class Quote: class Fields(Enum): QUOTE = 'quote' FUNDAMENTAL = 'fundamental' @@ -446,9 +446,9 @@ def get_quote(self, symbol, *, fields=None): :param fields: Fields to request. If unset, return all available data. i.e. all fields. See :class:`GetQuote.Field` for options. ''' - fields = self.convert_enum_iterable(fields, self.GetQuote.Fields) + fields = self.convert_enum_iterable(fields, self.Quote.Fields) if fields: - params = {'fields': fields} + params = {'fields': ','.join(fields)} else: params = {} @@ -470,9 +470,9 @@ def get_quotes(self, symbols, *, fields=None, indicative=None): 'symbols': ','.join(symbols) } - fields = self.convert_enum_iterable(fields, self.GetQuote.Fields) + fields = self.convert_enum_iterable(fields, self.Quote.Fields) if fields: - params['fields'] = fields + params['fields'] = ','.join(fields) if indicative is not None: if type(indicative) is not bool: @@ -603,9 +603,9 @@ def get_option_chain( strike_range, self.Options.StrikeRange) option_type = self.convert_enum(option_type, self.Options.Type) exp_month = self.convert_enum(exp_month, self.Options.ExpirationMonth) + entitlement = self.convert_enum(entitlement, self.Options.Entitlement) params = { - 'apikey': self.api_key, 'symbol': symbol, } @@ -639,6 +639,8 @@ def get_option_chain( params['expMonth'] = exp_month if option_type is not None: params['optionType'] = option_type + if entitlement is not None: + params['entitlement'] = entitlement path = '/marketdata/v1/chains' return self._get_request(path, params) diff --git a/tests/client_test.py b/tests/client_test.py index 3f6dded..227542d 100644 --- a/tests/client_test.py +++ b/tests/client_test.py @@ -573,6 +573,98 @@ def test_get_transactions_symbol_end_date_as_date(self): 'endDate': NOW_DATETIME_TRUNCATED_ISO}) + # get_transaction + + def test_get_transaction(self): + self.client.get_transaction(ACCOUNT_HASH, TRANSACTION_ID) + self.mock_session.get.assert_called_once_with( + self.make_url( + '/trader/v1/accounts/{accountHash}/transactions/{transactionId}'), + params={}) + + + # get_user_preference + + def test_get_user_preferences(self): + self.client.get_user_preferences() + self.mock_session.get.assert_called_once_with( + self.make_url('/trader/v1/userPreference'), params={}) + + + # get_quote + + def test_get_quote(self): + self.client.get_quote(SYMBOL) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/{symbol}/quotes'), params={}) + + + def test_get_quote_fields_single(self): + self.client.get_quote(SYMBOL, fields=self.client.Quote.Fields.QUOTE) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/{symbol}/quotes'), + params={'fields': 'quote'}) + + + def test_get_quote_fields_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_quote(SYMBOL, fields=['not-a-field']) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/{symbol}/quotes'), + params={'fields': 'not-a-field'}) + + + def test_get_quote_fields_multiple(self): + self.client.get_quote(SYMBOL, fields=[ + self.client.Quote.Fields.QUOTE, + self.client.Quote.Fields.FUNDAMENTAL]) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/{symbol}/quotes'), + params={'fields': 'quote,fundamental'}) + + + # get_quotes + + def test_get_quotes(self): + self.client.get_quotes(['AAPL', 'MSFT']) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/quotes'), params={ + 'symbols': 'AAPL,MSFT'}) + + + def test_get_quotes_single_symbol(self): + self.client.get_quotes('AAPL') + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/quotes'), params={ + 'symbols': 'AAPL'}) + + def test_get_quotes_fields(self): + self.client.get_quotes( + ['AAPL', 'MSFT'], + fields=self.client.Quote.Fields.QUOTE) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/quotes'), params={ + 'symbols': 'AAPL,MSFT', + 'fields': 'quote'}) + + + def test_get_quotes_fields_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_quotes(['AAPL', 'MSFT'], fields=['quote']) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/quotes'), params={ + 'symbols': 'AAPL,MSFT', + 'fields': 'quote'}) + + + def test_get_quotes_indicative(self): + self.client.get_quotes(['AAPL', 'MSFT'], indicative=True) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/quotes'), params={ + 'symbols': 'AAPL,MSFT', + 'indicative': 'true'}) + + # get_price_history def test_get_price_history_vanilla(self): @@ -705,8 +797,227 @@ def test_get_price_history_need_previous_close(self): 'needPreviousClose': True}) - # get_price_history_every_minute + # get_option_chain + + def test_get_option_chain_vanilla(self): + self.client.get_option_chain('AAPL') + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL'}) + + def test_get_option_chain_contract_type(self): + self.client.get_option_chain( + 'AAPL', contract_type=self.client_class.Options.ContractType.PUT) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'contractType': 'PUT'}) + + + def test_get_option_chain_contract_type_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_option_chain('AAPL', contract_type='PUT') + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'contractType': 'PUT'}) + + + def test_get_option_chain_strike_count(self): + self.client.get_option_chain('AAPL', strike_count=100) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'strikeCount': 100}) + + + def test_get_option_chain_include_underlyingquotes(self): + self.client.get_option_chain('AAPL', include_underlying_quote=True) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'includeUnderlyingQuote': True}) + + + def test_get_option_chain_strategy(self): + self.client.get_option_chain( + 'AAPL', strategy=self.client_class.Options.Strategy.STRANGLE) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'strategy': 'STRANGLE'}) + + + def test_get_option_chain_strategy_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_option_chain('AAPL', strategy='STRANGLE') + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'strategy': 'STRANGLE'}) + + + def test_get_option_chain_interval(self): + self.client.get_option_chain('AAPL', interval=10.0) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'interval': 10.0}) + + + def test_get_option_chain_strike(self): + self.client.get_option_chain('AAPL', strike=123) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'strike': 123}) + + + def test_get_option_chain_strike_range(self): + self.client.get_option_chain( + 'AAPL', strike_range=self.client_class.Options.StrikeRange.IN_THE_MONEY) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'range': 'ITM'}) + + + def test_get_option_chain_strike_range_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_option_chain('AAPL', strike_range='ITM') + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'range': 'ITM'}) + + + def test_get_option_chain_from_date_datetime(self): + self.client.get_option_chain( + 'AAPL', from_date=NOW_DATETIME) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'fromDate': NOW_DATE_ISO}) + + + def test_get_option_chain_from_date_date(self): + self.client.get_option_chain('AAPL', from_date=NOW_DATE) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'fromDate': NOW_DATE_ISO}) + + + def test_get_option_chain_from_date_str(self): + with self.assertRaises(ValueError) as cm: + self.client.get_option_chain('AAPL', from_date='2020-01-01') + self.assertEqual(str(cm.exception), + "expected type 'datetime.date' for " + + "from_date, got 'builtins.str'") + + + def test_get_option_chain_to_date_datetime(self): + self.client.get_option_chain('AAPL', to_date=NOW_DATETIME) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'toDate': NOW_DATE_ISO}) + + + def test_get_option_chain_to_date_date(self): + self.client.get_option_chain('AAPL', to_date=NOW_DATE) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'toDate': NOW_DATE_ISO}) + + + def test_get_option_chain_to_date_str(self): + with self.assertRaises(ValueError) as cm: + self.client.get_option_chain('AAPL', to_date='2020-01-01') + self.assertEqual(str(cm.exception), + "expected type 'datetime.date' for " + + "to_date, got 'builtins.str'") + + + def test_get_option_chain_volatility(self): + self.client.get_option_chain('AAPL', volatility=40.0) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'volatility': 40.0}) + + + def test_get_option_chain_underlying_price(self): + self.client.get_option_chain('AAPL', underlying_price=234.0) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'underlyingPrice': 234.0}) + + + def test_get_option_chain_interest_rate(self): + self.client.get_option_chain('AAPL', interest_rate=0.07) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'interestRate': 0.07}) + + + def test_get_option_chain_days_to_expiration(self): + self.client.get_option_chain('AAPL', days_to_expiration=12) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'daysToExpiration': 12}) + + + def test_get_option_chain_exp_month(self): + self.client.get_option_chain( + 'AAPL', exp_month=self.client_class.Options.ExpirationMonth.JANUARY) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'expMonth': 'JAN'}) + + + def test_get_option_chain_exp_month_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_option_chain('AAPL', exp_month='JAN') + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'expMonth': 'JAN'}) + + + def test_get_option_chain_option_type(self): + self.client.get_option_chain( + 'AAPL', option_type=self.client_class.Options.Type.STANDARD) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'optionType': 'S'}) + + + def test_get_option_chain_option_type_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_option_chain('AAPL', option_type='S') + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'optionType': 'S'}) + + + def test_get_option_chain_option_entitlement(self): + self.client.get_option_chain( + 'AAPL', entitlement=self.client.Options.Entitlement.PAYING_PRO) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/chains'), params={ + 'symbol': 'AAPL', + 'entitlement': 'PP'}) + + # get_price_history_every_minute @patch('schwab.client.base.datetime.datetime', mockdatetime) def test_get_price_history_every_minute_vanilla(self): @@ -2094,270 +2405,9 @@ def test_get_movers_unchecked(self): 'direction': 'up', 'change': 'percent'}) - # get_option_chain - - - def test_get_option_chain_vanilla(self): - self.client.get_option_chain('AAPL') - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL'}) - - - def test_get_option_chain_contract_type(self): - self.client.get_option_chain( - 'AAPL', contract_type=self.client_class.Options.ContractType.PUT) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'contractType': 'PUT'}) - - - def test_get_option_chain_contract_type_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_option_chain('AAPL', contract_type='PUT') - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'contractType': 'PUT'}) - - - def test_get_option_chain_strike_count(self): - self.client.get_option_chain('AAPL', strike_count=100) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'strikeCount': 100}) - - - def test_get_option_chain_include_quotes(self): - self.client.get_option_chain('AAPL', include_quotes=True) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'includeQuotes': True}) - - - def test_get_option_chain_strategy(self): - self.client.get_option_chain( - 'AAPL', strategy=self.client_class.Options.Strategy.STRANGLE) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'strategy': 'STRANGLE'}) - - - def test_get_option_chain_strategy_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_option_chain('AAPL', strategy='STRANGLE') - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'strategy': 'STRANGLE'}) - - - def test_get_option_chain_interval(self): - self.client.get_option_chain('AAPL', interval=10.0) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'interval': 10.0}) - - - def test_get_option_chain_strike(self): - self.client.get_option_chain('AAPL', strike=123) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'strike': 123}) - - - def test_get_option_chain_strike_range(self): - self.client.get_option_chain( - 'AAPL', strike_range=self.client_class.Options.StrikeRange.IN_THE_MONEY) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'range': 'ITM'}) - - - def test_get_option_chain_strike_range_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_option_chain('AAPL', strike_range='ITM') - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'range': 'ITM'}) - - - def test_get_option_chain_from_date_datetime(self): - self.client.get_option_chain( - 'AAPL', from_date=NOW_DATETIME) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'fromDate': NOW_DATE_ISO}) - - - def test_get_option_chain_from_date_date(self): - self.client.get_option_chain('AAPL', from_date=NOW_DATE) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'fromDate': NOW_DATE_ISO}) - - - def test_get_option_chain_from_date_str(self): - with self.assertRaises(ValueError) as cm: - self.client.get_option_chain('AAPL', from_date='2020-01-01') - self.assertEqual(str(cm.exception), - "expected type in (datetime.date, datetime.datetime) for " + - "from_date, got 'builtins.str'") - - - def test_get_option_chain_to_date_datetime(self): - self.client.get_option_chain('AAPL', to_date=NOW_DATETIME) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'toDate': NOW_DATE_ISO}) - - - def test_get_option_chain_to_date_date(self): - self.client.get_option_chain('AAPL', to_date=NOW_DATE) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'toDate': NOW_DATE_ISO}) - - - def test_get_option_chain_to_date_str(self): - with self.assertRaises(ValueError) as cm: - self.client.get_option_chain('AAPL', to_date='2020-01-01') - self.assertEqual(str(cm.exception), - "expected type in (datetime.date, datetime.datetime) for " + - "to_date, got 'builtins.str'") - - - def test_get_option_chain_volatility(self): - self.client.get_option_chain('AAPL', volatility=40.0) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'volatility': 40.0}) - - - def test_get_option_chain_underlying_price(self): - self.client.get_option_chain('AAPL', underlying_price=234.0) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'underlyingPrice': 234.0}) - - - def test_get_option_chain_interest_rate(self): - self.client.get_option_chain('AAPL', interest_rate=0.07) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'interestRate': 0.07}) - - - def test_get_option_chain_days_to_expiration(self): - self.client.get_option_chain('AAPL', days_to_expiration=12) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'daysToExpiration': 12}) - - - def test_get_option_chain_exp_month(self): - self.client.get_option_chain( - 'AAPL', exp_month=self.client_class.Options.ExpirationMonth.JANUARY) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'expMonth': 'JAN'}) - - - def test_get_option_chain_exp_month_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_option_chain('AAPL', exp_month='JAN') - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'expMonth': 'JAN'}) - - - def test_get_option_chain_option_type(self): - self.client.get_option_chain( - 'AAPL', option_type=self.client_class.Options.Type.STANDARD) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'optionType': 'S'}) - - - def test_get_option_chain_option_type_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_option_chain('AAPL', option_type='S') - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/chains'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'optionType': 'S'}) ''' ''' - # get_quote - - - def test_get_quote(self): - self.client.get_quote(SYMBOL) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/{symbol}/quotes'), params={ - 'apikey': API_KEY}) - - # get_quotes - - - def test_get_quotes(self): - self.client.get_quotes(['AAPL', 'MSFT']) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/quotes'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL,MSFT'}) - - - def test_get_quotes_single_symbol(self): - self.client.get_quotes('AAPL') - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/quotes'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL'}) - # get_preferences From 538f1f4a46d686689495ffbea462c48af86ef476 Mon Sep 17 00:00:00 2001 From: Alex Golec Date: Sun, 5 May 2024 09:01:35 -0400 Subject: [PATCH 8/8] add remaining tests --- schwab/client/base.py | 5 +- tests/client_test.py | 638 ++++++------------------------------------ 2 files changed, 95 insertions(+), 548 deletions(-) diff --git a/schwab/client/base.py b/schwab/client/base.py index 67a9ccc..b567f0d 100644 --- a/schwab/client/base.py +++ b/schwab/client/base.py @@ -1011,7 +1011,7 @@ def get_movers(self, index, *, sort_order=None, frequency=None): if sort_order is not None: params['sort'] = sort_order if frequency is not None: - params['frequency'] = frequency + params['frequency'] = str(frequency) return self._get_request(path, params) @@ -1115,5 +1115,8 @@ def get_instrument_by_cusip(self, cusip): :param cusip: String representing CUSIP of instrument for which to fetch data. Note leading zeroes must be preserved. ''' + if not isinstance(cusip, str): + raise ValueError('cusip must be passed as str') + return self._get_request( '/marketdata/v1/instruments/{}'.format(cusip), {}) diff --git a/tests/client_test.py b/tests/client_test.py index 227542d..161b4de 100644 --- a/tests/client_test.py +++ b/tests/client_test.py @@ -1017,6 +1017,15 @@ def test_get_option_chain_option_entitlement(self): 'entitlement': 'PP'}) + # get_option_expiration_chain + + def test_get_option_expiration_chain(self): + self.client.get_option_expiration_chain('AAPL') + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/expirationchain'), + params={'symbol': 'AAPL'}) + + # get_price_history_every_minute @patch('schwab.client.base.datetime.datetime', mockdatetime) @@ -2018,608 +2027,143 @@ def test_get_price_history_every_week_previous_close(self): params=params) - ''' - # create_saved_order - - - def test_create_saved_order(self): - order_spec = {'order': 'spec'} - self.client.create_saved_order(ACCOUNT_HASH, order_spec) - self.mock_session.post.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/savedorders'), - json=order_spec) - - - def test_create_saved_order_order_builder(self): - order_spec = OrderBuilder(enforce_enums=False).set_order_type('LIMIT') - expected_spec = {'orderType': 'LIMIT'} - self.client.create_saved_order(ACCOUNT_HASH, order_spec) - self.mock_session.post.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/savedorders'), - json=expected_spec) - - - def test_create_saved_order_str(self): - order_spec = {'order': 'spec'} - self.client.create_saved_order(str(ACCOUNT_HASH), order_spec) - self.mock_session.post.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/savedorders'), - json=order_spec) - - # delete_saved_order - - - def test_delete_saved_order(self): - self.client.delete_saved_order(ACCOUNT_HASH, SAVED_ORDER_ID) - self.mock_session.delete.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/savedorders/{savedOrderId}')) - - - def test_delete_saved_order_str(self): - self.client.delete_saved_order(str(ACCOUNT_HASH), str(SAVED_ORDER_ID)) - self.mock_session.delete.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/savedorders/{savedOrderId}')) - - # delete_saved_order - - - def test_get_saved_order(self): - self.client.get_saved_order(ACCOUNT_HASH, SAVED_ORDER_ID) - self.mock_session.get.assert_called_once_with( - self.make_url( - '/v1/accounts/{accountHash}/savedorders/{savedOrderId}'), - params={}) - - - def test_get_saved_order_str(self): - self.client.get_saved_order(str(ACCOUNT_HASH), str(SAVED_ORDER_ID)) - self.mock_session.get.assert_called_once_with( - self.make_url( - '/v1/accounts/{accountHash}/savedorders/{savedOrderId}'), - params={}) - - # get_saved_orders_by_path - - - def test_get_saved_orders_by_path(self): - self.client.get_saved_orders_by_path(ACCOUNT_HASH) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/savedorders'), params={}) + # get_movers - def test_get_saved_orders_by_path_str(self): - self.client.get_saved_orders_by_path(str(ACCOUNT_HASH)) + def test_get_movers(self): + self.client.get_movers( + self.client.Movers.Index.DJI) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/savedorders'), params={}) - - # replace_saved_order - - - def test_replace_saved_order(self): - order_spec = {'order': 'spec'} - self.client.replace_saved_order(ACCOUNT_HASH, SAVED_ORDER_ID, order_spec) - self.mock_session.put.assert_called_once_with( - self.make_url( - '/v1/accounts/{accountHash}/savedorders/{savedOrderId}'), - json=order_spec) - - - def test_replace_saved_order_order_builder(self): - order_spec = OrderBuilder(enforce_enums=False).set_order_type('LIMIT') - expected_spec = {'orderType': 'LIMIT'} - self.client.replace_saved_order(ACCOUNT_HASH, SAVED_ORDER_ID, order_spec) - self.mock_session.put.assert_called_once_with( - self.make_url( - '/v1/accounts/{accountHash}/savedorders/{savedOrderId}'), - json=expected_spec) + self.make_url('/marketdata/v1/movers/$DJI'), params={}) - - def test_replace_saved_order_str(self): - order_spec = {'order': 'spec'} - self.client.replace_saved_order( - str(ACCOUNT_HASH), str(SAVED_ORDER_ID), order_spec) - self.mock_session.put.assert_called_once_with( - self.make_url( - '/v1/accounts/{accountHash}/savedorders/{savedOrderId}'), - json=order_spec) - ''' - ''' - - - # get_orders_by_query - - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_vanilla(self): - self.client.get_orders_by_query() - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': MIN_ISO, - 'toEnteredTime': NOW_DATETIME_ISO - }) - - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_max_results(self): - self.client.get_orders_by_query(max_results=100) + def test_get_movers_index_unchecked(self): + self.client.set_enforce_enums(False) + self.client.get_movers('not-an-index') self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': MIN_ISO, - 'toEnteredTime': NOW_DATETIME_ISO, - 'maxResults': 100, - }) + self.make_url('/marketdata/v1/movers/not-an-index'), params={}) - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_from_entered_datetime(self): - self.client.get_orders_by_query(from_entered_datetime=EARLIER_DATETIME) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': EARLIER_ISO, - 'toEnteredTime': NOW_DATETIME_ISO, - }) - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_to_entered_datetime(self): - self.client.get_orders_by_query(to_entered_datetime=EARLIER_DATETIME) + def test_get_movers_sort_order(self): + self.client.get_movers( + self.client.Movers.Index.DJI, + sort_order=self.client.Movers.SortOrder.VOLUME) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': MIN_ISO, - 'toEnteredTime': EARLIER_ISO, - }) + self.make_url('/marketdata/v1/movers/$DJI'), + params={'sort': 'VOLUME'}) - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_status_and_statuses(self): - with self.assertRaises( - ValueError, msg='at most one of status or statuses may be set'): - self.client.get_orders_by_query( - to_entered_datetime=EARLIER_DATETIME, - status='EXPIRED', statuses=[ - self.client_class.Order.Status.FILLED, - self.client_class.Order.Status.EXPIRED]) - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_status(self): - self.client.get_orders_by_query(status=self.client_class.Order.Status.FILLED) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': MIN_ISO, - 'toEnteredTime': NOW_DATETIME_ISO, - 'status': 'FILLED' - }) - - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_status_unchecked(self): + def test_get_movers_sort_order_unchecked(self): self.client.set_enforce_enums(False) - self.client.get_orders_by_query(status='FILLED') + self.client.get_movers( + self.client.Movers.Index.DJI, + sort_order='not-a-sort-order') self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': MIN_ISO, - 'toEnteredTime': NOW_DATETIME_ISO, - 'status': 'FILLED' - }) + self.make_url('/marketdata/v1/movers/$DJI'), + params={'sort': 'not-a-sort-order'}) - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_statuses(self): - self.client.get_orders_by_query(statuses=[ - self.client_class.Order.Status.FILLED, - self.client_class.Order.Status.EXPIRED]) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': MIN_ISO, - 'toEnteredTime': NOW_DATETIME_ISO, - 'status': 'FILLED,EXPIRED' - }) - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_statuses_scalar(self): - self.client.get_orders_by_query(statuses=self.client_class.Order.Status.FILLED) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': MIN_ISO, - 'toEnteredTime': NOW_DATETIME_ISO, - 'status': 'FILLED' - }) - - - @patch('schwab.client.base.datetime.datetime', mockdatetime) - def test_get_orders_by_query_statuses_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_orders_by_query(statuses=['FILLED', 'EXPIRED']) + def test_get_movers_frequency(self): + self.client.get_movers( + self.client.Movers.Index.DJI, + frequency=self.client.Movers.Frequency.ZERO) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/orders'), params={ - 'fromEnteredTime': MIN_ISO, - 'toEnteredTime': NOW_DATETIME_ISO, - 'status': 'FILLED,EXPIRED' - }) - - ''' + self.make_url('/marketdata/v1/movers/$DJI'), + params={'frequency': '0'}) - ''' - # search_instruments - - def test_search_instruments(self): - self.client.search_instruments( - ['AAPL', 'MSFT'], self.client_class.Instrument.Projection.FUNDAMENTAL) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/instruments'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL,MSFT', - 'projection': 'fundamental'}) - - - def test_search_instruments_one_instrument(self): - self.client.search_instruments( - 'AAPL', self.client_class.Instrument.Projection.FUNDAMENTAL) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/instruments'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL', - 'projection': 'fundamental'}) - - - def test_search_instruments_unchecked(self): + def test_get_movers_frequency_unchecked(self): self.client.set_enforce_enums(False) - self.client.search_instruments(['AAPL', 'MSFT'], 'fundamental') + self.client.get_movers( + self.client.Movers.Index.DJI, + frequency='999999') self.mock_session.get.assert_called_once_with( - self.make_url('/v1/instruments'), params={ - 'apikey': API_KEY, - 'symbol': 'AAPL,MSFT', - 'projection': 'fundamental'}) + self.make_url('/marketdata/v1/movers/$DJI'), + params={'frequency': '999999'}) - # get_instrument - - def test_get_instrument(self): - self.client.get_instrument(CUSIP) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/instruments/{cusip}'), - params={'apikey': API_KEY}) + # get_market_hours - def test_get_instrument_cusip_must_be_string(self): - msg = 'CUSIPs must be passed as strings to preserve leading zeroes' - with self.assertRaises(ValueError, msg=msg): - self.client.get_instrument(123456) - - # get_hours_for_multiple_markets + def test_get_market_hours_single_market(self): + self.client.get_market_hours( + self.client_class.MarketHours.Market.EQUITY) + self.mock_session.get.assert_called_once_with( + self.make_url('/marketdata/v1/markets'), params={ + 'markets': 'equity'}) - - def test_get_hours_for_multiple_markets_datetime(self): - self.client.get_hours_for_multiple_markets([ - self.client_class.Markets.EQUITY, - self.client_class.Markets.BOND], NOW_DATETIME) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/hours'), params={ - 'apikey': API_KEY, - 'markets': 'EQUITY,BOND', - 'date': NOW_DATE_ISO}) - - def test_get_hours_for_multiple_markets_single_market(self): - self.client.get_hours_for_multiple_markets( - self.client_class.Markets.EQUITY, NOW_DATETIME) + def test_get_market_hours_market_list(self): + self.client.get_market_hours( + [self.client_class.MarketHours.Market.EQUITY, + self.client_class.MarketHours.Market.OPTION]) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/hours'), params={ - 'apikey': API_KEY, - 'markets': 'EQUITY', - 'date': NOW_DATE_ISO}) - - - def test_get_hours_for_multiple_markets_date(self): - self.client.get_hours_for_multiple_markets([ - self.client_class.Markets.EQUITY, - self.client_class.Markets.BOND], NOW_DATE) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/hours'), params={ - 'apikey': API_KEY, - 'markets': 'EQUITY,BOND', - 'date': NOW_DATE_ISO}) + self.make_url('/marketdata/v1/markets'), params={ + 'markets': 'equity,option'}) - - def test_get_hours_for_multiple_markets_str(self): - with self.assertRaises(ValueError) as cm: - self.client.get_hours_for_multiple_markets([ - self.client_class.Markets.EQUITY, - self.client_class.Markets.BOND], '2020-01-01') - self.assertEqual(str(cm.exception), - "expected type in (datetime.date, datetime.datetime) " - "for date, got 'builtins.str'") - - def test_get_hours_for_multiple_markets_unchecked(self): + def test_get_market_hours_market_unchecked(self): self.client.set_enforce_enums(False) - self.client.get_hours_for_multiple_markets( - ['EQUITY', 'BOND'], NOW_DATETIME) + self.client.get_market_hours(['not-a-market']) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/hours'), params={ - 'apikey': API_KEY, - 'markets': 'EQUITY,BOND', - 'date': NOW_DATE_ISO}) + self.make_url('/marketdata/v1/markets'), params={ + 'markets': 'not-a-market'}) - # get_hours_for_single_market - - def test_get_hours_for_single_market_datetime(self): - self.client.get_hours_for_single_market( - self.client_class.Markets.EQUITY, NOW_DATETIME) + def test_get_market_hours_date(self): + self.client.get_market_hours( + self.client_class.MarketHours.Market.EQUITY, + date=NOW_DATE) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/{market}/hours'), params={ - 'apikey': API_KEY, + self.make_url('/marketdata/v1/markets'), params={ + 'markets': 'equity', 'date': NOW_DATE_ISO}) - - def test_get_hours_for_single_market_date(self): - self.client.get_hours_for_single_market( - self.client_class.Markets.EQUITY, NOW_DATE) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/{market}/hours'), params={ - 'apikey': API_KEY, - 'date': NOW_DATE_ISO}) - - def test_get_hours_for_single_market_str(self): + def test_get_market_hours_date_str(self): with self.assertRaises(ValueError) as cm: - self.client.get_hours_for_single_market( - self.client_class.Markets.EQUITY, '2020-01-01') + self.client.get_market_hours( + self.client_class.MarketHours.Market.EQUITY, + date='2020-01-02') self.assertEqual(str(cm.exception), - "expected type in (datetime.date, datetime.datetime) for " + + "expected type 'datetime.date' for " + "date, got 'builtins.str'") - - def test_get_hours_for_single_market_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_hours_for_single_market('EQUITY', NOW_DATETIME) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/{market}/hours'), params={ - 'apikey': API_KEY, - 'date': NOW_DATE_ISO}) - - # get_movers - - - def test_get_movers(self): - self.client.get_movers( - INDEX, self.client_class.Movers.Direction.UP, self.client_class.Movers.Change.PERCENT) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/{index}/movers'), params={ - 'apikey': API_KEY, - 'direction': 'up', - 'change': 'percent'}) - - - def test_get_movers_unchecked(self): - self.client.set_enforce_enums(False) - self.client.get_movers(INDEX, 'up', 'percent') - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/marketdata/{index}/movers'), params={ - 'apikey': API_KEY, - 'direction': 'up', - 'change': 'percent'}) - - ''' - - ''' - # get_preferences - - - def test_get_preferences(self): - self.client.get_preferences(ACCOUNT_HASH) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/preferences'), params={ - 'apikey': API_KEY}) - - - def test_get_preferences_str(self): - self.client.get_preferences(str(ACCOUNT_HASH)) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/preferences'), params={ - 'apikey': API_KEY}) - - # get_streamer_subscription_keys - - - def test_get_streamer_subscription_keys(self): - self.client.get_streamer_subscription_keys([1000, 2000, 3000]) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/userprincipals/streamersubscriptionkeys'), - params={ - 'apikey': API_KEY, - 'accountHashs': '1000,2000,3000'}) - - - def test_get_streamer_subscription_keys_one_account_id(self): - self.client.get_streamer_subscription_keys(1000) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/userprincipals/streamersubscriptionkeys'), - params={ - 'apikey': API_KEY, - 'accountHashs': '1000'}) - - - def test_get_streamer_subscription_keys_str(self): - self.client.get_streamer_subscription_keys(['1000', '2000', '3000']) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/userprincipals/streamersubscriptionkeys'), - params={ - 'apikey': API_KEY, - 'accountHashs': '1000,2000,3000'}) - - # get_user_principals - - - def test_get_user_principals_vanilla(self): - self.client.get_user_principals() - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/userprincipals'), params={ - 'apikey': API_KEY}) + # get_instruments - def test_get_user_principals_fields(self): - self.client.get_user_principals( - fields=[ - self.client_class.UserPrincipals.Fields.STREAMER_SUBSCRIPTION_KEYS, - self.client_class.UserPrincipals.Fields.PREFERENCES]) + def test_get_instruments(self): + self.client.get_instruments( + ['AAPL', 'MSFT'], self.client_class.Instrument.Projection.FUNDAMENTAL) self.mock_session.get.assert_called_once_with( - self.make_url('/v1/userprincipals'), params={ - 'apikey': API_KEY, - 'fields': 'streamerSubscriptionKeys,preferences'}) + self.make_url('/marketdata/v1/instruments'), params={ + 'symbol': 'AAPL,MSFT', + 'projection': 'fundamental'}) - - def test_get_user_principals_one_field(self): - self.client.get_user_principals( - fields=self.client_class.UserPrincipals.Fields.PREFERENCES) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/userprincipals'), params={ - 'apikey': API_KEY, - 'fields': 'preferences'}) - - def test_get_user_principals_fields_unchecked(self): + def test_get_instruments_projection_unchecked(self): self.client.set_enforce_enums(False) - self.client.get_user_principals( - fields=['streamerSubscriptionKeys', 'preferences']) + self.client.get_instruments( + ['AAPL', 'MSFT'], 'not-a-projection') self.mock_session.get.assert_called_once_with( - self.make_url('/v1/userprincipals'), params={ - 'apikey': API_KEY, - 'fields': 'streamerSubscriptionKeys,preferences'}) - - # update_preferences - - - def test_update_preferences(self): - preferences = {'wantMoney': True} - self.client.update_preferences(ACCOUNT_HASH, preferences) - self.mock_session.put.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/preferences'), - json=preferences) - - - def test_update_preferences_str(self): - preferences = {'wantMoney': True} - self.client.update_preferences(str(ACCOUNT_HASH), preferences) - self.mock_session.put.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/preferences'), - json=preferences) - - # create_watchlist - - - def test_create_watchlist(self): - watchlist = {'AAPL': True} - self.client.create_watchlist(ACCOUNT_HASH, watchlist) - self.mock_session.post.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/watchlists'), - json=watchlist) - - - def test_create_watchlist_str(self): - watchlist = {'AAPL': True} - self.client.create_watchlist(str(ACCOUNT_HASH), watchlist) - self.mock_session.post.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/watchlists'), - json=watchlist) - - # delete_watchlist - - - def test_delete_watchlist(self): - watchlist = {'AAPL': True} - self.client.delete_watchlist(ACCOUNT_HASH, WATCHLIST_ID) - self.mock_session.delete.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/watchlists/{watchlistId}')) - - - def test_delete_watchlist_str(self): - watchlist = {'AAPL': True} - self.client.delete_watchlist(str(ACCOUNT_HASH), str(WATCHLIST_ID)) - self.mock_session.delete.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/watchlists/{watchlistId}')) - - # get_watchlist - - - def test_get_watchlist(self): - self.client.get_watchlist(ACCOUNT_HASH, WATCHLIST_ID) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/watchlists/{watchlistId}'), - params={}) - - - def test_get_watchlist_str(self): - self.client.get_watchlist(str(ACCOUNT_HASH), str(WATCHLIST_ID)) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/watchlists/{watchlistId}'), - params={}) - - # get_watchlists_for_multiple_accounts - - - def test_get_watchlists_for_multiple_accounts(self): - self.client.get_watchlists_for_multiple_accounts() - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/watchlists'), params={}) - - # get_watchlists_for_single_account + self.make_url('/marketdata/v1/instruments'), params={ + 'symbol': 'AAPL,MSFT', + 'projection': 'not-a-projection'}) - - def test_get_watchlists_for_single_account(self): - self.client.get_watchlists_for_single_account(ACCOUNT_HASH) - self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/watchlists'), params={}) + # get_instrument_by_cusip - def test_get_watchlists_for_single_account_str(self): - self.client.get_watchlists_for_single_account(str(ACCOUNT_HASH)) + def test_get_instrument_by_cusip(self): + self.client.get_instrument_by_cusip('037833100') self.mock_session.get.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/watchlists'), params={}) - - # replace_watchlist + self.make_url('/marketdata/v1/instruments/037833100'), params={}) - - def test_replace_watchlist(self): - watchlist = {'AAPL': True} - self.client.replace_watchlist(ACCOUNT_HASH, WATCHLIST_ID, watchlist) - self.mock_session.put.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/watchlists/{watchlistId}'), - json=watchlist) - - def test_replace_watchlist_str(self): - watchlist = {'AAPL': True} - self.client.replace_watchlist( - str(ACCOUNT_HASH), str(WATCHLIST_ID), watchlist) - self.mock_session.put.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/watchlists/{watchlistId}'), - json=watchlist) - - # update_watchlist - - - def test_update_watchlist(self): - watchlist = {'AAPL': True} - self.client.update_watchlist(ACCOUNT_HASH, WATCHLIST_ID, watchlist) - self.mock_session.patch.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/watchlists/{watchlistId}'), - json=watchlist) + def test_get_instrument_by_cusip_cusip_must_be_string(self): + with self.assertRaises(ValueError) as cm: + self.client.get_instrument_by_cusip(37833100) + self.assertEqual(str(cm.exception), 'cusip must be passed as str') - - def test_update_watchlist_str(self): - watchlist = {'AAPL': True} - self.client.update_watchlist( - str(ACCOUNT_HASH), str(WATCHLIST_ID), watchlist) - self.mock_session.patch.assert_called_once_with( - self.make_url('/v1/accounts/{accountHash}/watchlists/{watchlistId}'), - json=watchlist) - ''' class ClientTest(_TestClient, unittest.TestCase): """