flunk 0.0.13 → 0.0.14
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.
- checksums.yaml +4 -4
- data/lib/flunk.rb +119 -28
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fbfaf66ff6b6869fdd639cc3c5c789232ba7a1ca
|
4
|
+
data.tar.gz: 93e06a64ffe38ff97f6cd77ebcec094eef85e441
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 69e745859d1458782bcfa680df4750ad6ff89304a03f81129fbd0ac28255de8bfc41b7a258f982f3e744b500795d690af1be3f88b74233ac56103f0df64eb499
|
7
|
+
data.tar.gz: 17c6790e060ccdc1f913dab6b90b62dd00634585911e43c99826b9f44b55aeda69361fbff06a99be7724b832df3cc2191f8f3adac5e03fd4ef021c2e460af7a6
|
data/lib/flunk.rb
CHANGED
@@ -5,10 +5,10 @@ class Flunk < ActionDispatch::IntegrationTest
|
|
5
5
|
def self.test(resource, action, &block)
|
6
6
|
|
7
7
|
if action.class == Hash
|
8
|
-
name
|
9
|
-
action
|
8
|
+
name = action[:name]
|
9
|
+
action = action[:action]
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
new_proc = Proc.new do
|
13
13
|
@resource ||= resource
|
14
14
|
@action ||= action
|
@@ -38,11 +38,11 @@ class Flunk < ActionDispatch::IntegrationTest
|
|
38
38
|
@method ||= self.class.config.read_method
|
39
39
|
@ssl ||= self.class.config.read_ssl
|
40
40
|
|
41
|
+
@headers ||= {}
|
42
|
+
|
41
43
|
if @username || @password
|
42
|
-
@headers ||= {}
|
43
44
|
@headers["HTTP_AUTHORIZATION"] = "Basic #{Base64.encode64(@username.to_s + ":" + @password.to_s)}".strip
|
44
45
|
elsif @auth_token
|
45
|
-
@headers ||= {}
|
46
46
|
@headers["HTTP_AUTHORIZATION"] = "Token token=\"#{@auth_token}\"".strip
|
47
47
|
end
|
48
48
|
|
@@ -50,20 +50,38 @@ class Flunk < ActionDispatch::IntegrationTest
|
|
50
50
|
|
51
51
|
@response = response
|
52
52
|
|
53
|
-
|
53
|
+
expected_status_code = Rack::Utils::SYMBOL_TO_STATUS_CODE[@status]
|
54
|
+
|
55
|
+
if response.status == 422 and expected_status_code != 422
|
56
|
+
puts "VALIDATION ERRORS:"
|
57
|
+
puts JSON.pretty_generate(JSON.parse(response.body))
|
58
|
+
end
|
59
|
+
|
60
|
+
if response.status.to_i != expected_status_code
|
61
|
+
puts "STATUS MISMATCH:"
|
62
|
+
puts "path: #{@path}"
|
63
|
+
puts "headers: #{@headers.to_json}"
|
64
|
+
puts "body: #{@body}"
|
65
|
+
end
|
66
|
+
|
67
|
+
assert_response @status
|
54
68
|
|
55
69
|
unless response.body.blank?
|
70
|
+
@result = response.body
|
56
71
|
if response.content_type == 'application/json'
|
57
|
-
|
58
|
-
|
59
|
-
|
72
|
+
begin
|
73
|
+
json = ActiveSupport::JSON.decode(response.body)
|
74
|
+
rec_symbolize( json )
|
75
|
+
@result = json
|
76
|
+
rescue => e
|
77
|
+
end
|
60
78
|
end
|
61
79
|
end
|
62
80
|
|
63
81
|
if not @desc.nil?
|
64
82
|
make_doc @resource, @action, @desc, @path, @method, @auth_token, @headers, @body, @status, @result
|
65
83
|
end
|
66
|
-
|
84
|
+
|
67
85
|
end
|
68
86
|
|
69
87
|
@result
|
@@ -72,7 +90,7 @@ class Flunk < ActionDispatch::IntegrationTest
|
|
72
90
|
def desc(desc)
|
73
91
|
@desc = desc
|
74
92
|
end
|
75
|
-
|
93
|
+
|
76
94
|
def read_desc
|
77
95
|
@desc
|
78
96
|
end
|
@@ -86,7 +104,10 @@ class Flunk < ActionDispatch::IntegrationTest
|
|
86
104
|
end
|
87
105
|
|
88
106
|
def path(path)
|
89
|
-
|
107
|
+
uri = URI.parse path
|
108
|
+
uri.path = uri.path[0] == "/" ? uri.path : "/#{uri.path}"
|
109
|
+
uri.path = uri.path[-5..-1] == ".json" ? uri.path : "#{uri.path}.json"
|
110
|
+
@path = uri.to_s
|
90
111
|
end
|
91
112
|
|
92
113
|
def read_path
|
@@ -151,7 +172,7 @@ class Flunk < ActionDispatch::IntegrationTest
|
|
151
172
|
|
152
173
|
def header(key, value)
|
153
174
|
@headers ||= {}
|
154
|
-
@headers = self.class.config.read_headers.merge @headers
|
175
|
+
@headers = self.class.config.read_headers.merge @headers if self.class.config.read_headers
|
155
176
|
@headers[key] = value
|
156
177
|
end
|
157
178
|
|
@@ -170,7 +191,7 @@ class Flunk < ActionDispatch::IntegrationTest
|
|
170
191
|
|
171
192
|
def doc_directory(doc_directory)
|
172
193
|
FileUtils.rm_r(doc_directory) if File.exists?(doc_directory)
|
173
|
-
FileUtils.mkdir_p(doc_directory)
|
194
|
+
FileUtils.mkdir_p(doc_directory)
|
174
195
|
@doc_directory = doc_directory
|
175
196
|
end
|
176
197
|
|
@@ -184,6 +205,18 @@ class Flunk < ActionDispatch::IntegrationTest
|
|
184
205
|
@doc_directory
|
185
206
|
end
|
186
207
|
|
208
|
+
def doc_base_url(doc_base_url)
|
209
|
+
@doc_base_url = doc_base_url
|
210
|
+
end
|
211
|
+
|
212
|
+
def read_config_doc_base_url
|
213
|
+
@doc_base_url
|
214
|
+
end
|
215
|
+
|
216
|
+
def read_doc_base_url
|
217
|
+
self.class.config.read_config_doc_base_url || "http://www.example.com/"
|
218
|
+
end
|
219
|
+
|
187
220
|
|
188
221
|
|
189
222
|
|
@@ -223,46 +256,104 @@ class Flunk < ActionDispatch::IntegrationTest
|
|
223
256
|
def make_doc resource, action, desc, path, method, auth_token, headers, body, status, response
|
224
257
|
body = body.class == String ? JSON.parse(body) : body
|
225
258
|
url = File.join(@@config.read_base_url.to_s, path.to_s)
|
259
|
+
|
260
|
+
headers ||= {}
|
261
|
+
headers["Content-Type"] = "application/json"
|
262
|
+
headers["Accept"] = "application/json"
|
263
|
+
|
226
264
|
contents = ""
|
265
|
+
|
227
266
|
contents += "# #{action.humanize}\n\n"
|
267
|
+
|
228
268
|
contents += "#{desc.humanize}\n\n"
|
269
|
+
|
229
270
|
contents += "## Request\n\n"
|
271
|
+
|
230
272
|
if not auth_token.nil?
|
231
|
-
contents += "- Requires Authentication
|
273
|
+
contents += "- **Requires Authentication**\n"
|
232
274
|
end
|
233
|
-
|
234
|
-
contents += "-
|
275
|
+
|
276
|
+
contents += "- **Method:** #{method.to_s.upcase}\n"
|
277
|
+
|
278
|
+
# if not headers.nil?
|
279
|
+
# headers_strings = headers.map {|k,v| " - #{k}: #{v}" }
|
280
|
+
# contents += "- **Headers:**\n#{headers_strings.join("\n")}\n"
|
281
|
+
# end
|
282
|
+
|
283
|
+
contents += "- **URL:** #{url}\n"
|
284
|
+
|
235
285
|
if not body.nil?
|
236
|
-
contents += "- Body
|
286
|
+
contents += "- **Body:**\n\n```json\n#{pretty(body)}\n```\n\n"
|
237
287
|
else
|
238
288
|
contents += "\n"
|
239
289
|
end
|
290
|
+
|
240
291
|
contents += "## Response\n\n"
|
241
|
-
|
292
|
+
|
293
|
+
contents += "- **Status:** #{Rack::Utils::SYMBOL_TO_STATUS_CODE[status]} #{status.to_s.humanize}\n"
|
294
|
+
|
242
295
|
if not response.nil?
|
243
|
-
contents += "- Body
|
296
|
+
contents += "- **Body:**\n\n```json\n#{pretty(response)}\n```\n\n"
|
244
297
|
else
|
245
298
|
contents += "\n"
|
246
299
|
end
|
300
|
+
|
247
301
|
contents += "## Example\n\n"
|
248
|
-
|
302
|
+
|
303
|
+
contents +=
|
249
304
|
"```bash
|
250
305
|
curl -X #{method.to_s.upcase} \\\n"
|
251
|
-
headers.to_h.each do |key, value|
|
252
|
-
contents +=
|
253
|
-
" -H \
|
306
|
+
headers.to_h.each do |key, value|
|
307
|
+
contents +=
|
308
|
+
" -H \'#{key}: #{value}\' \\\n"
|
254
309
|
end
|
255
310
|
if not body.nil?
|
256
|
-
contents +=
|
257
|
-
" -d '#{body.
|
311
|
+
contents +=
|
312
|
+
" -d '#{pretty(body).gsub /\n/, "\n "}' \\\n"
|
258
313
|
end
|
259
|
-
contents +=
|
260
|
-
" \"#{url}\"
|
314
|
+
contents +=
|
315
|
+
" \"#{ URI::join(read_doc_base_url, url) }\"
|
261
316
|
```"
|
317
|
+
|
318
|
+
save_doc resource, action, contents
|
319
|
+
end
|
320
|
+
|
321
|
+
|
322
|
+
# custom attributes must follow this form:
|
323
|
+
# customer_attributes =
|
324
|
+
# key:
|
325
|
+
# kind: [text | code]
|
326
|
+
# content: [text]
|
327
|
+
def make_custom_doc resource, action, desc, custom_attributes
|
328
|
+
contents = ""
|
329
|
+
contents += "# #{action.humanize}\n\n"
|
330
|
+
contents += "#{desc.humanize}\n\n"
|
331
|
+
|
332
|
+
custom_attributes.each do |key, value|
|
333
|
+
if value[:kind] == :text
|
334
|
+
contents += "- **#{key.to_s.humanize}:** #{value[:content]}\n"
|
335
|
+
elsif value[:kind] == :code
|
336
|
+
contents += "- **#{key.to_s.humanize}:**\n\n```\n#{value[:content]}\n```\n\n"
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
save_doc resource, action, contents
|
341
|
+
end
|
342
|
+
|
343
|
+
|
344
|
+
def save_doc resource, action, contents
|
262
345
|
resource_directory = File.join( read_doc_directory, resource.pluralize.capitalize )
|
263
346
|
FileUtils.mkdir_p(resource_directory) unless File.exists?( resource_directory )
|
264
347
|
file_path = File.join( resource_directory, "#{action.capitalize}.md" )
|
265
348
|
File.open(file_path, 'w') {|f| f.write(contents) }
|
266
349
|
end
|
267
350
|
|
351
|
+
def pretty json
|
352
|
+
begin
|
353
|
+
pretty_json = JSON.pretty_generate(json)
|
354
|
+
rescue => e
|
355
|
+
pretty_json = json
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
268
359
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flunk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Kirk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A gem for testing Ruby on Rails web APIs by simulating a client.
|
14
14
|
email: atomkirk@gmail.com
|
@@ -30,17 +30,17 @@ require_paths:
|
|
30
30
|
- lib
|
31
31
|
required_ruby_version: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- -
|
33
|
+
- - ">="
|
34
34
|
- !ruby/object:Gem::Version
|
35
35
|
version: '0'
|
36
36
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
requirements: []
|
42
42
|
rubyforge_project:
|
43
|
-
rubygems_version: 2.2.
|
43
|
+
rubygems_version: 2.2.2
|
44
44
|
signing_key:
|
45
45
|
specification_version: 4
|
46
46
|
summary: A gem for testing Ruby on Rails web APIs by simulating a client.
|