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 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 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]