def test_remove_trade(self): stock_exchange = StockExchange('test') Stock('GIN', 'preferred', '8', '100', '2%', stock_exchange) trade = TradeRecord(stock_exchange, 'GIN', '300', 'buy', '130', '2017-02-05 23:14:39') trade1 = TradeRecord(stock_exchange, 'GIN', '500', 'sell', '150', '2017-02-05 22:14:39') stock_exchange.remove_trade(trade) stock_exchange.remove_trade(trade) stock_exchange.remove_trade(trade1) stock_exchange.remove_trade(trade1)
def test_vw_stock_price_calculator1(self): stock_exchange = StockExchange('test') Stock('GIN', 'preferred', '8', '100', '2%', stock_exchange) TradeRecord(stock_exchange, 'GIN', '300', 'buy', '130', '2017-01-05 21:14:39') TradeRecord(stock_exchange, 'GIN', '500', 'sell', '150', '2017-01-05 22:14:39') TradeRecord(stock_exchange, 'GIN', '200', 'sell', '120', '2017-01-05 23:14:39') volume_weighted_price = stock_exchange.vw_stock_price_calculator('GIN') self.assertIsNone(volume_weighted_price)
def test_vw_stock_price_calculator(self): stock_exchange = StockExchange('test') Stock('GIN', 'preferred', '8', '100', '2%', stock_exchange) TradeRecord(stock_exchange, 'GIN', '300', 'buy', '130') TradeRecord(stock_exchange, 'GIN', '500', 'sell', '150') TradeRecord(stock_exchange, 'GIN', '200', 'sell', '120') stock_exchange.vw_stock_price_calculator('TEA') stock_exchange.vw_stock_price_calculator('GIN', '10') stock_exchange.vw_stock_price_calculator('GIN', 'test') volume_weighted_price = stock_exchange.vw_stock_price_calculator('GIN') self.assertEqual(volume_weighted_price, 138.0)
def test_add_new_trade(self): stock_exchange = StockExchange('test') stock = Stock('GIN', 'preferred', '8', '100', '2%', stock_exchange) stock_exchange.add_new_trade( TradeRecord(stock_exchange, 'GIN', '500', 'sell', '150', '2017-02-05 22:14:39')) stock_exchange.add_new_trade( TradeRecord(stock_exchange, 'GIN', '300', 'buy', '130', '2017-02-05 23:14:39')) stock_exchange.remove_existing_stock(stock) stock_exchange.add_new_trade( TradeRecord(stock_exchange, 'GIN', '200', 'sell', '150', '2017-02-05 23:15:39'))
def add_trade(): """ A POST rest wrapper for StockExchange.add_new_trade() Example usage: { "stock_symbol": "POP", "quantity": "300", "trade_type": "buy", "traded_price": "150", "time_stamp": "2017-02-04 23:30:39" } """ check_stock_exchange() required_params = ['stock_symbol', 'quantity', 'trade_type', 'traded_price'] json_request = request.json if json_request: # Checking if all required params were in the request if all([True if required_param in json_request else False for required_param in required_params]): # Testing if the underlying code in StockExchange.add_new_trade() executed successfully. try: result = '' # Stock can be created either with a fixed dividend or not. if len(json_request) < 5: result = stock_exchange.add_new_trade( TradeRecord(stock_exchange, json_request['stock_symbol'], json_request['quantity'], json_request['trade_type'], json_request['traded_price'])) elif len(json_request) == 5 and 'time_stamp' in json_request: result = stock_exchange.add_new_trade( TradeRecord(stock_exchange, json_request['stock_symbol'], json_request['quantity'], json_request['trade_type'], json_request['traded_price'], json_request['time_stamp'])) else: abort(400, 'Fifth parameter must be "time_stamp".') if result: return jsonify({'Added trade for stock': json_request['stock_symbol']}), 200 else: abort(400, 'Please first add stock: {} in stock exchange. Then add a trade for it.'.format( json_request['stock_symbol'])) except TypeError as error: abort(500, error) else: missing_params = set(required_params).difference(json_request) abort(400, 'Parameters {} needs to be in the request'.format(list(missing_params))) else: abort(400)
def test_time_stamp(self): trade = TradeRecord(StockExchange('test'), 'TEA', '500', 'sell', '150', '2017-02-05 22:14:39') self.assertEqual(trade.stock_symbol, 'TEA') self.assertEqual(trade.quantity, 500.0) self.assertEqual(trade.trade_type, 'sell') self.assertEqual(trade.traded_price, 150) self.assertEqual( trade.time_stamp, datetime.strptime('2017-02-05 22:14:39', '%Y-%m-%d %H:%M:%S')) self.assertTrue(trade.created_successfully)
def test_simple(self): trade = TradeRecord(StockExchange('test'), 'TEA', '500', 'sell', '150') time_stamp = datetime.strptime( str(datetime.now())[:-10], '%Y-%m-%d %H:%M') self.assertEqual(trade.stock_symbol, 'TEA') self.assertEqual(trade.quantity, 500.0) self.assertEqual(trade.trade_type, 'sell') self.assertEqual(trade.traded_price, 150) self.assertEqual(str(trade.time_stamp)[:-3], str(time_stamp)[:-3]) # removing seconds self.assertTrue(trade.created_successfully)
def test_exceptions(self): trade = TradeRecord('test', 'TEA', 'test1', 'test2', 'test3', 'test4') self.assertFalse(trade.created_successfully)
def add_trade(from_='add_trade'): """ A console wrapper for TradeRecord :param from_: An optional argument for keeping track which method called add_trade() :return: Recursion or add_stock() """ create_exchange_market() user_provided_args = '' if stock_exchange.registered_stocks: user_prompt = 'Please provide trade information for addition in the following format:\nstock symbol, ' \ 'quantity, trade type, traded price, time stamp (Y-m-d H:M:S or empty to use current time.), ' # Normal case. User Asked for add_trade(). if from_ == 'add_trade': user_provided_args = raw_input(user_prompt + ' or \'q\'to quit\n:') # Case when add_trade() is called from remove_trade() -> add_trade()-> add_stock()-> add_trade()->remove_trade() elif from_ == 'remove_trade': user_provided_args = raw_input(user_prompt + '\n"remove" to start removing trades or \'q\'to quit\n:') if user_provided_args.strip() == 'remove': remove_trade() # Case when add_trade() is called from calculate_volume_weighted_price()-> add_trade()-> add_stock()-> # add_trade()-> calculate_volume_weighted_price() elif from_ == 'volume_weighted_price': user_provided_args = raw_input( user_prompt + '\n"vw" to calculate the volume weighted price or \'q\'to quit\n:') if user_provided_args.strip() == 'vw': calculate_volume_weighted_price() # Case when add_trade() is called from calculate_all_share_index() -> add_trade() -> add_stock()-> add_trade() # -> calculate_all_share_index() elif from_ == 'all_share_index': user_provided_args = raw_input( user_prompt + '\n"index" to calculate all share index or \'q\'to quit\n:') if user_provided_args.strip() == 'index': calculate_volume_weighted_price() exit_program(user_provided_args) user_provided_args = [arg.strip() for arg in user_provided_args.split(',') if arg] # Checking if the trade the user wants to add is about an already registered stock. if stock_exchange.is_stock_registered(user_provided_args[0]): # TradeRecord can be created either with user provided or system provided timestamp. try: if len(user_provided_args) < 5: TradeRecord(stock_exchange, user_provided_args[0], user_provided_args[1], user_provided_args[2], user_provided_args[3]) elif len(user_provided_args) == 5: TradeRecord(stock_exchange, user_provided_args[0], user_provided_args[1], user_provided_args[2], user_provided_args[3], user_provided_args[4]) except TypeError as error: print error # Retrying return add_trade(from_) # Recursion to add more trades. return add_trade(from_) # The trade the user wants to add is about a non existing stock. prompting the user to add it. else: add_stock('add_trade') # First time running add_trade(). Need to first add stocks. else: print 'Stock Exchange Empty. Please register some stocks first.' add_stock(from_)