lifen 0.2.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +3 -1
- data/README.md +11 -11
- data/lib/lifen.rb +7 -4
- data/lib/lifen/app_authenticated_client.rb +15 -27
- data/lib/lifen/client.rb +44 -0
- data/lib/lifen/configuration.rb +1 -1
- data/lib/lifen/error.rb +1 -0
- data/lib/lifen/flow.rb +41 -44
- data/lib/lifen/flows.rb +4 -8
- data/lib/lifen/status.rb +5 -3
- data/lib/lifen/token.rb +44 -0
- data/lib/lifen/user.rb +34 -23
- data/lib/lifen/user_authenticated_client.rb +17 -27
- data/lib/lifen/version.rb +1 -1
- data/lifen.gemspec +1 -0
- data/spec/cassettes/flows/attach_users/invalid_flow_uuid.yml +11 -13
- data/spec/cassettes/flows/attach_users/invalid_user_uuid.yml +12 -14
- data/spec/cassettes/flows/attach_users/valid.yml +14 -16
- data/spec/cassettes/flows/create.yml +13 -15
- data/spec/cassettes/flows/create_with_users.yml +12 -13
- data/spec/cassettes/flows/detach_users/valid.yml +14 -16
- data/spec/cassettes/flows/internal_error.yml +4 -2
- data/spec/cassettes/flows/internal_error_without_trace_id.yml +4 -2
- data/spec/cassettes/flows/invalid_token.yml +18 -14
- data/spec/cassettes/flows/valid_token.yml +14 -17
- data/spec/cassettes/messages/valid_message.yml +13 -15
- data/spec/cassettes/users/create/existing_user.yml +11 -11
- data/spec/cassettes/users/create/invalid_token.yml +16 -10
- data/spec/cassettes/users/create/missing_fields.yml +19 -14
- data/spec/cassettes/users/create/valid_attributes.yml +12 -12
- data/spec/cassettes/users/{refresh_unread_messages → status/refresh}/invalid_token.yml +16 -12
- data/spec/cassettes/users/{refresh_unread_messages → status/refresh}/valid_token.yml +10 -12
- data/spec/cassettes/users/token/refresh/invalid_user_uuid.yml +40 -0
- data/spec/cassettes/users/{refresh/invalid_user_uuid.yml → token/refresh/valid_user_uuid.yml} +16 -15
- data/spec/flows_spec.rb +43 -25
- data/spec/messages_spec.rb +10 -5
- data/spec/spec_helper.rb +1 -1
- data/spec/users_spec.rb +46 -26
- metadata +25 -13
- data/lib/lifen/authentication.rb +0 -29
- data/spec/cassettes/flows/detach_users/valid_again.yml +0 -57
- data/spec/cassettes/users/refresh/valid_user_uuid.yml +0 -54
data/lib/lifen/user.rb
CHANGED
@@ -1,49 +1,60 @@
|
|
1
1
|
module Lifen
|
2
|
-
class User
|
2
|
+
class User
|
3
|
+
include Virtus.model(finalize: false)
|
3
4
|
|
4
|
-
attribute :
|
5
|
-
attribute :
|
5
|
+
attribute :token, "Lifen::Token"#, default: proc { Lifen::Token.new() }
|
6
|
+
attribute :status, "Lifen::Status"
|
6
7
|
|
8
|
+
attribute :uuid, String
|
7
9
|
attribute :email, String
|
8
10
|
attribute :last_name, String
|
9
11
|
attribute :first_name, String
|
10
|
-
|
12
|
+
|
13
|
+
# def initialize(*args)
|
14
|
+
# self.token = Lifen::Token.new(user: self)
|
15
|
+
# self.status = Lifen::Status.new(user: self)
|
16
|
+
|
17
|
+
# super
|
18
|
+
# end
|
11
19
|
|
12
20
|
def flows
|
13
|
-
Lifen::Flows.new(self).all
|
21
|
+
Lifen::Flows.new(user: self).all
|
14
22
|
end
|
15
23
|
|
16
|
-
def create
|
17
|
-
|
18
|
-
authentication.register!
|
24
|
+
def create
|
25
|
+
params = {emailAddress: email, lastName: last_name, firstName: first_name}
|
19
26
|
|
20
|
-
|
21
|
-
self.uuid = authentication.uuid
|
27
|
+
json = application_client.post("authentication/api/register/third_party", params)
|
22
28
|
|
23
|
-
self
|
29
|
+
self.uuid = json["accountUuid"]
|
24
30
|
end
|
25
31
|
|
26
|
-
def
|
27
|
-
|
28
|
-
authentication.refresh_token
|
29
|
-
|
30
|
-
self.token = authentication.token
|
31
|
-
|
32
|
-
self
|
32
|
+
def unread_messages
|
33
|
+
status.unread
|
33
34
|
end
|
34
35
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
36
|
+
def token
|
37
|
+
@token ||= Lifen::Token.new(user: self)
|
38
|
+
end
|
38
39
|
|
39
|
-
|
40
|
+
def token=(token)
|
41
|
+
token.user = self
|
42
|
+
@token = token
|
43
|
+
end
|
40
44
|
|
41
|
-
|
45
|
+
def status
|
46
|
+
@status ||= Lifen::Status.new(user: self)
|
42
47
|
end
|
43
48
|
|
44
49
|
def client
|
45
50
|
UserAuthenticatedClient.new(token)
|
46
51
|
end
|
47
52
|
|
53
|
+
private
|
54
|
+
|
55
|
+
def application_client
|
56
|
+
@application_client ||= AppAuthenticatedClient.new
|
57
|
+
end
|
58
|
+
|
48
59
|
end
|
49
60
|
end
|
@@ -7,39 +7,29 @@ module Lifen
|
|
7
7
|
|
8
8
|
attr_reader :token
|
9
9
|
|
10
|
-
|
11
|
-
response = faraday_client.send(mode) do |req|
|
12
|
-
req.url url
|
10
|
+
private
|
13
11
|
|
14
|
-
|
15
|
-
|
12
|
+
def handle_status!(response)
|
13
|
+
super(response)
|
16
14
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
case response.status
|
16
|
+
when 400
|
17
|
+
raise InvalidParamsError, "Invalid params"
|
18
|
+
when 401
|
19
|
+
raise UnauthorizedError, "Token is not valid"
|
20
|
+
when 403
|
21
|
+
raise Error, "Action is forbidden"
|
22
|
+
end
|
22
23
|
|
23
|
-
trace_id = json.fetch("X-B3-TraceId", "unknown")
|
24
|
-
raise Error, "Error 500, Internal server error (trace ID: #{trace_id})"
|
25
24
|
end
|
26
25
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
json = JSON.parse response.body
|
32
|
-
|
33
|
-
json
|
34
|
-
end
|
35
|
-
|
36
|
-
def post(url, params = {})
|
37
|
-
request(:post, url, params)
|
38
|
-
end
|
26
|
+
def bearer
|
27
|
+
token.value
|
28
|
+
end
|
39
29
|
|
40
|
-
|
41
|
-
|
42
|
-
|
30
|
+
def before_request
|
31
|
+
token.refresh_once_if_needed
|
32
|
+
end
|
43
33
|
|
44
34
|
end
|
45
35
|
end
|
data/lib/lifen/version.rb
CHANGED
data/lifen.gemspec
CHANGED
@@ -8,15 +8,15 @@ http_interactions:
|
|
8
8
|
string: '["25588996-4ff1-2dbb-9643-eabb809fa654"]'
|
9
9
|
headers:
|
10
10
|
User-Agent:
|
11
|
-
- Faraday v0.
|
12
|
-
|
13
|
-
-
|
11
|
+
- Faraday v0.10.0
|
12
|
+
Authorization:
|
13
|
+
- Bearer valide_token
|
14
14
|
Content-Type:
|
15
15
|
- application/json
|
16
|
+
Accept:
|
17
|
+
- application/json
|
16
18
|
Accept-Encoding:
|
17
19
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
-
Accept:
|
19
|
-
- "*/*"
|
20
20
|
response:
|
21
21
|
status:
|
22
22
|
code: 400
|
@@ -27,9 +27,9 @@ http_interactions:
|
|
27
27
|
X-B3-Sampled:
|
28
28
|
- '1'
|
29
29
|
X-B3-Spanid:
|
30
|
-
-
|
30
|
+
- eea11196701d831b
|
31
31
|
X-B3-Traceid:
|
32
|
-
-
|
32
|
+
- eea11196701d831b
|
33
33
|
X-Content-Type-Options:
|
34
34
|
- nosniff
|
35
35
|
X-Xss-Protection:
|
@@ -45,13 +45,11 @@ http_interactions:
|
|
45
45
|
Transfer-Encoding:
|
46
46
|
- chunked
|
47
47
|
Date:
|
48
|
-
-
|
49
|
-
Connection:
|
50
|
-
- close
|
48
|
+
- Fri, 09 Dec 2016 14:51:03 GMT
|
51
49
|
body:
|
52
50
|
encoding: UTF-8
|
53
|
-
string: '{"timestamp":"2016-
|
54
|
-
Request","code":"error.400","X-B3-TraceId":"
|
51
|
+
string: '{"timestamp":"2016-12-09T14:51:03.693+0000","status":400,"error":"Bad
|
52
|
+
Request","code":"error.400","X-B3-TraceId":"eea11196701d831b","X-B3-SpanId":"eea11196701d831b"}'
|
55
53
|
http_version:
|
56
|
-
recorded_at:
|
54
|
+
recorded_at: Fri, 09 Dec 2016 14:49:12 GMT
|
57
55
|
recorded_with: VCR 3.0.3
|
@@ -2,21 +2,21 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: post
|
5
|
-
uri: https://develop.lifen.fr/central/api/chats/
|
5
|
+
uri: https://develop.lifen.fr/central/api/chats/11e6be18-7a35-d759-9177-0242ac110002/attach_users?rel=activeUsers
|
6
6
|
body:
|
7
7
|
encoding: UTF-8
|
8
8
|
string: '["invalid-uuid"]'
|
9
9
|
headers:
|
10
10
|
User-Agent:
|
11
|
-
- Faraday v0.
|
12
|
-
|
13
|
-
-
|
11
|
+
- Faraday v0.10.0
|
12
|
+
Authorization:
|
13
|
+
- Bearer valide_token
|
14
14
|
Content-Type:
|
15
15
|
- application/json
|
16
|
+
Accept:
|
17
|
+
- application/json
|
16
18
|
Accept-Encoding:
|
17
19
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
-
Accept:
|
19
|
-
- "*/*"
|
20
20
|
response:
|
21
21
|
status:
|
22
22
|
code: 400
|
@@ -27,9 +27,9 @@ http_interactions:
|
|
27
27
|
X-B3-Sampled:
|
28
28
|
- '1'
|
29
29
|
X-B3-Spanid:
|
30
|
-
-
|
30
|
+
- d5fdc72b4995d5c
|
31
31
|
X-B3-Traceid:
|
32
|
-
-
|
32
|
+
- d5fdc72b4995d5c
|
33
33
|
X-Content-Type-Options:
|
34
34
|
- nosniff
|
35
35
|
X-Xss-Protection:
|
@@ -45,13 +45,11 @@ http_interactions:
|
|
45
45
|
Transfer-Encoding:
|
46
46
|
- chunked
|
47
47
|
Date:
|
48
|
-
-
|
49
|
-
Connection:
|
50
|
-
- close
|
48
|
+
- Fri, 09 Dec 2016 14:54:11 GMT
|
51
49
|
body:
|
52
50
|
encoding: UTF-8
|
53
|
-
string: '{"timestamp":"2016-
|
54
|
-
Request","code":"error.badrequest","X-B3-TraceId":"
|
51
|
+
string: '{"timestamp":"2016-12-09T14:54:11.336+0000","status":400,"error":"Bad
|
52
|
+
Request","code":"error.badrequest","X-B3-TraceId":"d5fdc72b4995d5c","X-B3-SpanId":"d5fdc72b4995d5c"}'
|
55
53
|
http_version:
|
56
|
-
recorded_at:
|
54
|
+
recorded_at: Fri, 09 Dec 2016 14:52:20 GMT
|
57
55
|
recorded_with: VCR 3.0.3
|
@@ -2,21 +2,21 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: post
|
5
|
-
uri: https://develop.lifen.fr/central/api/chats/
|
5
|
+
uri: https://develop.lifen.fr/central/api/chats/11e6be18-7a35-d759-9177-0242ac110002/attach_users?rel=activeUsers
|
6
6
|
body:
|
7
7
|
encoding: UTF-8
|
8
|
-
string: '["
|
8
|
+
string: '["11e6be15-0fb1-0a21-a3bd-0242ac110002"]'
|
9
9
|
headers:
|
10
10
|
User-Agent:
|
11
|
-
- Faraday v0.
|
12
|
-
|
13
|
-
-
|
11
|
+
- Faraday v0.10.0
|
12
|
+
Authorization:
|
13
|
+
- Bearer valide_token
|
14
14
|
Content-Type:
|
15
15
|
- application/json
|
16
|
+
Accept:
|
17
|
+
- application/json
|
16
18
|
Accept-Encoding:
|
17
19
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
-
Accept:
|
19
|
-
- "*/*"
|
20
20
|
response:
|
21
21
|
status:
|
22
22
|
code: 200
|
@@ -27,9 +27,9 @@ http_interactions:
|
|
27
27
|
X-B3-Sampled:
|
28
28
|
- '1'
|
29
29
|
X-B3-Spanid:
|
30
|
-
-
|
30
|
+
- 6714925f9e13b875
|
31
31
|
X-B3-Traceid:
|
32
|
-
-
|
32
|
+
- 6714925f9e13b875
|
33
33
|
X-Content-Type-Options:
|
34
34
|
- nosniff
|
35
35
|
X-Xss-Protection:
|
@@ -41,17 +41,15 @@ http_interactions:
|
|
41
41
|
Expires:
|
42
42
|
- '0'
|
43
43
|
Content-Type:
|
44
|
-
- application/
|
44
|
+
- application/json;charset=UTF-8
|
45
45
|
Transfer-Encoding:
|
46
46
|
- chunked
|
47
47
|
Date:
|
48
|
-
-
|
49
|
-
Connection:
|
50
|
-
- close
|
48
|
+
- Fri, 09 Dec 2016 14:54:24 GMT
|
51
49
|
body:
|
52
50
|
encoding: UTF-8
|
53
|
-
string: '{"uuid":"
|
54
|
-
Flow","activeUsers":[{"uuid":"
|
51
|
+
string: '{"uuid":"11e6be18-7a35-d759-9177-0242ac110002","version":0,"title":"Rspec
|
52
|
+
Flow","activeUsers":[{"uuid":"11e6be14-8267-25ee-a3bd-0242ac110002","version":0,"firstName":"Existing","lastName":"User","hasEmail":false,"activated":false,"registered":false},{"uuid":"11e6be15-0fb1-0a21-a3bd-0242ac110002","version":0,"hasEmail":false,"activated":false,"registered":false}],"type":"regular"}'
|
55
53
|
http_version:
|
56
|
-
recorded_at:
|
54
|
+
recorded_at: Fri, 09 Dec 2016 14:52:33 GMT
|
57
55
|
recorded_with: VCR 3.0.3
|
@@ -5,18 +5,18 @@ http_interactions:
|
|
5
5
|
uri: https://develop.lifen.fr/central/api/chats?rel=activeUsers
|
6
6
|
body:
|
7
7
|
encoding: UTF-8
|
8
|
-
string: '{"title":"Rspec Flow"}'
|
8
|
+
string: '{"title":"Rspec Flow","users":[]}'
|
9
9
|
headers:
|
10
10
|
User-Agent:
|
11
|
-
- Faraday v0.
|
12
|
-
|
13
|
-
- valid_token
|
11
|
+
- Faraday v0.10.0
|
12
|
+
Authorization:
|
13
|
+
- Bearer valid_token
|
14
14
|
Content-Type:
|
15
15
|
- application/json
|
16
|
+
Accept:
|
17
|
+
- application/json
|
16
18
|
Accept-Encoding:
|
17
19
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
-
Accept:
|
19
|
-
- "*/*"
|
20
20
|
response:
|
21
21
|
status:
|
22
22
|
code: 200
|
@@ -27,9 +27,9 @@ http_interactions:
|
|
27
27
|
X-B3-Sampled:
|
28
28
|
- '1'
|
29
29
|
X-B3-Spanid:
|
30
|
-
-
|
30
|
+
- 7585f082524983e3
|
31
31
|
X-B3-Traceid:
|
32
|
-
-
|
32
|
+
- 7585f082524983e3
|
33
33
|
X-Content-Type-Options:
|
34
34
|
- nosniff
|
35
35
|
X-Xss-Protection:
|
@@ -41,17 +41,15 @@ http_interactions:
|
|
41
41
|
Expires:
|
42
42
|
- '0'
|
43
43
|
Content-Type:
|
44
|
-
- application/
|
44
|
+
- application/json;charset=UTF-8
|
45
45
|
Transfer-Encoding:
|
46
46
|
- chunked
|
47
47
|
Date:
|
48
|
-
-
|
49
|
-
Connection:
|
50
|
-
- close
|
48
|
+
- Fri, 09 Dec 2016 14:05:02 GMT
|
51
49
|
body:
|
52
50
|
encoding: UTF-8
|
53
|
-
string: '[{"uuid":"
|
54
|
-
Flow","
|
51
|
+
string: '[{"uuid":"11e6be18-7a35-d759-9177-0242ac110002","version":0,"title":"Rspec
|
52
|
+
Flow","activeUsers":[{"uuid":"11e6be14-8267-25ee-a3bd-0242ac110002","version":0,"firstName":"Existing","lastName":"User","hasEmail":false,"activated":false,"registered":false}],"type":"regular"}]'
|
55
53
|
http_version:
|
56
|
-
recorded_at:
|
54
|
+
recorded_at: Fri, 09 Dec 2016 14:03:11 GMT
|
57
55
|
recorded_with: VCR 3.0.3
|
@@ -5,18 +5,18 @@ http_interactions:
|
|
5
5
|
uri: https://develop.lifen.fr/central/api/chats?rel=activeUsers
|
6
6
|
body:
|
7
7
|
encoding: UTF-8
|
8
|
-
string: '{"title":"Rspec Flow","users":["
|
8
|
+
string: '{"title":"Rspec Flow","users":["11e6be15-0fb1-0a21-a3bd-0242ac110002"]}'
|
9
9
|
headers:
|
10
10
|
User-Agent:
|
11
11
|
- Faraday v0.10.0
|
12
|
-
|
13
|
-
- valid_token
|
12
|
+
Authorization:
|
13
|
+
- Bearer valid_token
|
14
14
|
Content-Type:
|
15
15
|
- application/json
|
16
|
+
Accept:
|
17
|
+
- application/json
|
16
18
|
Accept-Encoding:
|
17
19
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
-
Accept:
|
19
|
-
- "*/*"
|
20
20
|
response:
|
21
21
|
status:
|
22
22
|
code: 200
|
@@ -27,9 +27,9 @@ http_interactions:
|
|
27
27
|
X-B3-Sampled:
|
28
28
|
- '1'
|
29
29
|
X-B3-Spanid:
|
30
|
-
-
|
30
|
+
- a2cfd25a819dc82a
|
31
31
|
X-B3-Traceid:
|
32
|
-
-
|
32
|
+
- a2cfd25a819dc82a
|
33
33
|
X-Content-Type-Options:
|
34
34
|
- nosniff
|
35
35
|
X-Xss-Protection:
|
@@ -41,16 +41,15 @@ http_interactions:
|
|
41
41
|
Expires:
|
42
42
|
- '0'
|
43
43
|
Content-Type:
|
44
|
-
- application/
|
44
|
+
- application/json;charset=UTF-8
|
45
45
|
Transfer-Encoding:
|
46
46
|
- chunked
|
47
47
|
Date:
|
48
|
-
- Fri,
|
49
|
-
Connection:
|
50
|
-
- close
|
48
|
+
- Fri, 09 Dec 2016 14:48:27 GMT
|
51
49
|
body:
|
52
50
|
encoding: UTF-8
|
53
|
-
string: '[{"uuid":"
|
51
|
+
string: '[{"uuid":"11e6be1d-a870-eabc-9177-0242ac110002","version":0,"title":"Rspec
|
52
|
+
Flow","activeUsers":[{"uuid":"11e6be14-8267-25ee-a3bd-0242ac110002","version":0,"firstName":"Existing","lastName":"User","hasEmail":false,"activated":false,"registered":false},{"uuid":"11e6be15-0fb1-0a21-a3bd-0242ac110002","version":0,"hasEmail":false,"activated":false,"registered":false}],"type":"regular"}]'
|
54
53
|
http_version:
|
55
|
-
recorded_at: Fri,
|
54
|
+
recorded_at: Fri, 09 Dec 2016 14:46:37 GMT
|
56
55
|
recorded_with: VCR 3.0.3
|
@@ -2,21 +2,21 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: post
|
5
|
-
uri: https://develop.lifen.fr/central/api/chats/
|
5
|
+
uri: https://develop.lifen.fr/central/api/chats/11e6be18-7a35-d759-9177-0242ac110002/detach_users?rel=activeUsers
|
6
6
|
body:
|
7
7
|
encoding: UTF-8
|
8
|
-
string: '["
|
8
|
+
string: '["11e6be15-0fb1-0a21-a3bd-0242ac110002"]'
|
9
9
|
headers:
|
10
10
|
User-Agent:
|
11
|
-
- Faraday v0.
|
12
|
-
|
13
|
-
-
|
11
|
+
- Faraday v0.10.0
|
12
|
+
Authorization:
|
13
|
+
- Bearer valide_token
|
14
14
|
Content-Type:
|
15
15
|
- application/json
|
16
|
+
Accept:
|
17
|
+
- application/json
|
16
18
|
Accept-Encoding:
|
17
19
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
-
Accept:
|
19
|
-
- "*/*"
|
20
20
|
response:
|
21
21
|
status:
|
22
22
|
code: 200
|
@@ -27,9 +27,9 @@ http_interactions:
|
|
27
27
|
X-B3-Sampled:
|
28
28
|
- '1'
|
29
29
|
X-B3-Spanid:
|
30
|
-
-
|
30
|
+
- 6be25c2fd4989119
|
31
31
|
X-B3-Traceid:
|
32
|
-
-
|
32
|
+
- 6be25c2fd4989119
|
33
33
|
X-Content-Type-Options:
|
34
34
|
- nosniff
|
35
35
|
X-Xss-Protection:
|
@@ -41,17 +41,15 @@ http_interactions:
|
|
41
41
|
Expires:
|
42
42
|
- '0'
|
43
43
|
Content-Type:
|
44
|
-
- application/
|
44
|
+
- application/json;charset=UTF-8
|
45
45
|
Transfer-Encoding:
|
46
46
|
- chunked
|
47
47
|
Date:
|
48
|
-
-
|
49
|
-
Connection:
|
50
|
-
- close
|
48
|
+
- Fri, 09 Dec 2016 14:56:44 GMT
|
51
49
|
body:
|
52
50
|
encoding: UTF-8
|
53
|
-
string: '{"uuid":"
|
54
|
-
Flow","activeUsers":[],"type":"regular"}'
|
51
|
+
string: '{"uuid":"11e6be18-7a35-d759-9177-0242ac110002","version":0,"title":"Rspec
|
52
|
+
Flow","activeUsers":[{"uuid":"11e6be14-8267-25ee-a3bd-0242ac110002","version":0,"firstName":"Existing","lastName":"User","hasEmail":false,"activated":false,"registered":false}],"type":"regular"}'
|
55
53
|
http_version:
|
56
|
-
recorded_at:
|
54
|
+
recorded_at: Fri, 09 Dec 2016 14:54:53 GMT
|
57
55
|
recorded_with: VCR 3.0.3
|