vcr 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/.gitignore +1 -1
  2. data/.gitmodules +3 -0
  3. data/CHANGELOG.md +58 -1
  4. data/Gemfile +2 -4
  5. data/Gemfile.lock +26 -49
  6. data/README.md +92 -23
  7. data/Rakefile +6 -3
  8. data/features/fixtures/vcr_cassettes/1.9.1/record_all.yml +62 -0
  9. data/features/fixtures/vcr_cassettes/not_1.9.1/record_all.yml +61 -0
  10. data/features/http_client.feature +2 -2
  11. data/features/net_http.feature +15 -4
  12. data/features/record_response.feature +36 -7
  13. data/features/replay_recorded_response.feature +8 -8
  14. data/features/rspec.feature +100 -0
  15. data/features/step_definitions/net_http_steps.rb +13 -1
  16. data/features/step_definitions/vcr_steps.rb +26 -16
  17. data/features/support/env.rb +13 -5
  18. data/features/webmock.feature +4 -4
  19. data/lib/vcr.rb +5 -5
  20. data/lib/vcr/cassette.rb +55 -19
  21. data/lib/vcr/extensions/net_http.rb +2 -4
  22. data/lib/vcr/http_stubbing_adapters/fakeweb.rb +0 -4
  23. data/lib/vcr/http_stubbing_adapters/webmock.rb +2 -9
  24. data/lib/vcr/internet_connection.rb +13 -0
  25. data/lib/vcr/ping.rb +26 -0
  26. data/lib/vcr/rspec.rb +39 -0
  27. data/lib/vcr/version.rb +1 -1
  28. data/spec/cassette_spec.rb +160 -69
  29. data/spec/config_spec.rb +1 -1
  30. data/spec/cucumber_tags_spec.rb +3 -2
  31. data/spec/deprecations_spec.rb +1 -1
  32. data/spec/extensions/net_http_response_spec.rb +2 -4
  33. data/spec/extensions/net_http_spec.rb +3 -1
  34. data/spec/fixtures/1.9.1/cassette_spec/with_localhost_requests.yml +23 -0
  35. data/spec/fixtures/not_1.9.1/cassette_spec/with_localhost_requests.yml +23 -0
  36. data/spec/http_stubbing_adapters/fakeweb_spec.rb +3 -9
  37. data/spec/http_stubbing_adapters/webmock_spec.rb +7 -18
  38. data/spec/internet_connection_spec.rb +19 -0
  39. data/spec/monkey_patches.rb +45 -6
  40. data/spec/request_matcher_spec.rb +1 -1
  41. data/spec/rspec_spec.rb +46 -0
  42. data/spec/spec_helper.rb +6 -11
  43. data/spec/structs_spec.rb +1 -1
  44. data/spec/support/fixnum_extension.rb +10 -0
  45. data/spec/support/http_library_adapters.rb +31 -2
  46. data/spec/support/ruby_interpreter.rb +7 -0
  47. data/spec/support/vcr_localhost_server.rb +86 -44
  48. data/spec/support/webmock_macros.rb +14 -0
  49. data/spec/vcr_spec.rb +1 -1
  50. data/spec/version_spec.rb +1 -1
  51. data/vcr.gemspec +10 -6
  52. metadata +155 -39
data/Rakefile CHANGED
@@ -4,9 +4,12 @@ Bundler::GemHelper.install_tasks
4
4
 
5
5
  require 'rake'
6
6
  require "rspec/core/rake_task"
7
+ $LOAD_PATH.unshift 'spec'
8
+
9
+ require 'support/ruby_interpreter'
7
10
 
8
11
  RSpec::Core::RakeTask.new(:spec) do |t|
9
- #t.spec_opts = %w[--format documentation]
12
+ #t.rspec_opts = %w[--format documentation]
10
13
  end
11
14
 
12
15
  desc "Run all examples using rcov"
@@ -21,7 +24,7 @@ end
21
24
 
