Jayesh Guru
10/14/2022, 7:56 PMfrom pact import Verifier
PACT_BROKER_URL = "<http://pactbroker.service.xxx.xxx.xxx.com/>"
# I am spinning up our provider service(my-service) in docker-compose on 5002 port
PROVIDER_HOST = "my-service"
PROVIDER_PORT = 5002
PROVIDER_URL = f"http://{PROVIDER_HOST}:{PROVIDER_PORT}"
@pytest.fixture
def broker_opts():
return {
"broker_url": PACT_BROKER_URL,
"publish_version": "3",
"publish_verification_results": False,
}
def test_service_provider_against_broker(broker_opts):
headers=["Authorization: Bearer my_jwt_token"]
headers.append("Content-Type:application/json")
verifier = Verifier(provider="my_provider_python_service", provider_base_url=PROVIDER_URL)
success, logs = verifier.verify_with_broker(
**broker_opts,
verbose=True,
provider_states_setup_url=f"{PROVIDER_URL}/my_path",
enable_pending=False,
headers=headers
)
assert success == 0
Jayesh Guru
10/17/2022, 12:54 PMMatt (pactflow.io / pact-js / pact-go)
but not able to get the request body from pactwhat do you mean by this? The request body comes from your provider, not Pact. Pact checks the response from your provider is correct
Matt (pactflow.io / pact-js / pact-go)
Matt (pactflow.io / pact-js / pact-go)
Matt (pactflow.io / pact-js / pact-go)
Jayesh Guru
10/18/2022, 1:36 AMGiven metadata, upon receiving return created metadata object id from myconsumer-service, with
{
"method": "post",
"path": "/metadata/",
"headers": {
"Authorization": "Bearer token",
"content-type": "application/json"
},
"body": {
"datasource_id": 11111,
"metadata": {
"schema_id": 3,
"schema_tags": [
{
"schema_tag_id": 2,
"schema_tag_values": [
"1"
]
}
]
}
}
}
myprovider-service will respond with:
{
"status": 200,
"body": {
"metadata_object_id": 222222222,
"version_id": 1,
"validation_errors": {
"hard": {
},
"soft": {
}
}
}
}
Jayesh Guru
10/18/2022, 1:36 AMJayesh Guru
10/18/2022, 1:36 AMMatt (pactflow.io / pact-js / pact-go)
Jayesh Guru
10/18/2022, 1:39 AM4) Verifying a pact between myconsumer-service and myprovider-service Given metadata return created metadata object id with POST /metadata/ returns a response which has a matching body
Failure/Error: set_up_provider_states interaction.provider_states, options[:consumer]
Pact::ProviderVerifier::SetUpProviderStateError:
Error setting up provider state 'metadata' for consumer 'myconsumer-service' at <http://mats-service:5002/metadata/>. response status=400 response body={"title":"Client Input Validation Error","message":[{"loc":["body","datasource_id"],"msg":"field required","type":"value_error.missing"},{"loc":["body","metadata"],"msg":"field required","type":"value_error.missing"},{"loc":["body","consumer"],"msg":"extra fields not permitted","type":"value_error.extra"},{"loc":["body","params"],"msg":"extra fields not permitted","type":"value_error.extra"},{"loc":["body","state"],"msg":"extra fields not permitted","type":"value_error.extra"},{"loc":["body","states"],"msg":"extra fields not permitted","type":"value_error.extra"}],"mats_error_code":2000}
2 interactions, 2 failures
Jayesh Guru
10/18/2022, 1:39 AMJayesh Guru
10/18/2022, 1:40 AMJayesh Guru
10/18/2022, 1:40 AMMatt (pactflow.io / pact-js / pact-go)
200
Matt (pactflow.io / pact-js / pact-go)
Matt (pactflow.io / pact-js / pact-go)
Jayesh Guru
10/18/2022, 2:18 PM@pact_router.post("/_pact/provider_states")
async def provider_states(provider_state: ProviderState):
mapping = {
"metadata": {},
"get schema tag enums": {},
}
return {"result": mapping[provider_state.state]}
Matt (pactflow.io / pact-js / pact-go)
Matt (pactflow.io / pact-js / pact-go)
Matt (pactflow.io / pact-js / pact-go)
Jayesh Guru
10/27/2022, 6:10 PMJayesh Guru
10/27/2022, 6:16 PMJayesh Guru
10/27/2022, 6:17 PMMatt (pactflow.io / pact-js / pact-go)
Matt (pactflow.io / pact-js / pact-go)
Jayesh Guru
10/30/2022, 3:44 PMJayesh Guru
10/30/2022, 3:47 PMJayesh Guru
10/30/2022, 3:47 PMJayesh Guru
11/04/2022, 1:37 AMfrom fastapi.testclient import TestClient
, but pact verifier needs a provider base url which we cannot pass if we are using Test ClientMatt (pactflow.io / pact-js / pact-go)
we have buildkite pipelines for test, lint, build and deploy, so all our unit tests, contract tests, integration tests run in pipeline. That’s why we run it in docker container (edited)I’m not saying don’t run them in a docker container, I’m suggesting you don’t run the provider tests against a docker container (that doesn’t have stubbed dependencies).
Matt (pactflow.io / pact-js / pact-go)
for unit tests we use Python TestClientI understand. The verification isn’t a unit test, but you try your best to think of it as one - this includes being able to stub dependencies in a granular fashion, so that your pact tests are easy to manage and run., but pact verifier needs a provider base url which we cannot pass if we are using Test Clientfrom fastapi.testclient import TestClient