class FinancialDataRangesCacheTestCase(unittest.TestCase):
    def setUp(self):
        self.mock_data_getter = mock.Mock()
        self.mock_db = mock.Mock()
        self.date_range_cache = FinancialIntervalCache(get_data=self.mock_data_getter,
                                                         database=self.mock_db)
        
    def test_get_cache_hit(self):
        symbol = 'ABC'
        date = datetime.datetime(2012, 12, 1)
        value = 100.
        self.mock_db.get.return_value = value
        cache_value = self.date_range_cache.get(symbol=symbol, dates=[date]).next()
        self.assertEqual(cache_value, value)

        
    def test_cache_miss(self):
        symbol = 'ABC'
        date = datetime.datetime(2012, 12, 1)
        self.mock_db.get.return_value = None
        mock_get_set = mock.Mock()
        self.date_range_cache._get_set = mock_get_set
        self.mock_db.get.return_value = None
        self.date_range_cache.get(symbol=symbol, dates=[date]).next()
        mock_get_set.assert_called_once_with(symbol=symbol, date=date)
        
    def test_no_data_exception(self):
        symbol = 'XYZ'
        start_date, end_date = datetime.datetime(2012, 9, 1, tzinfo=pytz.UTC), datetime.datetime(2012, 12, 1, tzinfo=pytz.UTC)
        mock_getter = mock.Mock()
        mock_getter.side_effect = NoDataForStockForRange(start=start_date,
                                                         end=end_date)
        self.date_range_cache._get_data = mock_getter
        mock_database = mock.Mock()
        self.date_range_cache._database = mock_database
        value = self.date_range_cache._get_set(symbol=symbol, date=None) 
        self.assertTrue(np.isnan(value))
        mock_database.set_interval.assert_called_with(symbol=symbol,
                                                      start=start_date,
                                                      end=end_date,
                                                      value='NaN')