Here's more details on my last post about doing a JSON smoke test. The idea here, is that a test is needed to check the schema of the JSON coming back - to verify that the JSON structure itself is intact with the correct categories and sub categories.
I used Rotten Tomato's API end point. I'll pass in a fixed parameter to a specific movie and then validate the JSON coming back.
The end point URI that i'm hitting is:
http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey=jc7eaxjfpemb2uz7qsrudnsq&q=Toy+Story+3&page_limit=1
Let's review the JSON response we get with the above query - jsonlint.com shows that the top level categories are:
require 'open-uri'
require 'json'
Given /^A call to the Rotten Tomattoes API$/ do
@mquery = JSON.parse(open("http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey=jc7eaxjfpemb2uz7qsrudnsq&q=Toy+Story+3&page_limit=1").read)
end
Then /^the response should have the (.*) expected$/ do |category|
@mquery["#{category}"].should be_true
end
Given /^A call is made to the Rotten Tomattoes API$/ do
@mquery = JSON.parse(open("http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey=jc7eaxjfpemb2uz7qsrudnsq&q=Toy+Story+3&page_limit=1").read)
end
Then /^the response returned should have the movies (.*) expected$/ do |subcategory|
@mquery['movies'][0]["#{subcategory}"].should be_true
end
Then /^the response returned should have the (.*) subcategory expected$/ do |release_dates_sub|
@mquery['movies'][0]['release_dates']["#{release_dates_sub}"].should be_true
end
Then /^the ratings response returned should have the (.*) subcategory expected$/ do |ratings_sub|
@mquery['movies'][0]['ratings']["#{ratings_sub}"].should be_true
end
Then /^the posters response returned should have the (.*) subcategory expected$/ do |posters_sub|
@mquery['movies'][0]['posters']["#{posters_sub}"].should be_true
end
Then /^the abridged cast response returned should have the (.*) subcategory expected$/ do |abridged_cast_sub|
@mquery['movies'][0]['abridged_cast'][0]["#{abridged_cast_sub}"].should be_true
end
Then /^the alternate id's response returned should have the (.*) subcategory expected$/ do |alternate_ids_sub|
@mquery['movies'][0]['alternate_ids']["#{alternate_ids_sub}"].should be_true
end
Then /^the links response returned should have the (.*) subcategory expected$/ do |links_sub|
@mquery['movies'][0]['links']["#{links_sub}"].should be_true
end
The Cucumber test I wrote uses a Cucumber Scenario Outline to pass in the expected categories or sub-categories into the code above. Here's how I wrote the tests:
Feature: Smoke tests to ensure json validity by checking and verifying each JSON category and sub category exists
#Note: this is not validating values, just that the JSON structure has the expected categories and sub categories
Scenario Outline: Smoke test the JSON top level categories returned
Given A call to the Rotten Tomattoes API
Then the response should have the <category> expected
Examples:
|category|
|movies |
|links|
|link_template|
Scenario Outline: Smoke test the JSON movies sub categories returned
Given A call is made to the Rotten Tomattoes API
Then the response returned should have the movies <subcategory> expected
Examples:
|subcategory|
|id |
|title|
|year|
|mpaa_rating|
|runtime |
|critics_consensus|
|release_dates |
|ratings |
|synopsis |
|posters |
|abridged_cast |
|alternate_ids |
|links |
Scenario Outline: Smoke test the JSON release dates sub categories returned
Given A call is made to the Rotten Tomattoes API
Then the response returned should have the <release dates_sub> subcategory expected
Examples:
|release dates_sub|
|theater |
|dvd|
Scenario Outline: Smoke test the JSON ratings sub categories returned
Given A call is made to the Rotten Tomattoes API
Then the ratings response returned should have the <ratings_sub> subcategory expected
Examples:
|ratings_sub|
|critics_rating |
|critics_score|
|audience_rating|
|audience_score |
Scenario Outline: Smoke test the JSON posters sub categories returned
Given A call is made to the Rotten Tomattoes API
Then the posters response returned should have the <posters_sub> subcategory expected
Examples:
|posters_sub|
|thumbnail |
|profile|
|detailed|
|original |
Scenario Outline: Smoke test the JSON abridged cast sub categories returned
Given A call is made to the Rotten Tomattoes API
Then the abridged cast response returned should have the <abridged_cast_sub> subcategory expected
Examples:
|abridged_cast_sub|
|name |
|id|
|characters|
Scenario Outline: Smoke test the JSON alternate ids sub categories returned
Given A call is made to the Rotten Tomattoes API
Then the alternate id's response returned should have the <alternate_ids_sub> subcategory expected
Examples:
|alternate_ids_sub|
|imdb |
Scenario Outline: Smoke test the JSON links sub categories returned
Given A call is made to the Rotten Tomattoes API
Then the links response returned should have the <links_sub> subcategory expected
Examples:
|links_sub|
|self |
|alternate|
|cast |
|clips |
|reviews |
|similar |
I used Rotten Tomato's API end point. I'll pass in a fixed parameter to a specific movie and then validate the JSON coming back.
The end point URI that i'm hitting is:
http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey=jc7eaxjfpemb2uz7qsrudnsq&q=Toy+Story+3&page_limit=1
Let's review the JSON response we get with the above query - jsonlint.com shows that the top level categories are:
- total
- movies
- links
- link_template
- id
- title
- year
- mpaa_rating
- runtime
- critics_consensus
- release_dates
- ratings
- synopsis
- posters
- abridged_cast
- alternate_ids
- links
require 'open-uri'
require 'json'
Given /^A call to the Rotten Tomattoes API$/ do
@mquery = JSON.parse(open("http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey=jc7eaxjfpemb2uz7qsrudnsq&q=Toy+Story+3&page_limit=1").read)
end
Then /^the response should have the (.*) expected$/ do |category|
@mquery["#{category}"].should be_true
end
Given /^A call is made to the Rotten Tomattoes API$/ do
@mquery = JSON.parse(open("http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey=jc7eaxjfpemb2uz7qsrudnsq&q=Toy+Story+3&page_limit=1").read)
end
Then /^the response returned should have the movies (.*) expected$/ do |subcategory|
@mquery['movies'][0]["#{subcategory}"].should be_true
end
Then /^the response returned should have the (.*) subcategory expected$/ do |release_dates_sub|
@mquery['movies'][0]['release_dates']["#{release_dates_sub}"].should be_true
end
Then /^the ratings response returned should have the (.*) subcategory expected$/ do |ratings_sub|
@mquery['movies'][0]['ratings']["#{ratings_sub}"].should be_true
end
Then /^the posters response returned should have the (.*) subcategory expected$/ do |posters_sub|
@mquery['movies'][0]['posters']["#{posters_sub}"].should be_true
end
Then /^the abridged cast response returned should have the (.*) subcategory expected$/ do |abridged_cast_sub|
@mquery['movies'][0]['abridged_cast'][0]["#{abridged_cast_sub}"].should be_true
end
Then /^the alternate id's response returned should have the (.*) subcategory expected$/ do |alternate_ids_sub|
@mquery['movies'][0]['alternate_ids']["#{alternate_ids_sub}"].should be_true
end
Then /^the links response returned should have the (.*) subcategory expected$/ do |links_sub|
@mquery['movies'][0]['links']["#{links_sub}"].should be_true
end
The Cucumber test I wrote uses a Cucumber Scenario Outline to pass in the expected categories or sub-categories into the code above. Here's how I wrote the tests:
Feature: Smoke tests to ensure json validity by checking and verifying each JSON category and sub category exists
#Note: this is not validating values, just that the JSON structure has the expected categories and sub categories
Scenario Outline: Smoke test the JSON top level categories returned
Given A call to the Rotten Tomattoes API
Then the response should have the <category> expected
Examples:
|category|
|movies |
|links|
|link_template|
Scenario Outline: Smoke test the JSON movies sub categories returned
Given A call is made to the Rotten Tomattoes API
Then the response returned should have the movies <subcategory> expected
Examples:
|subcategory|
|id |
|title|
|year|
|mpaa_rating|
|runtime |
|critics_consensus|
|release_dates |
|ratings |
|synopsis |
|posters |
|abridged_cast |
|alternate_ids |
|links |
Scenario Outline: Smoke test the JSON release dates sub categories returned
Given A call is made to the Rotten Tomattoes API
Then the response returned should have the <release dates_sub> subcategory expected
Examples:
|release dates_sub|
|theater |
|dvd|
Scenario Outline: Smoke test the JSON ratings sub categories returned
Given A call is made to the Rotten Tomattoes API
Then the ratings response returned should have the <ratings_sub> subcategory expected
Examples:
|ratings_sub|
|critics_rating |
|critics_score|
|audience_rating|
|audience_score |
Scenario Outline: Smoke test the JSON posters sub categories returned
Given A call is made to the Rotten Tomattoes API
Then the posters response returned should have the <posters_sub> subcategory expected
Examples:
|posters_sub|
|thumbnail |
|profile|
|detailed|
|original |
Scenario Outline: Smoke test the JSON abridged cast sub categories returned
Given A call is made to the Rotten Tomattoes API
Then the abridged cast response returned should have the <abridged_cast_sub> subcategory expected
Examples:
|abridged_cast_sub|
|name |
|id|
|characters|
Scenario Outline: Smoke test the JSON alternate ids sub categories returned
Given A call is made to the Rotten Tomattoes API
Then the alternate id's response returned should have the <alternate_ids_sub> subcategory expected
Examples:
|alternate_ids_sub|
|imdb |
Scenario Outline: Smoke test the JSON links sub categories returned
Given A call is made to the Rotten Tomattoes API
Then the links response returned should have the <links_sub> subcategory expected
Examples:
|links_sub|
|self |
|alternate|
|cast |
|clips |
|reviews |
|similar |
No comments:
Post a Comment