pact-foundation / pact-provider-verifier

Cross-platform, generic language, Pact provider verification tool
http://pact.io
MIT License
32 stars 24 forks source link

Exception with verifier #74

Closed NicolasAgra closed 1 year ago

NicolasAgra commented 2 years ago

Hello Folks, I am running into this problem when trying to perform an execution with pact verifier. The input consumer-provider.json was created by pact-python.

pact-verifier --provider-base-url=http://localhost:8888 --pact-url=./consumer-provider.json
/home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/provider/rspec.rb:198:in `description_for': undefined method `capitalize' for nil:NilClass (NoMethodError)
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/provider/rspec.rb:202:in `interaction_description_for_rerun_command'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/provider/rspec.rb:91:in `describe_interaction'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/provider/rspec.rb:75:in `describe_interaction_with_provider_state'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/provider/rspec.rb:57:in `block in describe_consumer_contract'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/provider/rspec.rb:56:in `each'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/provider/rspec.rb:56:in `describe_consumer_contract'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/provider/rspec.rb:44:in `honour_consumer_contract'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/provider/rspec.rb:33:in `block in honour_pactfile'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/rspec-core-3.10.1/lib/rspec/core/example_group.rb:398:in `module_exec'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/rspec-core-3.10.1/lib/rspec/core/example_group.rb:398:in `subclass'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/rspec-core-3.10.1/lib/rspec/core/example_group.rb:271:in `block in define_example_group_method'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/rspec-core-3.10.1/lib/rspec/core/dsl.rb:43:in `block in expose_example_group_alias'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/provider/rspec.rb:32:in `honour_pactfile'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/provider/pact_spec_runner.rb:133:in `block in initialize_specs'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/provider/pact_spec_runner.rb:127:in `each'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/provider/pact_spec_runner.rb:127:in `initialize_specs'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/provider/pact_spec_runner.rb:34:in `run'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/cli/run_pact_verification.rb:70:in `run_with_pact_uri_object'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/cli/run_pact_verification.rb:51:in `run_specs'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/cli/run_pact_verification.rb:21:in `call'
    from /home/...venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-1.60.0/lib/pact/cli/run_pact_verification.rb:13:in `call'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-provider-verifier-1.36.0/lib/pact/provider_verifier/app.rb:178:in `verify_pact'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-provider-verifier-1.36.0/lib/pact/provider_verifier/app.rb:51:in `block in pacts_pass_verification?'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-provider-verifier-1.36.0/lib/pact/provider_verifier/app.rb:50:in `collect'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-provider-verifier-1.36.0/lib/pact/provider_verifier/app.rb:50:in `pacts_pass_verification?'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-provider-verifier-1.36.0/lib/pact/provider_verifier/app.rb:42:in `call'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-provider-verifier-1.36.0/lib/pact/provider_verifier/app.rb:35:in `call'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-provider-verifier-1.36.0/lib/pact/provider_verifier/cli/verify.rb:49:in `verify'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/thor-1.1.0/lib/thor/command.rb:27:in `run'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/thor-1.1.0/lib/thor/invocation.rb:127:in `invoke_command'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/thor-1.1.0/lib/thor.rb:392:in `dispatch'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/thor-1.1.0/lib/thor/base.rb:485:in `start'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/vendor/ruby/2.2.0/gems/pact-provider-verifier-1.36.0/lib/pact/provider_verifier/cli/custom_thor.rb:17:in `start'
    from /home/.../venv/lib/python3.8/site-packages/pact/bin/pact/lib/app/pact-provider-verifier.rb:33:in `<main>'
INFO: Reading pact at ./consumer-provider.json

Here is the consumer file (I had to add .txt extension in order github let me upload the file) consumer-provider.json.txt

bethesque commented 2 years ago

"description": null, is causing the problem. That's a mandatory field. It's unfortunate that it wasn't enforced on the consumer side.

NicolasAgra commented 2 years ago

Thanks @bethesque , I added .given and .upon_receiving to the missing pact definition and it worked. Maybe we can leave this issue open to catch the error and return a controlled message.

mikegeeves commented 2 years ago

@bethesque when you say enforced on the consumer side, where do you mean?

Having a quick look through, in the pact-python consumer code it's checking for the presence of request/response/description but this check only happens when checking if all fields are present for an interaction, and if so create a new empty interaction on the list (hence the one complete, one incomplete). There isn't a final "make sure the last one is complete before sending".

It would be relatively easy to add in a final check before the PUT /interactions, but I think that would be better on the pact-mock-server, throwing an error rather than 200 / "Registered interactions" - or was that what you meant?

bethesque commented 2 years ago

I was thinking the DSL code could raise an error if the description was not provided, but yes, we could put in validation in the mock server. Would just need to make sure the error was shown nicely to the user.

mikegeeves commented 2 years ago

I like the idea of as much as possible coming from one place to avoid dupes and mismatch (re changing default options, new options etc). The pact-python example currently raises an exception with the message if a 200 doesn't come back, so that should be ok-ish to make visible. That said, since description is spec rather than behaviour I suppose that's pretty solidly defined so shouldn't change anyway. Attempted to add in a simple check but having GitHub build weirdness [being flaky, old previously successful builds now failing..sometimes etc] so I'll have to come back to that later!

YOU54F commented 1 year ago

Thanks @mikegeeves