在验证契约之前编码/加密的正文

时间:2017-05-20 14:42:51

标签: pact pact-ruby

我需要集成的服务器返回其编码为JWT的答案。更糟糕的是,响应体实际上是一个json,形式如下:

{d: token} with token = JWT.encode({id: 123, field: "John", etc.})

我想对解码后的令牌内容使用pact验证。我知道我可以很容易地得到一个协议,验证我得到了{d:string},我不能对字符串做一个完全匹配(因为JWT包含一些不同的ID)。我想要的是以下内容,它假定添加了一个新的Pact.JWT功能。

my_provider. upon_receiving('my request') .with(method: :post, path: '/order', headers: {'Content-Type' => 'application/json'} ).will_respond_with( status: 200, headers: {'Content-Type' => 'application/json; charset=utf-8'}, body: { d: Pact::JWT( { id: Pact.like(123), field: Pact.term(generate: "John", matcher: /J.*/ },signing_key,algo ) })

如果没有添加这个Pact :: JWT,有没有办法实现这种结果呢?

我已经在使用pact代理来运行我的验证。我知道您可以在发送请求之前修改请求(How do I verify pacts against an API that requires an auth token?)。从代理服务器收到请求后,您可以修改请求吗?

如果是这种情况,我可以计划以下工作:

  • 在我的实际代码中切换有时期望解码而不是在JWT
  • 中解码
  • 关闭swich后运行我的测试一次(正常的代码行为,模拟返回JWT数据编码。
  • 第二次运行我的测试,关闭swich(代码期望数据已经解码,模拟返回解码数据。)
  • 使用第二次运行的合约json
  • 挂钩代理:验证任务以动态解码JWT,并使用现有的pact机制进行验证。 (我不知道该怎么办的步骤。)

我的代码是红宝石。我无权访问提供商。

任何建议表示赞赏!感谢

2 个答案:

答案 0 :(得分:1)

您可以使用(另一个)代理应用修改请求或响应。​​

class ProxyApp

  def initialize real_provider_app
    @real_provider_app = real_provider_app
  end

  def call env
    response = @real_provider_app.call(env)
    # modify response here
    response
  end
end

Pact.service_provider "My Service Provider" do
  app { ProxyApp.new(RealApp) }
end

答案 1 :(得分:0)

契约作为一种工具,我不希望它能立即提供这种行为。

我认为最好的是

  • 不要只为测试更改源代码
  • 确保您的测试仅验证编码的json(在测试中生成编码的预期json并通过实际验证)