Source code for pact_testgen.models

from enum import Enum
from typing import Any, Dict, List, Optional

from pydantic import BaseModel, Extra, conint, Field, validator

try:
    from typing import Literal
except ImportError:
    from typing_extensions import Literal


[docs]class Pacticipant(BaseModel): name: str
[docs]class Matcher(BaseModel): match: Literal["equality", "regex", "type"] max: Optional[int] min: Optional[int] regex: Optional[str]
[docs]class MatchingBodyRule(BaseModel): matchers: List[Matcher]
[docs]class MatchingRule(BaseModel): body: Dict[str, MatchingBodyRule]
[docs]class ProviderState(BaseModel): name: str params: Optional[Dict]
[docs] def full_name(self): if not self.params: return self.name return f"{self.name} {self._stringify_params()}"
def _stringify_params(self): param_strings = [f"{k} {v}" for k, v in self.params.items()] return " ".join(param_strings)
[docs]class Headers(BaseModel): pass
[docs] class Config: extra = Extra.allow
[docs]class Method(Enum): CONNECT = "CONNECT" DELETE = "DELETE" GET = "GET" HEAD = "HEAD" OPTIONS = "OPTIONS" PATCH = "PATCH" POST = "POST" PUT = "PUT" TRACE = "TRACE"
[docs]class PactRequest(BaseModel): body: Optional[Any] headers: Optional[Headers] method: Method path: str query: Optional[Dict[str, List[str]]]
[docs] @validator("method", pre=True) def validate_method(cls, v): return v.upper()
[docs]class PactResponse(BaseModel): body: Optional[Any] headers: Optional[Headers] matchingRules: Optional[MatchingRule] status: conint(ge=100, le=599)
[docs]class Interaction(BaseModel): description: str providerStates: Optional[List[ProviderState]] request: PactRequest response: PactResponse
[docs]class PactSpecification(BaseModel): version: str
[docs]class Metadata(BaseModel): pactSpecification: Optional[PactSpecification]
[docs]class Pact(BaseModel): consumer: Pacticipant interactions: List[Interaction] metadata: Optional[Metadata] provider: Pacticipant @property def version(self): if self.metadata is None or self.metadata.pactSpecification is None: return "2.0.0" return self.metadata.pactSpecification.version
# Input to template function
[docs]class RequestArgs(BaseModel): method: str path: str data: Optional[Dict] query_params: Optional[Dict] content_type: str = "application/json"
[docs]class TestMethodArgs(BaseModel): description: str = Field( ..., description="Unformatted name of test method to generate" ) expectation: str = Field( ..., description="String representation of pact expectation dictionary" ) request: RequestArgs
[docs]class TestCase(BaseModel): provider_state_names: List[str] test_methods: List[TestMethodArgs] @property def combined_provider_state_names(self) -> str: return " ".join(self.provider_state_names) @property def requires_provider_state(self) -> bool: return bool(self.provider_state_names)
[docs]class TestFile(BaseModel): pact_version: str base_class: str consumer: Pacticipant import_path: str provider: Pacticipant test_cases: List[TestCase]