respect-rails 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/FAQ.md +98 -0
- data/MIT-LICENSE +20 -0
- data/README.md +291 -0
- data/RELATED_WORK.md +47 -0
- data/RELEASE_NOTES.md +20 -0
- data/Rakefile +32 -0
- data/app/assets/javascripts/respect/rails/schemas.js +32 -0
- data/app/assets/stylesheets/respect/rails/schemas.css +160 -0
- data/app/controllers/respect/rails/schemas_controller.rb +36 -0
- data/app/helpers/respect/rails/schemas_helper.rb +78 -0
- data/app/views/layouts/respect/rails/schemas.html.erb +14 -0
- data/app/views/respect/rails/request_validation_exception.html.erb +38 -0
- data/app/views/respect/rails/schemas/doc.html.erb +158 -0
- data/app/views/respect/rails/schemas/index.html.erb +4 -0
- data/config/routes.rb +4 -0
- data/lib/respect/rails/action_def.rb +37 -0
- data/lib/respect/rails/action_schema.rb +41 -0
- data/lib/respect/rails/application_info.rb +26 -0
- data/lib/respect/rails/controller_helper.rb +107 -0
- data/lib/respect/rails/engine.rb +63 -0
- data/lib/respect/rails/engine_info.rb +27 -0
- data/lib/respect/rails/headers_helper.rb +11 -0
- data/lib/respect/rails/headers_simplifier.rb +31 -0
- data/lib/respect/rails/info.rb +72 -0
- data/lib/respect/rails/request_def.rb +38 -0
- data/lib/respect/rails/request_helper.rb +101 -0
- data/lib/respect/rails/request_schema.rb +102 -0
- data/lib/respect/rails/response_def.rb +43 -0
- data/lib/respect/rails/response_helper.rb +67 -0
- data/lib/respect/rails/response_schema.rb +84 -0
- data/lib/respect/rails/response_schema_set.rb +60 -0
- data/lib/respect/rails/route_info.rb +101 -0
- data/lib/respect/rails/version.rb +5 -0
- data/lib/respect/rails.rb +74 -0
- data/lib/tasks/respect_tasks.rake +4 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/controllers/automatic_validation_controller.rb +300 -0
- data/test/dummy/app/controllers/caught_exception_controller.rb +58 -0
- data/test/dummy/app/controllers/disabled_controller.rb +37 -0
- data/test/dummy/app/controllers/manual_validation_controller.rb +63 -0
- data/test/dummy/app/controllers/no_schema_controller.rb +17 -0
- data/test/dummy/app/controllers/skipped_automatic_validation_controller.rb +35 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/helpers/respect/application_macros.rb +10 -0
- data/test/dummy/app/helpers/respect/circle_schema.rb +16 -0
- data/test/dummy/app/helpers/respect/point_schema.rb +19 -0
- data/test/dummy/app/helpers/respect/rgba_schema.rb +18 -0
- data/test/dummy/app/views/automatic_validation/request_format.html.erb +1 -0
- data/test/dummy/app/views/automatic_validation/request_format.pdf.erb +1 -0
- data/test/dummy/app/views/caught_exception/response_validator.html.erb +1 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config/application.rb +58 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/respect.rb +9 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +38 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/schema.rb +16 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/lib/exts/Rgba.rb +11 -0
- data/test/dummy/lib/exts/circle.rb +11 -0
- data/test/dummy/lib/exts/point.rb +11 -0
- data/test/dummy/log/development.log +6 -0
- data/test/dummy/log/test.log +851 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/functional/automatic_validation_controller_test.rb +131 -0
- data/test/functional/caught_exception_controller_test.rb +50 -0
- data/test/functional/disabled_controller_test.rb +16 -0
- data/test/functional/manual_validation_controller_test.rb +24 -0
- data/test/functional/no_schema_controller_test.rb +12 -0
- data/test/functional/respect/rails/schemas_controller_test.rb +18 -0
- data/test/functional/skipped_automatic_validation_controller_test.rb +12 -0
- data/test/headers_can_dumped_in_json.sh +33 -0
- data/test/integration/navigation_test.rb +38 -0
- data/test/request_headers_validation_in_dev_mode.sh +33 -0
- data/test/test_helper.rb +17 -0
- data/test/unit/action_schema_test.rb +21 -0
- data/test/unit/application_info_test.rb +11 -0
- data/test/unit/controller_helper_test.rb +4 -0
- data/test/unit/engine_info_test.rb +11 -0
- data/test/unit/engine_test.rb +7 -0
- data/test/unit/info_test.rb +42 -0
- data/test/unit/request_def_test.rb +22 -0
- data/test/unit/request_helper_test.rb +67 -0
- data/test/unit/request_schema_test.rb +164 -0
- data/test/unit/response_def_test.rb +9 -0
- data/test/unit/response_helper_test.rb +73 -0
- data/test/unit/response_schema_set_test.rb +18 -0
- data/test/unit/response_schema_test.rb +147 -0
- metadata +334 -0
@@ -0,0 +1,67 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class RequestHelperTest < Test::Unit::TestCase
|
4
|
+
def test_successful_request_validation
|
5
|
+
request = Object.new
|
6
|
+
request.extend(Respect::Rails::RequestHelper)
|
7
|
+
schema = mock()
|
8
|
+
schema.stubs(:validate?).with(request).returns(true).once
|
9
|
+
request.stubs(:request_schema).with().returns(schema)
|
10
|
+
Benchmark.stubs(:realtime).with().yields().returns(1.2345) # 1234.5 seconds.
|
11
|
+
::Rails.logger.stubs(:info).with(" Request validation: success (1234.5ms)").once
|
12
|
+
assert_nothing_raised do
|
13
|
+
request.validate_schema
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_failed_request_validation
|
18
|
+
request = Object.new
|
19
|
+
request.extend(Respect::Rails::RequestHelper)
|
20
|
+
schema = mock()
|
21
|
+
schema.stubs(:validate?).with(request).returns(false).once
|
22
|
+
error = RuntimeError.new("test error")
|
23
|
+
error.stubs(:context).with().returns(["foo", "bar"])
|
24
|
+
schema.stubs(:last_error).with().returns(error)
|
25
|
+
request.stubs(:request_schema).with().returns(schema)
|
26
|
+
Benchmark.stubs(:realtime).with().yields().returns(1.2345) # 1234.5 seconds.
|
27
|
+
::Rails.logger.stubs(:info).with(" Request validation: failure (1234.5ms)").once
|
28
|
+
::Rails.logger.stubs(:info).with(" foo").once
|
29
|
+
::Rails.logger.stubs(:info).with(" bar").once
|
30
|
+
begin
|
31
|
+
request.validate_schema
|
32
|
+
assert false, "nothing raised"
|
33
|
+
rescue RuntimeError => e
|
34
|
+
assert_equal error, e
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_none_request_validation
|
39
|
+
request = Object.new
|
40
|
+
request.extend(Respect::Rails::RequestHelper)
|
41
|
+
request.stubs(:params).with().never
|
42
|
+
schema = mock()
|
43
|
+
schema.stubs(:validate!).never
|
44
|
+
request.stubs(:request_schema).with().returns(nil)
|
45
|
+
Benchmark.stubs(:realtime).with().yields().returns(1.2345) # 1234.5 seconds.
|
46
|
+
::Rails.logger.stubs(:info).with(" Request validation: none (1234.5ms)").once
|
47
|
+
assert_nothing_raised do
|
48
|
+
request.validate_schema
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_request_validation_schema_query_on_success
|
53
|
+
request = Object.new
|
54
|
+
request.extend(Respect::Rails::RequestHelper)
|
55
|
+
request.stubs(:validate_schema).returns(true)
|
56
|
+
assert_equal(true, request.validate_schema?)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_request_validation_schema_query_on_failure
|
60
|
+
error = mock()
|
61
|
+
error.stubs(:context).returns([])
|
62
|
+
request = Object.new
|
63
|
+
request.extend(Respect::Rails::RequestHelper)
|
64
|
+
request.stubs(:validate_schema).raises(Respect::Rails::RequestValidationError.new(error, :path, {}))
|
65
|
+
assert_equal(false, request.validate_schema?)
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,164 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class RequestSchemaTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@rs = Respect::Rails::RequestSchema.new("ctrl", "action")
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_default_path_parameters
|
9
|
+
assert_equal "ctrl", @rs.default_path_parameters["controller"].options[:equal_to]
|
10
|
+
assert_equal false, @rs.default_path_parameters["controller"].doc
|
11
|
+
assert_equal "action", @rs.default_path_parameters["action"].options[:equal_to]
|
12
|
+
assert_equal false, @rs.default_path_parameters["action"].doc
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_path_parameters_are_merged_with_default
|
16
|
+
params = Respect::HashSchema.new
|
17
|
+
result = Respect::HashSchema.new
|
18
|
+
@rs.default_path_parameters.stubs(:merge).with(params).returns(result).once
|
19
|
+
assert_not_equal result.object_id, @rs.path_parameters.object_id
|
20
|
+
assert_equal result.object_id, @rs.public_send(:path_parameters=, params).object_id
|
21
|
+
assert_equal result.object_id, @rs.path_parameters.object_id
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_validate_all_parameters
|
25
|
+
Respect::Rails::Engine.stubs(:disable_request_headers_validation).returns(false)
|
26
|
+
request = mock()
|
27
|
+
headers = {}
|
28
|
+
request.stubs(:headers).with().returns(headers).at_least_once
|
29
|
+
@rs.headers.stubs(:validate).with(headers).once
|
30
|
+
params = {}
|
31
|
+
request.stubs(:params).with().returns(params).at_least_once
|
32
|
+
@rs.path_parameters.stubs(:validate).with(params).once
|
33
|
+
@rs.path_parameters.stubs(:sanitized_object).returns(params).once
|
34
|
+
@rs.query_parameters.stubs(:validate).with(params).once
|
35
|
+
@rs.query_parameters.stubs(:sanitized_object).returns(params).once
|
36
|
+
@rs.body_parameters.stubs(:validate).with(params).once
|
37
|
+
@rs.body_parameters.stubs(:sanitized_object).returns(params).once
|
38
|
+
assert_equal true, @rs.validate(request)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_validate_raise_request_validation_error_on_path_params_validation_error
|
42
|
+
Respect::Rails::Engine.stubs(:disable_request_headers_validation).returns(false)
|
43
|
+
request = mock()
|
44
|
+
headers = {}
|
45
|
+
request.stubs(:headers).with().returns(headers).at_least_once
|
46
|
+
params = {}
|
47
|
+
request.stubs(:params).with().returns(params).at_least_once
|
48
|
+
@rs.path_parameters.stubs(:validate).with(params).raises(Respect::ValidationError.new("error message")).once
|
49
|
+
@rs.query_parameters.stubs(:validate).with(params)
|
50
|
+
@rs.body_parameters.stubs(:validate).with(params)
|
51
|
+
begin
|
52
|
+
@rs.validate(request)
|
53
|
+
assert false, "nothing raised"
|
54
|
+
rescue Respect::Rails::RequestValidationError => e
|
55
|
+
assert e.error.is_a?(Respect::ValidationError)
|
56
|
+
assert_equal "error message; in path", e.message
|
57
|
+
assert e.part.path?
|
58
|
+
assert_equal params, e.object
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_validate_raise_request_validation_error_on_query_params_validation_error
|
63
|
+
Respect::Rails::Engine.stubs(:disable_request_headers_validation).returns(false)
|
64
|
+
request = mock()
|
65
|
+
headers = {}
|
66
|
+
request.stubs(:headers).with().returns(headers).at_least_once
|
67
|
+
params = {}
|
68
|
+
request.stubs(:params).with().returns(params).at_least_once
|
69
|
+
@rs.path_parameters.stubs(:validate).with(params)
|
70
|
+
@rs.query_parameters.stubs(:validate).with(params).raises(Respect::ValidationError.new("error message")).once
|
71
|
+
@rs.body_parameters.stubs(:validate).with(params)
|
72
|
+
begin
|
73
|
+
@rs.validate(request)
|
74
|
+
assert false, "nothing raised"
|
75
|
+
rescue Respect::Rails::RequestValidationError => e
|
76
|
+
assert e.error.is_a?(Respect::ValidationError)
|
77
|
+
assert_equal "error message; in query", e.message
|
78
|
+
assert e.part.query?
|
79
|
+
assert_equal params, e.object
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_validate_raise_request_validation_error_on_body_params_validation_error
|
84
|
+
Respect::Rails::Engine.stubs(:disable_request_headers_validation).returns(false)
|
85
|
+
request = mock()
|
86
|
+
headers = {}
|
87
|
+
request.stubs(:headers).with().returns(headers).at_least_once
|
88
|
+
params = {}
|
89
|
+
request.stubs(:params).with().returns(params).at_least_once
|
90
|
+
@rs.path_parameters.stubs(:validate).with(params)
|
91
|
+
@rs.query_parameters.stubs(:validate).with(params)
|
92
|
+
@rs.body_parameters.stubs(:validate).with(params).raises(Respect::ValidationError.new("error message")).once
|
93
|
+
begin
|
94
|
+
@rs.validate(request)
|
95
|
+
assert false, "nothing raised"
|
96
|
+
rescue Respect::Rails::RequestValidationError => e
|
97
|
+
assert e.error.is_a?(Respect::ValidationError)
|
98
|
+
assert_equal "error message; in body", e.message
|
99
|
+
assert e.part.body?
|
100
|
+
assert_equal params, e.object
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_validate_raise_request_validation_error_on_headers_validation_error
|
105
|
+
Respect::Rails::Engine.stubs(:disable_request_headers_validation).returns(false)
|
106
|
+
request = mock()
|
107
|
+
headers = {}
|
108
|
+
request.stubs(:headers).with().returns(headers).at_least_once
|
109
|
+
@rs.headers.stubs(:validate).with(headers).raises(Respect::ValidationError.new("error message")).once
|
110
|
+
simplified_headers = {}
|
111
|
+
@rs.stubs(:simplify_headers).with(headers).returns(simplified_headers).once
|
112
|
+
params = {}
|
113
|
+
request.stubs(:params).with().returns(params)
|
114
|
+
@rs.path_parameters.stubs(:validate).with(params)
|
115
|
+
@rs.query_parameters.stubs(:validate).with(params)
|
116
|
+
@rs.body_parameters.stubs(:validate).with(params)
|
117
|
+
begin
|
118
|
+
@rs.validate(request)
|
119
|
+
assert false, "nothing raised"
|
120
|
+
rescue Respect::Rails::RequestValidationError => e
|
121
|
+
assert e.error.is_a?(Respect::ValidationError)
|
122
|
+
assert_equal "error message; in headers", e.message
|
123
|
+
assert e.part.headers?
|
124
|
+
assert_equal simplified_headers.object_id, e.object.object_id
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_validate_query_returns_true_when_no_error
|
129
|
+
request = mock()
|
130
|
+
@rs.stubs(:validate).with(request).returns(nil)
|
131
|
+
assert_equal true, @rs.validate?(request)
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_validate_query_returns_false_on_error_and_store_last_error
|
135
|
+
doc = {}
|
136
|
+
error = Respect::Rails::RequestValidationError.new(Respect::ValidationError.new("message"), :path, {})
|
137
|
+
@rs.stubs(:validate).with(doc).raises(error).once
|
138
|
+
assert_equal false, @rs.validate?(doc)
|
139
|
+
assert_equal error, @rs.last_error
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_validate_shebang_returns_true_on_success_and_sanitize
|
143
|
+
request = mock()
|
144
|
+
@rs.stubs(:validate?).with(request).returns(true).once
|
145
|
+
@rs.stubs(:sanitize!).with(request).once
|
146
|
+
assert_equal true, @rs.validate!(request)
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_validate_shebang_returns_false_on_failure
|
150
|
+
request = mock()
|
151
|
+
@rs.stubs(:validate?).with(request).returns(false).once
|
152
|
+
assert_equal false, @rs.validate!(request)
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_sanitize_all_params
|
156
|
+
request = mock()
|
157
|
+
params = mock()
|
158
|
+
request.stubs(:params).with().returns(params).at_least_once
|
159
|
+
@rs.path_parameters.stubs(:sanitize_object!).with(params).once
|
160
|
+
@rs.query_parameters.stubs(:sanitize_object!).with(params).once
|
161
|
+
@rs.body_parameters.stubs(:sanitize_object!).with(params).once
|
162
|
+
@rs.sanitize!(request)
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class ResponseHelperTest < Test::Unit::TestCase
|
4
|
+
def test_successful_response_validation
|
5
|
+
response = Object.new
|
6
|
+
response.extend(Respect::Rails::ResponseHelper)
|
7
|
+
body = ""
|
8
|
+
schema = mock()
|
9
|
+
response.stubs(:schema).with().returns(schema)
|
10
|
+
response.stubs(:content_type).with().returns(Mime::JSON)
|
11
|
+
schema.stubs(:validate?).with(response).returns(true).once
|
12
|
+
Benchmark.stubs(:realtime).with().yields().returns(1.2345) # 1234.5 seconds.
|
13
|
+
Rails.logger.stubs(:info).with(" Response validation: success (1234.5ms)").once
|
14
|
+
assert_nothing_raised do
|
15
|
+
response.validate_schema
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_failed_response_validation
|
20
|
+
response = Object.new
|
21
|
+
response.extend(Respect::Rails::ResponseHelper)
|
22
|
+
body = ""
|
23
|
+
schema = mock()
|
24
|
+
response.stubs(:schema).with().returns(schema)
|
25
|
+
response.stubs(:content_type).with().returns(Mime::JSON)
|
26
|
+
schema.stubs(:validate?).with(response).returns(false).once
|
27
|
+
error = RuntimeError.new("test error")
|
28
|
+
error.stubs(:context).with().returns(["foo", "bar"])
|
29
|
+
schema.stubs(:last_error).with().returns(error)
|
30
|
+
Benchmark.stubs(:realtime).with().yields().returns(1.2345) # 1234.5 seconds.
|
31
|
+
Rails.logger.stubs(:info).with(" Response validation: failure (1234.5ms)").once
|
32
|
+
Rails.logger.stubs(:info).with(" foo").once
|
33
|
+
Rails.logger.stubs(:info).with(" bar").once
|
34
|
+
begin
|
35
|
+
response.validate_schema
|
36
|
+
assert false, "nothing raised"
|
37
|
+
rescue RuntimeError => e
|
38
|
+
assert_equal error, e
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_none_response_validation
|
43
|
+
response = Object.new
|
44
|
+
response.extend(Respect::Rails::ResponseHelper)
|
45
|
+
body = ""
|
46
|
+
schema = mock()
|
47
|
+
response.stubs(:schema).with().returns(nil)
|
48
|
+
response.stubs(:body).with().never
|
49
|
+
response.stubs(:content_type).with().never
|
50
|
+
schema.stubs(:validate?).never
|
51
|
+
Benchmark.stubs(:realtime).with().yields().returns(1.2345) # 1234.5 seconds.
|
52
|
+
::Rails.logger.stubs(:info).with(" Response validation: none (1234.5ms)").once
|
53
|
+
assert_nothing_raised do
|
54
|
+
response.validate_schema
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_response_validation_schema_query_on_success
|
59
|
+
response = Object.new
|
60
|
+
response.extend(Respect::Rails::ResponseHelper)
|
61
|
+
response.stubs(:validate_schema).returns(true)
|
62
|
+
assert_equal(true, response.validate_schema?)
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_response_validation_schema_query_on_failure
|
66
|
+
error = mock()
|
67
|
+
error.stubs(:context).returns([])
|
68
|
+
response = Object.new
|
69
|
+
response.extend(Respect::Rails::ResponseHelper)
|
70
|
+
response.stubs(:validate_schema).raises(Respect::Rails::ResponseValidationError.new(error, :body, {}))
|
71
|
+
assert_equal(false, response.validate_schema?)
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class ResponseSchemaSetTest < Test::Unit::TestCase
|
4
|
+
def test_respond_to_object_method
|
5
|
+
assert_respond_to Respect::Rails::ResponseSchemaSet.new("automatic_validation", "response_schema_from_file"), :class
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_normalize_status
|
9
|
+
assert_equal :ok, Respect::Rails::ResponseSchemaSet.symbolize_status(:ok)
|
10
|
+
assert_equal :ok, Respect::Rails::ResponseSchemaSet.symbolize_status("ok")
|
11
|
+
assert_equal :ok, Respect::Rails::ResponseSchemaSet.symbolize_status(200)
|
12
|
+
assert_equal :ok, Respect::Rails::ResponseSchemaSet.symbolize_status("200")
|
13
|
+
assert_equal :ok, Respect::Rails::ResponseSchemaSet.symbolize_status(200.5)
|
14
|
+
assert_raises(ArgumentError) do
|
15
|
+
Respect::Rails::ResponseSchemaSet.symbolize_status(Object.new)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class ResponseSchemaTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@rs = Respect::Rails::ResponseSchema.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_define_with_block
|
9
|
+
s = Respect::HashSchema.define do |s|
|
10
|
+
s.integer "result"
|
11
|
+
end
|
12
|
+
block_def = Proc.new do |r|
|
13
|
+
r.body do |s|
|
14
|
+
s.integer "result"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
rs = Respect::Rails::ResponseSchema.define(:ok, &block_def)
|
18
|
+
assert_equal :ok, rs.status
|
19
|
+
assert_equal s, rs.body
|
20
|
+
|
21
|
+
rs = Respect::Rails::ResponseSchema.define(&block_def)
|
22
|
+
assert_equal :ok, rs.status
|
23
|
+
assert_equal s, rs.body
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_duplicata_are_equal
|
27
|
+
s = Respect::Rails::ResponseSchema.new(:ok)
|
28
|
+
assert_equal s, s.dup
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_differs_from_status
|
32
|
+
s1 = Respect::Rails::ResponseSchema.new(:ok)
|
33
|
+
s2 = Respect::Rails::ResponseSchema.new(:created)
|
34
|
+
assert(s1 != s2)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_differs_from_body
|
38
|
+
s1 = Respect::Rails::ResponseSchema.new
|
39
|
+
s1.body = Respect::IntegerSchema.new
|
40
|
+
s2 = Respect::Rails::ResponseSchema.new
|
41
|
+
s2.body = Respect::StringSchema.new
|
42
|
+
assert(s1 != s2)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_define_from_file
|
46
|
+
# Prepare mock file name and contents
|
47
|
+
filename = "/path/to/definition_file.rb"
|
48
|
+
file_content = <<-EOS.strip_heredoc
|
49
|
+
body do |s|
|
50
|
+
s.integer "result"
|
51
|
+
end
|
52
|
+
EOS
|
53
|
+
File.stubs(:read).with(filename).returns(file_content)
|
54
|
+
# Compute the expected response schema.
|
55
|
+
expected_response_schema = Respect::Rails::ResponseSchema.new
|
56
|
+
expected_response_schema.body = Respect::HashSchema.define do |s|
|
57
|
+
s.integer "result"
|
58
|
+
end
|
59
|
+
# Do the test.
|
60
|
+
rs = Respect::Rails::ResponseSchema.from_file(:ok, filename)
|
61
|
+
assert_equal expected_response_schema, rs
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_validate_raise_response_validation_error_on_validation_error
|
65
|
+
response = mock()
|
66
|
+
headers = mock()
|
67
|
+
response.stubs(:headers).returns(headers)
|
68
|
+
headers_schema = Respect::HashSchema.new
|
69
|
+
@rs.stubs(:headers).returns(headers_schema)
|
70
|
+
headers_schema.stubs(:validate).with(headers).once
|
71
|
+
|
72
|
+
body = mock()
|
73
|
+
response.stubs(:body).returns(body)
|
74
|
+
body_schema = Respect::HashSchema.new
|
75
|
+
@rs.stubs(:body).returns(body_schema)
|
76
|
+
decoded_body = mock()
|
77
|
+
ActiveSupport::JSON.stubs(:decode).with(body).returns(decoded_body).once
|
78
|
+
body_schema.stubs(:validate).with(decoded_body).raises(Respect::ValidationError.new("message"))
|
79
|
+
assert_raises(Respect::Rails::ResponseValidationError) do
|
80
|
+
@rs.validate(response)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_validate_returns_true_on_success
|
85
|
+
response = mock()
|
86
|
+
headers = mock()
|
87
|
+
response.stubs(:headers).returns(headers)
|
88
|
+
headers_schema = Respect::HashSchema.new
|
89
|
+
@rs.stubs(:headers).returns(headers_schema)
|
90
|
+
headers_schema.stubs(:validate).with(headers).once
|
91
|
+
body = mock()
|
92
|
+
response.stubs(:body).returns(body)
|
93
|
+
body_schema = Respect::HashSchema.new
|
94
|
+
@rs.stubs(:body).returns(body_schema)
|
95
|
+
decoded_body = mock()
|
96
|
+
ActiveSupport::JSON.stubs(:decode).with(body).returns(decoded_body).once
|
97
|
+
body_schema.stubs(:validate).with(decoded_body).once
|
98
|
+
assert_equal true, @rs.validate(response)
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_validate_query_returns_true_when_no_error
|
102
|
+
doc = {}
|
103
|
+
@rs.stubs(:validate).with(doc).returns(nil)
|
104
|
+
assert_equal true, @rs.validate?(doc)
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_validate_query_returns_false_on_error_and_store_last_error
|
108
|
+
doc = {}
|
109
|
+
error = Respect::Rails::ResponseValidationError.new(Respect::ValidationError.new("message"), :body, {})
|
110
|
+
@rs.stubs(:validate).with(doc).raises(error).once
|
111
|
+
assert_equal false, @rs.validate?(doc)
|
112
|
+
assert_equal error, @rs.last_error
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_symbolize_http_status
|
116
|
+
assert_equal :ok, Respect::Rails::ResponseSchema.symbolize_http_status(200)
|
117
|
+
assert_equal :internal_server_error, Respect::Rails::ResponseSchema.symbolize_http_status(0)
|
118
|
+
assert_equal :gateway_timeout, Respect::Rails::ResponseSchema.symbolize_http_status(504)
|
119
|
+
assert_equal :http_version_not_supported, Respect::Rails::ResponseSchema.symbolize_http_status(505)
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_validate_raise_response_validation_error_for_headers_error
|
123
|
+
response = mock()
|
124
|
+
headers = mock()
|
125
|
+
response.stubs(:headers).returns(headers)
|
126
|
+
headers_schema = Respect::HashSchema.new
|
127
|
+
@rs.stubs(:headers).returns(headers_schema)
|
128
|
+
headers_schema.stubs(:validate).with(headers).raises(Respect::ValidationError.new("message")).once
|
129
|
+
simplified_headers = {}
|
130
|
+
@rs.stubs(:simplify_headers).with(headers).returns(simplified_headers).once
|
131
|
+
|
132
|
+
body = mock()
|
133
|
+
response.stubs(:body).returns(body)
|
134
|
+
body_schema = Respect::HashSchema.new
|
135
|
+
@rs.stubs(:body).returns(body_schema)
|
136
|
+
decoded_body = mock()
|
137
|
+
ActiveSupport::JSON.stubs(:decode).with(body).returns(decoded_body)
|
138
|
+
body_schema.stubs(:validate).with(decoded_body)
|
139
|
+
begin
|
140
|
+
@rs.validate(response)
|
141
|
+
assert false
|
142
|
+
rescue Respect::Rails::ResponseValidationError => e
|
143
|
+
assert_equal "headers", e.part
|
144
|
+
assert_equal simplified_headers.object_id, e.object.object_id
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|