-
Notifications
You must be signed in to change notification settings - Fork 137
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chore: add https methods; updated v2 examples
- Loading branch information
Showing
10 changed files
with
825 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -24,18 +24,28 @@ | |
from yarl import URL | ||
|
||
from examples.src.consumer import User, UserConsumer | ||
from pact import Consumer, Format, Like, Provider | ||
from pact import Consumer, Format, Like, Provider # type: ignore[attr-defined] | ||
|
||
if TYPE_CHECKING: | ||
from pathlib import Path | ||
|
||
from pact.pact import Pact | ||
from pact.pact import Pact # type: ignore[import-untyped] | ||
|
||
log = logging.getLogger(__name__) | ||
logger = logging.getLogger(__name__) | ||
|
||
MOCK_URL = URL("http://localhost:8080") | ||
|
||
|
||
@pytest.fixture(scope="session", autouse=True) | ||
def _setup_pact_logging() -> None: | ||
""" | ||
Set up logging for the pact package. | ||
""" | ||
from pact.v3 import ffi | ||
|
||
ffi.log_to_stderr("INFO") | ||
|
||
|
||
@pytest.fixture | ||
def user_consumer() -> UserConsumer: | ||
""" | ||
|
@@ -78,7 +88,7 @@ def pact(broker: URL, pact_dir: Path) -> Generator[Pact, Any, None]: | |
pact = consumer.has_pact_with( | ||
Provider("UserProvider"), | ||
pact_dir=pact_dir, | ||
publish_to_broker=True, | ||
publish_to_broker=False, | ||
# Mock service configuration | ||
host_name=MOCK_URL.host, | ||
port=MOCK_URL.port, | ||
|
@@ -142,3 +152,66 @@ def test_get_unknown_user(pact: Pact, user_consumer: UserConsumer) -> None: | |
assert excinfo.value.response is not None | ||
assert excinfo.value.response.status_code == HTTPStatus.NOT_FOUND | ||
pact.verify() | ||
|
||
|
||
def test_post_request_to_create_user(pact: Pact, user_consumer: UserConsumer) -> None: | ||
""" | ||
Test the POST request for creating a new user. | ||
This test defines the expected interaction for a POST request to create | ||
a new user. It sets up the expected request and response from the provider, | ||
including the request body and headers, and verifies that the response | ||
status code is 200 and the response body matches the expected user data. | ||
""" | ||
expected: Dict[str, Any] = { | ||
"id": 124, | ||
"name": "Jane Doe", | ||
"email": "[email protected]", | ||
"created_on": Format().iso_8601_datetime(), | ||
} | ||
header = {"Content-Type": "application/json"} | ||
payload = { | ||
"name": "Jane Doe", | ||
"email": "[email protected]", | ||
"created_on": "1991-02-20T06:35:26+00:00", | ||
} | ||
expected_response_code: int = 200 | ||
|
||
( | ||
pact.given("create user 124") | ||
.upon_receiving("A request to create a new user") | ||
.with_request(method="POST", path="/users/", headers=header, body=payload) | ||
.will_respond_with(status=200, headers=header, body=Like(expected)) | ||
) | ||
|
||
with pact: | ||
response = user_consumer.create_user(user=payload, header=header) | ||
assert response[0] == expected_response_code | ||
assert response[1].id == 124 | ||
assert response[1].name == "Jane Doe" | ||
|
||
pact.verify() | ||
|
||
|
||
def test_delete_request_to_delete_user(pact: Pact, user_consumer: UserConsumer) -> None: | ||
""" | ||
Test the DELETE request for deleting a user. | ||
This test defines the expected interaction for a DELETE request to delete | ||
a user. It sets up the expected request and response from the provider, | ||
including the request body and headers, and verifies that the response | ||
status code is 200 and the response body matches the expected user data. | ||
""" | ||
expected_response_code: int = 204 | ||
( | ||
pact.given("delete the user 124") | ||
.upon_receiving("a request for deleting user") | ||
.with_request(method="DELETE", path="/users/124") | ||
.will_respond_with(204) | ||
) | ||
|
||
with pact: | ||
response_status_code = user_consumer.delete_user(124) | ||
assert response_status_code == expected_response_code | ||
|
||
pact.verify() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -35,7 +35,7 @@ | |
from yarl import URL | ||
|
||
from examples.src.fastapi import app | ||
from pact import Verifier | ||
from pact import Verifier # type: ignore[import-untyped] | ||
|
||
PROVIDER_URL = URL("http://localhost:8080") | ||
|
||
|
@@ -68,6 +68,8 @@ async def mock_pact_provider_states( | |
mapping = { | ||
"user 123 doesn't exist": mock_user_123_doesnt_exist, | ||
"user 123 exists": mock_user_123_exists, | ||
"create user 124": mock_post_request_to_create_user, | ||
"delete the user 124": mock_delete_request_to_delete_user, | ||
} | ||
return {"result": mapping[state.state]()} | ||
|
||
|
@@ -134,6 +136,61 @@ def mock_user_123_exists() -> None: | |
} | ||
|
||
|
||
def mock_post_request_to_create_user() -> None: | ||
""" | ||
Mock the database for the post request to create a user. | ||
""" | ||
import examples.src.fastapi | ||
|
||
examples.src.fastapi.FAKE_DB = MagicMock() | ||
examples.src.fastapi.FAKE_DB.__len__.return_value = 124 | ||
examples.src.fastapi.FAKE_DB.__setitem__.return_value = None | ||
examples.src.fastapi.FAKE_DB.__getitem__.return_value = { | ||
"id": 124, | ||
"created_on": "1991-02-20T06:35:26+00:00", | ||
"email": "[email protected]", | ||
"name": "Jane Doe", | ||
"ip_address": "10.1.2.3", | ||
"hobbies": ["hiking", "swimming"], | ||
"admin": False, | ||
} | ||
|
||
|
||
def mock_delete_request_to_delete_user() -> None: | ||
""" | ||
Mock the database for the delete request to delete a user. | ||
""" | ||
import examples.src.fastapi | ||
|
||
db_values = { | ||
123: { | ||
"id": 123, | ||
"name": "Verna Hampton", | ||
"email": "[email protected]", | ||
"created_on": "1991-02-20T06:35:26+00:00", | ||
"ip_address": "10.1.2.3", | ||
"hobbies": ["hiking", "swimming"], | ||
"admin": False, | ||
}, | ||
124: { | ||
"id": 124, | ||
"name": "Jane Doe", | ||
"email": "[email protected]", | ||
"created_on": "1991-02-20T06:35:26+00:00", | ||
"ip_address": "10.1.2.5", | ||
"hobbies": ["running", "dancing"], | ||
"admin": False, | ||
}, | ||
} | ||
|
||
examples.src.fastapi.FAKE_DB = MagicMock() | ||
examples.src.fastapi.FAKE_DB.__delitem__.side_effect = ( | ||
lambda key: db_values.__delitem__(key) | ||
) | ||
examples.src.fastapi.FAKE_DB.__getitem__.side_effect = lambda key: db_values[key] | ||
examples.src.fastapi.FAKE_DB.__contains__.side_effect = lambda key: key in db_values | ||
|
||
|
||
def test_against_broker(broker: URL, verifier: Verifier) -> None: | ||
""" | ||
Test the provider against the broker. | ||
|
Oops, something went wrong.