def setUp(self):
        """
        create two fake CSV files
        """
        self.csv_dir = gettempdir()
        self.symbol_list = ['FakeData1', 'FakeData2']
        self.start_dates = ['2014-05-05 17:30:00', '2014-05-10 17:30:00']
        self.end_dates = ['2014-05-20 17:30:00', '2014-05-15 17:30:00']

        for index, symbol in enumerate(self.symbol_list):
            make_fake_csv(save_to=self.csv_dir,
                          filename=symbol,
                          start_date=self.start_dates[index],
                          end_date=self.end_dates[index],
                          style='consecutive')

        self.event = queue.Queue()
        self.tested_handler = HistoricCSVDataHandler(events=self.event,
                                                     csv_dir=self.csv_dir,
                                                     symbol_list=self.
                                                     symbol_list)
class TestHistoricCSVDataHandler(unittest.TestCase):

    """
    Testing HistoricCSVDataHandler
    """

    def setUp(self):
        """
        create two fake CSV files
        """
        self.csv_dir = gettempdir()
        self.symbol_list = ['FakeData1', 'FakeData2']
        self.start_dates = ['2014-05-05 17:30:00', '2014-05-10 17:30:00']
        self.end_dates = ['2014-05-20 17:30:00', '2014-05-15 17:30:00']

        for index, symbol in enumerate(self.symbol_list):
            make_fake_csv(save_to=self.csv_dir,
                          filename=symbol,
                          start_date=self.start_dates[index],
                          end_date=self.end_dates[index],
                          style='consecutive')

        self.event = queue.Queue()
        self.tested_handler = HistoricCSVDataHandler(events=self.event,
                                                     csv_dir=self.csv_dir,
                                                     symbol_list=self.
                                                     symbol_list)

    def tearDown(self):
        """
        remove the temp files
        """
        for symbol in self.symbol_list:
            filename = os.path.join(self.csv_dir, (symbol + '.csv'))
            try:
                # if error there is no file, if no file how the test run?
                os.remove(filename)
            except OSError:
                pass

    def test_get_latest_bar_not_initialized(self):
        """
        get_latest_bar Raise KeyError if latest_symbol_data not initialized.
        """
        with self.assertRaises(KeyError):
            self.tested_handler.get_latest_bar(self.symbol_list[0])

    def test_get_latest_bar_not_symbol(self):
        """
        get_latest_bar Raise KeyError if symbol not in database
        """
        with self.assertRaises(KeyError):
            self.tested_handler.get_latest_bar('ErrorSymbol')

    def test_get_latest_bar_correct_value(self):
        """
        get_latest_bar normal case multiple calls
        """
        for row in range(15):
            self.tested_handler.update_bars()
            result = self.tested_handler.get_latest_bar(self.symbol_list[0])
            self.assertEqual(row, result[1][0],
                             'normal case error, col=0')
            self.assertEqual(row + 0.2, result[1][2],
                             'normal case error, col=2')

    def test_get_latest_bars_not_initialized(self):
        """
        get_latest_bars Raise KeyError if latest_symbol_data not initialized.
        """
        bars = 2
        with self.assertRaises(KeyError):
            self.tested_handler.get_latest_bars(self.symbol_list[0], bars)

    def test_get_latest_bars_not_symbol(self):
        """
        get_latest_bars Raise KeyError if symbol not in database
        """
        bars = 2
        with self.assertRaises(KeyError):
            self.tested_handler.get_latest_bars('ErrorSymbol', bars)

    def test_get_latest_bars_correct_value(self):
        """
        get_latest_bars normal case
        """
        bars = 3
        for dummy in range(bars):
            self.tested_handler.update_bars()

        tmp = self.tested_handler.get_latest_bars('FakeData1', bars)

        expected = [0.0, 1.0, 2.0]
        result = [tmp[0][1][0], tmp[1][1][0], tmp[2][1][0]]
        self.assertListEqual(expected, result)

        expected = [0.2, 1.2, 2.2]
        tmp = [tmp[0][1][2], tmp[1][1][2], tmp[2][1][2]]
        self.assertListEqual(expected, tmp)

    def test_get_latest_bar_datetime_not_initialized(self):
        """
        get_latest_bar_datetime not_initialized
        """
        with self.assertRaises(KeyError):
            self.tested_handler.get_latest_bar_datetime(self.symbol_list[1])

    def test_get_latest_bar_datetime_not_symbol(self):
        """
        get_latest_bar_datetime if symbol not in database
        """
        with self.assertRaises(KeyError):
            self.tested_handler.get_latest_bar_datetime('ErrorSymbol')

    def test_get_latest_bar_datetime_correct_values(self):
        """
        get_latest_bar_datetime normal case
        """
        symbol = self.symbol_list[1]

        self.tested_handler.update_bars()
        result = self.tested_handler.get_latest_bar_datetime(symbol)
        expected = datetime.datetime.strptime(self.start_dates[0],
                                              "%Y-%m-%d %H:%M:%S")
        self.assertEqual(result, expected, 'error in date times, beginning')

        for dummy in range(15):
            self.tested_handler.update_bars()

        result = self.tested_handler.get_latest_bar_datetime(symbol)
        expected = datetime.datetime.strptime(self.end_dates[0],
                                              "%Y-%m-%d %H:%M:%S")
        self.assertEqual(result, expected, 'error in date times, ending')

    def test_get_latest_bar_value_not_initialized(self):
        """
        get_latest_bar_value _not_initialized
        """
        with self.assertRaises(KeyError):
            self.tested_handler.get_latest_bar_value(
                self.symbol_list[1], 'open')

    def test_get_latest_bar_value_not_symbol(self):
        """
        get_latest_bar_value not_symbol
        """
        with self.assertRaises(KeyError):
            self.tested_handler.get_latest_bar_value('ErrorSymbol', 'open')

    def test_get_latest_bar_value_not_value(self):
        """
        get_latest_bar_value not correct field value
        """
        with self.assertRaises(KeyError):
            self.tested_handler.get_latest_bar_value(self.symbol_list[0],
                                                     'ErrorField')

    def test_get_latest_bar_value_correct_value(self):
        """
        get_latest_bar_value normal case
        """
        self.tested_handler.update_bars()

        symbol = self.symbol_list[0]

        field = 'open'
        result = self.tested_handler.get_latest_bar_value(symbol, field)
        self.assertEqual(0.0, result, 'error in normal case')

        field = 'adj_close'
        result = self.tested_handler.get_latest_bar_value(symbol, field)
        self.assertEqual(0.5, result, 'error in normal case')

    def test_get_latest_bars_values_not_initialized(self):
        """
        get_latest_bars_values not_initialized
        """
        with self.assertRaises(KeyError):
            self.tested_handler.get_latest_bars_values(self.symbol_list[1],
                                                       'open', 3)

    def test_get_latest_bars_values_not_symbol(self):
        """
        get_latest_bars_values not_symbol
        """
        with self.assertRaises(KeyError):
            self.tested_handler.get_latest_bars_values('ErrorSymbol',
                                                       'high', 3)

    def test_get_latest_bars_values_not_value(self):
        """
        get_latest_bars_values not correct field value
        """
        with self.assertRaises(KeyError):
            self.tested_handler.get_latest_bars_values(self.symbol_list[0],
                                                       'ErrorField', 5)

    def test_get_latest_bars_values_correct_value(self):
        """
        get_latest_bars_values normal case
        """

        symbol = self.symbol_list[0]
        lag1 = 5
        for dummy in range(lag1):
            self.tested_handler.update_bars()

        expected = list([0.3, 1.3, 2.3, 3.3, 4.3])

        field = 'close'
        result = self.tested_handler.get_latest_bars_values(
            symbol, field, lag1)
        np.testing.assert_allclose(result, expected,
                                   err_msg='error in normal case', verbose=True)

    def test_update_bars_event_queue(self):
        """
        update_bars event in queue
        """
        self.tested_handler.update_bars()
        result = self.event.get().type
        self.assertEqual(result, 'MARKET', 'error in event queue')

    def test_update_bars_stop_iteration(self):
        """
        update_bars stop iteration
        """
        for dummy in range(16):
            self.tested_handler.update_bars()

        self.assertTrue(self.tested_handler.continue_backtest,
                        'error stop iteration')

        self.tested_handler.update_bars()

        self.assertFalse(self.tested_handler.continue_backtest,
                         'error stop iteration')