22
25
  permutations = {
23
26
  'fakeweb' => %w( net/http ),
24
- 'webmock' => %w( net/http httpclient patron em-http-request )
27
+ 'webmock' => %w( net/http httpclient patron em-http-request curb )
25
28
  }
26
29
 
27
30
  require 'cucumber/rake/task'
@@ -31,7 +34,7 @@ namespace :features do
31
34
 
32
35
  namespace http_stubbing_adapter do
33
36
  http_libraries.each do |http_lib|
34
- next if RUBY_PLATFORM =~ /java/ && %w( patron em-http-request ).include?(http_lib)
37
+ next if RUBY_INTERPRETER != :mri && %w( patron em-http-request curb ).include?(http_lib)
35
38
 
36
39
  sanitized_http_lib = http_lib.gsub('/', '_')
37
40
  features_subtasks << "features:#{http_stubbing_adapter}:#{sanitized_http_lib}"
@@ -0,0 +1,62 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ :request: !ruby/struct:VCR::Request
4
+ :method: :get
5
+ :uri: http://example.com:80/a
6
+ :body:
7
+ :headers:
8
+ :response: !ruby/struct:VCR::Response
9
+ :status: !ruby/struct:VCR::ResponseStatus
10
+ :code: 200
11
+ :message: OK
12
+ :headers:
13
+ etag:
14
+ - "\"24ec5-1b6-4059a80bfd280\""
15
+ :body: a response 1
16
+ :http_version: "1.1"
17
+ - !ruby/struct:VCR::HTTPInteraction
18
+ :request: !ruby/struct:VCR::Request
19
+ :method: :get
20
+ :uri: http://example.com:80/a
21
+ :body:
22
+ :headers:
23
+ :response: !ruby/struct:VCR::Response
24
+ :status: !ruby/struct:VCR::ResponseStatus
25
+ :code: 200
26
+ :message: OK
27
+ :headers:
28
+ etag:
29
+ - "\"24ec5-1b6-4059a80bfd280\""
30
+ :body: a response 2
31
+ :http_version: "1.1"
32
+ - !ruby/struct:VCR::HTTPInteraction
33
+ :request: !ruby/struct:VCR::Request
34
+ :method: :get
35
+ :uri: http://example.com:80/b
36
+ :body:
37
+ :headers:
38
+ :response: !ruby/struct:VCR::Response
39
+ :status: !ruby/struct:VCR::ResponseStatus
40
+ :code: 200
41
+ :message: OK
42
+ :headers:
43
+ etag:
44
+ - "\"24ec5-1b6-4059a80bfd280\""
45
+ :body: b response 1
46
+ :http_version: "1.1"
47
+ - !ruby/struct:VCR::HTTPInteraction
48
+ :request: !ruby/struct:VCR::Request
49
+ :method: :get
50
+ :uri: http://example.com:80/b
51
+ :body:
52
+ :headers:
53
+ :response: !ruby/struct:VCR::Response
54
+ :status: !ruby/struct:VCR::ResponseStatus
55
+ :code: 200
56
+ :message: OK
57
+ :headers:
58
+ etag:
59
+ - "\"24ec5-1b6-4059a80bfd280\""
60
+ :body: b response 2
61
+ :http_version: "1.1"
62
+
@@ -0,0 +1,61 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :get
5
+ uri: http://example.com:80/a
6
+ body:
7
+ headers:
8
+ response: !ruby/struct:VCR::Response
9
+ status: !ruby/struct:VCR::ResponseStatus
10
+ code: 200
11
+ message: OK
12
+ headers:
13
+ etag:
14
+ - "\"24ec5-1b6-4059a80bfd280\""
15
+ body: a response 1
16
+ http_version: "1.1"
17
+ - !ruby/struct:VCR::HTTPInteraction
18
+ request: !ruby/struct:VCR::Request
19
+ method: :get
20
+ uri: http://example.com:80/a
21
+ body:
22
+ headers:
23
+ response: !ruby/struct:VCR::Response
24
+ status: !ruby/struct:VCR::ResponseStatus
25
+ code: 200
26
+ message: OK
27
+ headers:
28
+ etag:
29
+ - "\"24ec5-1b6-4059a80bfd280\""
30
+ body: a response 2
31
+ http_version: "1.1"
32
+ - !ruby/struct:VCR::HTTPInteraction
33
+ request: !ruby/struct:VCR::Request
34
+ method: :get
35
+ uri: http://example.com:80/b
36
+ body:
37
+ headers:
38
+ response: !ruby/struct:VCR::Response
39
+ status: !ruby/struct:VCR::ResponseStatus
40
+ code: 200
41
+ message: OK
42
+ headers:
43
+ etag:
44
+ - "\"24ec5-1b6-4059a80bfd280\""
45
+ body: b response 1
46
+ http_version: "1.1"
47
+ - !ruby/struct:VCR::HTTPInteraction
48
+ request: !ruby/struct:VCR::Request
49
+ method: :get
50
+ uri: http://example.com:80/b
51
+ body:
52
+ headers:
53
+ response: !ruby/struct:VCR::Response
54
+ status: !ruby/struct:VCR::ResponseStatus
55
+ code: 200
56
+ message: OK
57
+ headers:
58
+ etag:
59
+ - "\"24ec5-1b6-4059a80bfd280\""
60
+ body: b response 2
61
+ http_version: "1.1"
@@ -6,11 +6,11 @@ Feature: HTTPClient
6
6
 
