def testIsAfterDateBefore(self): zhArrowDateTimeObjRef = DateTimeUtil.dateTimeStringToArrowLocalDate( "2017/09/30 02:00:00", 'Europe/Zurich', "YYYY/MM/DD HH:mm:ss") zhArrowDateTimeObjOneSecBefore = DateTimeUtil.dateTimeStringToArrowLocalDate( "2017/09/30 01:59:59", 'Europe/Zurich', "YYYY/MM/DD HH:mm:ss") self.assertFalse( DateTimeUtil.isAfter(zhArrowDateTimeObjOneSecBefore, zhArrowDateTimeObjRef))
def testIsAfterOneSecond(self): zhArrowDateTimeObjRef = DateTimeUtil.dateTimeStringToArrowLocalDate( "2017/09/30 02:00:00", 'Europe/Zurich', "YYYY/MM/DD HH:mm:ss") zhArrowDateTimeObjOneSecAfter = DateTimeUtil.dateTimeStringToArrowLocalDate( "2017/09/30 02:00:01", 'Europe/Zurich', "YYYY/MM/DD HH:mm:ss") self.assertTrue( DateTimeUtil.isAfter(zhArrowDateTimeObjOneSecAfter, zhArrowDateTimeObjRef))
def testSummerDateTimeStringToArrowLocalDate(self): expTimeStamp = 1506787315 dateStr = '2017/09/30 21:31:55' arrowDateObj = DateTimeUtil.dateTimeStringToArrowLocalDate(dateStr, 'Asia/Calcutta', US_DATE_TIME_FORMAT_ARROW) self.assertEqual(expTimeStamp, arrowDateObj.timestamp) dateStr = '2017/09/30 18:01:55' arrowDateObj = DateTimeUtil.dateTimeStringToArrowLocalDate(dateStr, 'Europe/Zurich', US_DATE_TIME_FORMAT_ARROW) self.assertEqual(expTimeStamp, arrowDateObj.timestamp)
def testShiftTimeStampToEndOfDay_alt(self): utcArrowDateTimeObj_begOfDay = DateTimeUtil.dateTimeStringToArrowLocalDate("2017/09/30 00:00:00", 'UTC', "YYYY/MM/DD HH:mm:ss") timeStampBegDay = utcArrowDateTimeObj_begOfDay.timestamp utcArrowDateTimeObj_endOfDay = DateTimeUtil.dateTimeStringToArrowLocalDate("2017/09/30 23:59:59", 'UTC', "YYYY/MM/DD HH:mm:ss") timeStampEndDay = utcArrowDateTimeObj_endOfDay.timestamp timeStampShifted = DateTimeUtil.shiftTimeStampToEndOfDay(timeStampBegDay) self.assertEqual(timeStampShifted, timeStampEndDay)
def testWinterDateTimeStringToArrowLocalDate(self): expTimeStamp = 1512061315 dateStr = '2017/11/30 22:31:55' arrowDateObj = DateTimeUtil.dateTimeStringToArrowLocalDate( dateStr, 'Asia/Calcutta', US_DATE_TIME_FORMAT_ARROW) self.assertEqual(expTimeStamp, arrowDateObj.timestamp()) dateStr = '2017/11/30 18:01:55' arrowDateObj = DateTimeUtil.dateTimeStringToArrowLocalDate( dateStr, 'Europe/Zurich', US_DATE_TIME_FORMAT_ARROW) self.assertEqual(expTimeStamp, arrowDateObj.timestamp())
def testGetFormattedDateTimeComponents(self): zhArrowDateTimeObjRef = DateTimeUtil.dateTimeStringToArrowLocalDate("2017/09/30 02:00:00", 'Europe/Zurich', "YYYY/MM/DD HH:mm:ss") dateTimeComponentSymbolList, separatorsList, dateTimeComponentValueList = DateTimeUtil.getFormattedDateTimeComponents(zhArrowDateTimeObjRef, 'DD/MM/YY HH:mm') self.assertEqual(['DD', 'MM', 'YY', 'HH', 'mm'], dateTimeComponentSymbolList) self.assertEqual(['/', ':'], separatorsList) self.assertEqual(['30', '09', '17', '02', '00'], dateTimeComponentValueList) dateTimeComponentSymbolList, separatorsList, dateTimeComponentValueList = DateTimeUtil.getFormattedDateTimeComponents(zhArrowDateTimeObjRef, 'YYYY.MM.DD HH.mm') self.assertEqual(['YYYY', 'MM', 'DD', 'HH', 'mm'], dateTimeComponentSymbolList) self.assertEqual(['\.', '\.'], separatorsList) self.assertEqual(['2017', '09', '30', '02', '00'], dateTimeComponentValueList) dateTimeComponentSymbolList, separatorsList, dateTimeComponentValueList = DateTimeUtil.getFormattedDateTimeComponents(zhArrowDateTimeObjRef, 'YYYY.MM.DD HH-mm') self.assertEqual(['YYYY', 'MM', 'DD', 'HH', 'mm'], dateTimeComponentSymbolList) self.assertEqual(['\.', '-'], separatorsList) self.assertEqual(['2017', '09', '30', '02', '00'], dateTimeComponentValueList) dateTimeComponentSymbolList, separatorsList, dateTimeComponentValueList = DateTimeUtil.getFormattedDateTimeComponents(zhArrowDateTimeObjRef, 'MM-DD-YYYY HH.mm') self.assertEqual(['MM', 'DD', 'YYYY', 'HH', 'mm'], dateTimeComponentSymbolList) self.assertEqual(['-', '\.'], separatorsList) self.assertEqual(['09', '30', '2017', '02', '00'], dateTimeComponentValueList)
def computeCryptoFiatRate(self, crypto, fiat, dateStr=None): ''' :raise UnsupportedCryptoFiatPairError in case the crypto fiat exchange CSV file does not have the necessary information to compute the crypto/fiat pair rate. :raise AfterNowPriceRequestDateError in case the passed dateStr is after now. @param crypto: @param fiat: @param dateStr: if not None, means that an historical rate must be obtained. Otherwise, a current rate is returned. :return crypto/fiat pair current rate ''' if dateStr is not None: nowDateArrow = DateTimeUtil.localNow(LOCAL_TIME_ZONE) requestDateArrow = DateTimeUtil.dateTimeStringToArrowLocalDate(dateStr, LOCAL_TIME_ZONE, DATE_FORMAT) if DateTimeUtil.isAfter(requestDateArrow, nowDateArrow): raise AfterNowPriceRequestDateError(dateStr) intermediateExchangeRateRequestLst = self._getIntermediateExchangeRateRequests(crypto, fiat) rateRequestNumber = len(intermediateExchangeRateRequestLst) if rateRequestNumber == 1: exchange = intermediateExchangeRateRequestLst[0][2] if exchange == '1': # the case if the crypto/fiat pair is a stablecoin/ coin fiat pair, # like USDC/USD ! return 1 else: resultData = self._getCurrentOrHistoRate(crypto, dateStr, exchange, fiat) if not self._checkIfProblem(resultData): return resultData.getValue(resultData.RESULT_KEY_PRICE) elif rateRequestNumber == 2: crypto = intermediateExchangeRateRequestLst[0][0] unit = intermediateExchangeRateRequestLst[0][1] exchange = intermediateExchangeRateRequestLst[0][2] if exchange == '1': resultData = ResultData() resultData.setValue(resultData.RESULT_KEY_PRICE, 1) else: resultData = self._getCurrentOrHistoRate(crypto, dateStr, exchange, unit) if not self._checkIfProblem(resultData): firstRate = resultData.getValue(resultData.RESULT_KEY_PRICE) crypto = intermediateExchangeRateRequestLst[1][0] fiat = intermediateExchangeRateRequestLst[1][1] exchange = intermediateExchangeRateRequestLst[1][2] resultData = self._getCurrentOrHistoRate(crypto, dateStr, exchange, fiat) if not self._checkIfProblem(resultData): secondRate = resultData.getValue(resultData.RESULT_KEY_PRICE) return firstRate * secondRate raise UnsupportedCryptoFiatPairError(crypto, fiat, self.cryptoFiatCsvFilePathName)
def testDateTimeStringToArrowLocalDate(self): zhArrowDateTimeObj_begOfDay = DateTimeUtil.dateTimeStringToArrowLocalDate( "2017/09/30 02:00:00", 'Europe/Zurich', "YYYY/MM/DD HH:mm:ss") self.assertEqual(1506729600, zhArrowDateTimeObj_begOfDay.timestamp()) self.assertEqual( "2017/09/30 02:00:00 +02:00", zhArrowDateTimeObj_begOfDay.format(US_DATE_TIME_FORMAT_TZ_ARROW))
def testConvertToTimeZoneWinter(self): locDateStr = '2017/11/30 09:00:00' datetimeObjLA = DateTimeUtil.dateTimeStringToArrowLocalDate(locDateStr, 'US/Pacific', US_DATE_TIME_FORMAT_ARROW) self.assertEqual('2017/11/30 09:00:00 -08:00', datetimeObjLA.format(US_DATE_TIME_FORMAT_TZ_ARROW)) datetimeObjZH = DateTimeUtil.convertToTimeZone(datetimeObjLA, 'Europe/Zurich') self.assertEqual('2017/11/30 18:00:00 +01:00', datetimeObjZH.format(US_DATE_TIME_FORMAT_TZ_ARROW)) datetimeObjIN = DateTimeUtil.convertToTimeZone(datetimeObjLA, 'Asia/Calcutta') self.assertEqual('2017/11/30 22:30:00 +05:30', datetimeObjIN.format(US_DATE_TIME_FORMAT_TZ_ARROW))
def test_getHistoDayPriceAtUTCTimeStampMidOfDay(self): crypto = 'BTC' fiat = 'USD' exchange = 'CCCAGG' utcArrowDateTimeObj_midOfDay = DateTimeUtil.dateTimeStringToArrowLocalDate("2017/09/30 12:59:59", 'UTC', "YYYY/MM/DD HH:mm:ss") resultData = ResultData() resultData = self.priceRequester._getHistoDayPriceAtUTCTimeStamp(crypto, fiat, utcArrowDateTimeObj_midOfDay.timestamp, exchange, resultData) self.assertEqual(1506729600, resultData.getValue(resultData.RESULT_KEY_PRICE_TIME_STAMP)) priceArrowUTCDateTime = DateTimeUtil.timeStampToArrowLocalDate(resultData.getValue(resultData.RESULT_KEY_PRICE_TIME_STAMP), 'UTC') self.assertEqual(resultData.getValue(resultData.RESULT_KEY_PRICE_TYPE), resultData.PRICE_TYPE_HISTO_DAY) self.assertEqual('30/09/17', priceArrowUTCDateTime.format(self.configMgr.dateOnlyFormat)) self.assertEqual(4360.62, resultData.getValue(resultData.RESULT_KEY_PRICE))