-
Notifications
You must be signed in to change notification settings - Fork 131
/
recorder.ex
86 lines (75 loc) · 2.38 KB
/
recorder.ex
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
defmodule ExVCR.Recorder do
@moduledoc """
Provides data saving/loading capability for HTTP interactions.
"""
alias ExVCR.Handler
alias ExVCR.Actor.Responses
alias ExVCR.Actor.Options
@doc """
Initialize recorder.
"""
def start(options) do
ExVCR.Checker.start([])
{:ok, act_responses} = Responses.start([])
{:ok, act_options} = Options.start(options)
recorder = %ExVCR.Record{options: act_options, responses: act_responses}
if stub = options(recorder)[:stub] do
set(stub, recorder)
else
load_from_json(recorder)
end
recorder
end
@doc """
Provides entry point to be called from :meck library. HTTP request arguments are specified as args parameter.
If response is not found in the cache, access to the server.
"""
def request(recorder, request) do
Handler.get_response(recorder, request)
end
@doc """
Load record-data from json file.
"""
def load_from_json(recorder) do
file_path = get_file_path(recorder)
custom_mode = options(recorder)[:custom]
adapter = options(recorder)[:adapter]
responses = ExVCR.JSON.load(file_path, custom_mode, adapter)
set(responses, recorder)
end
@doc """
Save record-data into json file.
"""
def save(recorder) do
file_path = get_file_path(recorder)
if File.exists?(file_path) == false do
ExVCR.JSON.save(file_path, ExVCR.Recorder.get(recorder))
end
end
@doc """
Returns the file path of the save/load target, based on the custom_mode(true or false).
"""
def get_file_path(recorder) do
opts = options(recorder)
directory = case opts[:custom] do
true -> ExVCR.Setting.get(:custom_library_dir)
_ -> ExVCR.Setting.get(:cassette_library_dir)
end
"#{directory}/#{opts[:fixture]}.json"
end
def options(recorder), do: Options.get(recorder.options)
def get(recorder), do: Responses.get(recorder.responses)
def set(responses, recorder), do: Responses.set(recorder.responses, responses)
def append(recorder, x), do: Responses.append(recorder.responses, x)
def pop(recorder), do: Responses.pop(recorder.responses)
def update(recorder, finder, updator) do
responses = Enum.map(ExVCR.Recorder.get(recorder), fn(response) ->
if finder.(response) do
updator.(response)
else
response
end
end)
set(responses, recorder)
end
end