restful-externalfacilities 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml 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: []