versioncake 1.3.0 → 2.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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +5 -0
  3. data/Appraisals +6 -0
  4. data/CHANGELOG.md +12 -0
  5. data/Gemfile.lock +4 -4
  6. data/README.md +65 -30
  7. data/RELEASE.md +1 -1
  8. data/bin/versioncake +9 -0
  9. data/gemfiles/rails3.2.gemfile.lock +6 -2
  10. data/gemfiles/rails4.0.gemfile.lock +1 -1
  11. data/gemfiles/rails4.1.gemfile +9 -0
  12. data/gemfiles/rails4.1.gemfile.lock +87 -0
  13. data/lib/versioncake/cli.rb +60 -0
  14. data/lib/versioncake/configuration.rb +21 -21
  15. data/lib/versioncake/railtie.rb +3 -19
  16. data/lib/versioncake/strategies/extraction_strategy.rb +5 -5
  17. data/lib/versioncake/strategies/http_accept_parameter_strategy.rb +1 -1
  18. data/lib/versioncake/strategies/http_header_strategy.rb +2 -2
  19. data/lib/versioncake/strategies/path_parameter_strategy.rb +11 -0
  20. data/lib/versioncake/strategies/query_parameter_strategy.rb +2 -2
  21. data/lib/versioncake/strategies/request_parameter_strategy.rb +2 -2
  22. data/lib/versioncake/version.rb +1 -1
  23. data/lib/versioncake/versioned_request.rb +10 -6
  24. data/lib/versioncake/view_additions.rb +67 -10
  25. data/lib/versioncake.rb +2 -0
  26. data/test/{fixtures/templates/versioned.v1.html.erb → app/views/renders/index.html.v1.erb} +0 -0
  27. data/test/{fixtures/templates/versioned.v2.html.erb → app/views/renders/index.html.v2.erb} +0 -0
  28. data/test/config/application.rb +3 -2
  29. data/test/fixtures/templates/v1_extension_scheme.v3.html.erb +7 -0
  30. data/test/fixtures/templates/v1_extension_scheme.v6.json +4 -0
  31. data/test/fixtures/templates/versioned.html.v1.erb +1 -0
  32. data/test/fixtures/templates/versioned.html.v2.erb +1 -0
  33. data/test/fixtures/templates/{versioned.v3.html.erb → versioned.html.v3.erb} +0 -0
  34. data/test/fixtures/test_cases.yml +70 -0
  35. data/test/functional/custom_strategy_controller_test.rb +16 -0
  36. data/test/functional/multiple_strategy_controller_test.rb +24 -0
  37. data/test/functional/renders_controller_test.rb +14 -168
  38. data/test/functional/strategy_controller_test.rb +37 -0
  39. data/test/unit/cli_test.rb +48 -0
  40. data/test/unit/configuration_test.rb +15 -19
  41. data/test/unit/strategies/extraction_strategy_test.rb +2 -2
  42. data/test/unit/strategies/path_parameter_strategy_test.rb +17 -0
  43. data/test/unit/strategies/query_parameter_strategy_test.rb +5 -0
  44. data/test/unit/versioned_request_test.rb +1 -1
  45. data/test/unit/view_additions_test.rb +35 -0
  46. data/versioncake.gemspec +1 -0
  47. metadata +25 -9
  48. data/test/app/views/renders/index.v1.html.erb +0 -1
  49. data/test/app/views/renders/index.v2.html.erb +0 -1
@@ -2,8 +2,8 @@ module VersionCake
2
2
  class HttpHeaderStrategy < ExtractionStrategy
3
3
 
4
4
  def execute(request)
5
- if request.headers.key? "HTTP_X_#{@@version_string.upcase}"
6
- request.headers["HTTP_X_#{@@version_string.upcase}"]
5
+ if request.headers.key? "HTTP_X_#{version_key.upcase}"
6
+ request.headers["HTTP_X_#{version_key.upcase}"]
7
7
  end
8
8
  end
9
9
 
