versioncake 2.5.0 → 3.0.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.
- checksums.yaml +6 -14
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/Appraisals +12 -0
- data/CHANGELOG.md +18 -1
- data/CONTRIBUTING.md +2 -2
- data/Gemfile.lock +96 -44
- data/README.md +79 -29
- data/RELEASE.md +1 -1
- data/Rakefile +3 -7
- data/gemfiles/rails3.2.gemfile +2 -1
- data/gemfiles/rails3.2.gemfile.lock +34 -10
- data/gemfiles/rails4.0.gemfile +2 -1
- data/gemfiles/rails4.0.gemfile.lock +31 -7
- data/gemfiles/rails4.1.gemfile +1 -1
- data/gemfiles/rails4.1.gemfile.lock +28 -8
- data/gemfiles/rails4.2.gemfile +9 -0
- data/gemfiles/rails4.2.gemfile.lock +133 -0
- data/lib/generators/templates/versioncake.rb +40 -0
- data/lib/generators/versioncake/install_generator.rb +12 -0
- data/lib/versioncake.rb +24 -3
- data/lib/versioncake/configuration.rb +19 -2
- data/lib/versioncake/controller_additions.rb +35 -23
- data/lib/versioncake/engine.rb +7 -0
- data/lib/versioncake/exceptions.rb +4 -0
- data/lib/versioncake/rack/middleware.rb +20 -0
- data/lib/versioncake/strategies/extraction_strategy.rb +8 -3
- data/lib/versioncake/strategies/http_accept_parameter_strategy.rb +2 -2
- data/lib/versioncake/strategies/http_header_strategy.rb +2 -2
- data/lib/versioncake/strategies/path_parameter_strategy.rb +6 -2
- data/lib/versioncake/strategies/query_parameter_strategy.rb +2 -2
- data/lib/versioncake/strategies/request_parameter_strategy.rb +2 -2
- data/lib/versioncake/test_helpers.rb +14 -0
- data/lib/versioncake/version.rb +1 -1
- data/lib/versioncake/version_checker.rb +28 -0
- data/lib/versioncake/version_context.rb +20 -0
- data/lib/versioncake/version_context_service.rb +47 -0
- data/lib/versioncake/versioned_request.rb +22 -33
- data/lib/versioncake/versioned_resource.rb +14 -0
- data/lib/versioncake/view_additions.rb +7 -7
- data/{test → spec}/fixtures/partials/_versioned.erb +0 -0
- data/{test → spec}/fixtures/partials/_versioned.v1.erb +0 -0
- data/{test → spec}/fixtures/partials/_versioned.v2.erb +0 -0
- data/{test → spec}/fixtures/partials/_versioned.v3.erb +0 -0
- data/{test → spec}/fixtures/partials/another_versioned_partial.erb +0 -0
- data/{test → spec}/fixtures/partials/another_versioned_partial.v1.erb +0 -0
- data/{test → spec}/fixtures/templates/unversioned.html.erb +0 -0
- data/{test → spec}/fixtures/templates/v1_extension_scheme.v3.html.erb +0 -0
- data/{test → spec}/fixtures/templates/v1_extension_scheme.v6.json +0 -0
- data/{test → spec}/fixtures/templates/versioned.html.erb +0 -0
- data/{test → spec}/fixtures/templates/versioned.html.v1.erb +0 -0
- data/{test → spec}/fixtures/templates/versioned.html.v2.erb +0 -0
- data/{test → spec}/fixtures/templates/versioned.html.v3.erb +0 -0
- data/spec/fixtures/test_cases.yml +45 -0
- data/spec/integration/controller/renders_controller_spec.rb +73 -0
- data/spec/integration/controller/unversioned_controller_spec.rb +12 -0
- data/spec/integration/rack/middleware_regression_spec.rb +41 -0
- data/spec/integration/view/render_spec.rb +33 -0
- data/spec/integration/view/view_additions_spec.rb +51 -0
- data/spec/rails_helper.rb +41 -0
- data/spec/spec_helper.rb +25 -0
- data/spec/test_app/Rakefile +7 -0
- data/{test → spec/test_app}/app/controllers/renders_controller.rb +0 -0
- data/spec/test_app/app/controllers/unversioned_controller.rb +6 -0
- data/spec/test_app/app/views/renders/index.html.erb +1 -0
- data/{test → spec/test_app}/app/views/renders/index.html.v1.erb +0 -0
- data/{test → spec/test_app}/app/views/renders/index.html.v2.erb +0 -0
- data/spec/test_app/app/views/unversioned/index.html.erb +1 -0
- data/spec/test_app/config.ru +4 -0
- data/{test → spec/test_app}/config/application.rb +4 -6
- data/spec/test_app/config/boot.rb +5 -0
- data/spec/test_app/config/environment.rb +5 -0
- data/spec/test_app/config/initializers/versioncake.rb +45 -0
- data/spec/test_app/config/routes.rb +4 -0
- data/spec/test_app/script/rails +4 -0
- data/spec/unit/cli_spec.rb +36 -0
- data/spec/unit/configuration_spec.rb +61 -0
- data/spec/unit/strategies/extraction_strategy_spec.rb +71 -0
- data/spec/unit/strategies/http_accept_parameter_strategy_spec.rb +20 -0
- data/spec/unit/strategies/http_header_strategy_spec.rb +19 -0
- data/spec/unit/strategies/path_parameter_strategy_spec.rb +18 -0
- data/spec/unit/strategies/query_parameter_strategy_spec.rb +24 -0
- data/spec/unit/strategies/request_parameter_strategy_spec.rb +19 -0
- data/spec/unit/version_checker_spec.rb +60 -0
- data/spec/unit/version_context_service_spec.rb +84 -0
- data/spec/unit/version_context_spec.rb +46 -0
- data/spec/unit/versioned_request_spec.rb +35 -0
- data/spec/unit/versioned_resource_spec.rb +12 -0
- data/versioncake.gemspec +5 -2
- metadata +91 -70
- data/lib/versioncake/railtie.rb +0 -7
- data/test/app/views/renders/index.html.erb +0 -1
- data/test/config.ru +0 -0
- data/test/config/routes.rb +0 -3
- data/test/fixtures/test_cases.yml +0 -70
- data/test/functional/custom_strategy_controller_test.rb +0 -16
- data/test/functional/multiple_strategy_controller_test.rb +0 -24
- data/test/functional/renders_controller_test.rb +0 -71
- data/test/functional/strategy_controller_test.rb +0 -38
- data/test/script/rails +0 -0
- data/test/template/render_test.rb +0 -34
- data/test/test_helper.rb +0 -21
- data/test/unit/cli_test.rb +0 -48
- data/test/unit/configuration_test.rb +0 -45
- data/test/unit/strategies/extraction_strategy_test.rb +0 -70
- data/test/unit/strategies/http_accept_parameter_strategy_test.rb +0 -17
- data/test/unit/strategies/http_header_strategy_test.rb +0 -17
- data/test/unit/strategies/path_parameter_strategy_test.rb +0 -17
- data/test/unit/strategies/query_parameter_strategy_test.rb +0 -22
- data/test/unit/strategies/request_parameter_strategy_test.rb +0 -17
- data/test/unit/versioned_request_test.rb +0 -44
- data/test/unit/view_additions_test.rb +0 -35
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
VersionCake.setup do |config|
|
|
2
|
+
# Set the version key that clients will send example: `X-API-VERSION: 5`
|
|
3
|
+
# config.version_key = 'version'
|
|
4
|
+
|
|
5
|
+
# Enable Rails versioned filename mapping
|
|
6
|
+
# config.rails_view_versioning = true
|
|
7
|
+
|
|
8
|
+
# Extraction Strategies
|
|
9
|
+
# Define how you will accept version from the request.
|
|
10
|
+
#
|
|
11
|
+
# Defaults to all:
|
|
12
|
+
# [:http_accept_parameter, :http_header, :request_parameter, :path_parameter, :query_parameter]
|
|
13
|
+
#
|
|
14
|
+
# Custom strategy example:
|
|
15
|
+
# You can create your own extraction strategy by giving a proc or class that responds to execute:
|
|
16
|
+
# ```
|
|
17
|
+
# lambda {|request| request.headers["HTTP_X_MY_VERSION"] }
|
|
18
|
+
# ```
|
|
19
|
+
# or
|
|
20
|
+
# ```
|
|
21
|
+
# class ExtractorStrategy
|
|
22
|
+
# def execute(request)
|
|
23
|
+
# request.headers["HTTP_X_MY_VERSION"]
|
|
24
|
+
# end
|
|
25
|
+
# end
|
|
26
|
+
# ```
|
|
27
|
+
config.extraction_strategy = [:http_accept_parameter,
|
|
28
|
+
:http_header,
|
|
29
|
+
:request_parameter,
|
|
30
|
+
:path_parameter,
|
|
31
|
+
:query_parameter]
|
|
32
|
+
|
|
33
|
+
# Version when no version in present in the request. If none is
|
|
34
|
+
# specified then it will error?
|
|
35
|
+
config.missing_version = 3
|
|
36
|
+
|
|
37
|
+
# Versioned Resources
|
|
38
|
+
# Define what server resources are supported, deprecated or obsolete
|
|
39
|
+
# Resources listed are priority based upon creation. To version all
|
|
40
|
+
# resources you can define a catch all at the bottom of the block.
|
|
41
|
+
config.resources do |r|
|
|
42
|
+
# r.resource uri_regex, obsolete, deprecated, supported
|
|
43
|
+
r.resource %r{renders/*}, [2], [4], (1..5)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe VersionCake::Cli do
|
|
4
|
+
quiet_stdout
|
|
5
|
+
before { allow(File).to receive :rename }
|
|
6
|
+
|
|
7
|
+
context '#migrate' do
|
|
8
|
+
subject(:migrated_files) { VersionCake::Cli.new.migrate(path) }
|
|
9
|
+
|
|
10
|
+
context 'when a path has migratable files' do
|
|
11
|
+
let(:path) { './spec/fixtures/templates' }
|
|
12
|
+
|
|
13
|
+
it {
|
|
14
|
+
renamed_files = [
|
|
15
|
+
['./spec/fixtures/templates/v1_extension_scheme.v3.html.erb',
|
|
16
|
+
'./spec/fixtures/templates/v1_extension_scheme.html.v3.erb'],
|
|
17
|
+
['./spec/fixtures/templates/v1_extension_scheme.v6.json',
|
|
18
|
+
'./spec/fixtures/templates/v1_extension_scheme.json.v6']
|
|
19
|
+
]
|
|
20
|
+
expect(renamed_files).to match_array migrated_files
|
|
21
|
+
}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
context 'when a path has no migratable files' do
|
|
25
|
+
let(:path) { './spec/test_app/app/views' }
|
|
26
|
+
|
|
27
|
+
it { expect(migrated_files).to be_empty }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context 'when the path is not found' do
|
|
31
|
+
let(:path) { './a/missing/path' }
|
|
32
|
+
|
|
33
|
+
it { expect { migrated_files }.to raise_error(ArgumentError) }
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe VersionCake::Configuration do
|
|
4
|
+
subject(:config) do
|
|
5
|
+
config = described_class.new
|
|
6
|
+
if supported_versions
|
|
7
|
+
config.supported_version_numbers = supported_versions
|
|
8
|
+
end
|
|
9
|
+
config
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
context '#supported_version_numbers' do
|
|
13
|
+
context 'by default' do
|
|
14
|
+
let(:supported_versions) { nil }
|
|
15
|
+
|
|
16
|
+
it 'is a logical set of version numbers' do
|
|
17
|
+
expect(config.supported_version_numbers).to eq (1..10).to_a.reverse
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context 'when set with a range' do
|
|
22
|
+
let(:supported_versions) { (1..7) }
|
|
23
|
+
|
|
24
|
+
it { expect(config.supported_version_numbers).to eq [7,6,5,4,3,2,1] }
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
context 'when set with an unordered array' do
|
|
28
|
+
let(:supported_versions) { [2,4,1,5,3,6,7] }
|
|
29
|
+
|
|
30
|
+
it { expect(config.supported_version_numbers).to eq [7,6,5,4,3,2,1] }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context 'when set with a single value' do
|
|
34
|
+
let(:supported_versions) { 19 }
|
|
35
|
+
|
|
36
|
+
it { expect(config.supported_version_numbers).to eq [19] }
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
context '#supports_version?' do
|
|
41
|
+
let(:supported_versions) { (1..7) }
|
|
42
|
+
|
|
43
|
+
it 'is true for all supported versions' do
|
|
44
|
+
config.supported_version_numbers.each do |supported_version|
|
|
45
|
+
expect(config.supports_version?(supported_version)).to be_truthy
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it 'is false for other versions' do
|
|
50
|
+
[-2,-1,0,8,9,10].each do |unsupported_version|
|
|
51
|
+
expect(config.supports_version?(unsupported_version)).to be_falsey
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
context '#latest_version' do
|
|
57
|
+
let(:supported_versions) { [4,1,3,9,2,54] }
|
|
58
|
+
|
|
59
|
+
it { expect(config.latest_version).to eq 54 }
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
# TODO: make better!!!
|
|
4
|
+
describe VersionCake::ExtractionStrategy do
|
|
5
|
+
it "execute is required for a strategy" do
|
|
6
|
+
expect do
|
|
7
|
+
VersionCake::ExtractionStrategy.new.execute("request")
|
|
8
|
+
end.to raise_error(Exception)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "custom strategy result will be converted to integer" do
|
|
12
|
+
class TestStrategy < VersionCake::ExtractionStrategy
|
|
13
|
+
def execute(request); "123"; end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
expect(TestStrategy.new.extract("request")).to eq 123
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "custom strategy result will be returned" do
|
|
20
|
+
class TestStrategy < VersionCake::ExtractionStrategy
|
|
21
|
+
def execute(request); 123; end
|
|
22
|
+
end
|
|
23
|
+
expect(TestStrategy.new.extract("request")).to eq 123
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "custom strategy will fail if it returns unexpected result" do
|
|
27
|
+
class TestStrategy < VersionCake::ExtractionStrategy
|
|
28
|
+
def execute(request); Object.new; end
|
|
29
|
+
end
|
|
30
|
+
expect { TestStrategy.new.extract("request") }.to raise_error(Exception)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context '#query_parameter' do
|
|
34
|
+
subject(:lookedup_strategy) { VersionCake::ExtractionStrategy.lookup(:query_parameter) }
|
|
35
|
+
|
|
36
|
+
it { expect(lookedup_strategy.class).to eq VersionCake::QueryParameterStrategy }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "it creates a custom strategy for a proc" do
|
|
40
|
+
strategy = VersionCake::ExtractionStrategy.lookup(lambda{|req|})
|
|
41
|
+
expect(strategy.class).to eq VersionCake::CustomStrategy
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "it wraps a custom object" do
|
|
45
|
+
class FakeStrategy
|
|
46
|
+
def execute(request);end
|
|
47
|
+
end
|
|
48
|
+
strategy = VersionCake::ExtractionStrategy.lookup(FakeStrategy.new)
|
|
49
|
+
expect(strategy.class).to eq VersionCake::CustomStrategy
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "it calls a custom objects execute method" do
|
|
53
|
+
class FakeStrategy
|
|
54
|
+
def execute(request); 9999; end
|
|
55
|
+
end
|
|
56
|
+
strategy = VersionCake::ExtractionStrategy.lookup(FakeStrategy.new)
|
|
57
|
+
expect(strategy.execute(nil)).to eq 9999
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "it fails to create a custom strategy for a proc with no parameters" do
|
|
61
|
+
expect do
|
|
62
|
+
VersionCake::ExtractionStrategy.lookup(lambda{})
|
|
63
|
+
end.to raise_error(Exception)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "it raises error when no strategy is found" do
|
|
67
|
+
expect do
|
|
68
|
+
VersionCake::ExtractionStrategy.lookup(:fake_extraction)
|
|
69
|
+
end.to raise_error(Exception)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe VersionCake::HttpAcceptParameterStrategy do
|
|
4
|
+
let(:strategy) { VersionCake::HttpAcceptParameterStrategy.new }
|
|
5
|
+
subject { strategy.extract(request) }
|
|
6
|
+
|
|
7
|
+
context "a request with an HTTP_ACCEPT version retrieves the version" do
|
|
8
|
+
let(:request) { instance_double('Request', env: \
|
|
9
|
+
{'HTTP_ACCEPT' => 'application/xml; api_version=11'}) }
|
|
10
|
+
|
|
11
|
+
it { is_expected.to eq 11 }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
context "a request without an HTTP_ACCEPT version returns nil" do
|
|
15
|
+
let(:request) { instance_double('Request', env: \
|
|
16
|
+
{'HTTP_ACCEPT' => 'text/x-dvi; q=.8; mxb=100000; mxt=5.0, text/x-c'}) }
|
|
17
|
+
|
|
18
|
+
it { is_expected.to be_nil }
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe VersionCake::HttpHeaderStrategy do
|
|
4
|
+
let(:strategy) { VersionCake::HttpHeaderStrategy.new }
|
|
5
|
+
subject { strategy.extract(request) }
|
|
6
|
+
|
|
7
|
+
context "a request with an HTTP_X_API_VERSION retrieves the version" do
|
|
8
|
+
let(:request) { instance_double('Request', env: {'HTTP_API_VERSION' => '11'}) }
|
|
9
|
+
|
|
10
|
+
it { is_expected.to eq 11 }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
context "a request without an HTTP_X_API_VERSION returns nil" do
|
|
14
|
+
let(:request) { instance_double('Request', \
|
|
15
|
+
env: {'HTTP_ACCEPT' => 'text/x-dvi; q=.8; mxb=100000; mxt=5.0, text/x-c'}) }
|
|
16
|
+
|
|
17
|
+
it { is_expected.to be_nil }
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe VersionCake::PathParameterStrategy do
|
|
4
|
+
let(:strategy) { VersionCake::PathParameterStrategy.new }
|
|
5
|
+
subject { strategy.extract(request) }
|
|
6
|
+
|
|
7
|
+
context "a request with an api_version path parameter retrieves the version" do
|
|
8
|
+
let(:request) { instance_double('Request', path: 'api/v11/parameter') }
|
|
9
|
+
|
|
10
|
+
it { is_expected.to eq 11 }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
context "a request without an api_version path parameter returns nil" do
|
|
14
|
+
let(:request) { instance_double('Request', path: 'parameter/parameter') }
|
|
15
|
+
|
|
16
|
+
it { is_expected.to be_nil }
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe VersionCake::QueryParameterStrategy do
|
|
4
|
+
let(:strategy) { VersionCake::QueryParameterStrategy.new }
|
|
5
|
+
subject { strategy.extract(request) }
|
|
6
|
+
|
|
7
|
+
context "a request with an api_version parameter retrieves the version" do
|
|
8
|
+
let(:request) { instance_double('Request', GET: {'api_version' => '11', 'other' => 'parameter'}) }
|
|
9
|
+
|
|
10
|
+
it { is_expected.to eq 11 }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
context "a request with an Integer api_version parameter retrieves the version" do
|
|
14
|
+
let(:request) { instance_double('Request', GET: {'api_version' => 11, 'other' => 'parameter'}) }
|
|
15
|
+
|
|
16
|
+
it { is_expected.to eq 11 }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context "a request without an api_version parameter returns nil" do
|
|
20
|
+
let(:request) { instance_double('Request', GET: {'other' => 'parameter', 'another' => 'parameter'}) }
|
|
21
|
+
|
|
22
|
+
it { is_expected.to be_nil }
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe VersionCake::RequestParameterStrategy do
|
|
4
|
+
let(:strategy) { VersionCake::RequestParameterStrategy.new }
|
|
5
|
+
subject { strategy.extract(request) }
|
|
6
|
+
|
|
7
|
+
context "a request with an api_version request parameter retrieves the version" do
|
|
8
|
+
let(:request) { instance_double('Request', POST: {'api_version' => '11', 'other' => 'parameter'}) }
|
|
9
|
+
|
|
10
|
+
it { is_expected.to eq 11 }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
context "a request without an api_version request parameter returns nil" do
|
|
14
|
+
let(:request) { instance_double('Request', POST: \
|
|
15
|
+
{'other' => 'parameter', 'another' => 'parameter'}) }
|
|
16
|
+
|
|
17
|
+
it { is_expected.to be_nil }
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe VersionCake::VersionChecker do
|
|
4
|
+
let(:resource) do
|
|
5
|
+
double(
|
|
6
|
+
supported_versions: [5,6],
|
|
7
|
+
deprecated_versions: [4],
|
|
8
|
+
obsolete_versions: [2,3],
|
|
9
|
+
)
|
|
10
|
+
end
|
|
11
|
+
let(:version) { }
|
|
12
|
+
subject do
|
|
13
|
+
checker = VersionCake::VersionChecker.new(resource, version)
|
|
14
|
+
checker.execute
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe '#execute' do
|
|
18
|
+
context 'when no version is passed in' do
|
|
19
|
+
let(:version) { nil }
|
|
20
|
+
|
|
21
|
+
it { is_expected.to eq :no_version }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
context 'when the version is a supported version' do
|
|
25
|
+
let(:version) { 5 }
|
|
26
|
+
|
|
27
|
+
it { is_expected.to eq :supported }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context 'when the version is an obsolete version' do
|
|
31
|
+
let(:version) { 3 }
|
|
32
|
+
|
|
33
|
+
it { is_expected.to eq :obsolete }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context 'when the version is a deprecated version' do
|
|
37
|
+
let(:version) { 4 }
|
|
38
|
+
|
|
39
|
+
it { is_expected.to eq :deprecated }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
context 'when the version is greater than the supported versions' do
|
|
43
|
+
let(:version) { 7 }
|
|
44
|
+
|
|
45
|
+
it { is_expected.to eq :version_too_high }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context 'when the version is less than the supported versions' do
|
|
49
|
+
let(:version) { 1 }
|
|
50
|
+
|
|
51
|
+
it { is_expected.to eq :version_too_low }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
context 'when the version is of a strange format' do
|
|
55
|
+
let(:version) { '1' }
|
|
56
|
+
|
|
57
|
+
it { is_expected.to eq :invalid_format }
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe VersionCake::VersionContextService do
|
|
4
|
+
|
|
5
|
+
let(:resource_user) do
|
|
6
|
+
double('user_resource',
|
|
7
|
+
uri: %r{user},
|
|
8
|
+
supported_versions: [5,6,7],
|
|
9
|
+
deprecated_versions: [3,4],
|
|
10
|
+
obsolete_versions: [1,2]
|
|
11
|
+
)
|
|
12
|
+
end
|
|
13
|
+
let(:resource_all) do
|
|
14
|
+
double('default',
|
|
15
|
+
uri: %r{.*},
|
|
16
|
+
supported_versions: [6,7],
|
|
17
|
+
deprecated_versions: [3,4,5],
|
|
18
|
+
obsolete_versions: [1,2]
|
|
19
|
+
)
|
|
20
|
+
end
|
|
21
|
+
let(:config) do
|
|
22
|
+
double('config',
|
|
23
|
+
versioned_resources: [resource_user, resource_all],
|
|
24
|
+
missing_version: 9,
|
|
25
|
+
extraction_strategies: [
|
|
26
|
+
VersionCake::CustomStrategy.new(lambda{ |req| req.version })
|
|
27
|
+
]
|
|
28
|
+
)
|
|
29
|
+
end
|
|
30
|
+
let(:service) { described_class.new(config) }
|
|
31
|
+
|
|
32
|
+
describe '#create_context_from_request' do
|
|
33
|
+
let(:request) { double(version: 5, path: 'users/123') }
|
|
34
|
+
subject(:context) { service.create_context_from_request(request) }
|
|
35
|
+
|
|
36
|
+
it { expect(context.version).to eq 5 }
|
|
37
|
+
it { expect(context.resource).to eq resource_user }
|
|
38
|
+
it { expect(context.result).to eq :supported }
|
|
39
|
+
|
|
40
|
+
context 'for a deprecated version' do
|
|
41
|
+
let(:request) { double(version: 5, path: 'posts/123') }
|
|
42
|
+
|
|
43
|
+
it { expect(context.version).to eq 5 }
|
|
44
|
+
it { expect(context.resource).to eq resource_all }
|
|
45
|
+
it { expect(context.result).to eq :deprecated }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context 'for an obsolete version' do
|
|
49
|
+
let(:request) { double(version: 2, path: 'users/123') }
|
|
50
|
+
|
|
51
|
+
it { expect(context.version).to eq 2 }
|
|
52
|
+
it { expect(context.resource).to eq resource_user }
|
|
53
|
+
it { expect(context.result).to eq :obsolete }
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
describe '#create_context' do
|
|
58
|
+
let(:uri) { 'users/21' }
|
|
59
|
+
let(:version) { 5 }
|
|
60
|
+
subject(:context) { service.create_context(uri, version) }
|
|
61
|
+
|
|
62
|
+
it { expect(context.version).to eq 5 }
|
|
63
|
+
it { expect(context.resource).to eq resource_user }
|
|
64
|
+
it { expect(context.result).to eq :supported }
|
|
65
|
+
|
|
66
|
+
context 'for a deprecated version' do
|
|
67
|
+
let(:uri) { 'posts/21' }
|
|
68
|
+
let(:version) { 5 }
|
|
69
|
+
|
|
70
|
+
it { expect(context.version).to eq 5 }
|
|
71
|
+
it { expect(context.resource).to eq resource_all }
|
|
72
|
+
it { expect(context.result).to eq :deprecated }
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context 'for an obsolete version' do
|
|
76
|
+
let(:uri) { 'posts/21' }
|
|
77
|
+
let(:version) { 2 }
|
|
78
|
+
|
|
79
|
+
it { expect(context.version).to eq 2 }
|
|
80
|
+
it { expect(context.resource).to eq resource_all }
|
|
81
|
+
it { expect(context.result).to eq :obsolete }
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|