mustwin-vcr 2.9.3

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 (148) hide show
  1. checksums.yaml +7 -0
  2. data/features/about_these_examples.md +18 -0
  3. data/features/cassettes/allow_unused_http_interactions.feature +100 -0
  4. data/features/cassettes/automatic_re_recording.feature +72 -0
  5. data/features/cassettes/decompress.feature +74 -0
  6. data/features/cassettes/dynamic_erb.feature +100 -0
  7. data/features/cassettes/exclusive.feature +126 -0
  8. data/features/cassettes/format.feature +323 -0
  9. data/features/cassettes/freezing_time.feature +68 -0
  10. data/features/cassettes/naming.feature +28 -0
  11. data/features/cassettes/no_cassette.feature +152 -0
  12. data/features/cassettes/update_content_length_header.feature +112 -0
  13. data/features/configuration/allow_http_connections_when_no_cassette.feature +55 -0
  14. data/features/configuration/cassette_library_dir.feature +31 -0
  15. data/features/configuration/debug_logging.feature +59 -0
  16. data/features/configuration/default_cassette_options.feature +100 -0
  17. data/features/configuration/filter_sensitive_data.feature +153 -0
  18. data/features/configuration/hook_into.feature +172 -0
  19. data/features/configuration/ignore_request.feature +192 -0
  20. data/features/configuration/preserve_exact_body_bytes.feature +108 -0
  21. data/features/configuration/query_parser.feature +84 -0
  22. data/features/configuration/uri_parser.feature +89 -0
  23. data/features/getting_started.md +82 -0
  24. data/features/hooks/after_http_request.feature +58 -0
  25. data/features/hooks/around_http_request.feature +57 -0
  26. data/features/hooks/before_http_request.feature +63 -0
  27. data/features/hooks/before_playback.feature +184 -0
  28. data/features/hooks/before_record.feature +172 -0
  29. data/features/http_libraries/em_http_request.feature +250 -0
  30. data/features/http_libraries/net_http.feature +179 -0
  31. data/features/middleware/faraday.feature +56 -0
  32. data/features/middleware/rack.feature +92 -0
  33. data/features/record_modes/all.feature +82 -0
  34. data/features/record_modes/new_episodes.feature +79 -0
  35. data/features/record_modes/none.feature +72 -0
  36. data/features/record_modes/once.feature +95 -0
  37. data/features/request_matching/README.md +30 -0
  38. data/features/request_matching/body.feature +91 -0
  39. data/features/request_matching/body_as_json.feature +90 -0
  40. data/features/request_matching/custom_matcher.feature +135 -0
  41. data/features/request_matching/headers.feature +85 -0
  42. data/features/request_matching/host.feature +95 -0
  43. data/features/request_matching/identical_request_sequence.feature +89 -0
  44. data/features/request_matching/method.feature +96 -0
  45. data/features/request_matching/path.feature +96 -0
  46. data/features/request_matching/playback_repeats.feature +98 -0
  47. data/features/request_matching/query.feature +97 -0
  48. data/features/request_matching/uri.feature +94 -0
  49. data/features/request_matching/uri_without_param.feature +101 -0
  50. data/features/step_definitions/cli_steps.rb +193 -0
  51. data/features/support/env.rb +44 -0
  52. data/features/support/http_lib_filters.rb +53 -0
  53. data/features/test_frameworks/cucumber.feature +211 -0
  54. data/features/test_frameworks/rspec_macro.feature +81 -0
  55. data/features/test_frameworks/rspec_metadata.feature +150 -0
  56. data/features/test_frameworks/test_unit.feature +49 -0
  57. data/lib/vcr.rb +347 -0
  58. data/lib/vcr/cassette.rb +291 -0
  59. data/lib/vcr/cassette/erb_renderer.rb +55 -0
  60. data/lib/vcr/cassette/http_interaction_list.rb +108 -0
  61. data/lib/vcr/cassette/migrator.rb +118 -0
  62. data/lib/vcr/cassette/persisters.rb +42 -0
  63. data/lib/vcr/cassette/persisters/file_system.rb +64 -0
  64. data/lib/vcr/cassette/serializers.rb +57 -0
  65. data/lib/vcr/cassette/serializers/json.rb +48 -0
  66. data/lib/vcr/cassette/serializers/psych.rb +48 -0
  67. data/lib/vcr/cassette/serializers/syck.rb +61 -0
  68. data/lib/vcr/cassette/serializers/yaml.rb +50 -0
  69. data/lib/vcr/configuration.rb +555 -0
  70. data/lib/vcr/deprecations.rb +109 -0
  71. data/lib/vcr/errors.rb +266 -0
  72. data/lib/vcr/extensions/net_http_response.rb +36 -0
  73. data/lib/vcr/library_hooks.rb +18 -0
  74. data/lib/vcr/library_hooks/excon.rb +27 -0
  75. data/lib/vcr/library_hooks/fakeweb.rb +196 -0
  76. data/lib/vcr/library_hooks/faraday.rb +51 -0
  77. data/lib/vcr/library_hooks/typhoeus.rb +120 -0
  78. data/lib/vcr/library_hooks/typhoeus_0.4.rb +103 -0
  79. data/lib/vcr/library_hooks/webmock.rb +164 -0
  80. data/lib/vcr/middleware/excon.rb +221 -0
  81. data/lib/vcr/middleware/excon/legacy_methods.rb +33 -0
  82. data/lib/vcr/middleware/faraday.rb +118 -0
  83. data/lib/vcr/middleware/rack.rb +79 -0
  84. data/lib/vcr/request_handler.rb +114 -0
  85. data/lib/vcr/request_ignorer.rb +43 -0
  86. data/lib/vcr/request_matcher_registry.rb +149 -0
  87. data/lib/vcr/structs.rb +578 -0
  88. data/lib/vcr/tasks/vcr.rake +9 -0
  89. data/lib/vcr/test_frameworks/cucumber.rb +64 -0
  90. data/lib/vcr/test_frameworks/rspec.rb +47 -0
  91. data/lib/vcr/util/hooks.rb +61 -0
  92. data/lib/vcr/util/internet_connection.rb +43 -0
  93. data/lib/vcr/util/logger.rb +59 -0
  94. data/lib/vcr/util/variable_args_block_caller.rb +13 -0
  95. data/lib/vcr/util/version_checker.rb +48 -0
  96. data/lib/vcr/version.rb +34 -0
  97. data/spec/acceptance/threading_spec.rb +34 -0
  98. data/spec/fixtures/cassette_spec/1_x_cassette.yml +110 -0
  99. data/spec/fixtures/cassette_spec/empty.yml +0 -0
  100. data/spec/fixtures/cassette_spec/example.yml +111 -0
  101. data/spec/fixtures/cassette_spec/with_localhost_requests.yml +111 -0
  102. data/spec/fixtures/fake_example_responses.yml +110 -0
  103. data/spec/fixtures/match_requests_on.yml +187 -0
  104. data/spec/lib/vcr/cassette/erb_renderer_spec.rb +53 -0
  105. data/spec/lib/vcr/cassette/http_interaction_list_spec.rb +295 -0
  106. data/spec/lib/vcr/cassette/migrator_spec.rb +195 -0
  107. data/spec/lib/vcr/cassette/persisters/file_system_spec.rb +69 -0
  108. data/spec/lib/vcr/cassette/persisters_spec.rb +39 -0
  109. data/spec/lib/vcr/cassette/serializers_spec.rb +176 -0
  110. data/spec/lib/vcr/cassette_spec.rb +618 -0
  111. data/spec/lib/vcr/configuration_spec.rb +326 -0
  112. data/spec/lib/vcr/deprecations_spec.rb +85 -0
  113. data/spec/lib/vcr/errors_spec.rb +162 -0
  114. data/spec/lib/vcr/extensions/net_http_response_spec.rb +86 -0
  115. data/spec/lib/vcr/library_hooks/excon_spec.rb +104 -0
  116. data/spec/lib/vcr/library_hooks/fakeweb_spec.rb +169 -0
  117. data/spec/lib/vcr/library_hooks/faraday_spec.rb +68 -0
  118. data/spec/lib/vcr/library_hooks/typhoeus_0.4_spec.rb +36 -0
  119. data/spec/lib/vcr/library_hooks/typhoeus_spec.rb +162 -0
  120. data/spec/lib/vcr/library_hooks/webmock_spec.rb +118 -0
  121. data/spec/lib/vcr/library_hooks_spec.rb +51 -0
  122. data/spec/lib/vcr/middleware/faraday_spec.rb +182 -0
  123. data/spec/lib/vcr/middleware/rack_spec.rb +115 -0
  124. data/spec/lib/vcr/request_ignorer_spec.rb +70 -0
  125. data/spec/lib/vcr/request_matcher_registry_spec.rb +345 -0
  126. data/spec/lib/vcr/structs_spec.rb +732 -0
  127. data/spec/lib/vcr/test_frameworks/cucumber_spec.rb +107 -0
  128. data/spec/lib/vcr/test_frameworks/rspec_spec.rb +83 -0
  129. data/spec/lib/vcr/util/hooks_spec.rb +158 -0
  130. data/spec/lib/vcr/util/internet_connection_spec.rb +37 -0
  131. data/spec/lib/vcr/util/version_checker_spec.rb +31 -0
  132. data/spec/lib/vcr/version_spec.rb +27 -0
  133. data/spec/lib/vcr_spec.rb +349 -0
  134. data/spec/monkey_patches.rb +182 -0
  135. data/spec/spec_helper.rb +62 -0
  136. data/spec/support/configuration_stubbing.rb +8 -0
  137. data/spec/support/cucumber_helpers.rb +35 -0
  138. data/spec/support/fixnum_extension.rb +10 -0
  139. data/spec/support/http_library_adapters.rb +289 -0
  140. data/spec/support/limited_uri.rb +21 -0
  141. data/spec/support/ruby_interpreter.rb +7 -0
  142. data/spec/support/shared_example_groups/excon.rb +63 -0
  143. data/spec/support/shared_example_groups/hook_into_http_library.rb +594 -0
  144. data/spec/support/shared_example_groups/request_hooks.rb +59 -0
  145. data/spec/support/sinatra_app.rb +86 -0
  146. data/spec/support/vcr_localhost_server.rb +76 -0
  147. data/spec/support/vcr_stub_helpers.rb +17 -0
  148. metadata +677 -0