7
7
  Scenario: Record an asynchronous request
8
8
  Given we do not have a "temp/asynchronous" cassette
9
- When I make an asynchronous HTTPClient get request to "http://example.com" within the "temp/asynchronous" cassette
9
+ When I make an asynchronous HTTPClient get request to "http://example.com" while using the "temp/asynchronous" cassette
10
10
  Then the "temp/asynchronous" library file should have a response for "http://example.com" that matches /You have reached this web page by typing.*example\.com/
11
11
 
12
12
  @copy_not_the_real_response_to_temp
13
13
  Scenario: Replay a response for an asynchronous request
14
14
  Given the "temp/not_the_real_response" library file has a response for "http://example.com" that matches /This is not the real response from example\.com/
15
- When I make an asynchronous HTTPClient get request to "http://example.com" within the "temp/not_the_real_response" cassette
15
+ When I make an asynchronous HTTPClient get request to "http://example.com" while using the "temp/not_the_real_response" cassette
16
16
  Then the response for "http://example.com" should match /This is not the real response from example\.com/
@@ -6,22 +6,33 @@ Feature: Net::HTTP
6
6
 
7
7
  Scenario: Record an asynchronous request (such as for mechanize)
8
8
  Given we do not have a "temp/asynchronous" cassette
9
- When I make an asynchronous Net::HTTP get request to "http://example.com" within the "temp/asynchronous" cassette
9
+ When I make an asynchronous Net::HTTP get request to "http://example.com" while using the "temp/asynchronous" cassette
10
10
  Then the "temp/asynchronous" library file should have a response for "http://example.com" that matches /You have reached this web page by typing.*example\.com/
11
11
 
12
12
  @copy_not_the_real_response_to_temp
13
13
  Scenario: Replay a response for an asynchronous request (such as for mechanize)
14
14
  Given the "temp/not_the_real_response" library file has a response for "http://example.com" that matches /This is not the real response from example\.com/
15
- When I make a replayed asynchronous Net::HTTP get request to "http://example.com" within the "temp/not_the_real_response" cassette
15
+ When I make a replayed asynchronous Net::HTTP get request to "http://example.com" while using the "temp/not_the_real_response" cassette
16
16
  Then the response for "http://example.com" should match /This is not the real response from example\.com/
17
17
 
18
18
  Scenario: Record a recursive post request
