apirunner 0.1.11 → 0.2.0

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.1.11
1
+ 0.2.0
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.1.11"
8
+ s.version = "0.2.0"
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-27}
12
+ s.date = %q{2010-09-28}
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 = [
@@ -29,7 +29,13 @@ Gem::Specification.new do |s|
29
29
  "changelog.txt",
30
30
  "examples/config/api_runner.yml",
31
31
  "examples/test/api_runner/001_create_ressource.yml",
32
+ "examples/test/api_runner/001_create_user.yml",
33
+ "examples/test/api_runner/002_update_resources.yml",
34
+ "examples/test/api_runner/003_update_ratings.yml",
35
+ "examples/test/api_runner/004_pagination.yml",
36
+ "examples/test/api_runner/005_cache_operations.yml",
32
37
  "examples/test/api_runner/999_delete_ressource.yml",
38
+ "examples/test/api_runner/999_delete_user.yml",
33
39
  "examples/test/api_runner/excludes.yml",
34
40
  "features/apirunner.feature",
35
41
  "features/step_definitions/apirunner_steps.rb",
@@ -19,3 +19,4 @@ general:
19
19
  - verbose_on_error
20
20
  - verbose_on_success
21
21
  - verbose_with_curl
22
+ priority: 0
@@ -0,0 +1,166 @@
1
+ ---
2
+ - name: 'Create new User'
3
+ request:
4
+ headers:
5
+ Content-Type: 'application/json'
6
+ path: '/users/duffyduck'
7
+ method: 'PUT'
8
+ body:
9
+ username: 'duffyduck'
10
+ watchlist:
11
+ - m333
12
+ - m79
13
+ blacklist:
14
+ - m334
15
+ - m77
16
+ skiplist:
17
+ - m335
18
+ - m78
19
+ ratings:
20
+ m336: 4
21
+ m79: 2.5
22
+ m777: 3.0
23
+ m567: 4.0
24
+ m354: 5.0
25
+ expires_at: 2011-09-09T22:41:50+00:00
26
+ response_expectation:
27
+ status_code: 201
28
+ headers:
29
+ Last-Modified: /.*/
30
+ body:
31
+ username: 'duffyduck'
32
+ watchlist:
33
+ - m333
34
+ - m79
35
+ blacklist:
36
+ - m334
37
+ - m77
38
+ skiplist:
39
+ - m335
40
+ - m78
41
+ ratings:
42
+ m336: 4.0
43
+ m79: 2.5
44
+ fsk: "18"
45
+ - name: 'Update existing User - Update watchlist'
46
+ request:
47
+ headers:
48
+ Content-Type: 'application/json'
49
+ path: '/users/duffyduck/watchlist'
50
+ method: 'PUT'
51
+ body:
52
+ - m367
53
+ - m73
54
+ response_expectation:
55
+ status_code: 204
56
+ body:
57
+ - name: 'Check User FSK,Watchlist'
58
+ request:
59
+ headers:
60
+ Content-Type: 'application/json'
61
+ path: '/users/duffyduck'
62
+ method: 'GET'
63
+ response_expectation:
64
+ status_code: 200
65
+ headers:
66
+ Last-Modified: /.*/
67
+ body:
68
+ username: 'duffyduck'
69
+ fsk: "18"
70
+ watchlist:
71
+ - m367
72
+ - m73
73
+ blacklist:
74
+ - m334
75
+ - m77
76
+ skiplist:
77
+ - m335
78
+ - m78
79
+ ratings:
80
+ m336: 4.0
81
+ m79: 2.5
82
+ - name: 'Set 10 Ratings'
83
+ request:
84
+ headers:
85
+ Content-Type: 'application/json'
86
+ path: '/users/duffyduck/ratings'
87
+ method: 'PUT'
88
+ body:
89
+ "m1035": 1
90
+ "m2087": 0.5
91
+ "m1554": 2
92
+ "m2981": 1.0
93
+ "m1590": 2
94
+ "m12493": 4
95
+ "m1875": 5
96
+ "m7258": 2.5
97
+ response_expectation:
98
+ status_code: 204
99
+ headers:
100
+ Last-Modified: /.*/
101
+ - name: 'Check User Ratings Update'
102
+ request:
103
+ headers:
104
+ Content-Type: 'application/json'
105
+ path: '/users/duffyduck'
106
+ method: 'GET'
107
+ response_expectation:
108
+ status_code: 200
109
+ headers:
110
+ Last-Modified: /.*/
111
+ body:
112
+ username: 'duffyduck'
113
+ fsk: "18"
114
+ watchlist:
115
+ - m367
116
+ - m73
117
+ blacklist:
118
+ - m334
119
+ - m77
120
+ skiplist:
121
+ - m335
122
+ - m78
123
+ ratings:
124
+ "m1035": "1.0"
125
+ "m2087": "0.5"
126
+ "m1554": "2.0"
127
+ "m2981": "1.0"
128
+ "m1590": "2.0"
129
+ "m12493": "4.0"
130
+ "m1875": "5.0"
131
+ "m7258": "2.5"
132
+ - name: 'User creation should fail on wrong username'
133
+ priority: 2
134
+ request:
135
+ headers:
136
+ Content-Type: 'application/json'
137
+ path: '/users/duffyduck'
138
+ method: 'PUT'
139
+ body:
140
+ username: '!"§$%&/()=?QWERTZUI"§$%& /('
141
+ response_expectation:
142
+ status_code: 409
143
+ - name: 'User creation should fail on wrong fsk'
144
+ priority: 2
145
+ request:
146
+ headers:
147
+ Content-Type: 'application/json'
148
+ path: '/users/duffyduck2'
149
+ method: 'PUT'
150
+ body:
151
+ username: 'duffyduck2'
152
+ fsk: 2000000
153
+ response_expectation:
154
+ status_code: 409
155
+ - name: 'User creation should fail on wrong expiration_date'
156
+ priority: 2
157
+ request:
158
+ headers:
159
+ Content-Type: 'application/json'
160
+ path: '/users/duffyduck3'
161
+ method: 'PUT'
162
+ body:
163
+ username: 'duffyduck3'
164
+ expires_at: 2009-09-09T22:41:50+00:00
165
+ response_expectation:
166
+ status_code: 409
@@ -0,0 +1 @@
1
+ ---
@@ -0,0 +1,22 @@
1
+ ---
2
+ - name: 'Delete User 1'
3
+ request:
4
+ path: '/users/duffyduck'
5
+ method: 'DELETE'
6
+ body: {}
7
+ response_expectation:
8
+ status_code: 202
9
+ - name: 'Delete User 2'
10
+ request:
11
+ path: '/users/duffyduck2'
12
+ method: 'DELETE'
13
+ body: {}
14
+ response_expectation:
15
+ status_code: 202
16
+ - name: 'Delete User 3'
17
+ request:
18
+ path: '/users/duffyduck3'
19
+ method: 'DELETE'
20
+ body: {}
21
+ response_expectation:
22
+ status_code: 202
@@ -1,6 +1,6 @@
1
1
  class ApiConfiguration
2
2
 
3
- attr_accessor :protocol, :host, :namespace, :port, :verbosity
3
+ attr_accessor :protocol, :host, :namespace, :port, :verbosity, :priority
4
4
 
5
5
  end
6
6
 
data/lib/api_runner.rb CHANGED
@@ -76,14 +76,48 @@ class ApiRunner
76
76
  config = YAML.load_file(self.class.config_file)
77
77
  config[env.to_s].each { |key, value| @configuration.instance_variable_set("@#{key}", value) }
78
78
  @configuration.verbosity = config['general']['verbosity'].first
79
+ @configuration.priority = config['general']['priority'] || 0
79
80
  end
80
81
 
81
82
  # loads spec cases from yaml files
82
83
  def load_url_spec
83
84
  path = self.class.spec_path
85
+ specs = []
84
86
  Dir.new(path).entries.each do |dir_entry|
85
- @spec.push *YAML.load_file(path+dir_entry) if not (File.directory? dir_entry or dir_entry.match(/^\./) or dir_entry.match(/excludes/))
87
+ specs.push *YAML.load_file(path+dir_entry) if not (File.directory? dir_entry or dir_entry.match(/^\./) or dir_entry.match(/excludes/))
86
88
  end
89
+ @spec = priorize(partition(specs))
90
+ end
91
+
92
+ # returns only spec whose priority level is less or equals configures priority level
93
+ # if no priority level is configured for the api runner, 0 is assumed
94
+ # if no priority level ist configured for a story, 0 is assumed
95
+ def priorize(specs)
96
+ relevant_specs = []
97
+ specs.each do |spec|
98
+ relevant_specs << spec if spec['priority'].nil? or spec['priority'].to_i <= @configuration.priority.to_i
99
+ end
100
+ relevant_specs
101
+ end
102
+
103
+ # partitions the spec if keywords like 'focus', 'until' or 'from exist'
104
+ # and returns the relevant subset of specs that have to be tested then
105
+ def partition(specs)
106
+ relevant_specs = []
107
+ specs.each do |spec|
108
+ if spec['focus']
109
+ relevant_specs << spec
110
+ break
111
+ elsif spec['until']
112
+ relevant_specs = specs[0..specs.index(spec)]
113
+ break
114
+ elsif spec['from']
115
+ relevant_specs = specs[specs.index(spec)..specs.size+1]
116
+ break
117
+ end
118
+ end
119
+ relevant_specs = specs if relevant_specs.empty?
120
+ relevant_specs
87
121
  end
88
122
 
89
123
  # loads and parses items that need to be excluded from the checks in certain environments
data/lib/http_client.rb CHANGED
@@ -17,12 +17,15 @@ class HttpClient
17
17
  # returns struct containing response.code, headers, body and message
18
18
  # this is only for easily interfaceing another http client
19
19
  def build_response(raw_response)
20
+ debugger
20
21
  response_struct = Struct.new(:code, :message, :headers, :body)
21
22
  response = response_struct.new
22
23
  response.code = raw_response.code
23
24
  response.message = raw_response.message
24
25
  response.body = raw_response.body
25
- response.headers = raw_response.header
26
+ # response.headers = raw_response.header
27
+ # TODO improve me!
28
+ response.headers = JSON.parse(raw_response.header.to_json) rescue nil
26
29
  response
27
30
  end
28
31
 
data/lib/result.rb CHANGED
@@ -27,9 +27,7 @@ class Result
27
27
 
28
28
  # yields a more verbose error message only in case of an error
29
29
  def verbose_on_error(index)
30
- if not @succeeded
31
- be_verbose(index)
32
- end
30
+ be_verbose(index) if not @succeeded
33
31
  end
34
32
 
35
33
  # yields a more verbose message in case of an error AND success
@@ -45,22 +43,21 @@ class Result
45
43
 
46
44
  # yields the verbose error messages
47
45
  def be_verbose(index)
48
- debugger
49
- puts "\n#{result_case} (#{index+1}) - \"#{@testcase['name']}\""
50
- puts @error_message
51
- puts(" More more more verbosity\n")
52
- puts(" request method: #{@testcase['request']['method']}")
53
- puts(" resource path: #{@testcase['request']['path']}")
54
- puts(" request headers: #{@testcase['request']['headers']}")
55
- puts(" JSON body sent: #{@testcase['request']['body']}")
56
- puts(" expectation:")
57
- puts(" response status code: #{@testcase['response_expectation']['status_code']}")
58
- puts(" response headers: #{@testcase['response_expectation']['headers']}")
59
- puts(" response body: #{@testcase['response_expectation']['body']}")
60
- puts(" result:")
61
- puts(" response status code: #{@response.code}")
62
- puts(" response headers: #{@response.headers}")
63
- puts(" repsonse body: #{JSON.parse(@response.body) rescue nil}")
46
+ puts "\n#{result_case} (#{index+1}) - \"#{@testcase['name']}\""
47
+ puts @error_message
48
+ puts(" More more more verbosity\n")
49
+ puts(" request method: #{@testcase['request']['method']}")
50
+ puts(" resource path: #{@testcase['request']['path']}")
51
+ puts(" request headers: #{@testcase['request']['headers']}")
52
+ puts(" JSON body sent: #{@testcase['request']['body']}")
53
+ puts(" expectation:")
54
+ puts(" response status code: #{@testcase['response_expectation']['status_code']}")
55
+ puts(" response headers: #{@testcase['response_expectation']['headers']}")
56
+ puts(" response body: #{@testcase['response_expectation']['body']}")
57
+ puts(" result:")
58
+ puts(" response status code: #{@response.code}")
59
+ puts(" response headers: #{@response.headers}")
60
+ puts(" response body: #{JSON.parse(@response.body) rescue nil}")
64
61
  end
65
62
 
66
63
  # returns the result case for interpolation in the output message header
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
8
- - 11
9
- version: 0.1.11
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
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-27 00:00:00 +02:00
17
+ date: 2010-09-28 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -233,7 +233,13 @@ files:
233
233
  - changelog.txt
234
234
  - examples/config/api_runner.yml
235
235
  - examples/test/api_runner/001_create_ressource.yml
236
+ - examples/test/api_runner/001_create_user.yml
237
+ - examples/test/api_runner/002_update_resources.yml
238
+ - examples/test/api_runner/003_update_ratings.yml
239
+ - examples/test/api_runner/004_pagination.yml
240
+ - examples/test/api_runner/005_cache_operations.yml
236
241
  - examples/test/api_runner/999_delete_ressource.yml
242
+ - examples/test/api_runner/999_delete_user.yml
237
243
  - examples/test/api_runner/excludes.yml
238
244
  - features/apirunner.feature
239
245
  - features/step_definitions/apirunner_steps.rb
@@ -265,7 +271,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
265
271
  requirements:
266
272
  - - ">="
267
273
  - !ruby/object:Gem::Version
268
- hash: -3573133429557271609
274
+ hash: -2602692957616549135
269
275
  segments:
270
276
  - 0
271
277
  version: "0"