@@ -0,0 +1,11 @@
1
+ module VersionCake
2
+ class PathParameterStrategy < ExtractionStrategy
3
+
4
+ def execute(request)
5
+ if request.path_parameters.key? version_key.to_sym
6
+ request.path_parameters[version_key.to_sym]
7
+ end
8
+ end
9
+
10
+ end
11
+ end
@@ -2,8 +2,8 @@ module VersionCake
2
2
  class QueryParameterStrategy < ExtractionStrategy
3
3
 
4
4
  def execute(request)
5
- if request.query_parameters.key? @@version_string.to_sym
6
- request.query_parameters[@@version_string.to_sym]
5
+ if request.query_parameters.key? version_key.to_sym
6
+ request.query_parameters[version_key.to_sym].to_s
7
7
  end
8
8
  end
9
9
 
@@ -2,8 +2,8 @@ module VersionCake
2
2
  class RequestParameterStrategy < ExtractionStrategy
3
3
 
4
4
  def execute(request)
5
- if request.request_parameters.has_key? @@version_string.to_sym
6
- request.request_parameters[@@version_string.to_sym].to_i
5
+ if request.request_parameters.has_key? version_key.to_sym
6
+ request.request_parameters[version_key.to_sym]
7
7
  end
8
8
  end
9
9
 
@@ -1,3 +1,3 @@
1
1
  module VersionCake
2
- VERSION = "1.3.0"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -4,18 +4,22 @@ module VersionCake
4
4
 
5
5
  def initialize(request, version_override=nil)
6
6
  @version = version_override || extract_version(request)
7
- @is_latest_version = @version == VersionCake::Configuration.latest_version
7
+ @is_latest_version = @version == config.latest_version
8
8
  end
9
9
 
10
10
  def supported_versions
11
- VersionCake::Configuration.supported_versions(@version)
11
+ config.supported_versions(@version)
12
12
  end
13
13
 
14
14
  private
15
15
 
16
+ def config
17
+ VersionCake::Railtie.config.versioncake
18
+ end
19
+
16
20
  def apply_strategies(request)
17
21
  version = nil
18
- VersionCake::Configuration.extraction_strategies.each do |strategy|
22
+ config.extraction_strategies.each do |strategy|
19
23
  version = strategy.extract(request)
20
24
  break unless version.nil?
21
25
  end
@@ -25,10 +29,10 @@ module VersionCake
25
29
  def extract_version(request)
26
30
  @extracted_version = apply_strategies(request)
27
31
  if @extracted_version.nil?
28
- @version = VersionCake::Configuration.default_version || VersionCake::Configuration.latest_version
29
- elsif VersionCake::Configuration.supports_version? @extracted_version
32
+ @version = config.default_version || config.latest_version
33
+ elsif config.supports_version? @extracted_version
30
34
  @version = @extracted_version
31
- elsif @extracted_version > VersionCake::Configuration.latest_version
35
+ elsif @extracted_version > config.latest_version
32
36
  raise ActionController::RoutingError.new("No route match for version")
33
37
  else
34
38
  raise ActionController::RoutingError.new("Version is deprecated")
@@ -3,26 +3,83 @@ require 'action_view'
3
3
  # register an addition detail for the lookup context to understand,
4
4
  # this will allow us to have the versions available upon lookup in
5
5
  # the resolver.
6
- ActionView::LookupContext.register_detail(:versions){ VersionCake::Configuration.supported_versions }
6
+ ActionView::LookupContext.register_detail(:versions){ VersionCake::Railtie.config.versioncake.supported_versions }
7
7
 
8
8
  ActionView::PathResolver.class_eval do
9
-
10
9
  # not sure why we are doing this yet, but looks like a good idea
