def setUp(self):
        self.subject = UniqueIndexViolationCheck()

        self.index_query_result = Mock()
        self.index_query_result.getresult.return_value = [
            (9001, 'index1', 'table1', ['index1_column1', 'index1_column2']),
            (9001, 'index2', 'table1', ['index2_column1', 'index2_column2'])
        ]

        self.violated_segments_query_result = Mock()

        self.db_connection = Mock(spec=['query'])
        self.db_connection.query.side_effect = self.mock_query_return_value
class UniqueIndexViolationCheckTestCase(GpTestCase):
    def setUp(self):
        self.subject = UniqueIndexViolationCheck()

        self.index_query_result = Mock()
        self.index_query_result.getresult.return_value = [
            (9001, 'index1', 'table1', ['index1_column1', 'index1_column2']),
            (9001, 'index2', 'table1', ['index2_column1', 'index2_column2'])
        ]

        self.violated_segments_query_result = Mock()

        self.db_connection = Mock(spec=['query'])
        self.db_connection.query.side_effect = self.mock_query_return_value

    def mock_query_return_value(self, query_string):
        if query_string == UniqueIndexViolationCheck.unique_indexes_query:
            return self.index_query_result
        else:
            return self.violated_segments_query_result

    def test_run_check__when_there_are_no_issues(self):
        self.violated_segments_query_result.getresult.return_value = []

        violations = self.subject.runCheck(self.db_connection)

        self.assertEqual(len(violations), 0)

    def test_run_check__when_index_is_violated(self):
        self.violated_segments_query_result.getresult.side_effect = [[(-1, ),
                                                                      (0, ),
                                                                      (1, )],
                                                                     [(-1, )]]

        violations = self.subject.runCheck(self.db_connection)

        self.assertEqual(len(violations), 2)
        self.assertEqual(violations[0]['table_oid'], 9001)
        self.assertEqual(violations[0]['table_name'], 'table1')
        self.assertEqual(violations[0]['index_name'], 'index1')
        self.assertEqual(violations[0]['column_names'],
                         'index1_column1,index1_column2')
        self.assertEqual(violations[0]['violated_segments'], [-1, 0, 1])

        self.assertEqual(violations[1]['table_oid'], 9001)
        self.assertEqual(violations[1]['table_name'], 'table1')
        self.assertEqual(violations[1]['index_name'], 'index2')
        self.assertEqual(violations[1]['column_names'],
                         'index2_column1,index2_column2')
        self.assertEqual(violations[1]['violated_segments'], [-1])
class UniqueIndexViolationCheckTestCase(GpTestCase):
    def setUp(self):
        self.subject = UniqueIndexViolationCheck()

        self.index_query_result = Mock()
        self.index_query_result.getresult.return_value = [
            (9001, 'index1', 'table1', '{index1_column1,index1_column2}'),
            (9001, 'index2', 'table1', '{index2_column1,index2_column2}')
        ]

        self.violated_segments_query_result = Mock()

        self.db_connection = Mock(spec=['query'])
        self.db_connection.query.side_effect = self.mock_query_return_value

    def mock_query_return_value(self, query_string):
        if query_string == UniqueIndexViolationCheck.unique_indexes_query:
            return self.index_query_result
        else:
            return self.violated_segments_query_result

    def test_run_check__when_there_are_no_issues(self):
        self.violated_segments_query_result.getresult.return_value = []

        violations = self.subject.runCheck(self.db_connection)

        self.assertEqual(len(violations), 0)

    def test_run_check__when_index_is_violated(self):
        self.violated_segments_query_result.getresult.side_effect = [
            [(-1,), (0,), (1,)],
            [(-1,)]
        ]

        violations = self.subject.runCheck(self.db_connection)

        self.assertEqual(len(violations), 2)
        self.assertEqual(violations[0]['table_oid'], 9001)
        self.assertEqual(violations[0]['table_name'], 'table1')
        self.assertEqual(violations[0]['index_name'], 'index1')
        self.assertEqual(violations[0]['column_names'], 'index1_column1,index1_column2')
        self.assertEqual(violations[0]['violated_segments'], [-1, 0, 1])

        self.assertEqual(violations[1]['table_oid'], 9001)
        self.assertEqual(violations[1]['table_name'], 'table1')
        self.assertEqual(violations[1]['index_name'], 'index2')
        self.assertEqual(violations[1]['column_names'], 'index2_column1,index2_column2')
        self.assertEqual(violations[1]['violated_segments'], [-1])
    def setUp(self):
        self.subject = UniqueIndexViolationCheck()

        self.index_query_result = Mock()
        self.index_query_result.getresult.return_value = [
            (9001, 'index1', 'table1', '{index1_column1,index1_column2}'),
            (9001, 'index2', 'table1', '{index2_column1,index2_column2}')
        ]

        self.violated_segments_query_result = Mock()

        self.db_connection = Mock(spec=['query'])
        self.db_connection.query.side_effect = self.mock_query_return_value