import logging
from enum import Enum
from pathlib import Path
from typing import Optional
from q2_cores.query_helpers import JinjaBasedQuery
from q2_sdk.hq.models.online_user import OnlineUser
from q2_sdk.models.cores.queries.base_query import BaseQuery
[docs]
class SearchMethod(Enum):
"""
Class designed to determine the search method to use when retrieving demographic information from the core
"""
DEMOGRAPHIC_INFO = "DEMOGRAPHIC_INFO"
ACCOUNT_RELATION = "ACCOUNT_RELATION"
[docs]
class DemographicInfoQuery(BaseQuery):
"""Base query for Fiserv Cleartouch"""
def __init__(
self,
logger: logging.Logger,
request_dict: dict,
search_method=SearchMethod.DEMOGRAPHIC_INFO,
configs=None,
online_user: Optional[OnlineUser] = None,
):
self.demographic_info_query = JinjaBasedQuery
self.request_dict: dict = request_dict
self.search_method = search_method
self.configs = configs
self.online_user = online_user
super().__init__(logger)
[docs]
def build(self) -> str:
"""Creates the query"""
path = Path(__file__).parent
template_name = self.search_method.value.lower()
request_template = f"{template_name}_request.xml"
mock_path = path / "mock_responses"
mock_response_template = f"{template_name}_mock_response.xml"
self.demographic_info_query = JinjaBasedQuery(
logger=self.logger,
templates_path=Path(__file__).parent / "templates",
request_template=request_template,
mock_response_template=mock_response_template,
context=self.request_dict,
mock_path=mock_path,
)
self.logger.info(f"Created a {template_name} call with {request_template}")
request = self.demographic_info_query.build()
return request
[docs]
def mock_response(self, response_type: str = None) -> str:
"""
Constructs and returns a mock core response used for testing queries and mappers.
By default, mock response will return a successful cif core response. However, this can
be changed to handle various responses via the response_type param.
The response_type refers to the <expected_response>_mock_response.xml file located in
q2_core.FiservCleartouch.mock_responses directory. ``response_type`` defaults
to ``demographic_info`` if not provided.
"""
if response_type:
self.demographic_info_query.mock_response_template = (
f"{response_type}_mock_response.xml"
)
return self.demographic_info_query.mock_response()