iA


Daily-Log, 2010-11-11 – Cucumber & APIs

by Administrator. Average Reading Time: about a minute.

We are using a lot of distributed Sinatra and Rails3 applications in our Mobino project. They speak HTTP-REST and JSON with each other. Because we are using Cucumber and RSpec, we also have some high level integration tests for the APIs.

Today I started on cleaning up an API in the Rails app. I wrote a cucumber step to invoke the API. It took me a while to figure out the magic incantation to make the controller retrieve the parameters as JSON: Here’s the relevant part of the step_definition:

When /^an API transaction from (client \w+) to (merchant \w+) over (amount \d+.\d+) is made$/ do |client, merchant, amount|
  path = '/api/transactions'
  params = {:debitorid => client.id, :creditorid => merchant.id,
            :amount     => amount}.tojson
  post path, params, {"CONTENTTYPE" => "application/json", "ACCEPT" => "application/json" }
  response.status.should == 201
end

The key to success was to pass the hash with the content type and the accept headers – but specifying them like Rack variables, not HTTP Headers.

Another nice thing I discovered today was the Transform in Cucumber. It allows you to DRY up your steps by moving code that works on the arguments you provide (for example code that loads some object from the database) into it’s own transform step.

Transform /^merchant (\w+)$/ do |name|
  Merchant.findbylogin name
end

Transform /^amount (\d+.\d+)$/ do |amount| amount.to_f end

More details on this technique over on the Cucumber Wiki:Step Argument Transforms and an Engine Yard blog post.

No comments on ‘Daily-Log, 2010-11-11 – Cucumber & APIs’

Leave a Reply