pact-foundation / pact-jvm

JVM version of Pact. Enables consumer driven contract testing, providing a mock service and DSL for the consumer project, and interaction playback and verification for the service provider project.
https://docs.pact.io
Apache License 2.0
1.08k stars 479 forks source link

ProviderStateParameters - are defaulting to String #1771

Open lushilling opened 7 months ago

lushilling commented 7 months ago

This is still an issue with Pact-JVM too

my consumer tests are written in Pact-JS it logs the value as the correct type pact_matching::json: compare_values: Calling match_values for path $.userId pact_matching::json: JSON -> JSON: Comparing '1' to '1' using Type -> Ok(()) pact_matching::json: compare_values: Comparing 'Number(1)' to 'Number(1)' at path '$.userId' -> Ok(())

Pact file created

"generators": {
          "body": {
            "$.userId": {
              "expression": "${userId}",
              "type": "ProviderState"
            }
          }
        }

Provider written in Java -> logs

2024-02-26 17:12:18,369 DEBUG ll=DEBUG c=a.c.d.p.p.ProviderClient t=main    method: POST
path: /login
    query: {}
    headers: {Accept=[application/json], Content-Type=[application/json]}
    matchers: MatchingRules(rules={body=MatchingRuleCategory(name=body, matchingRules={$.userId=MatchingRuleGroup(rules=[au.com.dius.pact.core.model.matchingrules.TypeMatcher@346330b6], ruleLogic=AND, cascaded=false)}), header=MatchingRuleCategory(name=header, matchingRules={}), path=MatchingRuleCategory(name=path, matchingRules={}), query=MatchingRuleCategory(name=query, matchingRules={})})
    generators: Generators(categories={BODY={$.smUserId=ProviderStateGenerator(expression=${smUserId}, dataType=RAW)}})
    body: PRESENT({"userId":"829152765"})
lushilling commented 7 months ago

Looks like this comment has the same issue https://github.com/pact-foundation/pact-reference/issues/116#issuecomment-867553669

I've found a workaround but its not suitable for all my test cases (I have to hardcode the values on the consumer side, and remove fromProviderState)