testing a REST API that receives params in json and returns data in json

Hey everyone,

This is a problem that has been bothering me for some time. I am building an API function that should receive data in json and response in json. My controller tests run fine(Since I abstract that the data gets there already decode from JSON and only the answer needs to be interpreted ).

I Also know that the function runs fine since I have used curl to test it with JSON arguments and it works perfectly.

(ex: curl -i --header “Accept: application/json” --header “Content-Type: application/json” -d ‘{“test”:{“email”:“andreo@benjamin.dk”}}’ <url_with_the_service>)

But obviously I would like to write request(feature) tests to test this automatically and the way I see it they should work exactly like curl, i.e., hit my service like it was an external call. That means that I would like to pass the arguments in JSON and receive an answer. I am pretty lost since all the examples I can see people treat arguments as it was already decoded.

My question is: I am following a wrong premise in wanting to send the arguments and request as a JSON one since i will be testing that rails works, because this is its responsibility? But I would like to see how robust my code his to wrong arguments and would like to try with JSON.

something of this type:

it “should return an error if there is no correct email” do

params = {:subscription => {:email => “andre”}}

post “/magazine_subscriptions”, { ‘HTTP_ACCEPT’ => “application/json”, ‘Content-Type’ => ‘application/json’, ‘RAW_POST_DATA’ => params.to_json }

end

Do you know how this is possible? and please let me know if you think I am testing it wrong.

all the best,

Andre

What you are asking for is a way to test your API from the perspective of a client ( like curl ) . I wanted to do the same thing in a project I worked on, and I used Cucumber + Rack::Test + some JSON helper methods and I am really happy with how it worked out. I’ve blogged about this here : http://www.emilsoman.com/blog/2013/05/18/building-a-tested/ . I’ve set up an example Rails 4 app with tests here : https://github.com/emilsoman/rails-4-api . Hope that helps.

Hello there,

I have found ur post while googlin. Its very useful if you wanna use cucumber. I dont like cucumber for many reasons and would like to use RSPEC to test this. do you know how to do it? If so can you help me?

thanks for the help though,

all the best,

Andre

This may help you : http://matthewlehner.net/rails-api-testing-guidelines/

Hi Emil,

I have also found that link and that only shows GET requests. Its a very good example for those. But I need to make a pull request where I need to send data in JSON just like the example you posted here in cucumber, and I dont seem to find the way to do this in Rspec. at least I cant make it receive the arguments in JSON.

all the best,

Andre

Did you try reading the Rspec docs? Also, this would help you: http://edgeguides.rubyonrails.org/testing.html#what-to-include-in-your-functional-tests

Thanks everyone for your help,

I have found the answer here http://stackoverflow.com/questions/18337609/rspec-request-test-merges-hashes-in-array-in-post-json-params

It seems that the request parameters I was sending was not the correct ones.

this worked

it "should return an error if there is no correct email" do
    params = {:subscription => {:email => "andre"}}

    post "/magazine_subscriptions", params.to_json, {'ACCEPT' => "application/json", 'CONTENT_TYPE' => 'application/json'}
end