summaryrefslogtreecommitdiff
path: root/features/step_definitions/api_steps.rb
diff options
context:
space:
mode:
Diffstat (limited to 'features/step_definitions/api_steps.rb')
-rw-r--r--features/step_definitions/api_steps.rb132
1 files changed, 132 insertions, 0 deletions
diff --git a/features/step_definitions/api_steps.rb b/features/step_definitions/api_steps.rb
new file mode 100644
index 0000000..0e52f7a
--- /dev/null
+++ b/features/step_definitions/api_steps.rb
@@ -0,0 +1,132 @@
+require 'jsonpath'
+
+if defined?(Rack)
+
+ # Monkey patch Rack::MockResponse to work properly with response debugging
+ class Rack::MockResponse
+ def to_str
+ body
+ end
+ end
+
+ World(Rack::Test::Methods)
+
+end
+
+Given /^I set headers:$/ do |headers|
+ headers.rows_hash.each {|k,v| header k, v }
+end
+
+Given /^I send and accept (XML|JSON)$/ do |type|
+ header 'Accept', "application/#{type.downcase}"
+ header 'Content-Type', "application/#{type.downcase}"
+end
+
+Given /^I send and accept HTML$/ do
+ header 'Accept', "text/html"
+ header 'Content-Type', "application/x-www-form-urlencoded"
+end
+
+When /^I authenticate as the user "([^"]*)" with the password "([^"]*)"$/ do |user, pass|
+ authorize user, pass
+end
+
+When /^I digest\-authenticate as the user "(.*?)" with the password "(.*?)"$/ do |user, pass|
+ digest_authorize user, pass
+end
+
+When /^I send a (GET|POST|PUT|DELETE) request (?:for|to) "([^"]*)"(?: with the following:)?$/ do |*args|
+ request_type = args.shift
+ path = args.shift
+ input = args.shift
+
+ request_opts = {method: request_type.downcase.to_sym}
+
+ unless input.nil?
+ if input.class == Cucumber::Ast::Table
+ request_opts[:params] = input.rows_hash
+ else
+ request_opts[:input] = input
+ end
+ end
+
+ request path, request_opts
+end
+
+Then /^show me the (unparsed)?\s?response$/ do |unparsed|
+ if unparsed == 'unparsed'
+ puts last_response.body
+ elsif last_response.headers['Content-Type'] =~ /json/
+ json_response = JSON.parse(last_response.body)
+ puts JSON.pretty_generate(json_response)
+ else
+ puts last_response.headers
+ puts last_response.body
+ end
+end
+
+Then /^the response status should be "([^"]*)"$/ do |status|
+ if self.respond_to? :should
+ last_response.status.should == status.to_i
+ else
+ assert_equal status.to_i, last_response.status
+ end
+end
+
+Then /^the response should (not)?\s?have "([^"]*)"$/ do |negative, json_path|
+ json = JSON.parse(last_response.body)
+ results = JsonPath.new(json_path).on(json).to_a.map(&:to_s)
+ if self.respond_to?(:should)
+ if negative.present?
+ results.should be_empty
+ else
+ results.should_not be_empty
+ end
+ else
+ if negative.present?
+ assert results.empty?
+ else
+ assert !results.empty?
+ end
+ end
+end
+
+
+Then /^the response should (not)?\s?have "([^"]*)" with the text "([^"]*)"$/ do |negative, json_path, text|
+ json = JSON.parse(last_response.body)
+ results = JsonPath.new(json_path).on(json).to_a.map(&:to_s)
+ if self.respond_to?(:should)
+ if negative.present?
+ results.should_not include(text)
+ else
+ results.should include(text)
+ end
+ else
+ if negative.present?
+ assert !results.include?(text)
+ else
+ assert results.include?(text)
+ end
+ end
+end
+
+Then /^the response should be:$/ do |json|
+ expected = JSON.parse(json)
+ actual = JSON.parse(last_response.body)
+
+ if self.respond_to?(:should)
+ actual.should == expected
+ else
+ assert_equal expected, actual
+ end
+end
+
+Then /^the response should have "([^"]*)" with a length of (\d+)$/ do |json_path, length|
+ json = JSON.parse(last_response.body)
+ results = JsonPath.new(json_path).on(json)
+ if self.respond_to?(:should)
+ results.length.should == length.to_i
+ else
+ assert_equal length.to_i, results.length
+ end
+end