spokes 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spokes::Middleware::RequestID, modules: true, middleware: true do
4
+ let(:app) { proc { [200, {}, []] } }
5
+ let(:service_name) { 'nerds' }
6
+ let(:stack) { Spokes::Middleware::RequestID.new(app, service_name: service_name) }
7
+ let(:request) { Rack::MockRequest.new(stack) }
8
+ let(:env_header_name) { 'action_dispatch.request_id' }
9
+
10
+ it 'accepts incoming request ID' do
11
+ response = request.options('/', env_header_name => 'aaaa')
12
+ expect(response.status).to eq(200)
13
+ end
14
+
15
+ it 'generates request id when not present' do
16
+ response = request.options('/')
17
+ expect(response.status).to eq(200)
18
+ end
19
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spokes::Middleware::ServiceName, modules: true, middleware: true do
4
+ let(:app) { proc { [200, {}, []] } }
5
+ let(:service_name) { 'nerds' }
6
+ let(:stack) { Spokes::Middleware::ServiceName.new(app, service_name: service_name) }
7
+ let(:stack_exclude_paths) do
8
+ Spokes::Middleware::ServiceName.new(app,
9
+ service_name: service_name,
10
+ exclude_paths: ['/match/:id'])
11
+ end
12
+ let(:request) { Rack::MockRequest.new(stack) }
13
+ let(:request_exclude_paths) { Rack::MockRequest.new(stack_exclude_paths) }
14
+ let(:env_header_name) { 'HTTP_SERVICE_NAME' }
15
+
16
+ it 'errors when the header is not present' do
17
+ response = request.get('/')
18
+ json = MultiJson.load(response.body)
19
+
20
+ expect(response.status).to eq(400)
21
+ expect(response.content_type).to eq('application/json; charset=utf-8')
22
+ expect(json).to have_key('errors')
23
+ expect(json['errors'][0]).to eq('Service-Name is required')
24
+ end
25
+
26
+ it 'errors when the header is invalid' do
27
+ response = request.options('/', env_header_name => 'not,valid')
28
+ json = MultiJson.load(response.body)
29
+
30
+ expect(response.status).to eq(400)
31
+ expect(response.content_type).to eq('application/json; charset=utf-8')
32
+ expect(json).to have_key('errors')
33
+ expect(json['errors'][0]).to eq('Service-Name is invalid')
34
+ end
35
+
36
+ it 'responds normally when the header is valid' do
37
+ response = request.options('/', env_header_name => 'valid')
38
+ expect(response.status).to eq(200)
39
+ end
40
+
41
+ it 'respond with valid if header is invalid but exclude path includes path' do
42
+ response = request_exclude_paths.options('/match/abcd')
43
+ expect(response.status).to eq(200)
44
+ end
45
+
46
+ it 'responds with error 400 if path not included in excludes paths' do
47
+ response = request_exclude_paths.options('/match')
48
+ expect(response.status).to eq(400)
49
+ end
50
+
51
+ it 'responds with error 400 if path not included in excludes paths' do
52
+ response = request_exclude_paths.options('/match?param=1')
53
+ expect(response.status).to eq(400)
54
+ end
55
+
56
+ it 'responds with error 400 if path not included in excludes paths' do
57
+ response = request_exclude_paths.options('/match/')
58
+ expect(response.status).to eq(400)
59
+ end
60
+ end
@@ -0,0 +1,3 @@
1
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
2
+ ENV['RAILS_ENV'] ||= 'test'
3
+ require 'spec_helper'
@@ -0,0 +1,25 @@
1
+ ENV['RAILS_ENV'] = 'test'
2
+ $TEST = true
3
+
4
+ require 'bundler'
5
+ require 'simplecov'
6
+ require 'fileutils'
7
+ require 'rack/test'
8
+ require 'factory_bot'
9
+ require 'multi_json'
10
+
11
+ SimpleCov.start do
12
+ add_filter '.gems'
13
+ add_filter 'spec'
14
+ add_group 'Middleware', ['/spokes/middleware/*']
15
+ add_group 'Config', ['/spokes/config/*']
16
+ add_group 'Versioning', ['/spokes/versioning/*']
17
+ end
18
+
19
+ require_relative '../lib/spokes'
20
+
21
+ RSpec.configure do |config|
22
+ config.include Rack::Test::Methods
23
+ config.include FactoryBot::Syntax::Methods
24
+ config.order = 'random'
25
+ end
@@ -0,0 +1,45 @@
1
+ require 'rails_helper'
2
+
3
+ describe Spokes::Versioning::MinorVersioning do
4
+ let(:klass) do
5
+ klass = Class.new
6
+ expect(klass).to receive(:after_filter)
7
+ klass.send(:include, Spokes::Versioning::MinorVersioning)
8
+ klass
9
+ end
10
+
11
+ let(:controller) do
12
+ controller = klass.new
13
+ allow(controller).to receive(:all_minor_versions).and_return(minor_versions)
14
+ controller
15
+ end
16
+
17
+ let(:header_name) { 'API-Version' }
18
+ let(:default_version) { '2015-03-25' }
19
+ let(:minor_versions) do
20
+ {
21
+ '2015-07-07' => {},
22
+ default_version => { default: true }
23
+ }
24
+ end
25
+ let(:empty_info) { double('request/response info', headers: {}) }
26
+
27
+ it 'uses default version if no version is specified in the header' do
28
+ expect(controller).to receive(:request).and_return(empty_info)
29
+ expect(controller.minor_version).to eq default_version
30
+ end
31
+
32
+ it 'uses the version specified in the header' do
33
+ expected = '2015-07-07'
34
+ request_info = double('request', headers: { header_name => expected })
35
+ expect(controller).to receive(:request).and_return(request_info)
36
+ expect(controller.minor_version).to eq expected
37
+ end
38
+
39
+ it 'sets response header to current version' do
40
+ allow(controller).to receive(:response).and_return(empty_info)
41
+ expect(controller).to receive(:minor_version).and_return(default_version)
42
+ controller.set_minor_version_response_header
43
+ expect(controller.response.headers[header_name]).to eq(default_version)
44
+ end
45
+ end
data/spokes.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
2
+ require 'spokes/version'
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = 'spokes'
6
+ gem.version = Spokes::VERSION
7
+
8
+ gem.authors = ['Brett Buddin', 'Kevin Haight']
9
+ gem.email = ['kevinjhaight@gmail.com']
10
+ gem.homepage = 'https://github.com/khaight/spokes'
11
+ gem.summary = 'A set of utilities for helping creating apis'
12
+ gem.description = 'Setting up configuration of environment variables, versioning, & other middleware should be easier. This is is a set of utilities to help.'
13
+ gem.license = 'MIT'
14
+
15
+ gem.files = `git ls-files -z`.split("\x0")
16
+ gem.executables = gem.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+
18
+ gem.add_dependency 'activesupport', '~> 5.1', '>= 5.1.0'
19
+ gem.add_dependency 'multi_json', '~> 1.12', '>= 1.12.1'
20
+
21
+ gem.add_development_dependency 'factory_bot', '~> 4.8'
22
+ gem.add_development_dependency 'rack-test', '~> 0.6', '>= 0.6.2'
23
+ gem.add_development_dependency 'rake', '~> 0.8', '>= 0.8.7'
24
+ gem.add_development_dependency 'rspec', '~> 3.1', '>= 3.1.0'
25
+ gem.add_development_dependency 'rspec-rails', '~> 3.6', '>= 3.6.0'
26
+ gem.add_development_dependency 'rubocop', '~> 0.48.1'
27
+ gem.add_development_dependency 'rubygems-tasks', '~> 0.2.4'
28
+ gem.add_development_dependency 'simplecov', '~> 0.14.1'
29
+ end
metadata ADDED
@@ -0,0 +1,255 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spokes
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Brett Buddin
8
+ - Kevin Haight
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2017-12-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '5.1'
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 5.1.0
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - "~>"
29
+ - !ruby/object:Gem::Version
30
+ version: '5.1'
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 5.1.0
34
+ - !ruby/object:Gem::Dependency
35
+ name: multi_json
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.12'
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 1.12.1
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - "~>"
49
+ - !ruby/object:Gem::Version
50
+ version: '1.12'
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 1.12.1
54
+ - !ruby/object:Gem::Dependency
55
+ name: factory_bot
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '4.8'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '4.8'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rack-test
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.6'
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: 0.6.2
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '0.6'
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: 0.6.2
88
+ - !ruby/object:Gem::Dependency
89
+ name: rake
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '0.8'
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 0.8.7
98
+ type: :development
99
+ prerelease: false
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '0.8'
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: 0.8.7
108
+ - !ruby/object:Gem::Dependency
109
+ name: rspec
110
+ requirement: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '3.1'
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 3.1.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.1'
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: 3.1.0
128
+ - !ruby/object:Gem::Dependency
129
+ name: rspec-rails
130
+ requirement: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - "~>"
133
+ - !ruby/object:Gem::Version
134
+ version: '3.6'
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: 3.6.0
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3.6'
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: 3.6.0
148
+ - !ruby/object:Gem::Dependency
149
+ name: rubocop
150
+ requirement: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - "~>"
153
+ - !ruby/object:Gem::Version
154
+ version: 0.48.1
155
+ type: :development
156
+ prerelease: false
157
+ version_requirements: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - "~>"
160
+ - !ruby/object:Gem::Version
161
+ version: 0.48.1
162
+ - !ruby/object:Gem::Dependency
163
+ name: rubygems-tasks
164
+ requirement: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - "~>"
167
+ - !ruby/object:Gem::Version
168
+ version: 0.2.4
169
+ type: :development
170
+ prerelease: false
171
+ version_requirements: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - "~>"
174
+ - !ruby/object:Gem::Version
175
+ version: 0.2.4
176
+ - !ruby/object:Gem::Dependency
177
+ name: simplecov
178
+ requirement: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - "~>"
181
+ - !ruby/object:Gem::Version
182
+ version: 0.14.1
183
+ type: :development
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - "~>"
188
+ - !ruby/object:Gem::Version
189
+ version: 0.14.1
190
+ description: Setting up configuration of environment variables, versioning, & other
191
+ middleware should be easier. This is is a set of utilities to help.
192
+ email:
193
+ - kevinjhaight@gmail.com
194
+ executables: []
195
+ extensions: []
196
+ extra_rdoc_files: []
197
+ files:
198
+ - ".gitignore"
199
+ - ".rubocop.yml"
200
+ - ".ruby-gemset"
201
+ - ".ruby-version"
202
+ - Gemfile
203
+ - README.md
204
+ - Rakefile
205
+ - lib/spokes.rb
206
+ - lib/spokes/config/env.rb
207
+ - lib/spokes/middleware/concerns/bad_request.rb
208
+ - lib/spokes/middleware/concerns/header_validation.rb
209
+ - lib/spokes/middleware/cors.rb
210
+ - lib/spokes/middleware/health.rb
211
+ - lib/spokes/middleware/request_id.rb
212
+ - lib/spokes/middleware/service_name.rb
213
+ - lib/spokes/version.rb
214
+ - lib/spokes/versioning/config/minor_versions.yml
215
+ - lib/spokes/versioning/minor_versioning.rb
216
+ - lib/spokes/versioning/railtie.rb
217
+ - lib/spokes/versioning/tasks/minor_versioning.rake
218
+ - logo/spokes_logo.png
219
+ - script/cibuild
220
+ - script/postbuild
221
+ - script/test
222
+ - spec/config/env_spec.rb
223
+ - spec/middleware/cors_spec.rb
224
+ - spec/middleware/health_spec.rb
225
+ - spec/middleware/request_id_spec.rb
226
+ - spec/middleware/service_name_spec.rb
227
+ - spec/rails_helper.rb
228
+ - spec/spec_helper.rb
229
+ - spec/versioning/minor_versioning_spec.rb
230
+ - spokes.gemspec
231
+ homepage: https://github.com/khaight/spokes
232
+ licenses:
233
+ - MIT
234
+ metadata: {}
235
+ post_install_message:
236
+ rdoc_options: []
237
+ require_paths:
238
+ - lib
239
+ required_ruby_version: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ required_rubygems_version: !ruby/object:Gem::Requirement
245
+ requirements:
246
+ - - ">="
247
+ - !ruby/object:Gem::Version
248
+ version: '0'
249
+ requirements: []
250
+ rubyforge_project:
251
+ rubygems_version: 2.4.5.1
252
+ signing_key:
253
+ specification_version: 4
254
+ summary: A set of utilities for helping creating apis
255
+ test_files: []