19
19
  Given we do not have a "temp/recursive_post" cassette
20
- When I make a recursive Net::HTTP post request to "http://example.com" within the "temp/recursive_post" cassette
20
+ When I make a recursive Net::HTTP post request to "http://example.com" while using the "temp/recursive_post" cassette
21
21
  Then the "temp/recursive_post" library file should have a response for "http://example.com" that matches /You have reached this web page by typing.*example\.com/
22
22
  And the "temp/recursive_post" library file should have exactly 1 response
23
23
 
24
24
  Scenario: Record a request with a block with a return statement
25
25
  Given we do not have a "temp/block_with_a_return" cassette
26
- When I make a returning block Net::HTTP get request to "http://example.com" within the "temp/block_with_a_return" cassette
26
+ When I make a returning block Net::HTTP get request to "http://example.com" while using the "temp/block_with_a_return" cassette
27
27
  Then the "temp/block_with_a_return" library file should have a response for "http://example.com" that matches /You have reached this web page by typing.*example\.com/
28
+
29
+ Scenario: Record a request made with open uri
30
+ Given we do not have a "temp/open_uri" cassette
31
+ When I make an open uri Net::HTTP get request to "http://example.com" while using the "temp/open_uri" cassette
32
+ Then the "temp/open_uri" library file should have a response for "http://example.com" that matches /You have reached this web page by typing.*example\.com/
33
+
34
+ @copy_not_the_real_response_to_temp
35
+ Scenario: Replay a response for an open uri request
36
+ Given the "temp/not_the_real_response" library file has a response for "http://example.com" that matches /This is not the real response from example\.com/
37
+ When I make an open uri Net::HTTP get request to "http://example.com" while using the "temp/not_the_real_response" cassette
38
+ Then the response for "http://example.com" should match /This is not the real response from example\.com/
@@ -6,7 +6,7 @@ Feature: Record response
6
6
 
7
7
  Scenario: Record a response using VCR.use_cassette
8
8
  Given we do not have a "temp/cassette" cassette
9
- When I make an HTTP get request to "http://example.com/" within the "temp/cassette" cassette
9
+ When I make an HTTP get request to "http://example.com/" while using the "temp/cassette" cassette
10
10
  Then the "temp/cassette" library file should have a response for "http://example.com/" that matches /You have reached this web page by typing.*example\.com/
11
11
  And the "temp/cassette" library file should have normalized headers for all recorded interactions
12
12
 
@@ -27,7 +27,7 @@ Feature: Record response
27
27
  And we do not have a "temp/nested" cassette
28
28
  And this scenario is tagged with the vcr cassette tag: "@record_cassette2"
29
29
  When I make an HTTP get request to "http://example.com/before_nested"
30
- And I make an HTTP get request to "http://example.com/nested" within the "temp/nested" cassette
30
+ And I make an HTTP get request to "http://example.com/nested" while using the "temp/nested" cassette
31
31
  And I make an HTTP get request to "http://example.com/after_nested"
32
32
  Then I can test the scenario cassette's recorded responses in the next scenario, after the cassette has been ejected
33
33
  And the "temp/nested" library file should have a response for "http://example.com/nested" that matches /The requested URL \/nested was not found/
@@ -37,14 +37,27 @@ Feature: Record response
37
37
  Then the "cucumber_tags/record_cassette2" library file should have a response for "http://example.com/before_nested" that matches /The requested URL \/before_nested was not found/
38
38
  And the "cucumber_tags/record_cassette2" library file should have a response for "http://example.com/after_nested" that matches /The requested URL \/after_nested was not found/
39
39
 
40
- Scenario: Make an HTTP request in a cassette with record mode set to :all
40
+ Scenario: Make an HTTP request in a cassette with record mode set to :all when the cassette does not already exist
41
41
  Given we do not have a "temp/record_all_cassette" cassette