11
- ActionView::PathResolver::EXTENSIONS.replace [:locale, :versions, :formats, :handlers]
10
+ if ActionPack::VERSION::MAJOR >= 4 && ActionPack::VERSION::MINOR >= 1
11
+ ActionView::PathResolver::EXTENSIONS.replace({
12
+ :locale => ".",
13
+ :formats => ".",
14
+ :versions => ".",
15
+ :variants => "+",
16
+ :handlers => "."
17
+ })
18
+
19
+ ActionView::PathResolver::DEFAULT_PATTERN.replace ":prefix/:action{.:locale,}{.:formats,}{+:variants,}{.:versions,}{.:handlers,}"
20
+ else
21
+ ActionView::PathResolver::EXTENSIONS.replace [:locale, :formats, :versions, :handlers]
22
+
23
+ # The query builder has the @details from the lookup_context and will
24
+ # match the detail name to the string in the pattern, so we must append
25
+ # it to the default pattern
26
+ ActionView::PathResolver::DEFAULT_PATTERN.replace ":prefix/:action{.:locale,}{.:formats,}{.:versions,}{.:handlers,}"
27
+ end
28
+
29
+ # The default extract handler expects that the handler is the last extension and
30
+ # the format is the next one. Since we are replacing the DEFAULT_PATTERN, we need to
31
+ # make sure that we extract the format from the correct position.
32
+ #
33
+ # The version may be stuck inbetween the format and the handler. This is actually pretty tricky
34
+ # because the version is optional and the locale is optional-which means when there are 3 'pieces'
35
+ # it may be the locale, format and handler or the format, version and handler. To check this, we will
36
+ # try one additional time if there are more pieces, which should cover all the cases:
37
+ #
38
+ # Cases:
39
+ # 1: assume version is in the extension, pieces = ['html','erb']
40
+ # 2: assume version is in the extension, pieces = ['html','v1','erb']
41
+ # 3: assume version is in the extension, pieces = ['en','html','erb']
42
+ # 4: assume version is in the extension, pieces = ['en','html','v1','erb']
43
+ #
44
+ def extract_handler_and_format(path, default_formats)
45
+ pieces = File.basename(path).split(".")
46
+ pieces.shift
47
+
48
+ extension = pieces.pop
49
+ if ActionPack::VERSION::MAJOR == 4
50
+ unless extension
51
+ message = "The file #{path} did not specify a template handler. The default is currently ERB, " \
52
+ "but will change to RAW in the future."
53
+ ActiveSupport::Deprecation.warn message
54
+ end
55
+ end
56
+ handler = ActionView::Template.handler_for_extension(extension)
57
+ format = get_format_from_pieces(pieces, (ActionPack::VERSION::MAJOR == 4 ? ActionView::Template::Types : Mime))
12
58
 
13
- # The query builder has the @details from the lookup_context and will
14
- # match the detail name to the string in the pattern, so we must append
15
- # it to the default pattern
16
- ActionView::PathResolver::DEFAULT_PATTERN.replace ":prefix/:action{.:locale,}{.:versions,}{.:formats,}{.:handlers,}"
59
+ [handler, format]
60
+ end
61
+
62
+ # If there are still pieces and we didn't find a valid format, we may
63
+ # have a version in the extension, so try one more time to pop the format.
64
+ def get_format_from_pieces(pieces, format_list)
65
+ format = nil
66
+ pieces.reverse.each do |piece|
67
+ if ActionView::PathResolver::EXTENSIONS.is_a?(Hash) &&
68
+ ActionView::PathResolver::EXTENSIONS.include?(:variants)
69
+ piece = piece.split(ActionView::PathResolver::EXTENSIONS[:variants], 2).first # remove variant from format
70
+ end
17
71
 
72
+ format = format_list[piece]
73
+ break unless format.nil?
74
+ end
75
+ format
76
+ end
18
77
  end
19
78
 
20
79
  ActionView::Template.class_eval do
21
-
22
80
  # the identifier method name filters out numbers,
23
81
  # but we want to preserve them for v1 etc.
24
82
  def identifier_method_name #:nodoc:
25
83
  inspect.gsub(/[^a-z0-9_]/, '_')
26
84
  end
27
-
28
- end
85
+ end
data/lib/versioncake.rb CHANGED
@@ -2,6 +2,7 @@ require 'versioncake/strategies/extraction_strategy'
2
2
  require 'versioncake/strategies/http_accept_parameter_strategy'
3
3
  require 'versioncake/strategies/http_header_strategy'
4
4
  require 'versioncake/strategies/query_parameter_strategy'
5
+ require 'versioncake/strategies/path_parameter_strategy'
5
6
  require 'versioncake/strategies/request_parameter_strategy'
