def setUp(self):
     mock_server = Server(utils.MockPGServerConnection())
     db = Database(mock_server, mock_server.maintenance_db_name)
     mock_server._child_objects[
         Database.__name__] = self._as_node_collection([db])
     mock_server._search_path = self._as_node_collection([MYSCHEMA])
     self.schema1 = Schema(mock_server, db, MYSCHEMA)
     self.schema2 = Schema(mock_server, db, MYSCHEMA2)
     db._schemas = self._as_node_collection([self.schema1, self.schema2])
     self.mock_server = mock_server
     self.executor: MetadataExecutor = MetadataExecutor(mock_server)
    def _bg_refresh(self, callbacks, history=None, settings=None):
        settings = settings or {}
        completer: PGCompleter or MySQLCompleter = COMPLETER_MAP[
            self.connection._provider_name](smart_completion=True,
                                            settings=settings)

        self.server.refresh()
        metadata_executor = MetadataExecutor(self.server)

        # If callbacks is a single function then push it into a list.
        if callable(callbacks):
            callbacks = [callbacks]

        try:
            while True:
                for do_refresh in self.refreshers.values():
                    do_refresh(completer, metadata_executor)
                    if self._restart_refresh.is_set():
                        self._restart_refresh.clear()
                        break
                else:
                    # Break out of while loop if the for loop finishes natually
                    # without hitting the break statement.
                    break

                # Start over the refresh from the beginning if the for loop hit the
                # break statement.
                continue

            # Load history into completer so it can learn user preferences
            n_recent = 100
            if history:
                for recent in history[-n_recent:]:
                    completer.extend_query_history(recent, is_init=True)

        except Exception as e:
            if self.logger:
                self.logger.exception('Error during metadata refresh: {0}', e)

        for callback in callbacks:
            callback(completer)

        if self._restart_refresh.is_set():
            self._restart_refresh.clear()
    def test_tables(self):
        # Given 2 tables in the database
        expected_table_tuples = []
        for x in range(0, 3):
            s1_table_name = 's1_t%s' % x
            s2_table_name = 's2_t%s' % x
            expected_table_tuples.append(
                tuple([self.schema1.name, s1_table_name]))
            expected_table_tuples.append(
                tuple([self.schema2.name, s2_table_name]))

        cursor = MockCursor(expected_table_tuples)
        mock_server = Server(utils.MockPGServerConnection(cursor))
        executor: MetadataExecutor = MetadataExecutor(mock_server)
        # When I query tables
        actual_table_tuples = executor.tables()

        # I expect to get 2 tables from the executor
        self.assertEqual(len(expected_table_tuples), len(actual_table_tuples))
        for expected in expected_table_tuples:
            self.assertTrue(expected in actual_table_tuples)