42
- When I make an HTTP get request to "http://example.com/" within the "temp/record_all_cassette" cassette using cassette options: { :record => :all }
42
+ When I make an HTTP get request to "http://example.com/" while using the "temp/record_all_cassette" cassette using cassette options: { :record => :all }
43
43
  Then the "temp/record_all_cassette" library file should have a response for "http://example.com/" that matches /You have reached this web page by typing.*example\.com/
44
44
 
45
+ @copy_record_all_to_temp
46
+ Scenario: Make an HTTP request in a cassette with record mode set to :all when the cassette already exists
47
+ Given the "temp/record_all" library file has a response for "http://example.com/a" that matches /a response 1/
48
+ And the "temp/record_all" library file has a response for "http://example.com/a" that matches /a response 2/
49
+ And the "temp/record_all" library file has a response for "http://example.com/b" that matches /b response 1/
50
+ And the "temp/record_all" library file has a response for "http://example.com/b" that matches /b response 2/
51
+ When I make an HTTP get request to "http://example.com/a" while using the "temp/record_all" cassette using cassette options: { :record => :all }
52
+ Then the "temp/record_all" library file should have a response for "http://example.com/a" that matches /The requested URL \/a was not found/
53
+ And the "temp/record_all" library file should not have a response for "http://example.com/a" that matches /a response 1/
54
+ And the "temp/record_all" library file should not have a response for "http://example.com/a" that matches /a response 2/
55
+ And the "temp/record_all" library file should have a response for "http://example.com/b" that matches /b response 1/
56
+ And the "temp/record_all" library file should have a response for "http://example.com/b" that matches /b response 2/
57
+
45
58
  Scenario: Make an HTTP request in a cassette with record mode set to :none
46
59
  Given we do not have a "temp/record_none_cassette" cassette
47
- When I make an HTTP get request to "http://example.com/" within the "temp/record_none_cassette" cassette using cassette options: { :record => :none }
60
+ When I make an HTTP get request to "http://example.com/" while using the "temp/record_none_cassette" cassette using cassette options: { :record => :none }
48
61
  Then the HTTP get request to "http://example.com/" should result in an error that mentions VCR
49
62
  And there should not be a "temp/record_none_cassette" library file
50
63
 
@@ -52,7 +65,7 @@ Feature: Record response
52
65
  Scenario: Make an HTTP request in a cassette with record mode set to :new_episodes
53
66
  Given we have a "temp/not_the_real_response" library file with a previously recorded response for "http://example.com/"
54
67
  And we have a "temp/not_the_real_response" library file with no previously recorded response for "http://example.com/foo"
55
- When I make HTTP get requests to "http://example.com/" and "http://example.com/foo" within the "temp/not_the_real_response" cassette
68
+ When I make HTTP get requests to "http://example.com/" and "http://example.com/foo" while using the "temp/not_the_real_response" cassette
56
69
  Then the "temp/not_the_real_response" library file should have a response for "http://example.com/" that matches /This is not the real response from example\.com/
57
70
  And the "temp/not_the_real_response" library file should have a response for "http://example.com/foo" that matches /The requested URL \/foo was not found/
58
71
 
@@ -61,6 +74,22 @@ Feature: Record response
61
74
  Given we do not have a "temp/localhost" cassette
62
75
  And the ignore_localhost config setting is set to true
63
76
  And a rack app is running on localhost that returns "hello world" for all requests
64
- When I make an HTTP get request to the localhost rack app within the "temp/localhost" cassette
77
+ When I make an HTTP get request to the localhost rack app while using the "temp/localhost" cassette
65
78
  Then the response for the localhost rack app should match /hello world/
66
79
  And there should not be a "temp/localhost" library file
