vcr 3.0.3 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/lib/vcr.rb +18 -1
  3. data/lib/vcr/cassette.rb +11 -3
  4. data/lib/vcr/cassette/persisters/file_system.rb +1 -1
  5. data/lib/vcr/configuration.rb +3 -5
  6. data/lib/vcr/deprecations.rb +0 -62
  7. data/lib/vcr/errors.rb +16 -0
  8. data/lib/vcr/library_hooks/typhoeus.rb +37 -8
  9. data/lib/vcr/middleware/faraday.rb +5 -1
  10. data/lib/vcr/structs.rb +1 -1
  11. data/lib/vcr/util/hooks.rb +1 -0
  12. data/lib/vcr/version.rb +1 -1
  13. metadata +9 -249
  14. data/features/CHANGELOG.md +0 -710
  15. data/features/CONTRIBUTING.md +0 -26
  16. data/features/LICENSE.md +0 -20
  17. data/features/README.md +0 -339
  18. data/features/Upgrade.md +0 -289
  19. data/features/about_these_examples.md +0 -18
  20. data/features/cassettes/allow_unused_http_interactions.feature +0 -100
  21. data/features/cassettes/automatic_re_recording.feature +0 -72
  22. data/features/cassettes/decompress.feature +0 -74
  23. data/features/cassettes/dynamic_erb.feature +0 -100
  24. data/features/cassettes/exclusive.feature +0 -126
  25. data/features/cassettes/format.feature +0 -411
  26. data/features/cassettes/freezing_time.feature +0 -68
  27. data/features/cassettes/naming.feature +0 -28
  28. data/features/cassettes/no_cassette.feature +0 -152
  29. data/features/cassettes/update_content_length_header.feature +0 -112
  30. data/features/configuration/allow_http_connections_when_no_cassette.feature +0 -55
  31. data/features/configuration/cassette_library_dir.feature +0 -31
  32. data/features/configuration/debug_logging.feature +0 -58
  33. data/features/configuration/default_cassette_options.feature +0 -100
  34. data/features/configuration/filter_sensitive_data.feature +0 -153
  35. data/features/configuration/hook_into.feature +0 -172
  36. data/features/configuration/ignore_request.feature +0 -192
  37. data/features/configuration/preserve_exact_body_bytes.feature +0 -108
  38. data/features/configuration/query_parser.feature +0 -84
  39. data/features/configuration/uri_parser.feature +0 -93
  40. data/features/getting_started.md +0 -82
  41. data/features/hooks/after_http_request.feature +0 -58
  42. data/features/hooks/around_http_request.feature +0 -57
  43. data/features/hooks/before_http_request.feature +0 -63
  44. data/features/hooks/before_playback.feature +0 -184
  45. data/features/hooks/before_record.feature +0 -172
  46. data/features/http_libraries/em_http_request.feature +0 -250
  47. data/features/http_libraries/net_http.feature +0 -179
  48. data/features/middleware/faraday.feature +0 -56
  49. data/features/middleware/rack.feature +0 -92
  50. data/features/record_modes/all.feature +0 -82
  51. data/features/record_modes/new_episodes.feature +0 -79
  52. data/features/record_modes/none.feature +0 -72
  53. data/features/record_modes/once.feature +0 -95
  54. data/features/request_matching/README.md +0 -30
  55. data/features/request_matching/body.feature +0 -91
  56. data/features/request_matching/body_as_json.feature +0 -90
  57. data/features/request_matching/custom_matcher.feature +0 -135
  58. data/features/request_matching/headers.feature +0 -85
  59. data/features/request_matching/host.feature +0 -95
  60. data/features/request_matching/identical_request_sequence.feature +0 -89
  61. data/features/request_matching/method.feature +0 -96
  62. data/features/request_matching/path.feature +0 -96
  63. data/features/request_matching/playback_repeats.feature +0 -98
  64. data/features/request_matching/query.feature +0 -97
  65. data/features/request_matching/uri.feature +0 -94
  66. data/features/request_matching/uri_without_param.feature +0 -101
  67. data/features/step_definitions/cli_steps.rb +0 -199
  68. data/features/support/env.rb +0 -46
  69. data/features/support/http_lib_filters.rb +0 -46
  70. data/features/test_frameworks/cucumber.feature +0 -211
  71. data/features/test_frameworks/rspec_macro.feature +0 -81
  72. data/features/test_frameworks/rspec_metadata.feature +0 -150
  73. data/features/test_frameworks/test_unit.feature +0 -49
  74. data/lib/vcr/extensions/net_http_response.rb +0 -36
  75. data/lib/vcr/library_hooks/fakeweb.rb +0 -197
  76. data/spec/acceptance/concurrency_spec.rb +0 -51
  77. data/spec/acceptance/threading_spec.rb +0 -34
  78. data/spec/fixtures/cassette_spec/1_x_cassette.yml +0 -110
  79. data/spec/fixtures/cassette_spec/empty.yml +0 -0
  80. data/spec/fixtures/cassette_spec/example.yml +0 -111
  81. data/spec/fixtures/cassette_spec/with_localhost_requests.yml +0 -111
  82. data/spec/fixtures/fake_example_responses.yml +0 -110
  83. data/spec/fixtures/match_requests_on.yml +0 -187
  84. data/spec/lib/vcr/cassette/erb_renderer_spec.rb +0 -53
  85. data/spec/lib/vcr/cassette/http_interaction_list_spec.rb +0 -295
  86. data/spec/lib/vcr/cassette/migrator_spec.rb +0 -196
  87. data/spec/lib/vcr/cassette/persisters/file_system_spec.rb +0 -75
  88. data/spec/lib/vcr/cassette/persisters_spec.rb +0 -39
  89. data/spec/lib/vcr/cassette/serializers_spec.rb +0 -182
  90. data/spec/lib/vcr/cassette_spec.rb +0 -618
  91. data/spec/lib/vcr/configuration_spec.rb +0 -326
  92. data/spec/lib/vcr/deprecations_spec.rb +0 -85
  93. data/spec/lib/vcr/errors_spec.rb +0 -178
  94. data/spec/lib/vcr/extensions/net_http_response_spec.rb +0 -86
  95. data/spec/lib/vcr/library_hooks/excon_spec.rb +0 -104
  96. data/spec/lib/vcr/library_hooks/fakeweb_spec.rb +0 -169
  97. data/spec/lib/vcr/library_hooks/faraday_spec.rb +0 -68
  98. data/spec/lib/vcr/library_hooks/typhoeus_0.4_spec.rb +0 -36
  99. data/spec/lib/vcr/library_hooks/typhoeus_spec.rb +0 -162
  100. data/spec/lib/vcr/library_hooks/webmock_spec.rb +0 -117
  101. data/spec/lib/vcr/library_hooks_spec.rb +0 -51
  102. data/spec/lib/vcr/middleware/faraday_spec.rb +0 -181
  103. data/spec/lib/vcr/middleware/rack_spec.rb +0 -115
  104. data/spec/lib/vcr/request_ignorer_spec.rb +0 -70
  105. data/spec/lib/vcr/request_matcher_registry_spec.rb +0 -345
  106. data/spec/lib/vcr/structs_spec.rb +0 -732
  107. data/spec/lib/vcr/test_frameworks/cucumber_spec.rb +0 -107
  108. data/spec/lib/vcr/test_frameworks/rspec_spec.rb +0 -94
  109. data/spec/lib/vcr/util/hooks_spec.rb +0 -158
  110. data/spec/lib/vcr/util/internet_connection_spec.rb +0 -37
  111. data/spec/lib/vcr/util/version_checker_spec.rb +0 -31
  112. data/spec/lib/vcr/version_spec.rb +0 -27
  113. data/spec/lib/vcr_spec.rb +0 -354
  114. data/spec/monkey_patches.rb +0 -186
  115. data/spec/spec_helper.rb +0 -63
  116. data/spec/support/configuration_stubbing.rb +0 -8
  117. data/spec/support/cucumber_helpers.rb +0 -39
  118. data/spec/support/fixnum_extension.rb +0 -10
  119. data/spec/support/http_library_adapters.rb +0 -289
  120. data/spec/support/limited_uri.rb +0 -21
  121. data/spec/support/ruby_interpreter.rb +0 -7
  122. data/spec/support/shared_example_groups/excon.rb +0 -63
  123. data/spec/support/shared_example_groups/hook_into_http_library.rb +0 -594
  124. data/spec/support/shared_example_groups/request_hooks.rb +0 -59
  125. data/spec/support/sinatra_app.rb +0 -86
  126. data/spec/support/vcr_localhost_server.rb +0 -76
  127. data/spec/support/vcr_stub_helpers.rb +0 -17
