def testPrintCryptoPriceHistoricalPriceValueWarning(self): crypto = 'BTC' fiat = 'USD' exchange = 'BitTrex' resultData = ResultData() resultData.setValue(resultData.RESULT_KEY_ERROR_MSG, None) resultData.setValue(resultData.RESULT_KEY_CRYPTO, crypto) resultData.setValue(resultData.RESULT_KEY_FIAT, fiat) resultData.setValue(resultData.RESULT_KEY_EXCHANGE, exchange) resultData.setValue(resultData.RESULT_KEY_PRICE_TYPE, resultData.PRICE_TYPE_HISTO_DAY) resultData.setValue(resultData.RESULT_KEY_PRICE, 4122) resultData.setValue(resultData.RESULT_KEY_PRICE_DATE_TIME_STRING, '12/09/17 00:00') resultData.setValue(resultData.RESULT_KEY_PRICE_TIME_STAMP, 1505174400) resultData.setValue(resultData.RESULT_KEY_PRICE_VALUE_CRYPTO, None) resultData.setValue(resultData.RESULT_KEY_PRICE_VALUE_FIAT, None) resultData.setWarning( ResultData.WARNING_TYPE_COMMAND_VALUE, "WARNING - price value symbol ETH differs from both crypto (BTC) and fiat (USD). -v parameter ignored !" ) stdout = sys.stdout capturedStdout = StringIO() sys.stdout = capturedStdout self.printer.printDataToConsole(resultData) sys.stdout = stdout self.assertEqual( 'BTC/USD on BitTrex: 12/09/17 00:00C 4122\nWARNING - price value symbol ETH differs from both crypto (BTC) and fiat (USD). -v parameter ignored !\n', capturedStdout.getvalue())
def execute(self): ''' :seqdiag_return ResultData or False :return: ''' resultPriceOrBoolean = self._validateMandatoryData() if resultPriceOrBoolean != True: return resultPriceOrBoolean localTimezone = self.configManager.localTimeZone localNow = DateTimeUtil.localNow(localTimezone) resultPriceOrBoolean = self._validateDateTimeData(localNow) if resultPriceOrBoolean != True: return resultPriceOrBoolean cryptoUpper = self.parsedParmData[self.CRYPTO].upper() fiatUpper = self.parsedParmData[self.FIAT].upper() exchange = self.parsedParmData[self.EXCHANGE] dayStr = self.parsedParmData[self.DAY] if dayStr != None: day = int(dayStr) else: day = 0 monthStr = self.parsedParmData[self.MONTH] if monthStr != None: month = int(monthStr) else: month = localNow.month yearStr = self.parsedParmData[self.YEAR] if yearStr != None: if len(yearStr) == 2: year = 2000 + int(yearStr) elif len(yearStr) == 4: year = int(yearStr) elif yearStr == '0': # user entered -d0 ! year = 0 else: year = localNow.year hourStr = self.parsedParmData[self.HOUR] if hourStr != None: hour = int(hourStr) else: hour = 0 minuteStr = self.parsedParmData[self.MINUTE] if minuteStr != None: minute = int(minuteStr) else: minute = 0 #storing the parsed parm gata dicèionary before it #may be modified in case the user requested a RT #price. The initial dictionary wiLl be added to the #returned resultData so the client can have access #to the full command request, even if only a partial #request like -d or -c was entered. This is necessary #bcecause if the client is a GUI, it stores the list #of requests in order to be able to replay them ! initialParsedParmDataDic = self.parsedParmData.copy() wasDateInFutureSetToLastYear = False localRequestDateTime = None if day + month + year == 0: # asking for RT price here. Current date is stored in parsed parm data for possible # use in next request self._storeDateTimeDataForNextPartialRequest(localNow) else: try: localRequestDateTime = DateTimeUtil.dateTimeComponentsToArrowLocalDate( day, month, year, hour, minute, 0, localTimezone) except ValueError as e: # is the when the user specify only the day if he enters 31 and the current month # has no 31st or if he enters 30 or 29 and we are on February result = ResultData() result.setValue( ResultData.RESULT_KEY_ERROR_MSG, "ERROR - {}: day {}, month {}".format(str(e), day, month)) return result if DateTimeUtil.isAfter(localRequestDateTime, localNow): # request date is in the future ---> invalid. This happens for example in case # btc usd 31/12 bittrex entered sometime before 31/12. Then the request year is # forced to last year and a warning will be displayed. year = localNow.year - 1 wasDateInFutureSetToLastYear = True priceValueSymbol = self.parsedParmData[self.PRICE_VALUE_SYMBOL] priceValueAmount = self.parsedParmData[self.PRICE_VALUE_AMOUNT] if priceValueSymbol: priceValueSymbol = priceValueSymbol.upper() if priceValueAmount: priceValueAmount = float(priceValueAmount) priceValueSaveFlag = self.parsedParmData[self.PRICE_VALUE_SAVE] result = self.receiver.getCryptoPrice(cryptoUpper, fiatUpper, exchange, day, month, year, hour, minute, priceValueSymbol, priceValueAmount, priceValueSaveFlag, self.requestInputString) #the command components denoting the user request will be used to recreate #a full command request which will be stored in the command history list. #The historry list can be replayed, stored on disk, edited ... result.setValue(ResultData.RESULT_KEY_INITIAL_COMMAND_PARMS, initialParsedParmDataDic) result.setValue(ResultData.RESULT_KEY_PRICE_VALUE_SAVE, priceValueSaveFlag) if wasDateInFutureSetToLastYear: result.setWarning( ResultData.WARNING_TYPE_FUTURE_DATE, "Warning - request date {} can not be in the future and was shifted back to last year" .format( localRequestDateTime.format( self.configManager.dateTimeFormat))) unsupportedCommand = self.parsedParmData[self.UNSUPPORTED_COMMAND] if unsupportedCommand: result.setWarning( ResultData.WARNING_TYPE_UNSUPPORTED_COMMAND, "Warning - unsupported command {}{} in request {}".format( unsupportedCommand, self.parsedParmData[self.UNSUPPORTED_COMMAND_DATA], self.requestInputString)) return result
class TestResultData(unittest.TestCase): def setUp(self): self.resultData = ResultData() def testInit(self): self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_CRYPTO), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_UNIT), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_EXCHANGE), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_PRICE_TIME_STAMP), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_PRICE_DATE_TIME_STRING), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_PRICE), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_PRICE_TYPE), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_ERROR_MSG), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_WARNINGS_DIC), {}) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_INITIAL_COMMAND_PARMS), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_VALUE_CRYPTO), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_VALUE_UNIT), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_VALUE_FIAT), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_VALUE_SAVE), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_FIAT_RATE), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_FIAT_COMPUTED_AMOUNT), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_FIAT_SYMBOL), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_FIAT_EXCHANGE), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_FIAT_SAVE), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_PRICE_AMOUNT), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_PRICE_SAVE), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_RESULT_COMPUTED_AMOUNT_UNIT), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_RESULT_COMPUTED_PERCENT_UNIT), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_RESULT_COMPUTED_AMOUNT_FIAT), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_RESULT_COMPUTED_PERCENT_FIAT), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_RESULT_SAVE), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_LIMIT_AMOUNT), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_LIMIT_COMPUTED_UNIT_AMOUNT), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_LIMIT_SYMBOL), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_LIMIT_EXCHANGE), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_OPTION_LIMIT_SAVE), None) def testNoError(self): self.assertTrue(self.resultData.noError()) errorMsg = "ERROR - test error" self.resultData.setError(errorMsg) self.assertFalse(self.resultData.noError()) def testSetValue(self): self.resultData.setValue(self.resultData.RESULT_KEY_CRYPTO, 'USD') self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_CRYPTO), 'USD') def testSetGetWarning(self): commValWarningMsg = "test warning command value" futureDateWarningMsg = "test warning future date" self.resultData.setWarning(ResultData.WARNING_TYPE_OPTION_VALUE, commValWarningMsg) self.resultData.setWarning(ResultData.WARNING_TYPE_FUTURE_DATE, futureDateWarningMsg) self.assertEqual(commValWarningMsg, self.resultData.getWarningMessage(ResultData.WARNING_TYPE_OPTION_VALUE)) self.assertEqual(futureDateWarningMsg, self.resultData.getWarningMessage(ResultData.WARNING_TYPE_FUTURE_DATE)) def testGetAllWarningMessages(self): commValWarningMsg = "test warning command value" futureDateWarningMsg = "test warning future date" self.resultData.setWarning(ResultData.WARNING_TYPE_OPTION_VALUE, commValWarningMsg) self.resultData.setWarning(ResultData.WARNING_TYPE_FUTURE_DATE, futureDateWarningMsg) self.assertEqual([commValWarningMsg, futureDateWarningMsg], self.resultData.getAllWarningMessages()) def testContainsWarning(self): commValWarningMsg = "test warning command value" futureDateWarningMsg = "test warning future date" self.assertFalse(self.resultData.containsWarnings()) self.resultData.setWarning(ResultData.WARNING_TYPE_OPTION_VALUE, commValWarningMsg) self.assertTrue(self.resultData.containsWarning(ResultData.WARNING_TYPE_OPTION_VALUE)) self.assertFalse(self.resultData.containsWarning(ResultData.WARNING_TYPE_FUTURE_DATE)) self.resultData.setWarning(ResultData.WARNING_TYPE_FUTURE_DATE, futureDateWarningMsg) self.assertTrue(self.resultData.containsWarning(ResultData.WARNING_TYPE_FUTURE_DATE)) def testOverwriteWarning(self): commValWarningMsgOne = "test warning command value one" futureDateWarningMsgOne = "test warning future date one" self.resultData.setWarning(ResultData.WARNING_TYPE_OPTION_VALUE, commValWarningMsgOne) self.resultData.setWarning(ResultData.WARNING_TYPE_FUTURE_DATE, futureDateWarningMsgOne) commValWarningMsgTwo = "test warning command value two" futureDateWarningMsgTwo = "test warning future date two" self.resultData.setWarning(ResultData.WARNING_TYPE_OPTION_VALUE, commValWarningMsgTwo) self.resultData.setWarning(ResultData.WARNING_TYPE_FUTURE_DATE, futureDateWarningMsgTwo) self.assertEqual(commValWarningMsgTwo, self.resultData.getWarningMessage(ResultData.WARNING_TYPE_OPTION_VALUE)) self.assertEqual(futureDateWarningMsgTwo, self.resultData.getWarningMessage(ResultData.WARNING_TYPE_FUTURE_DATE))
class TestResultData(unittest.TestCase): def setUp(self): self.resultData = ResultData() def testInit(self): self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_CRYPTO), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_FIAT), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_EXCHANGE), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_PRICE_TIME_STAMP), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_PRICE_DATE_TIME_STRING), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_PRICE), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_PRICE_TYPE), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_ERROR_MSG), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_PRICE_VALUE_FIAT), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_PRICE_VALUE_CRYPTO), None) self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_PRICE_VALUE_SAVE), None) def testIsEmpty(self): self.assertTrue(self.resultData.isEmpty(self.resultData.RESULT_KEY_CRYPTO)) def testSetValue(self): self.resultData.setValue(self.resultData.RESULT_KEY_CRYPTO, 'USD') self.assertEqual(self.resultData.getValue(self.resultData.RESULT_KEY_CRYPTO), 'USD') def testSetGetWarning(self): commValWarningMsg = "test warning command value" futureDateWarningMsg = "test warning future date" self.resultData.setWarning(ResultData.WARNING_TYPE_COMMAND_VALUE, commValWarningMsg) self.resultData.setWarning(ResultData.WARNING_TYPE_FUTURE_DATE, futureDateWarningMsg) self.assertEqual(commValWarningMsg, self.resultData.getWarningMessage(ResultData.WARNING_TYPE_COMMAND_VALUE)) self.assertEqual(futureDateWarningMsg, self.resultData.getWarningMessage(ResultData.WARNING_TYPE_FUTURE_DATE)) def testGetAllWarningMessages(self): commValWarningMsg = "test warning command value" futureDateWarningMsg = "test warning future date" self.resultData.setWarning(ResultData.WARNING_TYPE_COMMAND_VALUE, commValWarningMsg) self.resultData.setWarning(ResultData.WARNING_TYPE_FUTURE_DATE, futureDateWarningMsg) self.assertEqual([commValWarningMsg, futureDateWarningMsg], self.resultData.getAllWarningMessages()) def testContainsWarning(self): commValWarningMsg = "test warning command value" futureDateWarningMsg = "test warning future date" self.assertFalse(self.resultData.containsWarnings()) self.resultData.setWarning(ResultData.WARNING_TYPE_COMMAND_VALUE, commValWarningMsg) self.assertTrue(self.resultData.containsWarning(ResultData.WARNING_TYPE_COMMAND_VALUE)) self.assertFalse(self.resultData.containsWarning(ResultData.WARNING_TYPE_FUTURE_DATE)) self.resultData.setWarning(ResultData.WARNING_TYPE_FUTURE_DATE, futureDateWarningMsg) self.assertTrue(self.resultData.containsWarning(ResultData.WARNING_TYPE_FUTURE_DATE)) def testOverwriteWarning(self): commValWarningMsgOne = "test warning command value one" futureDateWarningMsgOne = "test warning future date one" self.resultData.setWarning(ResultData.WARNING_TYPE_COMMAND_VALUE, commValWarningMsgOne) self.resultData.setWarning(ResultData.WARNING_TYPE_FUTURE_DATE, futureDateWarningMsgOne) commValWarningMsgTwo = "test warning command value two" futureDateWarningMsgTwo = "test warning future date two" self.resultData.setWarning(ResultData.WARNING_TYPE_COMMAND_VALUE, commValWarningMsgTwo) self.resultData.setWarning(ResultData.WARNING_TYPE_FUTURE_DATE, futureDateWarningMsgTwo) self.assertEqual(commValWarningMsgTwo, self.resultData.getWarningMessage(ResultData.WARNING_TYPE_COMMAND_VALUE)) self.assertEqual(futureDateWarningMsgTwo, self.resultData.getWarningMessage(ResultData.WARNING_TYPE_FUTURE_DATE))
def testGetCryptoPriceRealTimeWithValueFlagGenerateWarning(self): now = DateTimeUtil.localNow('Europe/Zurich') crypto = 'BTC' fiat = 'USD' exchange = 'bittrex' day = 0 month = 0 year = 0 hour = 1 minute = 1 resultData = ResultData() nowMinute = now.minute if nowMinute < 10: if nowMinute > 0: nowMinuteStr = '0' + str(nowMinute) else: nowMinuteStr = '00' else: nowMinuteStr = str(nowMinute) nowHour = now.hour if nowHour < 10: if nowHour > 0: nowHourStr = '0' + str(nowHour) else: nowHourStr = '00' else: nowHourStr = str(nowHour) nowDay = now.day if nowDay < 10: nowDayStr = '0' + str(nowDay) else: nowDayStr = str(nowDay) #rt price not provided here ! resultData.setValue(resultData.RESULT_KEY_ERROR_MSG, None) resultData.setValue(resultData.RESULT_KEY_CRYPTO, crypto) resultData.setValue(resultData.RESULT_KEY_FIAT, fiat) resultData.setValue(resultData.RESULT_KEY_EXCHANGE, 'BitTrex') resultData.setValue(resultData.RESULT_KEY_PRICE_TYPE, resultData.PRICE_TYPE_RT) dateTimeString = '{}/{}/{} {}:{}'.format(nowDayStr, now.month, now.year - 2000, nowHourStr, nowMinuteStr) resultData.setValue(resultData.RESULT_KEY_PRICE_DATE_TIME_STRING, dateTimeString) resultData.setWarning( ResultData.WARNING_TYPE_COMMAND_VALUE, "WARNING - price value symbol ETH differs from both crypto (BTC) and fiat (USD). -v parameter ignored !" ) stdout = sys.stdout capturedStdout = StringIO() sys.stdout = capturedStdout self.printer.printDataToConsole(resultData) sys.stdout = stdout self.assertEqual( 'BTC/USD on BitTrex: {}R \nWARNING - price value symbol ETH differs from both crypto (BTC) and fiat (USD). -v parameter ignored !\n' .format(dateTimeString), capturedStdout.getvalue())