80
+
81
+ @copy_not_the_real_response_to_temp
82
+ Scenario: The response is not automatically recorded when not enough time has passed
83
+ Given the "temp/not_the_real_response" library file has a response for "http://example.com/" that matches /This is not the real response from example.com/
84
+ And 6 days have passed since the "temp/not_the_real_response" library file last changed
85
+ When I make an HTTP get request to "http://example.com/" while using the "temp/not_the_real_response" cassette using cassette options: { :record => :none, :re_record_interval => 7.days }
86
+ Then the response for "http://example.com/" should match /This is not the real response from example.com/
87
+ And the "temp/not_the_real_response" library file should have a response for "http://example.com/" that matches /This is not the real response from example.com/
88
+
89
+ @copy_not_the_real_response_to_temp
90
+ Scenario: The response is automatically recorded when enough time has passed
91
+ Given the "temp/not_the_real_response" library file has a response for "http://example.com/" that matches /This is not the real response from example.com/
92
+ And 8 days have passed since the "temp/not_the_real_response" library file last changed
93
+ When I make an HTTP get request to "http://example.com/" while using the "temp/not_the_real_response" cassette using cassette options: { :record => :none, :re_record_interval => 7.days }
94
+ Then the response for "http://example.com/" should match /You have reached this web page by typing.*example\.com/
95
+ And the "temp/not_the_real_response" library file should have a response for "http://example.com/" that matches /You have reached this web page by typing.*example\.com/
@@ -6,7 +6,7 @@ Feature: Replay recorded response
6
6
 
7
7
  Scenario: Replay recorded response for a request in a VCR.use_cassette block
8
8
  Given the "not_the_real_response" library file has a response for "http://example.com/" that matches /This is not the real response from example\.com/
9
- When I make an HTTP get request to "http://example.com/" within the "not_the_real_response" cassette
9
+ When I make an HTTP get request to "http://example.com/" while using the "not_the_real_response" cassette
10
10
  Then the response for "http://example.com/" should match /This is not the real response from example\.com/
11
11
 
12
12
  @replay_cassette1
@@ -23,7 +23,7 @@ Feature: Replay recorded response
23
23
  And the "nested_replay_cassette" library file has a response for "http://example.com/nested" that matches /The nested response/
24
24
  And the "cucumber_tags/replay_cassette2" library file has a response for "http://example.com/after_nested" that matches /The after_nested response/
25
25
  When I make an HTTP get request to "http://example.com/before_nested"
26
- And I make an HTTP get request to "http://example.com/nested" within the "nested_replay_cassette" cassette
26
+ And I make an HTTP get request to "http://example.com/nested" while using the "nested_replay_cassette" cassette
27
27
  And I make an HTTP get request to "http://example.com/after_nested"
28
28
  Then the response for "http://example.com/before_nested" should match /The before_nested response/
29
29
  And the response for "http://example.com/nested" should match /The nested response/
@@ -33,7 +33,7 @@ Feature: Replay recorded response
33
33
  Scenario: Make an HTTP request in a cassette with record mode set to :all
34
34
  Given we have a "temp/not_the_real_response" library file with a previously recorded response for "http://example.com/"
35
35
  And we have a "temp/not_the_real_response" library file with no previously recorded response for "http://example.com/foo"
36
- When I make HTTP get requests to "http://example.com/" and "http://example.com/foo" within the "temp/not_the_real_response" cassette using cassette options: { :record => :all }
36
+ When I make HTTP get requests to "http://example.com/" and "http://example.com/foo" while using the "temp/not_the_real_response" cassette using cassette options: { :record => :all }
37
37
  Then the response for "http://example.com/" should match /You have reached this web page by typing.*example\.com/
38
38
  And the response for "http://example.com/foo" should match /The requested URL \/foo was not found/
39
39
 
@@ -41,7 +41,7 @@ Feature: Replay recorded response
41
41
  Scenario: Make an HTTP request in a cassette with record mode set to :none
42
42
  Given we have a "temp/not_the_real_response" library file with a previously recorded response for "http://example.com/"
43
43
  And we have a "temp/not_the_real_response" library file with no previously recorded response for "http://example.com/foo"
