Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support matchers and example generators in requests #113

Open
surpher opened this issue Jul 26, 2023 · 0 comments
Open

Support matchers and example generators in requests #113

surpher opened this issue Jul 26, 2023 · 0 comments
Labels
enhancement New feature or request help wanted Extra attention is needed v2.x.x Tasks related to setting up next major version of PactSwift

Comments

@surpher
Copy link
Owner

surpher commented Jul 26, 2023

🗣 Context

Setting expectations for requests should be as strict as possible since we own the code and own the data to verify our system's behaviour - Choosing the right type of matching.

Typically, exact matching is most appropriate for Pact tests on the consumer 
side that are running at the unit test level. The same person is responsible for 
both the expectation and the actual request, so making sure that they match should 
be straightforward.

But sometimes when sending requests, specifically POST requests, sometimes we need to generate a random value and send to the provider. This can be an issue when we want to verify the key is being sent, but we can't guarantee the value to be sent.

📝 Notes

Branch off of https://github.com/surpher/PactSwift/tree/feat/v2.0.0

💬 Narrative

When setting up expectations for requests
I want to be able to use matchers
So that requests don't fail when generated values are being sent

🏗 Design

class SomePactTest: PactTestCase {
class SomePactTest: PactTestCase {

    func testAnInteraction() async throws {
        try builder
            .uponReceiving("A request to create a record")
            .given("A record does not exist")
            .withRequest(method: .POST, path: "/records") { request in
                // #start of feature request
                try request
                    .jsonBody(
                        .like([
                            "identifier": .uuid("b425456a-2450-43ab-86cf-1a8b9d3981c4", .lowerCaseHyphenated),
                            "anotherIdentifier": .randomUUID(), // using an example generator 
                            // https://github.com/pact-foundation/pact-specification/tree/version-3#introduce-example-generators
                            "type": .oneOf(["A", "B", "C"]),
                            "name": .like("some string"),
                            "value": .number(5)
                        ])
                    )   
                // #end         
            }
            .willRespond(with: 201) { resonse in
                try response.jsonBody(
                    .like([
                        "result": .like("ok")
                    ])
                )
            }
    }
}

✅ Acceptance Criteria

GIVEN defining expectations for requests
WHEN matchers and/or example generators are used
THEN they are reflected in the Pact contract
and considered when verifying the interactions (running Pact test) (eg: request doesn't fail if expected uuid doesn't match the sent uuid)

🚫 Out of Scope

N/A

@surpher surpher added enhancement New feature or request help wanted Extra attention is needed labels Jul 26, 2023
@surpher surpher added the v2.x.x Tasks related to setting up next major version of PactSwift label Aug 2, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request help wanted Extra attention is needed v2.x.x Tasks related to setting up next major version of PactSwift
Projects
Development

No branches or pull requests

1 participant