restful-externalfacilities 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 712e64b4db1d45bb15f239e308c5e5874c26d5c561e3c2f0062927c75b187d4d
4
+ data.tar.gz: fe0378c2bfa05e2273a79d000d65a17aa1af0ea87281d7143ecbf223694c2ee4
5
+ SHA512:
6
+ metadata.gz: 26afb94efa10f29750bde7d5c0c20305839d004c806eeac68ab409cbdb2e6abca5b2e715aec8723352392f8aa073f41438f2b63b8eb3fc1a288367e867caf0f7
7
+ data.tar.gz: 19709dd1afaa2183171edac42a5a12f140adb87c0547d5d447cdf1cdd9a8a24cbef58ab0c58dad30eb11592e55f87a7d347996a1115776520a0a43b7510afa84
data/Rakefile ADDED
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ # ######################################################################## #
5
+ #
6
+ # Copyright (c) 2019 Razor Risk Technologies Pty Limited. All rights reserved.
7
+ #
8
+ # ######################################################################## #
9
+
10
+ $:.unshift File.join(File.dirname(__FILE__), 'lib')
11
+
12
+
13
+ # ##########################################################
14
+ # bundler
15
+
16
+ require 'rubygems'
17
+ require 'bundler/setup'
18
+
19
+
20
+ # ######################################################################## #
21
+ # requires
22
+
23
+ require 'razor_risk/razor/control/rake_helpers/diagnostic_tasks'
24
+ require 'razor_risk/razor/control/rake_helpers/gem_tasks'
25
+ require 'razor_risk/razor/control/rake_helpers/task_helpers'
26
+
27
+ require 'rake'
28
+ require 'rake/clean'
29
+
30
+
31
+ # ##########################################################
32
+ # includes
33
+
34
+ include ::RazorRisk::Razor::Control
35
+ include ::Pantheios
36
+
37
+
38
+ # ##########################################################
39
+ # Constants
40
+
41
+ Spec = ::Gem::Specification.load(Dir['*.gemspec'].first)
42
+ LogDir = 'log'
43
+ LogThresholds = [ :informational, :informational ]
44
+
45
+
46
+ # ##########################################################
47
+ # clean/clobber
48
+
49
+ Dir[
50
+ 'log',
51
+ 'doc',
52
+ 'test/reports',
53
+ ].each { |f| CLEAN << f }
54
+ Dir[
55
+ '.bundle',
56
+ 'vendor',
57
+ 'GEM_HOME',
58
+ '*.gem',
59
+ '*.zip',
60
+ ].each { |f| CLOBBER << f }
61
+
62
+
63
+ # ##########################################################
64
+ # Tasks
65
+
66
+ desc 'Run tests'
67
+ task :test => [ :'gem:unit_test' ]
68
+
69
+ desc 'Build zip'
70
+ task :build_zip, [ :path ] do |task, args|
71
+
72
+ trace ParamNames[ :task, :args ], task, args
73
+
74
+ `build_zip.cmd #{args[:path]}`
75
+ end
76
+
77
+ desc 'Build gem'
78
+ task :build_gem, [ :path ] => :'gem:build'
79
+
80
+ desc 'Builds the Razor EntityConnector Gem'
81
+ task :build, [ :path ] => [
82
+ :build_gem,
83
+ :build_zip,
84
+ ]
85
+
86
+ desc 'Push the gem to the gem server.'
87
+ task :deploy => :'gem:push'
88
+
89
+
90
+ # ##########################################################
91
+ # Hooks
92
+
93
+ task :default do
94
+ puts 'Run \'bundler exec rake --tasks\' to see available tasks'
95
+ end
96
+
97
+ task :first do
98
+ ::Rake::Task[:'diagnostics:init'].execute(
99
+ name: Spec.name,
100
+ version: Spec.version.to_s,
101
+ directory: LogDir,
102
+ thresholds: LogThresholds,
103
+ )
104
+ end
105
+
106
+ RakeHelpers::TaskHelpers.add_hooks
107
+
108
+
109
+ # ############################## end of file ############################# #
110
+
111
+
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ # ######################################################################## #
5
+ #
6
+ # Main module/entry file for the External Facilities Microservice
7
+ #
8
+ # Copyright (c) 2019 Razor Risk Technologies Pty Limited. All rights reserved.
9
+ #
10
+ # ######################################################################## #
11
+
12
+ # ##########################################################################
13
+ # requires
14
+
15
+ require 'razor_risk/cassini/diagnostics/zeroth_include'
16
+
17
+ require 'razor_risk/cassini/applications/microservices/restful/externalfacilities'
18
+ require 'razor_risk/cassini/main'
19
+
20
+ # Requires for compatibility check
21
+ require 'razor_risk/cassini/util/version_util'
22
+ require 'razor_risk/cassini/common/version'
23
+ require 'razor_risk/razor/connectivity/version'
24
+ require 'xqsr3/version'
25
+
26
+
27
+ # ##########################################################################
28
+ # includes
29
+
30
+ include ::RazorRisk::Cassini::Applications::Microservices::RESTful
31
+ include ::RazorRisk::Cassini::Util::VersionUtil
32
+
33
+
34
+ # ##########################################################################
35
+ # constants
36
+
37
+ PROGRAM_VERSION = ExternalFacilities::VERSION
38
+
39
+
40
+ # ##########################################################################
41
+ # compatibility checks
42
+
43
+ check_version_compatibility ::RazorRisk::Cassini::Common, [ 0, 21 ], 'RazorRisk.Cassini.Common'
44
+ check_version_compatibility ::RazorRisk::Razor::Connectivity, [ 0, 11, 2 ], 'RazorRisk.Razor.Connectivity'
45
+ check_version_compatibility ::LibCLImate, '0.10'
46
+ check_version_compatibility ::Pantheios, '0.20'
47
+ check_version_compatibility ::Xqsr3::VERSION, '0.30'
48
+
49
+
50
+ # ##########################################################################
51
+ # main section
52
+
53
+ TheApp = ExternalFacilities::CapabilitiesApp
54
+
55
+ # ############################## end of file ############################# #
56
+
57
+
@@ -0,0 +1,244 @@
1
+ # encoding: UTF-8
2
+
3
+ # ######################################################################## #
4
+ #
5
+ # Sinatra App for ExternalFacilities microservice.
6
+ #
7
+ # Copyright (c) 2019 Razor Risk Technologies Pty Limited. All rights reserved.
8
+ #
9
+ # ######################################################################## #
10
+
11
+
12
+ # ##########################################################################
13
+ # requires
14
+
15
+ require 'razor_risk/cassini/applications/rest_framework/route_verb_dispatcher'
16
+ require 'razor_risk/cassini/applications/route_verb_adaptors/externalfacilities'
17
+ require 'razor_risk/cassini/applications/secured_microservice'
18
+ require 'razor_risk/core/diagnostics/logger'
19
+
20
+ require 'pantheios'
21
+
22
+ require 'csv'
23
+ require 'json'
24
+
25
+
26
+ # ##########################################################################
27
+ # modules
28
+
29
+ module RazorRisk
30
+ module Cassini
31
+ module Applications
32
+ module Microservices
33
+ module RESTful
34
+ module ExternalFacilities
35
+
36
+
37
+ # ##########################################################################
38
+ # includes
39
+
40
+ include ::RazorRisk::Cassini::Applications
41
+
42
+
43
+ # ##########################################################################
44
+ # application
45
+
46
+ # Sinatra Application for the ExternalFacilities Microservice.
47
+ class ExternalFacilitiesApp < SecuredMicroservice
48
+
49
+ include RouteVerbAdaptors::ExternalFacilities
50
+ include RESTFramework::RouteVerbDispatch
51
+
52
+ include ::Pantheios
53
+ include ::RazorRisk::Core::Diagnostics::Logger
54
+
55
+ FULL_DESIGNATION = 'ExternalFacilities'
56
+ SHORT_DESIGNATION = 'externalfacilities'
57
+ SERVICE_TYPE = :microservice
58
+ PROGRAM_FEATURES = {
59
+ has_web_server: true,
60
+ has_host_and_port: true,
61
+ has_razor_connectivity: true,
62
+ authentication: :with_credentials_algorithm,
63
+ copyright_year: 2019,
64
+ }
65
+ SUPPORTED_ROUTES = [
66
+ [ '/externalfacilities/?', :get, 'Get the external facilities.' ],
67
+ ]
68
+ HTTP_ACCEPTS = %w{
69
+ text/html
70
+ application/json
71
+ application/xml
72
+ text/xml
73
+ text/csv
74
+ text/plain
75
+ text/tab-separated-values
76
+ text/tsv
77
+ }
78
+
79
+
80
+ def self.on_init_service options
81
+
82
+ trace ParamNames[ :options ], options
83
+
84
+ raise ArgumentError.new(
85
+ 'missing keyword: razor_requester'
86
+ ) unless options.has_key? :razor_requester
87
+
88
+ request_options = options[:request_options] || {
89
+ validate: true
90
+ }
91
+
92
+ set :razor_requester, options[:razor_requester]
93
+ set :request_options, request_options
94
+ end
95
+
96
+ private
97
+ def sec
98
+ return '' if credentials.empty?
99
+ " (for #{credentials.join(':')})"
100
+ end
101
+ public
102
+
103
+
104
+ # ##########################################################
105
+ # routes
106
+
107
+ get '/externalfacilities/:id/?' do
108
+
109
+ trace ParamNames[ :request, :params ], request, params
110
+
111
+ dispatch ExternalFacilitiesSet
112
+ end
113
+
114
+ get '/' do
115
+
116
+ HTTP_ACCEPTS.each do |accept_type|
117
+
118
+ if request.accept? accept_type
119
+
120
+ content_type accept_type
121
+
122
+ case accept_type
123
+ when 'application/json'
124
+ r = make_JSON_routes SUPPORTED_ROUTES
125
+ when 'application/xml', 'text/xml'
126
+ r = make_XML_routes SUPPORTED_ROUTES
127
+ when 'text/csv'
128
+ r = make_CSV_routes SUPPORTED_ROUTES
129
+ when 'text/html'
130
+ r = make_HTML_routes SUPPORTED_ROUTES
131
+ when 'text/plain'
132
+ r = make_Plain_routes SUPPORTED_ROUTES
133
+ when 'text/tsv', 'text/tab-separated-values'
134
+ r = make_TSV_routes SUPPORTED_ROUTES
135
+ else
136
+ log :violation, "unrecognised accept type '#{accept_type}'"
137
+ halt(
138
+ 500,
139
+ {},
140
+ 'internal server failure'
141
+ )
142
+ end
143
+
144
+ return r
145
+ end
146
+ end
147
+
148
+ halt(
149
+ 406,
150
+ {},
151
+ "supports only the Accept types #{HTTP_ACCEPTS.map do |t|
152
+ %Q<'#{t}'>
153
+ end.join(', ')}"
154
+ )
155
+ end
156
+
157
+ define_catch_all_handlers
158
+
159
+
160
+ # ##########################################################
161
+ # routes helpers
162
+
163
+ def make_CSV_routes routes
164
+ CSV.generate do |csv|
165
+ routes.each do |ar|
166
+ csv << ar
167
+ end
168
+ end
169
+ end
170
+
171
+ def make_HTML_routes routes, **options
172
+ routes = routes.map do |ar|
173
+ <<END_OF_tr
174
+ <tr>
175
+ <td>#{ar[0]}</td>
176
+ <td>#{ar[1]}</td>
177
+ <td>#{ar[2]}</td>
178
+ </tr>
179
+ END_OF_tr
180
+ end
181
+
182
+ <<END_OF_html
183
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.we.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
184
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
185
+ <head>
186
+ <title>Razor Risk Web Service API - Internal Microservice - External Facilities</title>
187
+ <meta name="revisit-after" content="24 hours" />
188
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
189
+ </head>
190
+ <body>
191
+ <h1>Routes</h1>
192
+ <table>
193
+ <tr>
194
+ <th>Route</th>
195
+ <th>Verb</th>
196
+ <th>Description</th>
197
+ </tr>
198
+ #{routes.map { |r| r.chomp("\n") }.join("\n")}
199
+ </table>
200
+ </body>
201
+ </html>
202
+ END_OF_html
203
+ end
204
+
205
+ def make_JSON_routes routes, **options
206
+ r = {
207
+ 'routes' => []
208
+ }
209
+ r['routes'] = SUPPORTED_ROUTES.map { |ar| { route: ar[0], verb: ar[1].to_s.upcase, description: ar[2] } }
210
+ r.to_json
211
+ end
212
+
213
+ def make_Plain_routes routes
214
+ make_TSV_routes routes
215
+ end
216
+
217
+ def make_TSV_routes routes
218
+ routes.map { |ar| "#{ar[0]}\t#{ar[1]}\t#{ar[2]}\n" }
219
+ end
220
+
221
+ def make_XML_routes routes
222
+ <<END_OF_xml
223
+ <?xml version="1.0">
224
+ <routes>#{routes.map { |ar| %Q{ <route route="#{ar[0]}" verb="#{ar[1].to_s.upcase}" description="#{ar[2]}"/>}}.join(%Q{\n})}
225
+ </routes>
226
+ END_OF_xml
227
+ end
228
+
229
+ end # class App
230
+
231
+
232
+ # ##########################################################################
233
+ # modules
234
+
235
+ end # module ExternalFacilities
236
+ end # module RESTful
237
+ end # module Microservices
238
+ end # module Applications
239
+ end # module Cassini
240
+ end # module RazorRisk
241
+
242
+ # ############################## end of file ############################# #
243
+
244
+
@@ -0,0 +1,43 @@
1
+ # encoding: UTF-8
2
+
3
+ # ######################################################################## #
4
+ #
5
+ # Version for RazorRisk.Cassini.Microservices.RESTful.ExternalFacilities library
6
+ #
7
+ # Copyright (c) 2019 Razor Risk Technologies Pty Limited. All rights reserved.
8
+ #
9
+ # ######################################################################## #
10
+
11
+ module RazorRisk
12
+ module Cassini
13
+ module Applications
14
+ module Microservices
15
+ module RESTful
16
+
17
+ module ExternalFacilities
18
+
19
+ # Current version of the
20
+ # RazorRisk.Cassini.Microservices.RESTful.ExternalFacilities library
21
+ VERSION = '0.0.1'
22
+
23
+ private
24
+ VERSION_PARTS_ = VERSION.split(/[.]/).collect { |n| n.to_i }
25
+ public
26
+ VERSION_MAJOR = VERSION_PARTS_[0]
27
+ VERSION_MINOR = VERSION_PARTS_[1]
28
+ VERSION_PATCH = VERSION_PARTS_[2]
29
+ VERSION_COMMIT = VERSION_PARTS_[3] || 0
30
+
31
+ # The description of the framework
32
+ DESCRIPTION = "Razor Risk's Cassini Web-framework's ExternalFacilities RESTful microservice"
33
+ end # module ExternalFacilities
34
+
35
+ end # module RESTful
36
+ end # module Microservices
37
+ end # module Applications
38
+ end # module Cassini
39
+ end # module RazorRisk
40
+
41
+ # ############################## end of file ############################# #
42
+
43
+
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ # ##########################################################################
4
+ #
5
+ # Copyright (c) 2019 Razor Risk Technologies Pty Limited. All rights reserved.
6
+ #
7
+ # ##########################################################################
8
+
9
+ # ##########################################################
10
+ # requires
11
+
12
+ require 'razor_risk/cassini/applications/microservices/restful/externalfacilities/app'
13
+ require 'razor_risk/cassini/applications/microservices/restful/externalfacilities/version'
14
+
15
+ # ############################## end of file ############################# #
16
+
17
+
@@ -0,0 +1,59 @@
1
+ # encoding: UTF-8
2
+
3
+ # ######################################################################## #
4
+ #
5
+ # Adaptor for ExternalFacilities microservice's GET external facilities.
6
+ #
7
+ # Copyright (c) 2019 Razor Risk Technologies Pty Limited. All rights reserved.
8
+ #
9
+ # ######################################################################## #
10
+
11
+
12
+ # ##########################################################################
13
+ # requires
14
+
15
+ require 'razor_risk/cassini/applications/rest_framework/verb_handler'
16
+ require 'razor_risk/cassini/applications/route_verb_adaptors/capabilities/get_handler_mixin'
17
+
18
+ require 'pantheios'
19
+
20
+ # ##########################################################################
21
+ # module
22
+
23
+ module RazorRisk
24
+ module Cassini
25
+ module Applications
26
+ module RouteVerbAdaptors
27
+ module ExternalFacilities
28
+
29
+
30
+ # ##########################################################################
31
+ # ExternalFacilitiesSet
32
+
33
+ class ExternalFacilitiesGet < RESTFramework::VerbHandler
34
+
35
+ include GetHandlerMixin
36
+
37
+ def handle env, params, request, response
38
+
39
+ trace ParamNames[ :env, :params, :request, :response ], env, params, request, response
40
+
41
+ super do |ec|
42
+ ec.get_users indicate_result_by: :qualified_result
43
+ end
44
+ end
45
+ end # class ExternalFacilitiesGet
46
+
47
+
48
+ # ##########################################################################
49
+ # module
50
+
51
+ end # module ExternalFacilities
52
+ end # module RouteVerbAdaptors
53
+ end # module Applications
54
+ end # module Cassini
55
+ end # module RazorRisk
56
+
57
+ # ############################## end of file ############################# #
58
+
59
+
@@ -0,0 +1,16 @@
1
+ # encoding: utf-8
2
+
3
+ # ##########################################################################
4
+ #
5
+ # Copyright (c) 2019 Razor Risk Technologies Pty Limited. All rights reserved.
6
+ #
7
+ # ##########################################################################
8
+
9
+ # ##########################################################
10
+ # requires
11
+
12
+ require 'razor_risk/cassini/applications/route_verb_adaptors/externalfacilities/externalfacilities_get'
13
+
14
+ # ############################## end of file ############################# #
15
+
16
+
@@ -0,0 +1,381 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ #############################################################################
5
+ #
6
+ # Copyright (c) 2019 Razor Risk Technologies Pty Limited. All rights reserved.
7
+ #
8
+ #############################################################################
9
+
10
+ $:.unshift File.join(File.dirname(__FILE__), *(['..'] * 3), 'lib')
11
+
12
+ ENV['APP_ENV'] = 'test'
13
+ ENV['RZ_EXPOSE_MICROSERVICE_EXCEPTIONS'] = 'true'
14
+
15
+ # ##########################################################
16
+ # requires
17
+
18
+ require 'razor_risk/cassini/testing/suppress_pantheios_logging' unless $DEBUG
19
+
20
+ require 'razor_risk/cassini/applications/microservices/restful/externalfacilities/app'
21
+ require 'razor_risk/razor/connectivity/test_doubles/razor_requester/raises_on_send'
22
+ require 'razor_risk/razor/connectivity/test_doubles/razor_requester/returns_given_response'
23
+ require 'razor_risk/razor/connectivity/razor_3/response'
24
+
25
+ require 'rack/test'
26
+ require 'test/unit'
27
+
28
+ # ##########################################################
29
+ # Tests
30
+
31
+ class TestExternalFacilitiesApp < Test::Unit::TestCase
32
+
33
+ include ::Rack::Test::Methods
34
+
35
+ include ::RazorRisk::Cassini::Applications::Microservices::RESTful
36
+ include ::RazorRisk::Razor::Connectivity::TestDoubles::RazorRequester
37
+ include ::RazorRisk::Razor::Connectivity::Razor3
38
+ include ::RazorRisk::Razor::Connectivity::EntityConnectors::Exceptions
39
+
40
+ RazorEnv = 'env'
41
+
42
+ def app
43
+ ExternalFacilities::ExternalFacilitiesApp
44
+ end
45
+
46
+ def set_razor_response body, **options
47
+
48
+ doc = ::Nokogiri::XML::Builder.new do |xml|
49
+ xml.razorOutbound(
50
+ environment: RazorEnv,
51
+ request: 'select',
52
+ server: 'DataServer',
53
+ ) do
54
+ xml.requestReceivedTime '2020-09-09 14:20:33.844'
55
+ xml.responseSentTime '2019-09-09 14:20:33.911'
56
+ xml.responseReceivedTime '2019-09-09 14:20:33.917'
57
+ xml.returnCode (options[:failed] ? 'nack' : 'ack')
58
+ xml.parent << ::Nokogiri.XML(body).root
59
+ end
60
+ end.doc
61
+
62
+ rsp = Response.new(doc)
63
+ rr = ReturnsGivenResponse.new('conf', RazorEnv, given_response: rsp)
64
+
65
+ app.on_init_service(
66
+ razor_requester: rr,
67
+ request_options: options[:request_options],
68
+ )
69
+ end
70
+
71
+ def configure_app **opts
72
+ opts = {
73
+ host: 'localhost',
74
+ port: 5679,
75
+ authentication_scheme: 'none',
76
+ executable: 'abc',
77
+ razor_requester: nil,
78
+ }.merge(opts)
79
+
80
+ app.init_service(**opts)
81
+ end
82
+
83
+ def setup
84
+ configure_app
85
+ end
86
+ end
87
+
88
+ class TestCommon < TestExternalFacilitiesApp
89
+
90
+ # TODO: HEAD does the full razor request as if it is a GET, but returns
91
+ # empty. This is not ok and it must be changed not do the razor request.
92
+
93
+ # TODO: Currently cannot mock raising UnexpectedServerResponseException
94
+ # as due to restrictuions in RaisesOnSend exception must be a class.
95
+
96
+ Routes = {
97
+ 'externalfacilities' => [ '/externalfacilities' ],
98
+ }
99
+ end
100
+
101
+ class TestInvalidVerbs < TestCommon
102
+
103
+ InvalidVerbs = [ :post, :put, :delete, :options ]
104
+
105
+ InvalidVerbs.each do |verb|
106
+ Routes.each do |name, args|
107
+ define_method "test_#{verb}_#{name}" do
108
+ self.send(verb, *args)
109
+ assert_false last_response.ok?
110
+ assert_equal 404, last_response.status
111
+ assert_equal(
112
+ "'#{args.first}' [#{verb.to_s.upcase}] not found",
113
+ last_response.body
114
+ )
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ class TestHeaders < TestCommon
121
+
122
+ Routes.each do |name, args|
123
+ define_method "test_#{name}_invalid_accept_type" do
124
+ set_razor_response('<body/>')
125
+
126
+ header 'Accept', 'image/png'
127
+ get(*args)
128
+
129
+ assert_false last_response.ok?, last_response.body
130
+ assert_equal 406, last_response.status
131
+ assert_match(/invalid accept type/, last_response.body)
132
+ end
133
+
134
+ define_method "test_#{name}_invalid_accept_types" do
135
+ set_razor_response('<body/>')
136
+
137
+ header 'Accept', [ 'image/png', 'application/pdf' ]
138
+ get(*args)
139
+
140
+ assert_false last_response.ok?, last_response.body
141
+ assert_equal 406, last_response.status
142
+ assert_match(/invalid accept type/, last_response.body)
143
+ end
144
+
145
+ define_method "test_#{name}_valid_accept_type" do
146
+
147
+ set_razor_response(
148
+ '<body/>',
149
+ request_options: { validate: false }
150
+ )
151
+
152
+ header 'Accept', 'application/xml'
153
+ get(*args)
154
+
155
+ assert last_response.ok?, last_response.body
156
+ assert_equal 200, last_response.status
157
+ assert_match(
158
+ /application\/xml/,
159
+ last_response.headers['Content-Type']
160
+ )
161
+ end
162
+
163
+ define_method "test_#{name}_valid_accept_types" do
164
+
165
+ set_razor_response(
166
+ '<body/>',
167
+ request_options: { validate: false }
168
+ )
169
+
170
+ header 'Accept', [ 'application/json', 'application/xml' ]
171
+ get(*args)
172
+
173
+ assert last_response.ok?, last_response.body
174
+ assert_equal 200, last_response.status
175
+ assert_match(
176
+ /application\/xml/,
177
+ last_response.headers['Content-Type']
178
+ )
179
+ end
180
+
181
+ define_method "test_#{name}_mixed_accept_types" do
182
+
183
+ set_razor_response(
184
+ '<body/>',
185
+ request_options: { validate: false }
186
+ )
187
+
188
+ header 'Accept', [ 'application/pdf', 'application/xml' ]
189
+ get(*args)
190
+
191
+ assert last_response.ok?, last_response.body
192
+ assert_equal 200, last_response.status
193
+ assert_match(
194
+ /application\/xml/,
195
+ last_response.headers['Content-Type']
196
+ )
197
+ end
198
+
199
+ define_method "test_#{name}_application_xml_accept_types" do
200
+
201
+ set_razor_response(
202
+ '<body/>',
203
+ request_options: { validate: false }
204
+ )
205
+
206
+ header 'Accept', 'application/xml'
207
+ get(*args)
208
+
209
+ assert last_response.ok?, last_response.body
210
+ assert_equal 200, last_response.status
211
+ assert_match(
212
+ /application\/xml/,
213
+ last_response.headers['Content-Type']
214
+ )
215
+ assert_equal '<body/>', last_response.body
216
+ end
217
+
218
+ define_method "test_#{name}_text_xml_accept_types" do
219
+
220
+ set_razor_response(
221
+ '<body/>',
222
+ request_options: { validate: false }
223
+ )
224
+
225
+ header 'Accept', 'text/xml'
226
+ get(*args)
227
+
228
+ assert last_response.ok?, last_response.body
229
+ assert_equal 200, last_response.status
230
+ assert_match(
231
+ /text\/xml/,
232
+ last_response.headers['Content-Type']
233
+ )
234
+ assert_equal '<body/>', last_response.body
235
+ end
236
+
237
+ define_method "test_#{name}_application_json_accept_types" do
238
+
239
+ set_razor_response(
240
+ '<body/>',
241
+ request_options: { validate: false }
242
+ )
243
+
244
+ header 'Accept', 'application/json'
245
+ get(*args)
246
+
247
+ assert last_response.ok?, last_response.body
248
+ assert_equal 200, last_response.status
249
+ assert_match(
250
+ /application\/json/,
251
+ last_response.headers['Content-Type']
252
+ )
253
+ assert_equal '{"body":[]}', last_response.body
254
+ end
255
+ end
256
+ end
257
+
258
+ class TestJSONConversion < TestCommon
259
+
260
+ Routes.each do |name, args|
261
+
262
+ define_method "test_#{name}_json_uses_gdata_scheme" do
263
+
264
+ doc = ::Nokogiri::XML::Builder.new do |xml|
265
+ xml.body do
266
+ xml.group 'value', id: 'group 1'
267
+ xml.group id: 'group 2'
268
+ end
269
+ end.doc.root.to_xml
270
+ set_razor_response(doc, request_options: { validate: false })
271
+
272
+ exp_doc = {
273
+ 'body' => {
274
+ 'group' => [
275
+ { '$t' => 'value', 'id' => 'group 1' },
276
+ { 'id' => 'group 2' }
277
+ ]
278
+ }
279
+ }.to_json
280
+
281
+ header 'Accept', 'application/json'
282
+ get(*args)
283
+
284
+ assert last_response.ok?, last_response.body
285
+ assert_equal 200, last_response.status
286
+ assert_match(
287
+ /application\/json/,
288
+ last_response.headers['Content-Type']
289
+ )
290
+ assert_equal(
291
+ exp_doc,
292
+ last_response.body
293
+ )
294
+ end
295
+ end
296
+ end
297
+
298
+ class TestErrorHandling < TestCommon
299
+
300
+ Routes.each do |name, args|
301
+
302
+ define_method "test_#{name}_RZ0011_error" do
303
+ doc = ::Nokogiri::XML::Builder.new do |xml|
304
+ xml.errors do
305
+ xml.error do
306
+ xml.code 'RZ0011'
307
+ xml.message 'This failed'
308
+ xml.details 'This failed'
309
+ end
310
+ end
311
+ end.doc.root.to_xml
312
+ set_razor_response doc, failed: true
313
+
314
+ get(*args)
315
+
316
+ assert_false last_response.ok?
317
+ assert_equal 404, last_response.status
318
+ assert_equal('This failed: This failed', last_response.body)
319
+ end
320
+
321
+ define_method "test_#{name}_razor_error" do
322
+ doc = ::Nokogiri::XML::Builder.new do |xml|
323
+ xml.body
324
+ end.doc.root.to_xml
325
+ set_razor_response doc, failed: true
326
+
327
+ get(*args)
328
+
329
+ assert_false last_response.ok?
330
+ assert_equal 500, last_response.status
331
+ assert_equal('Server Error', last_response.body)
332
+ end
333
+
334
+ define_method "test_#{name}_unknown_error" do
335
+
336
+ doc = '<body/>'
337
+ set_razor_response doc, failed: true
338
+
339
+ get(*args)
340
+
341
+ assert_false last_response.ok?
342
+ assert_equal 500, last_response.status
343
+ assert_equal('Server Error', last_response.body)
344
+ end
345
+ end
346
+ end
347
+
348
+ class TestExternalFacilities < TestExternalFacilitiesApp
349
+
350
+ def test_validates_xml
351
+
352
+ doc = '<body/>'
353
+ set_razor_response(doc)
354
+
355
+ get '/externalfacilities'
356
+
357
+ assert_false last_response.ok?, last_response.body
358
+ assert_equal 404, last_response.status
359
+ assert_equal('External Facilities not found', last_response.body)
360
+ end
361
+
362
+ def test_get
363
+
364
+ doc = ::Nokogiri::XML::Builder.new do |xml|
365
+ xml.body do
366
+ xml.group id: 'group 1'
367
+ xml.group id: 'group 2'
368
+ end
369
+ end.doc.root.to_xml
370
+ set_razor_response(doc)
371
+
372
+ get '/externalfacilities'
373
+ assert last_response.ok?
374
+ assert_equal 200, last_response.status
375
+ assert_equal doc, last_response.body
376
+ end
377
+ end
378
+
379
+ # ############################## end of file ############################# #
380
+
381
+
metadata ADDED
@@ -0,0 +1,243 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: restful-externalfacilities
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Razor Risk
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-06-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: razorrisk-cassini-common
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.26.16
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '1.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 0.26.16
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '1.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: razorrisk-core-diagnostics-extensions
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.2'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.2'
47
+ - !ruby/object:Gem::Dependency
48
+ name: razorrisk-razor-connectivity
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.11.2
54
+ - - "<"
55
+ - !ruby/object:Gem::Version
56
+ version: '1.0'
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 0.11.2
64
+ - - "<"
65
+ - !ruby/object:Gem::Version
66
+ version: '1.0'
67
+ - !ruby/object:Gem::Dependency
68
+ name: razorrisk-razor-connectivity-entityconnectors
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: 0.26.7
74
+ - - "<"
75
+ - !ruby/object:Gem::Version
76
+ version: '1.0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: 0.26.7
84
+ - - "<"
85
+ - !ruby/object:Gem::Version
86
+ version: '1.0'
87
+ - !ruby/object:Gem::Dependency
88
+ name: activesupport
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '4.0'
94
+ type: :runtime
95
+ prerelease: false
96
+ version_requirements: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: '4.0'
101
+ - !ruby/object:Gem::Dependency
102
+ name: clasp-ruby
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '0.14'
108
+ type: :runtime
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '0.14'
115
+ - !ruby/object:Gem::Dependency
116
+ name: json
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: '1.8'
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: 1.8.3
125
+ type: :runtime
126
+ prerelease: false
127
+ version_requirements: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.8'
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: 1.8.3
135
+ - !ruby/object:Gem::Dependency
136
+ name: libclimate-ruby
137
+ requirement: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - "~>"
140
+ - !ruby/object:Gem::Version
141
+ version: '0.10'
142
+ type: :runtime
143
+ prerelease: false
144
+ version_requirements: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - "~>"
147
+ - !ruby/object:Gem::Version
148
+ version: '0.10'
149
+ - !ruby/object:Gem::Dependency
150
+ name: nokogiri
151
+ requirement: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - "~>"
154
+ - !ruby/object:Gem::Version
155
+ version: '1.6'
156
+ type: :runtime
157
+ prerelease: false
158
+ version_requirements: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - "~>"
161
+ - !ruby/object:Gem::Version
162
+ version: '1.6'
163
+ - !ruby/object:Gem::Dependency
164
+ name: pantheios-ruby
165
+ requirement: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - "~>"
168
+ - !ruby/object:Gem::Version
169
+ version: 0.20.2
170
+ type: :runtime
171
+ prerelease: false
172
+ version_requirements: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - "~>"
175
+ - !ruby/object:Gem::Version
176
+ version: 0.20.2
177
+ - !ruby/object:Gem::Dependency
178
+ name: sinatra
179
+ requirement: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - "~>"
182
+ - !ruby/object:Gem::Version
183
+ version: '1.4'
184
+ type: :runtime
185
+ prerelease: false
186
+ version_requirements: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - "~>"
189
+ - !ruby/object:Gem::Version
190
+ version: '1.4'
191
+ - !ruby/object:Gem::Dependency
192
+ name: xqsr3
193
+ requirement: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - "~>"
196
+ - !ruby/object:Gem::Version
197
+ version: '0.30'
198
+ type: :runtime
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - "~>"
203
+ - !ruby/object:Gem::Version
204
+ version: '0.30'
205
+ description: Razor Risk's Cassini Web-framework's ExternalFacilities RESTful microservice
206
+ email: operations@razor-risk.com
207
+ executables:
208
+ - razorrisk-microservice-externalfacilities
209
+ extensions: []
210
+ extra_rdoc_files: []
211
+ files:
212
+ - Rakefile
213
+ - bin/razorrisk-microservice-externalfacilities
214
+ - lib/razor_risk/cassini/applications/microservices/restful/externalfacilities.rb
215
+ - lib/razor_risk/cassini/applications/microservices/restful/externalfacilities/app.rb
216
+ - lib/razor_risk/cassini/applications/microservices/restful/externalfacilities/version.rb
217
+ - lib/razor_risk/cassini/applications/route_verb_adaptors/externalfacilities.rb
218
+ - lib/razor_risk/cassini/applications/route_verb_adaptors/externalfacilities/externalfacilities_get.rb
219
+ - test/unit/microservice/tc_app.rb
220
+ homepage: https://razor-risk.com/
221
+ licenses:
222
+ - Nonstandard
223
+ metadata: {}
224
+ post_install_message:
225
+ rdoc_options: []
226
+ require_paths:
227
+ - lib
228
+ required_ruby_version: !ruby/object:Gem::Requirement
229
+ requirements:
230
+ - - "~>"
231
+ - !ruby/object:Gem::Version
232
+ version: '2.0'
233
+ required_rubygems_version: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ requirements: []
239
+ rubygems_version: 3.2.3
240
+ signing_key:
241
+ specification_version: 4
242
+ summary: Razor Risk Cassini External Facilities RESTful microservice
243
+ test_files: []