api_docs 1.0.4 → 1.0.5
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/README.md +5 -3
- data/VERSION +1 -1
- data/api_docs.gemspec +2 -2
- data/app/views/api_docs/docs/_action.html.erb +3 -1
- data/lib/api_docs/test_helper.rb +8 -12
- data/test/dummy/app/controllers/application_controller.rb +25 -6
- data/test/test_helper_test.rb +28 -21
- metadata +3 -3
data/README.md
CHANGED
@@ -30,7 +30,7 @@ Documentation is automatically generated into yaml files from tests you create t
|
|
30
30
|
class UsersTest < ActionDispatch::IntegrationTest
|
31
31
|
def test_get_user
|
32
32
|
user = users(:default)
|
33
|
-
api_call(:get, '/users/:id', :id => user.to_param) do |doc|
|
33
|
+
api_call(:get, '/users/:id', :id => user.to_param, :format => 'json') do |doc|
|
34
34
|
assert_response :success
|
35
35
|
assert_equal ({
|
36
36
|
'id' => user.id,
|
@@ -40,7 +40,7 @@ class UsersTest < ActionDispatch::IntegrationTest
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def test_get_user_failure
|
43
|
-
api_call(:get, '/users/:id', :id => 'invalid') do |doc|
|
43
|
+
api_call(:get, '/users/:id', :id => 'invalid', :format => 'json') do |doc|
|
44
44
|
doc.description = 'When bad user id is passed'
|
45
45
|
assert_response :not_found
|
46
46
|
assert_equal ({
|
@@ -60,6 +60,7 @@ show:
|
|
60
60
|
path: /users/:id
|
61
61
|
params:
|
62
62
|
id: 12345
|
63
|
+
format: json
|
63
64
|
status: 200
|
64
65
|
body:
|
65
66
|
id: 12345
|
@@ -70,6 +71,7 @@ show:
|
|
70
71
|
path: /users/:id
|
71
72
|
params:
|
72
73
|
id: invalid
|
74
|
+
format: json
|
73
75
|
status: 404
|
74
76
|
body:
|
75
77
|
message: User not found
|
@@ -101,4 +103,4 @@ end
|
|
101
103
|
|
102
104
|
---
|
103
105
|
|
104
|
-
Copyright 2012 Oleg Khabarov, Jack Neto, [The Working Group, Inc](http://twg.ca)
|
106
|
+
Copyright 2012 Oleg Khabarov, Jack Neto, [The Working Group, Inc](http://twg.ca)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.5
|
data/api_docs.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "api_docs"
|
8
|
-
s.version = "1.0.
|
8
|
+
s.version = "1.0.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Oleg Khabarov", "Jack Neto", "The Working Group Inc."]
|
12
|
-
s.date = "
|
12
|
+
s.date = "2013-02-28"
|
13
13
|
s.description = "Generate API documentation using integration tests in Ruby on Rails 3"
|
14
14
|
s.email = "jack@twg.ca"
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/api_docs/test_helper.rb
CHANGED
@@ -6,7 +6,7 @@ module ApiDocs::TestHelper
|
|
6
6
|
# doc.description = 'Something for the docs'
|
7
7
|
# ... regular test code
|
8
8
|
# end
|
9
|
-
def api_call(method, path, params = { }
|
9
|
+
def api_call(method, path, params = { })
|
10
10
|
parsed_params = params.dup
|
11
11
|
parsed_path = path.dup
|
12
12
|
|
@@ -18,7 +18,8 @@ module ApiDocs::TestHelper
|
|
18
18
|
# get '/users/12345'
|
19
19
|
doc = OpenStruct.new
|
20
20
|
send(method, parsed_path, parsed_params)
|
21
|
-
|
21
|
+
|
22
|
+
yield doc if block_given?
|
22
23
|
|
23
24
|
# Assertions inside test block didn't fail. Preparing file
|
24
25
|
# content to be written
|
@@ -27,11 +28,10 @@ module ApiDocs::TestHelper
|
|
27
28
|
|
28
29
|
file_path = File.expand_path("#{c.gsub('/', ':')}.yml", ApiDocs.config.docs_path)
|
29
30
|
params = api_deep_clean_params(params)
|
30
|
-
body = JSON.parse(response.body)
|
31
31
|
|
32
32
|
# Marking response as an unique
|
33
33
|
key = 'ID-' + Digest::MD5.hexdigest("
|
34
|
-
#{method}#{path}#{params}#{response.status}
|
34
|
+
#{method}#{path}#{doc.description}#{params}#{response.status}}
|
35
35
|
")
|
36
36
|
|
37
37
|
data = if File.exists?(file_path)
|
@@ -47,7 +47,7 @@ module ApiDocs::TestHelper
|
|
47
47
|
'path' => path,
|
48
48
|
'params' => api_deep_clean_params(params),
|
49
49
|
'status' => response.status,
|
50
|
-
'body' => body
|
50
|
+
'body' => response.body
|
51
51
|
}
|
52
52
|
FileUtils.mkdir_p(File.dirname(file_path))
|
53
53
|
File.open(file_path, 'w'){|f| f.write(data.to_yaml)}
|
@@ -55,18 +55,14 @@ module ApiDocs::TestHelper
|
|
55
55
|
|
56
56
|
# Cleans up params. Removes things like File object handlers
|
57
57
|
# Sets up ignored values so we don't generate new keys for same data
|
58
|
-
def api_deep_clean_params(params
|
58
|
+
def api_deep_clean_params(params)
|
59
59
|
case params
|
60
60
|
when Hash
|
61
61
|
params.each_with_object({}) do |(key, value), res|
|
62
|
-
|
63
|
-
res[key.to_s] = 'IGNORED'
|
64
|
-
else
|
65
|
-
res[key.to_s] = api_deep_clean_params(value, as_response)
|
66
|
-
end
|
62
|
+
res[key.to_s] = api_deep_clean_params(value)
|
67
63
|
end
|
68
64
|
when Array
|
69
|
-
params.collect{|value| api_deep_clean_params(value
|
65
|
+
params.collect{|value| api_deep_clean_params(value)}
|
70
66
|
else
|
71
67
|
case params
|
72
68
|
when Rack::Test::UploadedFile
|
@@ -2,11 +2,22 @@ class ApplicationController < ActionController::Base
|
|
2
2
|
protect_from_forgery
|
3
3
|
|
4
4
|
def index
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
respond_to do |format|
|
6
|
+
format.json {
|
7
|
+
render :text => [{
|
8
|
+
:id => 1,
|
9
|
+
:name => 'Test User',
|
10
|
+
:created_at => 1.day.ago
|
11
|
+
}].to_json
|
12
|
+
}
|
13
|
+
format.xml {
|
14
|
+
render :text => [{
|
15
|
+
:id => 1,
|
16
|
+
:name => 'Test User',
|
17
|
+
:created_at => 1.day.ago
|
18
|
+
}].to_xml(:root => 'users')
|
19
|
+
}
|
20
|
+
end
|
10
21
|
end
|
11
22
|
|
12
23
|
def show
|
@@ -20,6 +31,14 @@ class ApplicationController < ActionController::Base
|
|
20
31
|
end
|
21
32
|
|
22
33
|
response.merge!(:created_at => rand.days.ago) if params[:random]
|
23
|
-
|
34
|
+
|
35
|
+
respond_to do |format|
|
36
|
+
format.json do
|
37
|
+
render :text => response.to_json, :status => status
|
38
|
+
end
|
39
|
+
format.xml do
|
40
|
+
render :text => response.to_xml(:root => 'user'), :status => status
|
41
|
+
end
|
42
|
+
end
|
24
43
|
end
|
25
44
|
end
|
data/test/test_helper_test.rb
CHANGED
@@ -28,17 +28,8 @@ class TestHelperTest < ActionDispatch::IntegrationTest
|
|
28
28
|
api_deep_clean_params({:a => Rack::Test::UploadedFile.new(__FILE__)})
|
29
29
|
end
|
30
30
|
|
31
|
-
def test_api_deep_clean_params_with_ignored_params
|
32
|
-
ApiDocs.config.ignored_attributes = ['c']
|
33
|
-
assert_equal ({'c' => 'IGNORED'}),
|
34
|
-
api_deep_clean_params({:c => 'c'}, :as_response)
|
35
|
-
|
36
|
-
assert_equal ({'a' => [{'b' => 'c', 'c' => 'IGNORED'}]}),
|
37
|
-
api_deep_clean_params({:a => [:b => 'c', :c => 'd']}, :as_response)
|
38
|
-
end
|
39
|
-
|
40
31
|
def test_api_call
|
41
|
-
api_call(:get, '/users/:id', :id => 12345) do |doc|
|
32
|
+
api_call(:get, '/users/:id', :id => 12345, :format => 'json') do |doc|
|
42
33
|
assert_response :success
|
43
34
|
assert_equal ({
|
44
35
|
'id' => 12345,
|
@@ -46,7 +37,7 @@ class TestHelperTest < ActionDispatch::IntegrationTest
|
|
46
37
|
}), JSON.parse(response.body)
|
47
38
|
end
|
48
39
|
|
49
|
-
api_call(:get, '/users/:id', :id => 'invalid') do |doc|
|
40
|
+
api_call(:get, '/users/:id', :id => 'invalid', :format => 'json') do |doc|
|
50
41
|
doc.description = 'Invalid user id'
|
51
42
|
assert_response :not_found
|
52
43
|
assert_equal ({
|
@@ -68,27 +59,27 @@ class TestHelperTest < ActionDispatch::IntegrationTest
|
|
68
59
|
object = output['show'][output['show'].keys.first]
|
69
60
|
assert_equal 'GET', object['method']
|
70
61
|
assert_equal '/users/:id', object['path']
|
71
|
-
assert_equal ({'id' => '12345'}),
|
62
|
+
assert_equal ({'id' => '12345', 'format' => 'json'}), object['params']
|
72
63
|
assert_equal 200, object['status']
|
73
|
-
assert_equal ({'id' => 12345, 'name' => 'Test User'}), object['body']
|
64
|
+
assert_equal ({'id' => 12345, 'name' => 'Test User'}), JSON.parse(object['body'])
|
74
65
|
|
75
66
|
object = output['show'][output['show'].keys.last]
|
76
|
-
assert_equal 'GET',
|
77
|
-
assert_equal '/users/:id',
|
78
|
-
assert_equal ({'id' => 'invalid'}),
|
79
|
-
assert_equal 404,
|
80
|
-
assert_equal ({'message' => 'User not found'}),
|
67
|
+
assert_equal 'GET', object['method']
|
68
|
+
assert_equal '/users/:id', object['path']
|
69
|
+
assert_equal ({'id' => 'invalid', 'format' => 'json'}), object['params']
|
70
|
+
assert_equal 404, object['status']
|
71
|
+
assert_equal ({'message' => 'User not found'}), JSON.parse(object['body'])
|
81
72
|
end
|
82
73
|
|
83
74
|
def test_api_call_with_ignored_attribute
|
84
|
-
api_call(:get, '/users/:id', :id => 12345) do
|
75
|
+
api_call(:get, '/users/:id', :id => 12345, :format => 'json') do
|
85
76
|
assert_response :success
|
86
77
|
end
|
87
78
|
output = YAML.load_file(ApiDocs.config.docs_path.join('application.yml'))
|
88
79
|
assert_equal 1, output['show'].keys.size
|
89
80
|
|
90
81
|
ApiDocs.config.ignored_attributes << 'random'
|
91
|
-
api_call(:get, '/users/:id', :id => 12345, :random => 1) do
|
82
|
+
api_call(:get, '/users/:id', :id => 12345, :random => 1, :format => 'json') do
|
92
83
|
assert_response :success
|
93
84
|
end
|
94
85
|
output = YAML.load_file(ApiDocs.config.docs_path.join('application.yml'))
|
@@ -96,11 +87,27 @@ class TestHelperTest < ActionDispatch::IntegrationTest
|
|
96
87
|
object = output['show'][output['show'].keys.last]
|
97
88
|
assert_not_equal 'IGNORED', object['body']['random']
|
98
89
|
|
99
|
-
api_call(:get, '/users/:id', :id => 12345, :random => 1) do
|
90
|
+
api_call(:get, '/users/:id', :id => 12345, :random => 1, :format => 'json') do
|
100
91
|
assert_response :success
|
101
92
|
end
|
102
93
|
output = YAML.load_file(ApiDocs.config.docs_path.join('application.yml'))
|
103
94
|
assert_equal 2, output['show'].keys.size
|
104
95
|
end
|
96
|
+
|
97
|
+
def test_api_call_with_xml
|
98
|
+
api_call(:get, '/users/:id', :id => 12345, :format => 'xml') do
|
99
|
+
assert_response :success
|
100
|
+
xml_response = <<-eoxml
|
101
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
102
|
+
<user>
|
103
|
+
<id type="integer">12345</id>
|
104
|
+
<name>Test User</name>
|
105
|
+
</user>
|
106
|
+
eoxml
|
107
|
+
assert_equal xml_response, response.body
|
108
|
+
end
|
109
|
+
output = YAML.load_file(ApiDocs.config.docs_path.join('application.yml'))
|
110
|
+
assert_equal 1, output['show'].keys.size
|
111
|
+
end
|
105
112
|
|
106
113
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: api_docs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2013-02-28 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rails
|
@@ -143,7 +143,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
143
143
|
version: '0'
|
144
144
|
segments:
|
145
145
|
- 0
|
146
|
-
hash:
|
146
|
+
hash: -620307920657419595
|
147
147
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
148
|
none: false
|
149
149
|
requirements:
|