6
7
  require 'versioncake/strategies/custom_strategy'
7
8
 
@@ -10,3 +11,4 @@ require 'versioncake/controller_additions'
10
11
  require 'versioncake/view_additions'
11
12
  require 'versioncake/versioned_request'
12
13
  require 'versioncake/railtie'
14
+ require 'versioncake/cli'
@@ -11,7 +11,8 @@ module RendersTest
11
11
  config.eager_load = false
12
12
 
13
13
  config.active_support.deprecation = :stderr
14
- config.view_versions = (1..3)
15
- config.view_version_extraction_strategy = :http_header
14
+
15
+ config.versioncake.supported_version_numbers = (1..3)
16
+ config.versioncake.extraction_strategy = [:http_header, :http_accept_parameter, :query_parameter, :request_parameter]
16
17
  end
17
18
  end
@@ -0,0 +1,7 @@
1
+ <dl>
2
+ <dt>Versioncake v1 Extension</dt>
3
+ <dd>v3.html.erb</dd>
4
+
5
+ <dt>Versioncake v2 Extension</dt>
6
+ <dd>html.v3.erb</dd>
7
+ </dl>
@@ -0,0 +1,4 @@
1
+ {
2
+ "Versioncake v1 Extension": "v6.json",
3
+ "Versioncake v2 Extension": "json.v6"
4
+ }
@@ -0,0 +1 @@
1
+ template v1
@@ -0,0 +1 @@
1
+ template v2
@@ -0,0 +1,70 @@
1
+ # http_header_strategy
2
+ - request:
3
+ headers:
4
+ HTTP_ACCEPT: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=1"
5
+ response: "template v1"
6
+
7
+ - request:
8
+ headers:
9
+ HTTP_ACCEPT: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=2"
10
+ response: "template v2"
11
+
12
+ - request:
13
+ headers:
14
+ HTTP_ACCEPT: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=INVALID"
15
+ response: "template v2"
16
+
17
+ # request_parameter_strategy
18
+ - request:
19
+ method: post
20
+ params:
21
+ api_version: "1"
22
+ response: "template v1"
23
+
24
+ - request:
25
+ method: post
26
+ params:
27
+ api_version: "2"
28
+ response: "template v2"
29
+
30
+ - request:
31
+ method: post
32
+ params:
33
+ api_version: "INVALID"
34
+ response: "template v2"
35
+
36
+ # query_parameter_strategy
37
+ - request:
38
+ params:
39
+ api_version: "1"
40
+ response: "template v1"
41
+
42
+ - request:
43
+ params:
44
+ api_version: "2"
45
+ response: "template v2"
46
+
47
+ - request:
48
+ params:
49
+ api_version: "INVALID"
50
+ response: "template v2"
51
+
52
+ # http_header_strategy
53
+ - request:
54
+ headers:
55
+ HTTP_X_API_VERSION: "1"
56
+ response: "template v1"
57
+
58
+ - request:
59
+ headers:
60
+ HTTP_X_API_VERSION: "2"
61
+ response: "template v2"
62
+
63
+ - request:
64
+ headers:
65
+ HTTP_X_API_VERSION: "INVALID"
66
+ response: "template v2"
67
+
68
+ # general
69
+ - request:
70
+ response: "template v2"
@@ -0,0 +1,16 @@
1
+ require './test/test_helper'
2
+ require 'action_controller'
3
+ require 'action_controller/test_case'
4
+
5
+ class CustomStrategyTest < ActionController::TestCase
6
+ tests RendersController
7
+
8
+ setup do
9
+ VersionCake::Configuration.any_instance.stubs(:extraction_strategy => lambda { |request| 2 })
10
+ end
11
+
12
+ test "renders version 2 of the partial based on the header Accept" do
13
+ get :index
14
+ assert_equal "template v2", @response.body
15
+ end
16
+ end
@@ -0,0 +1,24 @@
1
+ require './test/test_helper'
2
+ require 'action_controller'
3
+ require 'action_controller/test_case'
4
+
5
+ class MultipleStrategyTest < ActionController::TestCase
6
+ tests RendersController
7
+
8
+ test "renders version 1 of the partial based on the header Accept" do
9
+ @controller.request.stubs(:headers).returns({"HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=1"})
10
+ get :index
11
+ assert_equal "template v1", @response.body
12
+ end
13
+
14
+ test "renders the query parameter when accept parameter isn't available" do
15
+ get :index, "api_version" => "1"
16
+ assert_equal "template v1", @response.body
17
+ end
18
+
19
+ test "renders the higher priority accept parameter version" do
20
+ @controller.request.stubs(:headers).returns({"HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=2"})
21
+ get :index, "api_version" => "1"
22
+ assert_equal "template v2", @response.body
23
+ end
24
+ end
@@ -4,32 +4,23 @@ require 'action_controller/test_case'
4
4
 