@@ -1,107 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe VCR::CucumberTags do
4
- subject { described_class.new(self) }
5
- let(:before_blocks_for_tags) { {} }
6
- let(:after_blocks_for_tags) { {} }
7
-
8
- def scenario(name)
9
- double(:name => name, :feature => double(:name => "My feature name\nThe preamble text is not included"), :failed? => false)
10
- end
11
-
12
- let(:current_scenario) { scenario "My scenario name\nThe preamble text is not included" }
13
-
14
- # define our own Before/After so we can test this in isolation from cucumber's implementation.
15
- def Before(tag, &block)
16
- before_blocks_for_tags[tag.sub('@', '')] = block
17
- end
18
-
19
- def After(tag, &block)
20
- after_blocks_for_tags[tag.sub('@', '')] = block
21
- end
22
-
23
- def test_tag(cassette_attribute, tag, expected_value, scenario=current_scenario)
24
- expect(VCR.current_cassette).to be_nil
25
-
26
- before_blocks_for_tags[tag].call(scenario)
27
- expect(VCR.current_cassette.send(cassette_attribute)).to eq(expected_value)
28
- after_blocks_for_tags[tag].call(scenario)
29
-
30
- expect(VCR.current_cassette).to be_nil
31
- end
32
-
33
- %w(tags tag).each do |tag_method|
34
- describe "##{tag_method}" do
35
- it "creates a cucumber Around hook for each given tag so that the scenario runs with the cassette inserted" do
36
- subject.send(tag_method, 'tag1', 'tag2')
37
-
38
- test_tag(:name, 'tag1', 'cucumber_tags/tag1')
39
- test_tag(:name, 'tag2', 'cucumber_tags/tag2')
40
- end
41
-
42
- it "works with tags that start with an @" do
43
- subject.send(tag_method, '@tag1', '@tag2')
44
-
45
- test_tag(:name, 'tag1', 'cucumber_tags/tag1')
46
- test_tag(:name, 'tag2', 'cucumber_tags/tag2')
47
- end
48
-
49
- it "passes along the given options to the cassette" do
50
- subject.send(tag_method, 'tag1', :record => :none)
51
- subject.send(tag_method, 'tag2', :record => :new_episodes)
52
-
53
- test_tag(:record_mode, 'tag1', :none)
54
- test_tag(:record_mode, 'tag2', :new_episodes)
55
- end
56
-
57
- context 'with :use_scenario_name as an option' do
58
- it "uses the scenario's name as the cassette name" do
59
- subject.send(tag_method, 'tag1', :use_scenario_name => true)
60
-
61
- test_tag(:name, 'tag1', 'My feature name/My scenario name')
62
- end
63
-
64
- it "makes a unique name for each element of scenario outline" do
65
- subject.send(tag_method, 'tag1', :use_scenario_name => true)
66
-
67
- scenario_with_outline = double(:name => "My row name", :failed? => false,
68
- :scenario_outline => double(:feature => double(:name => "My feature name\nThe preamble text is not included"),
69
- :name => "My scenario outline name"))
70
- test_tag(:name, 'tag1', 'My feature name/My scenario outline name/My row name', scenario_with_outline)
71
- end
72
-
73
- it 'does not pass :use_scenario_name along the given options to the cassette' do
74
- subject.send(tag_method, 'tag1', :use_scenario_name => true)
75
-
76
- expect(VCR::Cassette).to receive(:new).with(anything, hash_not_including(:use_scenario_name))
77
- before_blocks_for_tags['tag1'].call(current_scenario)
78
- end
79
-
80
- it 'does not modify the options passed to the cassette' do
81
- original_options = { :use_scenario_name => true, :record => :none }
82
- subject.send(tag_method, 'tag1', original_options)
83
- before_blocks_for_tags['tag1'].call(current_scenario)
84
-
85
- expect(original_options.size).to eq(2)
86
- expect(original_options[:use_scenario_name]).to eq(true)
87
- expect(original_options[:record]).to eq(:none)
88
- end
89
-
90
- it "works properly when multiple scenarios use the tag" do
91
- subject.send(tag_method, 'tag1', :use_scenario_name => true)
92
-
93
- test_tag(:name, 'tag1', 'My feature name/Foo', scenario("Foo"))
94
- test_tag(:name, 'tag1', 'My feature name/Bar', scenario("Bar"))
95
- end
96
- end
97
- end
98
- end
99
-
100
- describe '.tags' do
101
- it 'returns the list of cucumber tags' do
102
- subject.tags 'tag1', 'tag2'
103
- subject.tags 'tag3', 'tag4'
104
- expect(described_class.tags[-4, 4]).to eq(%w(@tag1 @tag2 @tag3 @tag4))
105
- end
106
- end
107
- end
@@ -1,94 +0,0 @@
1
- require 'spec_helper'
2
-
3
- VCR.configuration.configure_rspec_metadata!
4
-
5
- describe VCR::RSpec::Metadata, :skip_vcr_reset do
6
- before(:all) { VCR.reset! }
7
- after(:each) { VCR.reset! }
8
-
9
- context 'an example group', :vcr do
10
- context 'with a nested example group' do
11
- it 'uses a cassette for any examples' do
12
- expect(VCR.current_cassette.name.split('/')).to eq([
13
- 'VCR::RSpec::Metadata',
14
- 'an example group',
15
- 'with a nested example group',
16
- 'uses a cassette for any examples'
17
- ])
18
- end
19
- end
20
-
21
- context 'when the spec has no description' do
22
- it do
23
- expect(VCR.current_cassette.name.split('/')).to eq([
24
- 'VCR::RSpec::Metadata',
25
- 'an example group',
26
- 'when the spec has no description',
27
- '1:1:2:1'
28
- ])
29
- end
30
- end
31
- end
32
-
33
- context 'with the cassette name overridden at the example group level', :vcr => { :cassette_name => 'foo' } do
34
- it 'overrides the cassette name for an example' do
35
- expect(VCR.current_cassette.name).to eq('foo')
36
- end
37
-
38
- it 'overrides the cassette name for another example' do
39
- expect(VCR.current_cassette.name).to eq('foo')
40
- end
41
- end
42
-
43
- it 'allows the cassette name to be overriden', :vcr => { :cassette_name => 'foo' } do
44
- expect(VCR.current_cassette.name).to eq('foo')
45
- end
46
-
47
- it 'allows the cassette options to be set', :vcr => { :match_requests_on => [:method] } do
48
- expect(VCR.current_cassette.match_requests_on).to eq([:method])
49
- end
50
- end
51
-
52
- describe VCR::RSpec::Macros do
53
- extend described_class
54
-
55
- describe '#use_vcr_cassette' do
56
- def self.perform_test(context_name, expected_cassette_name, *args, &block)
57
- context context_name do
58
- after(:each) do |example|
59
- if example.metadata[:test_ejection]
60
- expect(VCR.current_cassette).to be_nil
61
- end
62
- end
63
-
64
- use_vcr_cassette(*args)
65
-
66
- it 'ejects the cassette in an after hook', :test_ejection do
67
- expect(VCR.current_cassette).to be_a(VCR::Cassette)
68
- end
69
-
70
- it "creates a cassette named '#{expected_cassette_name}" do
71
- expect(VCR.current_cassette.name).to eq(expected_cassette_name)
72
- end
73
-
74
- module_eval(&block) if block
75
- end
76
- end
77
-
78
- perform_test 'when called with an explicit name', 'explicit_name', 'explicit_name'
79
-
80
- perform_test 'when called with an explicit name and some options', 'explicit_name', 'explicit_name', :match_requests_on => [:method, :host] do
81
- it 'uses the provided cassette options' do
82
- expect(VCR.current_cassette.match_requests_on).to eq([:method, :host])
83
- end
84
- end
85
-
86
- perform_test 'when called with nothing', 'VCR::RSpec::Macros/#use_vcr_cassette/when called with nothing'
87
-
88
- perform_test 'when called with some options', 'VCR::RSpec::Macros/#use_vcr_cassette/when called with some options', :match_requests_on => [:method, :host] do
89
- it 'uses the provided cassette options' do
90
- expect(VCR.current_cassette.match_requests_on).to eq([:method, :host])
91
- end
92
- end
93
- end
94
- end
@@ -1,158 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe VCR::Hooks::FilteredHook do
4
- describe "#conditionally_invoke" do
5
- it 'invokes the hook' do
6
- called = false
7
- subject.hook = lambda { called = true }
8
- subject.conditionally_invoke
9
- expect(called).to be true
10
- end
11
-
12
- it 'forwards the given arguments to the hook' do
13
- args = nil
14
- subject.hook = lambda { |a, b| args = [a, b] }
15
- subject.conditionally_invoke(3, 5)
16
- expect(args).to eq([3, 5])
17
- end
18
-
19
- it 'forwards only as many arguments as the hook block accepts' do
20
- args = nil
21
- subject.hook = lambda { |a| args = [a] }
22
- subject.conditionally_invoke(3, 5)
23
- expect(args).to eq([3])
24
- end
25
-
26
- it 'does not invoke the hook if all of the filters return false' do
27
- called = false
28
- subject.hook = lambda { called = true }
29
- subject.filters = lambda { false }
30
- subject.conditionally_invoke
31
- expect(called).to be false
32
- end
33
-
34
- it 'does not invoke the hook if any of the filters returns false' do
35
- called = false
36
- subject.hook = lambda { called = true }
37
- subject.filters = [lambda { false }, lambda { true }]
38
- subject.conditionally_invoke
39
- expect(called).to be false
40
- end
41
-
42
- it 'forwards arguments to the filters' do
43
- filter_args = nil
44
- subject.filters = lambda { |a, b| filter_args = [a, b]; false }
45
- subject.conditionally_invoke(3, 5)
46
- expect(filter_args).to eq([3, 5])
47
- end
48
-
49
- it 'handles splat args properly' do
50
- filter_args = nil
51
- subject.filters = lambda { |*args| filter_args = args; false }
52
- subject.conditionally_invoke(3, 5)
53
- expect(filter_args).to eq([3, 5])
54
- end
55
-
56
- it 'forwards only as many arguments as the filter blocks accept' do
57
- args1 = args2 = nil
58
- subject.filters = [
59
- lambda { |a| args1 = [a]; true },
60
- lambda { |a, b| args2 = [a, b]; false }
61
- ]
62
-
63
- subject.conditionally_invoke(3, 5)
64
- expect(args1).to eq([3])
65
- expect(args2).to eq([3, 5])
66
- end
67
-
68
- it '#to_procs the filter objects' do
69
- filter_called = false
70
- subject.hook = lambda { }
71
- subject.filters = [double(:to_proc => lambda { filter_called = true })]
72
- subject.conditionally_invoke
73
- expect(filter_called).to be true
74
- end
75
- end
76
- end
77
-
78
- describe VCR::Hooks do
79
- let(:hooks_class) { Class.new { include VCR::Hooks } }
80
-
81
- subject { hooks_class.new }
82
- let(:invocations) { [] }
83
-
84
- before(:each) do
85
- hooks_class.instance_eval do
86
- define_hook :before_foo
87
- define_hook :before_bar, :prepend
88
- end
89
- end
90
-
91
- it 'allows the class to override the hook method and super to the main definition' do
92
- override_called = nil
93
-
94
- hooks_class.class_eval do
95
- define_method :before_foo do |&block|
96
- override_called = true
97
- super(&block)
98
- end
99
- end
100
-
101
- subject.before_foo { }
102
- expect(override_called).to be true
103
- end
104
-
105
- describe '#clear_hooks' do
106
- it 'clears all hooks' do
107
- subject.before_foo { invocations << :callback }
108
- subject.clear_hooks
109
- subject.invoke_hook(:before_foo)
110
- expect(invocations).to be_empty
111
- end
112
- end
113
-
114
- describe '#invoke_hook' do
115
- it 'invokes each of the callbacks' do
116
- subject.before_foo { invocations << :callback_1 }
117
- subject.before_foo { invocations << :callback_2 }
118
-
119
- expect(invocations).to be_empty
120
- subject.invoke_hook(:before_foo)
121
- expect(invocations).to eq([:callback_1, :callback_2])
122
- end
123
-
124
- it 'maps the return value of each callback' do
125
- subject.before_foo { 17 }
126
- subject.before_foo { 12 }
127
- expect(subject.invoke_hook(:before_foo)).to eq([17, 12])
128
- end
129
-
130
- it 'does not invoke any filtered callbacks' do
131
- subject.before_foo(:real?) { invocations << :blue_callback }
132
- subject.invoke_hook(:before_foo, double(:real? => false))
133
- expect(invocations).to be_empty
134
- end
135
-
136
- it 'invokes them in reverse order if the hook was defined with :prepend' do
137
- subject.before_bar { 17 }
138
- subject.before_bar { 12 }
139
- expect(subject.invoke_hook(:before_bar)).to eq([12, 17])
140
- end
141
- end
142
-
143
- describe "#has_hooks_for?" do
144
- it 'returns false when given an unrecognized hook name' do
145
- expect(subject).not_to have_hooks_for(:abcd)
146
- end
147
-
148
- it 'returns false when given the name of a defined hook that has no registered callbacks' do
149
- expect(subject).not_to have_hooks_for(:before_foo)
150
- end
151
-
152
- it 'returns true when given the name of a defined hook that has registered callbacks' do
153
- subject.before_foo { }
154
- expect(subject).to have_hooks_for(:before_foo)
155
- end
156
- end
157
- end
158
-
@@ -1,37 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe VCR::InternetConnection do
4
- describe '.available?' do
5
- before(:each) do
6
- described_class.send(:remove_instance_variable, :@available) if described_class.instance_variable_defined?(:@available)
7
- end
8
-
9
- def stub_pingecho_with(value)
10
- allow(VCR::Ping).to receive(:pingecho).with("example.com", anything, anything).and_return(value)
11
- end
12
-
13
- context 'when pinging example.com succeeds' do
14
- it 'returns true' do
15
- stub_pingecho_with(true)
16
- expect(described_class).to be_available
17
- end
18
-
19
- it 'memoizes the value so no extra pings are made' do
20
- expect(VCR::Ping).to receive(:pingecho).once.and_return(true)
21
- 3.times { described_class.available? }
22
- end
23
- end
24
-
25
- context 'when pinging example.com fails' do
26
- it 'returns false' do
27
- stub_pingecho_with(false)
28
- expect(described_class).not_to be_available
29
- end
30
-
31
- it 'memoizes the value so no extra pings are made' do
32
- expect(VCR::Ping).to receive(:pingecho).once.and_return(false)
33
- 3.times { described_class.available? }
34
- end
35
- end
36
- end
37
- end
@@ -1,31 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module VCR
4
- describe VersionChecker do
5
- it 'raises an error if the major version is too low' do
6
- checker = VersionChecker.new('foo', '0.7.3', '1.0.0')
7
- expect { checker.check_version! }.to raise_error(Errors::LibraryVersionTooLowError)
8
- end
9
-
10
- it 'raises an error if the minor version is too low' do
11
- checker = VersionChecker.new('foo', '1.0.99', '1.1.3')
12
- expect { checker.check_version! }.to raise_error(Errors::LibraryVersionTooLowError)
13
- end
14
-
15
- it 'raises an error if the patch version is too low' do
16
- checker = VersionChecker.new('foo', '1.0.8', '1.0.10')
17
- expect { checker.check_version! }.to raise_error(Errors::LibraryVersionTooLowError)
18
- end
19
-
20
- it 'does not raise an error when the version is equal' do
21
- checker = VersionChecker.new('foo', '1.0.0', '1.0.0')
22
- expect { checker.check_version! }.not_to raise_error
23
- end
24
-
25
- it 'does not raise an error when the version is higher' do
26
- checker = VersionChecker.new('foo', '2.0.0', '1.0.0')
27
- expect { checker.check_version! }.not_to raise_error
28
- end
29
- end
30
- end
31
-
@@ -1,27 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "VCR.version" do
4
- subject { VCR.version }
5
-
6
- it { should =~ /\A\d+\.\d+\.\d+(\.\w+)?\z/ }
7
-
8
- describe '#parts' do
9
- subject { super().parts }
10
- it { should be_instance_of(Array) }
11
- end
12
-
13
- describe '#major' do
14
- subject { super().major }
15
- it { should be_instance_of(Fixnum) }
16
- end
17
-
18
- describe '#minor' do
19
- subject { super().minor }
20
- it { should be_instance_of(Fixnum) }
21
- end
22
-
23
- describe '#patch' do
24
- subject { super().patch }
25
- it { should be_instance_of(Fixnum) }
26
- end
27
- end