apirunner 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.3
1
+ 0.2.4
data/apirunner.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{apirunner}
8
- s.version = "0.2.3"
8
+ s.version = "0.2.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["jan@moviepilot.com"]
12
- s.date = %q{2010-09-29}
12
+ s.date = %q{2010-09-30}
13
13
  s.description = %q{apirunner is a testsuite to query your RESTful JSON API and match response with your defined expectations}
14
14
  s.email = %q{developers@moviepilot.com}
15
15
  s.extra_rdoc_files = [
@@ -48,6 +48,7 @@ Gem::Specification.new do |s|
48
48
  "lib/http_client.rb",
49
49
  "lib/result.rb",
50
50
  "lib/tasks/api.rake",
51
+ "lib/testcase.rb",
51
52
  "spec/.rspec",
52
53
  "spec/api_runner_spec.rb",
53
54
  "spec/expectation_matcher_spec.rb",
@@ -2,5 +2,13 @@ class ApiConfiguration
2
2
 
3
3
  attr_accessor :protocol, :host, :namespace, :port, :verbosity, :priority
4
4
 
5
+ # initializes a configuration object from given YAML file for given environment
6
+ def initialize(raw_config, env)
7
+ raw_config[env.to_s].each { |key, value| self.instance_variable_set("@#{key}", value) }
8
+ self.verbosity = raw_config['general']['verbosity'].first
9
+ self.priority = raw_config['general']['priority'] || 0
10
+ self
11
+ end
12
+
5
13
  end
6
14
 
data/lib/api_runner.rb CHANGED
@@ -3,6 +3,7 @@ class ApiRunner
3
3
  require 'expectation_matcher'
4
4
  require 'http_client'
5
5
  require 'api_configuration'
6
+ require 'testcase'
6
7
 
7
8
  CONFIG_FILE = "config/api_runner.yml"
8
9
  SPEC_PATH = "test/api_runner/"
@@ -13,8 +14,7 @@ class ApiRunner
13
14
  @spec = []
14
15
  @results = []
15
16
  @excludes = []
16
- @configuration = ApiConfiguration.new
17
- load_config(env)
17
+ @configuration = ApiConfiguration.new(YAML.load_file(self.class.config_file), env)
18
18
  load_excludes(env)
19
19
  load_url_spec
20
20
  @http_client = HttpClient.new(@configuration.protocol, @configuration.host, @configuration.port, @configuration.namespace)
@@ -39,7 +39,7 @@ class ApiRunner
39
39
  def run_tests
40
40
  puts "Running exactly #{@spec.size} tests."
41
41
  @spec.each do |test_case|
42
- response = send_request(test_case['request']['method'].downcase.to_sym, test_case['request']['path'], test_case['request']['headers'], test_case['request']['body'], test_case['request']['parameters'])
42
+ response = send_request_for(test_case)
43
43
  @expectation.test_types.each do |test_type|
44
44
  result = @expectation.check(test_type, response, test_case)
45
45
  if not result.succeeded
@@ -57,8 +57,8 @@ class ApiRunner
57
57
  end
58
58
 
59
59
  # sends http request and fetches response using the given http client
60
- def send_request(method, uri, headers, data, params)
61
- @http_client.send_request(method, uri, headers, data, params)
60
+ def send_request_for(testcase)
61
+ @http_client.send_request(testcase.request['method'], testcase.request['path'], testcase.request['headers'], testcase.request['body'], testcase.request['parameters'])
62
62
  end
63
63
 
64
64
  # builds target uri from base uri generated of host port and namespace as well as the ressource path
@@ -72,14 +72,6 @@ class ApiRunner
72
72
  !@http_client.send_request(:get, "#{@configuration.protocol}://#{@configuration.host}:#{@configuration.port}", nil, {:timeout => 5}).nil?
73
73
  end
74
74
 
75
- # loads environment config data from yaml file
76
- def load_config(env)
77
- config = YAML.load_file(self.class.config_file)
78
- config[env.to_s].each { |key, value| @configuration.instance_variable_set("@#{key}", value) }
79
- @configuration.verbosity = config['general']['verbosity'].first
80
- @configuration.priority = config['general']['priority'] || 0
81
- end
82
-
83
75
  # loads spec cases from yaml files
84
76
  def load_url_spec
85
77
  path = self.class.spec_path
@@ -87,7 +79,16 @@ class ApiRunner
87
79
  Dir.new(path).entries.each do |dir_entry|
88
80
  specs.push *YAML.load_file(path+dir_entry) if not (File.directory? dir_entry or dir_entry.match(/^\./) or dir_entry.match(/excludes/))
89
81
  end
90
- @spec = priorize(partition(specs))
82
+ @spec = objectize(priorize(partition(specs)))
83
+ end
84
+
85
+ # converts the given array of raw testcases to an array of testcase objects
86
+ def objectize(raw_specs)
87
+ specs = []
88
+ raw_specs.each do |spec|
89
+ specs << Testcase.new(spec)
90
+ end
91
+ specs
91
92
  end
92
93
 
93
94
  # returns only spec whose priority level is less or equals configures priority level
@@ -23,9 +23,9 @@ class ExpectationMatcher
23
23
  # matches the given response code
24
24
  def response_code(response, testcase)
25
25
  result = Result.new(testcase, response)
26
- if not testcase['response_expectation']['status_code'].to_s == response.code.to_s
26
+ if not testcase.response_expectation['status_code'].to_s == response.code.to_s
27
27
  result.succeeded = false
28
- result.error_message = " expected response code --#{testcase['response_expectation']['status_code']}--\n got response code --#{response.code}--"
28
+ result.error_message = " expected response code --#{testcase.response_expectation['status_code']}--\n got response code --#{response.code}--"
29
29
  end
30
30
  result
31
31
  end
@@ -46,7 +46,7 @@ class ExpectationMatcher
46
46
  def response_headers(response, testcase)
47
47
  result = Result.new(testcase, response)
48
48
 
49
- testcase['response_expectation']['headers'].each_pair do |header_name, header_value|
49
+ testcase.response_expectation['headers'].each_pair do |header_name, header_value|
50
50
  if is_regex?(header_value)
51
51
  if not (excluded?(header_name) or regex_matches?(header_value, response.headers[header_name]))
52
52
  result.succeeded = false
@@ -58,7 +58,7 @@ class ExpectationMatcher
58
58
  result.error_message = " expected header identifier --#{header_name}-- to match --#{header_value}--\n got --#{response.headers[header_name]}--"
59
59
  end
60
60
  end
61
- end unless (testcase['response_expectation']['headers'].nil? or testcase['response_expectation']['headers'].empty?)
61
+ end unless (testcase.response_expectation['headers'].nil? or testcase.response_expectation['headers'].empty?)
62
62
  return result
63
63
  end
64
64
 
@@ -67,15 +67,15 @@ class ExpectationMatcher
67
67
  result = Result.new(testcase, response)
68
68
 
69
69
  # special case: the whole body has to be matched via a regular expression
70
- if is_regex?(testcase['response_expectation']['body'])
71
- if not regex_matches?(testcase['response_expectation']['body'], response.body)
70
+ if is_regex?(testcase.response_expectation['body'])
71
+ if not regex_matches?(testcase.response_expectation['body'], response.body)
72
72
  result.succeeded = false
73
- result.error_message = " expected the whole body to match regex --#{testcase['response_expectation']['body']}--\n got --#{response.body}--"
73
+ result.error_message = " expected the whole body to match regex --#{testcase.response_expectation['body']}--\n got --#{response.body}--"
74
74
  end
75
75
  return result
76
76
  end
77
77
 
78
- expected_body_hash = testcase['response_expectation']['body']
78
+ expected_body_hash = testcase.response_expectation['body']
79
79
 
80
80
  # in case we have no body expectation we simply return success
81
81
  return result if expected_body_hash.nil?
data/lib/testcase.rb ADDED
@@ -0,0 +1,11 @@
1
+ class Testcase
2
+
3
+ attr_reader :raw, :request, :response_expectation
4
+
5
+ def initialize(raw)
6
+ @raw = raw
7
+ @request = @raw['request']
8
+ @response_expectation = @raw['response_expectation']
9
+ end
10
+
11
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 3
9
- version: 0.2.3
8
+ - 4
9
+ version: 0.2.4
10
10
  platform: ruby
11
11
  authors:
12
12
  - jan@moviepilot.com
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-09-29 00:00:00 +02:00
17
+ date: 2010-09-30 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -252,6 +252,7 @@ files:
252
252
  - lib/http_client.rb
253
253
  - lib/result.rb
254
254
  - lib/tasks/api.rake
255
+ - lib/testcase.rb
255
256
  - spec/.rspec
256
257
  - spec/api_runner_spec.rb
257
258
  - spec/expectation_matcher_spec.rb
@@ -271,7 +272,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
271
272
  requirements:
272
273
  - - ">="
273
274
  - !ruby/object:Gem::Version
274
- hash: 3550102861078407058
275
+ hash: -4241672918987621375
275
276
  segments:
276
277
  - 0
277
278
  version: "0"