5
5
  class RendersControllerTest < ActionController::TestCase
6
6
 
7
- setup do
8
- # change the version string for configuration testing
9
- VersionCake::ExtractionStrategy.version_string = "version"
10
- end
11
-
12
- teardown do
13
- VersionCake::ExtractionStrategy.version_string = "api_version"
14
- end
15
-
16
7
  test "render latest version of partial" do
17
8
  get :index
18
- assert_equal @response.body, "index.v2.html.erb"
9
+ assert_equal "template v2", @response.body
19
10
  end
20
11
 
21
12
  test "exposes the requested version" do
22
- get :index, "version" => "1"
23
- assert_equal @controller.requested_version, 1
13
+ get :index, "api_version" => "1"
14
+ assert_equal 1, @controller.requested_version
24
15
  end
25
16
 
26
17
  test "exposes latest version when requesting the latest" do
27
- get :index, "version" => "3"
18
+ get :index, "api_version" => "3"
28
19
  assert @controller.is_latest_version
29
20
  end
30
21
 
31
22
  test "reports not the latest version" do
32
- get :index, "version" => "1"
23
+ get :index, "api_version" => "1"
33
24
  assert !@controller.is_latest_version
34
25
  end
35
26
 
@@ -39,10 +30,9 @@ class RendersControllerTest < ActionController::TestCase
39
30
  end
40
31
 
41
32
  test "exposes the default version when the version is not set default is set" do
42
- VersionCake::Configuration.default_version = 1
33
+ VersionCake::Configuration.any_instance.stubs(:default_version => 1)
43
34
  get :index
44
35
  assert_equal 1, @controller.derived_version
45
- VersionCake::Configuration.default_version = nil
46
36
  end
47
37
 
48
38
  test "requested version is blank when the version is not set" do
@@ -51,158 +41,9 @@ class RendersControllerTest < ActionController::TestCase
51
41
  end
52
42
 
53
43
  test "set_version can be called to override the requested version" do
54
- get :index, "version" => "1", "override_version" => 2
44
+ get :index, "api_version" => "1", "override_version" => 2
55
45
  assert_equal 2, @controller.derived_version
56
46
  end
