File: hook_into.feature

package info (click to toggle)
ruby-vcr 6.0.0%2Breally5.0.0-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,320 kB
  • sloc: ruby: 8,456; sh: 177; makefile: 7
file content (165 lines) | stat: -rw-r--r-- 6,436 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
Feature: hook_into

  The `hook_into` configuration option determines how VCR hooks into the
  HTTP requests to record and replay them.  There are currently 4 valid
  options which support many different HTTP libraries:

    - :webmock can be used to hook into requests from:
      - Net::HTTP
      - HTTPClient
      - Patron
      - Curb (Curl::Easy, but not Curl::Multi)
      - EM HTTP Request
      - Typhoeus (Typhoeus::Hydra, but not Typhoeus::Easy or Typhoeus::Multi)
      - Excon
    - :typhoeus can be used to hook into itself (as long as you use Typhoeus::Hydra,
      but not Typhoeus::Easy or Typhoeus::Multi).
    - :excon can be used to hook into itself.
    - :faraday can be used to hook into itself.

  There are some addiitonal trade offs to consider when deciding which
  option to use:

    - WebMock uses extensive monkey patching to hook into supported HTTP
      libraries.  No monkey patching is used for Typhoeus, Excon or Faraday.
    - Typhoeus, Excon, Faraday can be used together, and with WebMock.

  Regardless of which library you use, VCR takes care of all of the configuration
  for you.  You should not need to interact directly with WebMock or the
  stubbing facilities of Typhoeus, Excon or Faraday.  If/when you decide to change stubbing
  libraries, you can change the `hook_into` configuration option and it'll work with no other changes required.

  Scenario Outline: Record and replay a request using each supported hook_into/http library combination
    Given a file named "hook_into_http_lib_combo.rb" with:
      """ruby
      include_http_adapter_for("<http_lib>")

      require 'vcr'
      VCR.configure { |c| c.ignore_localhost = true }

      $server = start_sinatra_app do
        get('/') { ARGV[0] }
      end

      puts "The response for request 1 was: #{response_body_for(:get, "http://localhost:#{$server.port}/")}"

      VCR.configure do |c|
        <configuration>
        c.cassette_library_dir = 'vcr_cassettes'
        c.ignore_localhost = false
        c.default_cassette_options = { :serialize_with => :syck }
      end

      VCR.use_cassette('example') do
        puts "The response for request 2 was: #{response_body_for(:get, "http://localhost:#{$server.port}/")}"
      end
      """
    When I run `ruby hook_into_http_lib_combo.rb 'Hello World'`
    Then the output should contain each of the following:
      | The response for request 1 was: Hello World |
      | The response for request 2 was: Hello World |
     And the file "vcr_cassettes/example.yml" should contain "Hello World"

    When I run `ruby hook_into_http_lib_combo.rb 'Goodbye World'`
    Then the output should contain each of the following:
      | The response for request 1 was: Goodbye World |
      | The response for request 2 was: Hello World   |
     And the file "vcr_cassettes/example.yml" should contain "Hello World"

   Examples:
      | configuration         | http_lib              |
      | c.hook_into :webmock  | net/http              |
      | c.hook_into :webmock  | httpclient            |
      | c.hook_into :webmock  | curb                  |
      | c.hook_into :webmock  | patron                |
      | c.hook_into :webmock  | em-http-request       |
      | c.hook_into :webmock  | typhoeus              |
      | c.hook_into :webmock  | excon                 |
      | c.hook_into :typhoeus | typhoeus              |
      | c.hook_into :excon    | excon                 |
      | c.hook_into :faraday  | faraday (w/ net_http) |
      | c.hook_into :faraday  | faraday (w/ typhoeus) |

  @exclude-jruby @exclude-rbx
  Scenario Outline: Use Typhoeus, Excon and Faraday in combination with WebMock
    Given a file named "hook_into_multiple.rb" with:
      """ruby
      require 'typhoeus'
      require 'excon'
      require 'faraday'
      require 'vcr'
      <extra_require>

      VCR.configure { |c| c.ignore_localhost = true }

      $server = start_sinatra_app do
        get('/:path') { "#{ARGV[0]} #{params[:path]}" }
      end

      def net_http_response
        Net::HTTP.get_response('localhost', '/net_http', $server.port).body
      end

      def typhoeus_response
        Typhoeus::Request.get("http://localhost:#{$server.port}/typhoeus").body
      end

      def excon_response
        Excon.get("http://localhost:#{$server.port}/excon").body
      end

      def faraday_response
        Faraday::Connection.new(:url => "http://localhost:#{$server.port}") do |builder|
          builder.adapter :<faraday_adapter>
        end.get('/faraday').body
      end

      puts "Net::HTTP 1: #{net_http_response}"
      puts "Typhoeus 1: #{typhoeus_response}"
      puts "Excon 1: #{excon_response}"
      puts "Faraday 1: #{faraday_response}"

      VCR.configure do |c|
        c.hook_into <hook_into>, :typhoeus, :excon, :faraday
        c.cassette_library_dir = 'vcr_cassettes'
        c.ignore_localhost = false
      end

      VCR.use_cassette('example') do
        puts "Net::HTTP 2: #{net_http_response}"
        puts "Typhoeus 2: #{typhoeus_response}"
        puts "Excon 2: #{excon_response}"
        puts "Faraday 2: #{faraday_response}"
      end
      """
    When I run `ruby hook_into_multiple.rb 'Hello'`
    Then the output should contain each of the following:
      | Net::HTTP 1: Hello net_http |
      | Typhoeus 1: Hello typhoeus  |
      | Excon 1: Hello excon        |
      | Faraday 1: Hello faraday    |
      | Net::HTTP 2: Hello net_http |
      | Typhoeus 2: Hello typhoeus  |
      | Excon 2: Hello excon        |
      | Faraday 2: Hello faraday    |
    And the cassette "vcr_cassettes/example.yml" should have the following response bodies:
      | Hello net_http |
      | Hello typhoeus |
      | Hello excon    |
      | Hello faraday  |

    When I run `ruby hook_into_multiple.rb 'Goodbye'`
    Then the output should contain each of the following:
      | Net::HTTP 1: Goodbye net_http |
      | Typhoeus 1: Goodbye typhoeus  |
      | Excon 1: Goodbye excon        |
      | Faraday 1: Goodbye faraday    |
      | Net::HTTP 2: Hello net_http   |
      | Typhoeus 2: Hello typhoeus    |
      | Excon 2: Hello excon          |
      | Faraday 2: Hello faraday      |

    Examples:
      | hook_into | faraday_adapter | extra_require                       |
      | :webmock  | net_http        |                                     |
      | :webmock  | typhoeus        | require 'typhoeus/adapters/faraday' |