@@ -0,0 +1,107 @@
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
@@ -0,0 +1,83 @@
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
+ end
21
+
22
+ context 'with the cassette name overridden at the example group level', :vcr => { :cassette_name => 'foo' } do
23
+ it 'overrides the cassette name for an example' do
24
+ expect(VCR.current_cassette.name).to eq('foo')
25
+ end
26
+
27
+ it 'overrides the cassette name for another example' do
28
+ expect(VCR.current_cassette.name).to eq('foo')
29
+ end
30
+ end
31
+
32
+ it 'allows the cassette name to be overriden', :vcr => { :cassette_name => 'foo' } do
33
+ expect(VCR.current_cassette.name).to eq('foo')
34
+ end
35
+
36
+ it 'allows the cassette options to be set', :vcr => { :match_requests_on => [:method] } do
37
+ expect(VCR.current_cassette.match_requests_on).to eq([:method])
38
+ end
39
+ end
40
+
41
+ describe VCR::RSpec::Macros do
42
+ extend described_class
43
+
44
+ describe '#use_vcr_cassette' do
45
+ def self.perform_test(context_name, expected_cassette_name, *args, &block)
46
+ context context_name do
47
+ after(:each) do |example|
48
+ if example.metadata[:test_ejection]
49
+ expect(VCR.current_cassette).to be_nil
50
+ end
51
+ end
52
+
53
+ use_vcr_cassette(*args)
54
+
55
+ it 'ejects the cassette in an after hook', :test_ejection do
56
+ expect(VCR.current_cassette).to be_a(VCR::Cassette)
57
+ end
58
+
59
+ it "creates a cassette named '#{expected_cassette_name}" do
60
+ expect(VCR.current_cassette.name).to eq(expected_cassette_name)
61
+ end
62
+
63
+ module_eval(&block) if block
64
+ end
65
+ end
66
+
67
+ perform_test 'when called with an explicit name', 'explicit_name', 'explicit_name'
68
+
69
+ perform_test 'when called with an explicit name and some options', 'explicit_name', 'explicit_name', :match_requests_on => [:method, :host] do
70
+ it 'uses the provided cassette options' do
71
+ expect(VCR.current_cassette.match_requests_on).to eq([:method, :host])
72
+ end
73
+ end
74
+
75
+ perform_test 'when called with nothing', 'VCR::RSpec::Macros/#use_vcr_cassette/when called with nothing'
76
+
77
+ perform_test 'when called with some options', 'VCR::RSpec::Macros/#use_vcr_cassette/when called with some options', :match_requests_on => [:method, :host] do
78
+ it 'uses the provided cassette options' do
79
+ expect(VCR.current_cassette.match_requests_on).to eq([:method, :host])
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,158 @@
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
+
@@ -0,0 +1,37 @@
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
@@ -0,0 +1,31 @@
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
+
@@ -0,0 +1,27 @@
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