57
- end
58
-
59
- class ParameterStrategyTest < ActionController::TestCase
60
- tests RendersController
61
-
62
- setup do
63
- VersionCake::Configuration.extraction_strategy = :query_parameter
64
- end
65
-
66
- test "render version 1 of the partial based on the parameter _api_version" do
67
- get :index, "api_version" => "1"
68
- assert_equal @response.body, "index.v1.html.erb"
69
- end
70
-
71
- test "render version 2 of the partial based on the parameter _api_version" do
72
- get :index, "api_version" => "2"
73
- assert_equal @response.body, "index.v2.html.erb"
74
- end
75
-
76
- test "render the latest available version (v2) of the partial based on the parameter _api_version" do
77
- get :index, "api_version" => "3"
78
- assert_equal @response.body, "index.v2.html.erb"
79
- end
80
- end
81
-
82
- class CustomHeaderStrategyTest < ActionController::TestCase
83
- tests RendersController
84
-
85
- setup do
86
- VersionCake::Configuration.extraction_strategy = :http_header
87
- end
88
-
89
- test "renders version 1 of the partial based on the header API-Version" do
90
- @controller.request.stubs(:headers).returns({"HTTP_X_API_VERSION" => "1"})
91
- get :index
92
- assert_equal @response.body, "index.v1.html.erb"
93
- end
94
-
95
- test "renders version 2 of the partial based on the header API-Version" do
96
- @controller.request.stubs(:headers).returns({"HTTP_X_API_VERSION" => "2"})
97
- get :index
98
- assert_equal @response.body, "index.v2.html.erb"
99
- end
100
-
101
- test "renders the latest available version (v2) of the partial based on the header API-Version" do
102
- @controller.request.stubs(:headers).returns({"HTTP_X_API_VERSION" => "3"})
103
- get :index
104
- assert_equal @response.body, "index.v2.html.erb"
105
- end
106
- end
107
-
108
- class RequestBodyStrategyTest < ActionController::TestCase
109
- tests RendersController
110
-
111
- setup do
112
- VersionCake::Configuration.extraction_strategy = :request_parameter
113
- end
114
-
115
- test "requested version is in the body" do
116
- post :index, "api_version" => "2"
117
- assert_equal 2, @controller.requested_version
118
- end
119
- end
120
-
121
- class AcceptHeaderStrategyTest < ActionController::TestCase
122
- tests RendersController
123
-
124
- setup do
125
- VersionCake::Configuration.extraction_strategy = :http_accept_parameter
126
- end
127
-
128
- test "render version 1 of the partial based on the header Accept" do
129
- @controller.request.stubs(:headers).returns({"HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=1"})
130
- get :index
131
- assert_equal @response.body, "index.v1.html.erb"
132
- end
133
-
134
- test "render version 2 of the partial based on the header Accept" do
135
- @controller.request.stubs(:headers).returns({"HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=2"})
136
- get :index
137
- assert_equal @response.body, "index.v2.html.erb"
138
- end
139
-
140
- test "render the latest available version (v2) of the partial based on the header Accept" do
141
- @controller.request.stubs(:headers).returns({"HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=3"})
142
- get :index
143
- assert_equal @response.body, "index.v2.html.erb"
144
- end
145
-
146
- test "render the latest version of the partial" do
147
- @controller.request.stubs(:headers).returns({"HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=abc"})
148
- get :index
149
- assert_equal @response.body, "index.v2.html.erb"
150
- end
151
-
152
- test "render the default version version of the partial" do
153
- VersionCake::Configuration.default_version = 1
154
- @controller.request.stubs(:headers).returns({"HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=abc"})
155
- get :index
156
- assert_equal @response.body, "index.v1.html.erb"
157
- VersionCake::Configuration.default_version = nil
158
- end
159
-
160
- end
161
-
162
- class CustomStrategyTest < ActionController::TestCase
163
- tests RendersController
164
-
165
- setup do
166
- VersionCake::Configuration.extraction_strategy = lambda { |request| 2 }
167
- end
168
-
169
- test "renders version 2 of the partial based on the header Accept" do
170
- get :index
171
- assert_equal @response.body, "index.v2.html.erb"
172
- end
173
- end
174
-
175
- class MultipleStrategyTest < ActionController::TestCase
176
- tests RendersController
177
-
178
- setup do
179
- VersionCake::Configuration.extraction_strategy = [:http_accept_parameter, :query_parameter]
180
- end
181
-
182
- test "renders version 1 of the partial based on the header Accept" do
183
- @controller.request.stubs(:headers).returns({"HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=1"})
184
- get :index
185
- assert_equal @response.body, "index.v1.html.erb"
186
- end
187
-
188
- test "renders the query parameter when accept parameter isn't available" do
189
- get :index, "api_version" => "1"
190
- assert_equal @response.body, "index.v1.html.erb"
191
- end
192
-
193
- test "renders the higher priority accept parameter version" do
194
- @controller.request.stubs(:headers).returns({"HTTP_ACCEPT" => "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;api_version=2"})
195
- get :index, "api_version" => "1"
196
- assert_equal @response.body, "index.v2.html.erb"
197
- end
198
- end
199
-
200
- class UnsupportedVersionTest < ActionController::TestCase
201
- tests RendersController
202
-
203
- setup do
204
- VersionCake::Configuration.extraction_strategy = :query_parameter
205
- end
206
47
 
