Skip to content

Commit

Permalink
[Implemnt] Mock Adapter and ConnectionManager
Browse files Browse the repository at this point in the history
Signed-off-by: Kent Huang <[email protected]>
  • Loading branch information
kentwelcome committed Sep 6, 2023
1 parent 8f7629f commit 162cbbb
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 4 deletions.
20 changes: 18 additions & 2 deletions dbt/adapters/piperider/connections.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
from contextlib import contextmanager
from dataclasses import dataclass
from typing import Tuple, List

import agate
import dbt.exceptions # noqa
from dbt.adapters.base import Credentials
from dbt.adapters.sql import SQLConnectionManager
from dbt.contracts.connection import AdapterResponse

from dbt.adapters.base import BaseConnectionManager as connection_cls

# from dbt.logger import GLOBAL_LOGGER as logger

Expand Down Expand Up @@ -46,7 +50,19 @@ def _connection_keys(self):
return ()


class PipeRiderAdapterConnectionManager(connection_cls):
class PipeRiderAdapterConnectionManager(SQLConnectionManager):
def cancel_open(self) -> List[str]:
return super().cancel_open()

def execute(self, sql: str, auto_begin: bool = False, fetch: bool = False) -> Tuple[AdapterResponse, agate.Table]:
return super().execute(sql, auto_begin, fetch)

def begin(self):
super().begin()

def commit(self):
super().commit()

TYPE = "piperider"

@contextmanager
Expand Down
81 changes: 79 additions & 2 deletions dbt/adapters/piperider/impl.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,86 @@
from dbt.adapters.base import BaseAdapter as adapter_cls
from contextlib import contextmanager
from unittest import mock

from dbt.adapters.base import BaseAdapter

from dbt.adapters.piperider import PipeRiderAdapterConnectionManager


class PipeRiderAdapter(adapter_cls):
class MockAdapter(BaseAdapter):
ConnectionManager = mock.MagicMock(TYPE="mock")
responder = mock.MagicMock()
# some convenient defaults
responder.quote.side_effect = lambda identifier: '"{}"'.format(identifier)
responder.date_function.side_effect = lambda: "unitdate()"
responder.is_cancelable.side_effect = lambda: False

@contextmanager
def exception_handler(self, *args, **kwargs):
self.responder.exception_handler(*args, **kwargs)
yield

def execute(self, *args, **kwargs):
return self.responder.execute(*args, **kwargs)

def drop_relation(self, *args, **kwargs):
return self.responder.drop_relation(*args, **kwargs)

def truncate_relation(self, *args, **kwargs):
return self.responder.truncate_relation(*args, **kwargs)

def rename_relation(self, *args, **kwargs):
return self.responder.rename_relation(*args, **kwargs)

def get_columns_in_relation(self, *args, **kwargs):
return self.responder.get_columns_in_relation(*args, **kwargs)

def expand_column_types(self, *args, **kwargs):
return self.responder.expand_column_types(*args, **kwargs)

def list_relations_without_caching(self, *args, **kwargs):
return self.responder.list_relations_without_caching(*args, **kwargs)

def create_schema(self, *args, **kwargs):
return self.responder.create_schema(*args, **kwargs)

def drop_schema(self, *args, **kwargs):
return self.responder.drop_schema(*args, **kwargs)

@classmethod
def quote(cls, identifier):
return cls.responder.quote(identifier)

def convert_text_type(self, *args, **kwargs):
return self.responder.convert_text_type(*args, **kwargs)

def convert_number_type(self, *args, **kwargs):
return self.responder.convert_number_type(*args, **kwargs)

def convert_boolean_type(self, *args, **kwargs):
return self.responder.convert_boolean_type(*args, **kwargs)

def convert_datetime_type(self, *args, **kwargs):
return self.responder.convert_datetime_type(*args, **kwargs)

def convert_date_type(self, *args, **kwargs):
return self.responder.convert_date_type(*args, **kwargs)

def convert_time_type(self, *args, **kwargs):
return self.responder.convert_time_type(*args, **kwargs)

def list_schemas(self, *args, **kwargs):
return self.responder.list_schemas(*args, **kwargs)

@classmethod
def date_function(cls):
return cls.responder.date_function()

@classmethod
def is_cancelable(cls):
return cls.responder.is_cancelable()


class PipeRiderAdapter(MockAdapter):
"""
Controls actual implmentation of adapter, and ability to override certain methods.
"""
Expand Down

0 comments on commit 162cbbb

Please sign in to comment.