44
- When I make HTTP get requests to "http://example.com/" and "http://example.com/foo" within the "temp/not_the_real_response" cassette using cassette options: { :record => :none }
44
+ When I make HTTP get requests to "http://example.com/" and "http://example.com/foo" while using the "temp/not_the_real_response" cassette using cassette options: { :record => :none }
45
45
  Then the response for "http://example.com/" should match /This is not the real response from example\.com/
46
46
  And the HTTP get request to "http://example.com/foo" should result in an error that mentions VCR
47
47
 
@@ -49,7 +49,7 @@ Feature: Replay recorded response
49
49
  Scenario: Make an HTTP request in a cassette with record mode set to :new_episodes
50
50
  Given we have a "temp/not_the_real_response" library file with a previously recorded response for "http://example.com/"
51
51
  And we have a "temp/not_the_real_response" library file with no previously recorded response for "http://example.com/foo"
52
- When I make HTTP get requests to "http://example.com/" and "http://example.com/foo" within the "temp/not_the_real_response" cassette
52
+ When I make HTTP get requests to "http://example.com/" and "http://example.com/foo" while using the "temp/not_the_real_response" cassette
53
53
  Then the response for "http://example.com/" should match /This is not the real response from example\.com/
54
54
  And the response for "http://example.com/foo" should match /The requested URL \/foo was not found/
55
55
 
@@ -76,7 +76,7 @@ Feature: Replay recorded response
76
76
 
77
77
  Scenario: Replay recorded erb response
78
78
  Given the "erb_cassette" library file has a response for "http://example.com/embedded_ruby_code" that matches /Some embedded ruby code[\S\s]*The value of some_variable is/
79
- When I make an HTTP get request to "http://example.com/embedded_ruby_code" within the "erb_cassette" cassette using cassette options: { :record => :none, :erb => { :some_variable => 'foo-bar' } }
79
+ When I make an HTTP get request to "http://example.com/embedded_ruby_code" while using the "erb_cassette" cassette using cassette options: { :record => :none, :erb => { :some_variable => 'foo-bar' } }
80
80
  Then the response for "http://example.com/embedded_ruby_code" should match /Some embedded ruby code: 7[\S\s]*The value of some_variable is: foo-bar/
81
81
 
82
82
  @create_replay_localhost_cassette @spawns_localhost_server
@@ -84,7 +84,7 @@ Feature: Replay recorded response
84
84
  Given the ignore_localhost config setting is set to false
85
85
  And the "temp/replay_localhost_cassette" library file has a response for localhost that matches /This is a fake response/
86
86
  And a rack app is running on localhost that returns "localhost response" for all requests
87
- When I make an HTTP get request to the localhost rack app within the "temp/replay_localhost_cassette" cassette
87
+ When I make an HTTP get request to the localhost rack app while using the "temp/replay_localhost_cassette" cassette
88
88
  Then the response for the localhost rack app should match /This is a fake response/
89
89
 
90
90
  @create_replay_localhost_cassette @spawns_localhost_server
@@ -92,5 +92,5 @@ Feature: Replay recorded response
92
92
  Given the ignore_localhost config setting is set to true
93
93
  And the "temp/replay_localhost_cassette" library file has a response for localhost that matches /This is a fake response/
94
94
  And a rack app is running on localhost that returns "localhost response" for all requests
95
- When I make an HTTP get request to the localhost rack app within the "temp/replay_localhost_cassette" cassette
95
+ When I make an HTTP get request to the localhost rack app while using the "temp/replay_localhost_cassette" cassette
96
96
  Then the response for the localhost rack app should match /localhost response/