207
48
  test "responds with 404 when the version is larger than the supported version" do
208
49
  assert_raise ActionController::RoutingError do
@@ -211,9 +52,14 @@ class UnsupportedVersionTest < ActionController::TestCase
211
52
  end
212
53
 
213
54
  test "responds with 404 when the version is lower than the latest version, but not an available version" do
214
- VersionCake::Configuration.supported_version_numbers = [2,3]
215
55
  assert_raise ActionController::RoutingError do
216
- get :index, "api_version" => "1"
56
+ get :index, "api_version" => "0"
217
57
  end
218
58
  end
59
+
60
+ test "render the default version version of the partial" do
61
+ VersionCake::Configuration.any_instance.stubs(:default_version => 1)
62
+ get :index, "api_version" => "abc"
63
+ assert_equal "template v1", @response.body
64
+ end
219
65
  end
@@ -0,0 +1,37 @@
1
+ require './test/test_helper'
2
+ require 'action_controller'
3
+ require 'action_controller/test_case'
4
+ require 'yaml'
5
+
6
+ class StrategyControllerTest < ActionController::TestCase
7
+ tests RendersController
8
+
9
+ setup do
10
+ @test_cases = YAML.load(File.open(Rails.root.join('fixtures', 'test_cases.yml')))
11
+ end
12
+
13
+ test "test yml test cases" do
14
+ @test_cases.each do |test_case|
15
+ request = (test_case['request'] || {})
16
+ headers = request['headers']
17
+ params = request['params']
18
+ method = (request['method'] || "get").to_sym
19
+ response = test_case['response']
20
+ @controller.request.stubs(:headers).returns(headers || {})
21
+ begin
22
+ send(method, :index, params || {})
23
+ assert_equal(response, @response.body, custom_message(headers, params, method, response))
24
+ rescue => e
25
+ fail(custom_message(headers, params, method, response) + ", but it failed with an exception '#{e.message}'")
26
+ end
27
+ end
28
+ end
29
+
30
+ def custom_message(headers, params, method, response)
31
+ data = []
32
+ data << "headers:#{headers}" if headers
33
+ data << "params:#{params}" if params
34
+ "Expected #{data.join(",")} with method #{method} to yield #{response}"
35
+ end
36
+
37
+ end
@@ -0,0 +1,48 @@
1
+ require './test/test_helper'
2
+ require './lib/versioncake/cli'
3
+
4
+ class CliTest < ActiveSupport::TestCase
5
+
6
+ setup do
7
+ File.stubs :rename
8
+ capture_stdout(true)
9
+ end
10
+
11
+ teardown do
12
+ capture_stdout(false)
13
+ end
14
+
15
+ def capture_stdout(flag=true)
16
+ if flag
17
+ out = StringIO.new
18
+ $stdout = out
19
+ else
20
+ $stdout = STDOUT
21
+ end
22
+ end
23
+
24
+ test 'it can detect old file names' do
25
+ renamed_files = VersionCake::Cli.new.migrate('./test/fixtures/templates')
26
+ assert_equal 2, renamed_files.size
27
+ end
28
+
29
+ test 'it renames old filenames to new filenames' do
30
+ renamed_files = VersionCake::Cli.new.migrate('./test/fixtures/templates')
31
+ expected_renamed_files = [
32
+ ['./test/fixtures/templates/v1_extension_scheme.v3.html.erb', './test/fixtures/templates/v1_extension_scheme.html.v3.erb'],
33
+ ['./test/fixtures/templates/v1_extension_scheme.v6.json', './test/fixtures/templates/v1_extension_scheme.json.v6']
34
+ ]
35
+ assert_empty expected_renamed_files - renamed_files
36
+ end
37
+
38
+ test 'it reports no files changed when new filenames exist' do
39
+ assert_empty VersionCake::Cli.new.migrate('./test/app/views')
40
+ end
41
+
42
+ test 'it raises if it cannot find the path' do
43
+ assert_raises ArgumentError do
44
+ VersionCake::Cli.new.migrate('./a/missing/path')
45
+ end
46
+ end
47
+
48
+ end