versioncake 2.5.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|