versioncake 1.3.0 → 2.0.0

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