-
-
Notifications
You must be signed in to change notification settings - Fork 60
/
Copy pathuse_cassette_middleware.rb
56 lines (46 loc) · 1.33 KB
/
use_cassette_middleware.rb
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
require_relative 'middleware_helpers'
module CypressOnRails
module Vcr
# Middleware to handle vcr with use_cassette
class UseCassetteMiddleware
include MiddlewareHelpers
def initialize(app, vcr = nil)
@app = app
@vcr = vcr
end
def call(env)
return @app.call(env) if should_not_use_vcr?
initialize_vcr
handle_request_with_vcr(env)
end
private
def vcr_defined?
defined?(VCR) != nil
end
def should_not_use_vcr?
vcr_defined? &&
VCR.configuration.cassette_library_dir.present? &&
VCR.configuration.cassette_library_dir != cassette_library_dir
end
def initialize_vcr
WebMock.enable! if defined?(WebMock)
vcr.turn_on!
end
def handle_request_with_vcr(env)
request = Rack::Request.new(env)
cassette_name = fetch_request_cassette(request)
vcr.use_cassette(cassette_name) do
logger.info "Handle request with cassette name: #{cassette_name}"
@app.call(env)
end
end
def fetch_request_cassette(request)
if request.path.start_with?('/graphql') && request.params.key?('operation')
"#{request.path}/#{request.params['operation']}"
else
request.path
end
end
end
end
end