class TestCollectTask(TestCase):

    def __init__(self, methodName='runTest'):
        super(TestCollectTask, self).__init__(methodName)
        self._mox = None
        self._logger = None,
        self._query_executer = None
        self._process_task = None
        self._collect_task = None
        self._query_list = ['q1', 'q2']
        self._intermediate_data_list = [[('c1', 'd1', 'sd1'), ('c2', 'd2', 'sd2')], [('c1', 'd3', 'sd3')]]
        self._data_item_list = [DataItem('cat.c1', 'd1:sd1'), DataItem('cat.c2', 'd2:sd2'), DataItem('cat.c3', 'd3:sd3')]

    def setUp(self):
        self._mox = Mox()
        self._logger = self._mox.CreateMock(Logger)
        self._process_task = self._mox.CreateMock(ProcessTask)
        self._query_executer = self._mox.CreateMockAnything()
        self._collect_task = CollectTask(self._query_list, self._process_task)

    def test_normal_life_cycle(self):
        self._set_collect_data_expectations()
        self._set_process_data_expectations()
        self._mox.ReplayAll()
        self.assertFalse(self._collect_task.contains_data())
        self._collect_task.collect_data(self._query_executer, self._logger)
        self.assertTrue(self._collect_task.contains_data())
        self._collect_task.process_data(self._logger)
        self.assertFalse(self._collect_task.contains_data())
        self._mox.VerifyAll()

    def test_exception_when_collect_data(self):
        self._logger.info('collect_data(query_executer) enter')
        self._logger.info('_collect_data_item({0:s}) enter'.format(self._query_list[0]))
        self._query_executer(self._query_list[0]).AndReturn(self._intermediate_data_list[0])
        self._logger.info('_collect_data_item({0:s}) exit'.format(self._query_list[0]))
        self._logger.info('_collect_data_item({0:s}) enter'.format(self._query_list[1]))
        self._query_executer(self._query_list[1]).AndRaise(CustomTestException())
        self._logger.exception('exception in _collect_data_item({0:s})'.format(self._query_list[1]))
        self._logger.exception('exception in collect_data(query_executer)')
        self._mox.ReplayAll()
        self.assertFalse(self._collect_task.contains_data())
        self.assertRaises(CustomTestException, lambda: self._collect_task.collect_data(self._query_executer, self._logger))
        self.assertFalse(self._collect_task.contains_data())
        self._mox.VerifyAll()

    def test_exception_when_process_data(self):
        self._set_collect_data_expectations()
        self._logger.info('process_data() enter')
        self._process_task.process(self._intermediate_data_list).AndRaise(CustomTestException())
        self._logger.exception('exception in process_data()')
        self._mox.ReplayAll()
        self.assertFalse(self._collect_task.contains_data())
        self._collect_task.collect_data(self._query_executer, self._logger)
        self.assertTrue(self._collect_task.contains_data())
        self.assertRaises(CustomTestException, lambda: self._collect_task.process_data(self._logger))
        self.assertFalse(self._collect_task.contains_data())
        self._mox.VerifyAll()

    def _set_collect_data_expectations(self):
        self._logger.info('collect_data(query_executer) enter')
        index = 0
        while index < len(self._query_list):
            self._logger.info('_collect_data_item({0:s}) enter'.format(self._query_list[index]))
            self._query_executer(self._query_list[index]).AndReturn(self._intermediate_data_list[index])
            self._logger.info('_collect_data_item({0:s}) exit'.format(self._query_list[index]))
            index += 1
        self._logger.info('collect_data(query_executer) exit')

    def _set_process_data_expectations(self):
        self._logger.info('process_data() enter')
        self._process_task.process(self._intermediate_data_list).AndReturn(self._data_item_list)
        self._logger.info('process_data() exit')
 def setUp(self):
     self._mox = Mox()
     self._logger = self._mox.CreateMock(Logger)
     self._process_task = self._mox.CreateMock(ProcessTask)
     self._query_executer = self._mox.CreateMockAnything()
     self._collect_task = CollectTask(self._query_list, self._process_task)