respect-rails 0.1.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/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
|