@@ -0,0 +1,100 @@
1
+ @fakeweb
2
+ Feature: RSpec integration
3
+ In order to easily use VCR with RSpec
4
+ As a user of both VCR and RSpec
5
+ I want a simple macro that uses a cassette for an example group
6
+
7
+ Scenario: `use_vcr_cassette` macro for RSpec 2
8
+ Given the following files do not exist:
9
+ | cassettes/VCR-RSpec_integration/without_an_explicit_cassette_name.yml |
10
+ | cassettes/net_http_example.yml |
11
+ And a file named "use_vcr_cassette_for_rspec_2_spec.rb" with:
12
+ """
13
+ require 'vcr'
14
+
15
+ VCR.config do |c|
16
+ c.cassette_library_dir = 'cassettes'
17
+ c.http_stubbing_library = :fakeweb
18
+ c.default_cassette_options = { :record => :new_episodes }
19
+ end
20
+
21
+ RSpec.configure do |c|
22
+ c.extend VCR::RSpec::Macros
23
+ end
24
+
25
+ describe "VCR-RSpec integration" do
26
+ def make_http_request
27
+ Net::HTTP.get_response('example.com', '/').body
28
+ end
29
+
30
+ context "without an explicit cassette name" do
31
+ use_vcr_cassette
32
+
33
+ it 'records an http request' do
34
+ make_http_request.should =~ /You have reached this web page by typing.*example\.com/
35
+ end
36
+ end
37
+
38
+ context "with an explicit cassette name" do
39
+ use_vcr_cassette "net_http_example"
40
+
41
+ it 'records an http request' do
42
+ make_http_request.should =~ /You have reached this web page by typing.*example\.com/
43
+ end
44
+ end
45
+ end
46
+ """
47
+ When I run "rspec ./use_vcr_cassette_for_rspec_2_spec.rb"
48
+ Then the output should contain "2 examples, 0 failures"
49
+ And the file "cassettes/VCR-RSpec_integration/without_an_explicit_cassette_name.yml" should contain "You have reached this web page by typing"
50
+ And the file "cassettes/net_http_example.yml" should contain "You have reached this web page by typing"
51
+
52
+ Scenario: `use_vcr_cassette` macro for RSpec 1
53
+ Given the following files do not exist:
54
+ | cassettes/VCR-RSpec_integration/without_an_explicit_cassette_name.yml |
55
+ | cassettes/net_http_example.yml |
56
+ And a file named "use_vcr_cassette_for_rspec_1_spec.rb" with:
57
+ """
58
+ $LOAD_PATH.unshift(File.join(%w[ .. .. vendor rspec-1 lib ]))
59
+
60
+ require 'spec'
61
+ require 'spec/autorun'
62
+
63
+ require 'vcr'
64
+
65
+ VCR.config do |c|
66
+ c.cassette_library_dir = 'cassettes'
67
+ c.http_stubbing_library = :fakeweb
68
+ c.default_cassette_options = { :record => :new_episodes }
69
+ end
70
+
71
+ Spec::Runner.configure do |c|
72
+ c.extend VCR::RSpec::Macros
73
+ end
74
+
75
+ describe "VCR-RSpec integration" do
76
+ def make_http_request
77
+ Net::HTTP.get_response('example.com', '/').body
78
+ end
79
+
80
+ context "without an explicit cassette name" do
81
+ use_vcr_cassette
82
+
83
+ it 'records an http request' do
84
+ make_http_request.should =~ /You have reached this web page by typing.*example\.com/
85
+ end
86
+ end
87
+
88
+ context "with an explicit cassette name" do
89
+ use_vcr_cassette "net_http_example"
90
+
91
+ it 'records an http request' do
92
+ make_http_request.should =~ /You have reached this web page by typing.*example\.com/
93
+ end
94
+ end
95
+ end
96
+ """
97
+ When I run "ruby -I'../../lib' ./use_vcr_cassette_for_rspec_1_spec.rb"
98
+ Then the output should contain "2 examples, 0 failures"
99
+ And the file "cassettes/VCR-RSpec_integration/without_an_explicit_cassette_name.yml" should contain "You have reached this web page by typing"
100
+ And the file "cassettes/net_http_example.yml" should contain "You have reached this web page by typing"