liveqa 1.4.6 → 1.8.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -0
- data/.travis.yml +1 -0
- data/README.md +94 -7
- data/lib/liveqa/api_operation/delete.rb +38 -0
- data/lib/liveqa/api_resource.rb +7 -6
- data/lib/liveqa/async_handlers/base.rb +1 -3
- data/lib/liveqa/config.rb +35 -11
- data/lib/liveqa/event.rb +4 -10
- data/lib/liveqa/group.rb +14 -0
- data/lib/liveqa/identity.rb +16 -0
- data/lib/liveqa/liveqa_object.rb +48 -8
- data/lib/liveqa/message.rb +31 -10
- data/lib/liveqa/plugins/rack/middleware.rb +50 -36
- data/lib/liveqa/plugins/rails/data.rb +19 -0
- data/lib/liveqa/plugins/rails/middleware_data.rb +2 -18
- data/lib/liveqa/plugins/sidekiq/client_middleware.rb +1 -1
- data/lib/liveqa/plugins/sidekiq/server_middleware.rb +2 -2
- data/lib/liveqa/plugins.rb +1 -0
- data/lib/liveqa/request.rb +2 -0
- data/lib/liveqa/store.rb +1 -1
- data/lib/liveqa/util.rb +81 -1
- data/lib/liveqa/version.rb +1 -1
- data/lib/liveqa/watcher.rb +15 -0
- data/lib/liveqa.rb +82 -4
- data/spec/lib/liveqa/api_resource_spec.rb +109 -0
- data/spec/lib/liveqa/async_handlers/base_spec.rb +13 -3
- data/spec/lib/liveqa/config_spec.rb +8 -6
- data/spec/lib/liveqa/event_spec.rb +2 -23
- data/spec/lib/liveqa/group_spec.rb +15 -0
- data/spec/lib/liveqa/identity_spec.rb +15 -0
- data/spec/lib/liveqa/liveqa_object_spec.rb +53 -2
- data/spec/lib/liveqa/message_spec.rb +75 -8
- data/spec/lib/liveqa/plugins/rack/middleware_spec.rb +8 -2
- data/spec/lib/liveqa/plugins/rails/data_spec.rb +22 -0
- data/spec/lib/liveqa/plugins/rails/middleware_data_spec.rb +2 -23
- data/spec/lib/liveqa/plugins/sidekiq/server_middleware_spec.rb +6 -12
- data/spec/lib/liveqa/util_spec.rb +40 -0
- data/spec/lib/liveqa/watcher_spec.rb +25 -0
- data/spec/lib/liveqa_spec.rb +88 -5
- data/spec/spec_helper.rb +3 -1
- metadata +17 -2
@@ -5,12 +5,8 @@ module LiveQA
|
|
5
5
|
|
6
6
|
class << self
|
7
7
|
|
8
|
-
def store_data(request)
|
9
|
-
|
10
|
-
environement: ::Rails.env
|
11
|
-
)
|
12
|
-
store_request_data(request)
|
13
|
-
store_framework
|
8
|
+
def store_data(request = nil)
|
9
|
+
store_request_data(request) if request
|
14
10
|
end
|
15
11
|
|
16
12
|
private
|
@@ -24,18 +20,6 @@ module LiveQA
|
|
24
20
|
)
|
25
21
|
end
|
26
22
|
|
27
|
-
def store_framework
|
28
|
-
stack = LiveQA::Store.get(:stack) || []
|
29
|
-
|
30
|
-
LiveQA::Store.set(
|
31
|
-
:stack,
|
32
|
-
stack.push(
|
33
|
-
name: 'rails',
|
34
|
-
version: ::Rails.version
|
35
|
-
)
|
36
|
-
)
|
37
|
-
end
|
38
|
-
|
39
23
|
end
|
40
24
|
|
41
25
|
end
|
@@ -9,7 +9,7 @@ module LiveQA
|
|
9
9
|
class ServerMiddleware
|
10
10
|
|
11
11
|
def call(_worker, job, _queue)
|
12
|
-
LiveQA::Store.
|
12
|
+
LiveQA::Store.set(:session_tracker_id, job['liveqa_session_tracker_id'] || SecureRandom.uuid)
|
13
13
|
store_worker_data(job)
|
14
14
|
yield
|
15
15
|
ensure
|
@@ -36,7 +36,7 @@ module LiveQA
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def convert_to_iso8601(int_time)
|
39
|
-
Time.at(int_time).utc.iso8601
|
39
|
+
Time.at(int_time).utc.iso8601(3)
|
40
40
|
rescue
|
41
41
|
nil
|
42
42
|
end
|
data/lib/liveqa/plugins.rb
CHANGED
data/lib/liveqa/request.rb
CHANGED
@@ -60,6 +60,7 @@ module LiveQA
|
|
60
60
|
def put
|
61
61
|
@request = Net::HTTP::Put.new(uri.path)
|
62
62
|
|
63
|
+
set_header
|
63
64
|
request.body = params[:payload]
|
64
65
|
|
65
66
|
handle_request
|
@@ -76,6 +77,7 @@ module LiveQA
|
|
76
77
|
def delete
|
77
78
|
@request = Net::HTTP::Delete.new(uri.path)
|
78
79
|
|
80
|
+
set_header
|
79
81
|
request.body = params[:payload]
|
80
82
|
|
81
83
|
handle_request
|
data/lib/liveqa/store.rb
CHANGED
data/lib/liveqa/util.rb
CHANGED
@@ -3,7 +3,30 @@ module LiveQA
|
|
3
3
|
class << self
|
4
4
|
|
5
5
|
DATE_FORMAT = '%Y/%m/%d'.freeze
|
6
|
-
OBFUSCATED
|
6
|
+
OBFUSCATED = '[HIDDEN]'.freeze
|
7
|
+
DEFAULT_OBJECT_DEF = %w[id name].freeze
|
8
|
+
|
9
|
+
##
|
10
|
+
# Remove keys from a Hash
|
11
|
+
#
|
12
|
+
# @param [Hash] to be excepted
|
13
|
+
# @param [List[String]] to be excepted
|
14
|
+
#
|
15
|
+
# @return [Hash]
|
16
|
+
def except_keys(hash, *keys)
|
17
|
+
hash.dup.delete_if { |(key, _value)| keys.include?(key) }
|
18
|
+
end
|
19
|
+
|
20
|
+
##
|
21
|
+
# Convert string to camelize
|
22
|
+
#
|
23
|
+
# @param [String]
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
# camelize('my_model') => 'MyModel'
|
27
|
+
def camelize(string)
|
28
|
+
string.split('_').map(&:capitalize).join
|
29
|
+
end
|
7
30
|
|
8
31
|
##
|
9
32
|
# Remove nil value from hash
|
@@ -128,6 +151,38 @@ module LiveQA
|
|
128
151
|
end
|
129
152
|
end
|
130
153
|
|
154
|
+
##
|
155
|
+
# Convert object into Hash
|
156
|
+
#
|
157
|
+
# @params [Objects]
|
158
|
+
#
|
159
|
+
# @return [Hash]
|
160
|
+
def properties(*args)
|
161
|
+
params = extract_params!(args)
|
162
|
+
|
163
|
+
attributes = params.each_with_object({}) do |(key, value), hash|
|
164
|
+
hash[key] = extract_object(value)
|
165
|
+
end
|
166
|
+
|
167
|
+
attributes.merge(
|
168
|
+
args.each_with_object({}) do |object, hash|
|
169
|
+
key = object.class.name.downcase
|
170
|
+
next if key.nil?
|
171
|
+
|
172
|
+
hash[key] = extract_object(object)
|
173
|
+
end
|
174
|
+
)
|
175
|
+
end
|
176
|
+
|
177
|
+
##
|
178
|
+
# Parse JSON without raise
|
179
|
+
#
|
180
|
+
def safe_json_parse(data)
|
181
|
+
JSON.parse(data.to_s)
|
182
|
+
rescue JSON::ParserError
|
183
|
+
{}
|
184
|
+
end
|
185
|
+
|
131
186
|
private
|
132
187
|
|
133
188
|
def deep_transform_keys_in_object(object, &block)
|
@@ -143,6 +198,31 @@ module LiveQA
|
|
143
198
|
end
|
144
199
|
end
|
145
200
|
|
201
|
+
def extract_object(object, custom_object_properties = LiveQA.configurations.custom_object_properties)
|
202
|
+
return unless object
|
203
|
+
|
204
|
+
object_name = object.class.name.downcase
|
205
|
+
|
206
|
+
columns =
|
207
|
+
custom_object_properties[object_name.to_sym] ||
|
208
|
+
custom_object_properties[object_name.to_s] ||
|
209
|
+
DEFAULT_OBJECT_DEF
|
210
|
+
|
211
|
+
params = columns.each_with_object({}) do |column, attributes|
|
212
|
+
attributes[column.to_s] = object.send(column) if object.respond_to?(column)
|
213
|
+
end
|
214
|
+
|
215
|
+
params.empty? ? object : params
|
216
|
+
end
|
217
|
+
|
218
|
+
def extract_params!(args)
|
219
|
+
if args.last.is_a?(Hash) && args.last.instance_of?(Hash)
|
220
|
+
args.pop
|
221
|
+
else
|
222
|
+
{}
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
146
226
|
end
|
147
227
|
end
|
148
228
|
end
|
data/lib/liveqa/version.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
module LiveQA
|
2
|
+
##
|
3
|
+
# == LiveQA \Watcher
|
4
|
+
#
|
5
|
+
# Create and update groups
|
6
|
+
#
|
7
|
+
# @example: Usage
|
8
|
+
#
|
9
|
+
# request = LiveQA::Watcher.create(template_flow: 'My Flow', expected_times: 42) #=> #<LiveQA::Response...>
|
10
|
+
#
|
11
|
+
class Watcher < APIResource
|
12
|
+
include LiveQA::APIOperation::Save
|
13
|
+
include LiveQA::APIOperation::Delete
|
14
|
+
end
|
15
|
+
end
|
data/lib/liveqa.rb
CHANGED
@@ -3,6 +3,8 @@ require 'securerandom'
|
|
3
3
|
require 'net/http'
|
4
4
|
require 'ostruct'
|
5
5
|
require 'json'
|
6
|
+
require 'time'
|
7
|
+
require 'cgi'
|
6
8
|
|
7
9
|
# Async
|
8
10
|
require 'liveqa/async_handlers/base'
|
@@ -21,9 +23,13 @@ require 'liveqa/message'
|
|
21
23
|
|
22
24
|
# Operations
|
23
25
|
require 'liveqa/api_operation/save'
|
26
|
+
require 'liveqa/api_operation/delete'
|
24
27
|
|
25
28
|
# Resources
|
26
29
|
require 'liveqa/event'
|
30
|
+
require 'liveqa/group'
|
31
|
+
require 'liveqa/identity'
|
32
|
+
require 'liveqa/watcher'
|
27
33
|
|
28
34
|
# Plugins
|
29
35
|
require 'liveqa/plugins'
|
@@ -42,7 +48,9 @@ module LiveQA
|
|
42
48
|
#
|
43
49
|
# @example Default configuration
|
44
50
|
# LiveQA.configure do |config|
|
45
|
-
#
|
51
|
+
# config.account_token = 'acc_xx'
|
52
|
+
# config.space_name = 'LiveQA'
|
53
|
+
# config.environment_name = 'production'
|
46
54
|
# end
|
47
55
|
def configure
|
48
56
|
yield @configurations = LiveQA::Config.new
|
@@ -54,7 +62,6 @@ module LiveQA
|
|
54
62
|
# Send a track event to the server
|
55
63
|
#
|
56
64
|
# @param [String] event name
|
57
|
-
# @param [String] user id from your database
|
58
65
|
# @param [Hash] payload to be send
|
59
66
|
# @param [Hash] options for the request
|
60
67
|
#
|
@@ -64,8 +71,9 @@ module LiveQA
|
|
64
71
|
|
65
72
|
payload[:type] = 'track'
|
66
73
|
payload[:name] = name
|
74
|
+
LiveQA::Plugins::Rails::Data.store_data if defined?(LiveQA::Plugins::Rails::Data)
|
67
75
|
|
68
|
-
payload =
|
76
|
+
payload = Message.extended.merge(payload)
|
69
77
|
|
70
78
|
if configurations.async_handler
|
71
79
|
return configurations.async_handler.enqueue('LiveQA::Event', 'create', payload, request_options)
|
@@ -89,8 +97,9 @@ module LiveQA
|
|
89
97
|
|
90
98
|
payload[:type] = 'identify'
|
91
99
|
payload[:user_id] = user_id
|
100
|
+
LiveQA::Plugins::Rails::Data.store_data if defined?(LiveQA::Plugins::Rails::Data)
|
92
101
|
|
93
|
-
payload =
|
102
|
+
payload = Message.extended.merge(payload)
|
94
103
|
|
95
104
|
if configurations.async_handler
|
96
105
|
return configurations.async_handler.enqueue('LiveQA::Event', 'create', payload, request_options)
|
@@ -101,5 +110,74 @@ module LiveQA
|
|
101
110
|
event.successful?
|
102
111
|
end
|
103
112
|
|
113
|
+
##
|
114
|
+
# Send a create/update for a group
|
115
|
+
#
|
116
|
+
# @param [String] group id from your database
|
117
|
+
# @param [Hash] payload to be send
|
118
|
+
# @param [Hash] options for the request
|
119
|
+
#
|
120
|
+
# @return [LiveQA::Object] response from the server
|
121
|
+
def set_group(group_id, payload = {}, request_options = {})
|
122
|
+
return true unless configurations.enabled
|
123
|
+
|
124
|
+
payload = Message.base.merge(payload)
|
125
|
+
|
126
|
+
if configurations.async_handler
|
127
|
+
return configurations.async_handler.enqueue('LiveQA::Group', 'update', group_id, payload, request_options)
|
128
|
+
end
|
129
|
+
|
130
|
+
group = Group.update(group_id, payload, request_options)
|
131
|
+
|
132
|
+
group.successful?
|
133
|
+
end
|
134
|
+
|
135
|
+
##
|
136
|
+
# Send a create/update for an identity
|
137
|
+
#
|
138
|
+
# @param [String] user id from your database
|
139
|
+
# @param [Hash] payload to be send
|
140
|
+
# @param [Hash] options for the request
|
141
|
+
#
|
142
|
+
# @return [LiveQA::Object] response from the server
|
143
|
+
def set_identity(user_id, payload = {}, request_options = {})
|
144
|
+
return true unless configurations.enabled
|
145
|
+
|
146
|
+
payload = Message.base.merge(payload)
|
147
|
+
|
148
|
+
if configurations.async_handler
|
149
|
+
return configurations.async_handler.enqueue('LiveQA::Identity', 'update', user_id, payload, request_options)
|
150
|
+
end
|
151
|
+
|
152
|
+
identity = Identity.update(user_id, payload, request_options)
|
153
|
+
|
154
|
+
identity.successful?
|
155
|
+
end
|
156
|
+
|
157
|
+
##
|
158
|
+
# Send a create a watcher
|
159
|
+
#
|
160
|
+
# @param [String|Integer] template flow name or id
|
161
|
+
# @param [Hash] payload to be send
|
162
|
+
# @param [Hash] options for the request
|
163
|
+
#
|
164
|
+
# @return [LiveQA::Object] response from the server
|
165
|
+
def watch(id_or_name, payload = {}, request_options = {})
|
166
|
+
return true unless configurations.enabled
|
167
|
+
|
168
|
+
payload[:template_flow] = id_or_name
|
169
|
+
payload = Message.base.merge(payload)
|
170
|
+
|
171
|
+
payload.delete(:session_tracker_id) if payload.delete(:without_session)
|
172
|
+
|
173
|
+
if configurations.async_handler
|
174
|
+
return configurations.async_handler.enqueue('LiveQA::Watcher', 'create', payload, request_options)
|
175
|
+
end
|
176
|
+
|
177
|
+
watcher = Watcher.create(payload, request_options)
|
178
|
+
|
179
|
+
watcher.successful?
|
180
|
+
end
|
181
|
+
|
104
182
|
end
|
105
183
|
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe LiveQA::APIResource do
|
4
|
+
|
5
|
+
describe '#request' do
|
6
|
+
subject(:resource) { LiveQA::APIResource.request(:post, '/test') }
|
7
|
+
|
8
|
+
context 'valid request' do
|
9
|
+
let(:response) { double('response', code: '200', code_type: Net::HTTPOK, body: {}.to_json) }
|
10
|
+
|
11
|
+
context 'default payload' do
|
12
|
+
let(:expected_payload) {{
|
13
|
+
method: :post,
|
14
|
+
url: 'http://localhost:4003/test',
|
15
|
+
payload: '{}',
|
16
|
+
use_ssl: false,
|
17
|
+
headers: {
|
18
|
+
accept: 'application/json',
|
19
|
+
content_type: 'application/json',
|
20
|
+
x_account_token: 'acc_xx',
|
21
|
+
x_space_name: 'LiveQA',
|
22
|
+
x_environment_name: 'test'
|
23
|
+
}
|
24
|
+
}}
|
25
|
+
|
26
|
+
after { resource }
|
27
|
+
|
28
|
+
it { expect(LiveQA::Request).to receive(:execute).with(expected_payload).and_return(response) }
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'with body and post' do
|
32
|
+
let(:expected_payload) {{
|
33
|
+
method: :post,
|
34
|
+
url: 'http://localhost:4003/test',
|
35
|
+
payload: "{\"test\":true}",
|
36
|
+
use_ssl: false,
|
37
|
+
headers: {
|
38
|
+
accept: 'application/json',
|
39
|
+
content_type: 'application/json',
|
40
|
+
x_account_token: 'acc_xx',
|
41
|
+
x_space_name: 'LiveQA',
|
42
|
+
x_environment_name: 'test'
|
43
|
+
}
|
44
|
+
}}
|
45
|
+
|
46
|
+
after { LiveQA::APIResource.request(:post, '/test', { test: true }) }
|
47
|
+
|
48
|
+
it { expect(LiveQA::Request).to receive(:execute).with(expected_payload).and_return(response) }
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'with body and get' do
|
52
|
+
let(:expected_payload) {{
|
53
|
+
method: :get,
|
54
|
+
url: 'http://localhost:4003/test?test=true',
|
55
|
+
payload: "{\"test\":true}",
|
56
|
+
use_ssl: false,
|
57
|
+
headers: {
|
58
|
+
accept: 'application/json',
|
59
|
+
content_type: 'application/json',
|
60
|
+
x_account_token: 'acc_xx',
|
61
|
+
x_space_name: 'LiveQA',
|
62
|
+
x_environment_name: 'test'
|
63
|
+
}
|
64
|
+
}}
|
65
|
+
|
66
|
+
after { LiveQA::APIResource.request(:get, '/test', { test: true }) }
|
67
|
+
|
68
|
+
it { expect(LiveQA::Request).to receive(:execute).with(expected_payload).and_return(response) }
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'with overwrite headers tokens' do
|
72
|
+
let(:expected_payload) {{
|
73
|
+
method: :post,
|
74
|
+
url: 'http://localhost:4003/test',
|
75
|
+
payload: '{}',
|
76
|
+
use_ssl: false,
|
77
|
+
headers: {
|
78
|
+
accept: 'application/json',
|
79
|
+
content_type: 'application/json',
|
80
|
+
x_account_token: 'acc_42',
|
81
|
+
x_space_name: 'MySpace',
|
82
|
+
x_environment_name: 'staging'
|
83
|
+
}
|
84
|
+
}}
|
85
|
+
|
86
|
+
after { LiveQA::APIResource.request(:post, '/test', {}, account_token: 'acc_42', space_name: 'MySpace', environment_name: 'staging') }
|
87
|
+
|
88
|
+
it { expect(LiveQA::Request).to receive(:execute).with(expected_payload).and_return(response) }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'with errors' do
|
93
|
+
before { allow(LiveQA::Request).to receive(:execute).and_raise(LiveQA::RequestError.new(response)) }
|
94
|
+
|
95
|
+
context 'with Net::HTTPUnprocessableEntity' do
|
96
|
+
let(:response) { double('response', code: '422', code_type: Net::HTTPUnprocessableEntity, body: {}.to_json, message: 'failed') }
|
97
|
+
|
98
|
+
it { expect { resource }.to_not raise_error }
|
99
|
+
end
|
100
|
+
|
101
|
+
context 'with Net::HTTPBadRequest' do
|
102
|
+
let(:response) { double('response', code: '400', code_type: Net::HTTPBadRequest, body: {}.to_json, message: 'failed') }
|
103
|
+
|
104
|
+
it { expect { resource }.to_not raise_error }
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
@@ -10,10 +10,20 @@ describe LiveQA::AsyncHandlers::Base do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
describe 'execute' do
|
13
|
-
|
13
|
+
context 'default params' do
|
14
|
+
let(:params) { ['LiveQA::Event', 'create', { test: true }] }
|
14
15
|
|
15
|
-
|
16
|
+
after { base.execute(params) }
|
16
17
|
|
17
|
-
|
18
|
+
it { expect(LiveQA::Event).to receive(:create).with({ test: true }) }
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'more params params' do
|
22
|
+
let(:params) { ['LiveQA::Group', 'update', 42, { test: true }, { no_ssl: true }] }
|
23
|
+
|
24
|
+
after { base.execute(params) }
|
25
|
+
|
26
|
+
it { expect(LiveQA::Group).to receive(:update).with(42, { test: true }, { no_ssl: true }) }
|
27
|
+
end
|
18
28
|
end
|
19
29
|
end
|
@@ -4,30 +4,32 @@ describe LiveQA::Config do
|
|
4
4
|
subject(:config) { LiveQA::Config.new(params) }
|
5
5
|
|
6
6
|
describe '#initialize' do
|
7
|
-
let(:params) {{
|
7
|
+
let(:params) {{ account_token: 'acc_xx', space_name: 'LiveQA', environment_name: 'test' }}
|
8
8
|
|
9
9
|
it { expect(config.valid!).to be_truthy }
|
10
10
|
|
11
|
-
%i[
|
11
|
+
%i[account_token environment_name api_host api_version].each do |field|
|
12
12
|
context "validate #{field}" do
|
13
|
-
let(:params) {{
|
13
|
+
let(:params) {{ account_token: 'acc_xx', space_name: 'LiveQA', environment_name: 'test', api_host: 'host', api_version: 'v1' }.merge(field => '')}
|
14
14
|
|
15
15
|
it { expect { config.valid! }.to raise_error(LiveQA::ConfigurationError, "#{field} can't be blank") }
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
context 'format obfuscated_fields' do
|
20
|
-
let(:params) {{
|
20
|
+
let(:params) {{ account_token: 'acc_xx', space_name: 'LiveQA', environment_name: 'test', obfuscated_fields: %i[another_password password_confirmation] }}
|
21
21
|
|
22
22
|
before { config.valid! }
|
23
23
|
|
24
|
-
it { expect(config.obfuscated_fields).to match_array(%w[another_password password_confirmation password access_token api_key ccv credit_card_number cvv secret secret_token token]) }
|
24
|
+
it { expect(config.obfuscated_fields).to match_array(%w[another_password password_confirmation password access_token api_key authenticity_token ccv credit_card_number cvv secret secret_token token]) }
|
25
25
|
end
|
26
26
|
|
27
27
|
context 'async_handler' do
|
28
28
|
context 'sidekiq' do
|
29
29
|
let(:params) {{
|
30
|
-
|
30
|
+
account_token: 'acc_xx',
|
31
|
+
space_name: 'LiveQA',
|
32
|
+
environment_name: 'test',
|
31
33
|
async_handler: :sidekiq
|
32
34
|
}}
|
33
35
|
before { config.valid! }
|
@@ -2,35 +2,14 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe LiveQA::Event do
|
4
4
|
|
5
|
-
describe '.build_payload' do
|
6
|
-
before { LiveQA::Store.set(:tracker_id, '41') }
|
7
|
-
|
8
|
-
let(:expected) {{
|
9
|
-
library: {
|
10
|
-
name: "liveqa",
|
11
|
-
language: "ruby",
|
12
|
-
version: kind_of(String)
|
13
|
-
},
|
14
|
-
server: {
|
15
|
-
host: kind_of(String),
|
16
|
-
pid: kind_of(Numeric)
|
17
|
-
},
|
18
|
-
message_id: kind_of(String),
|
19
|
-
timestamp: kind_of(String),
|
20
|
-
tracker_id: '42',
|
21
|
-
session_tracker_id: kind_of(String)
|
22
|
-
}}
|
23
|
-
|
24
|
-
it { expect(LiveQA::Event.build_payload(tracker_id: '42')).to match(expected) }
|
25
|
-
end
|
26
|
-
|
27
5
|
describe '.create' do
|
28
|
-
let(:response) { double('LiveQA::Request', body:
|
6
|
+
let(:response) { double('LiveQA::Request', body: "{\"object\":\"event\",\"id\":41}") }
|
29
7
|
before { expect(LiveQA::Request).to receive(:execute).and_return(response) }
|
30
8
|
|
31
9
|
subject(:create) { LiveQA::Event.create(user_id: 42) }
|
32
10
|
|
33
11
|
it { is_expected.to be_successful }
|
12
|
+
it { expect(create.id).to eq(41) }
|
34
13
|
end
|
35
14
|
|
36
15
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe LiveQA::Group do
|
4
|
+
|
5
|
+
describe '#update' do
|
6
|
+
let(:response) { double('LiveQA::Request', body: "{\"object\":\"group\",\"id\":3,\"externalId\":\"41df8a48a68cb7c94e119ef7f1380537\",\"rawData\":{\"name\":\"Lubowitz, Cartwright and Davis\",\"email\":\"kenya_parker@batz.info\",\"plan\":\"premium\",\"address\":{\"street\":\"19222 Keyshawn Mountain\",\"city\":\"Rogahnmouth\",\"state\":\"Hawaii\",\"postal_code\":\"98441-4908\",\"country\":\"Singapore\"}}}") }
|
7
|
+
before { expect(LiveQA::Request).to receive(:execute).and_return(response) }
|
8
|
+
|
9
|
+
subject(:update) { LiveQA::Group.update('41df8a48a68cb7c94e119ef7f1380537', properties: { name: 'Lubowitz, Cartwright and Davis' }) }
|
10
|
+
|
11
|
+
it { is_expected.to be_successful }
|
12
|
+
it { expect(update.external_id).to eq('41df8a48a68cb7c94e119ef7f1380537') }
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe LiveQA::Identity do
|
4
|
+
|
5
|
+
describe '#update' do
|
6
|
+
let(:response) { double('LiveQA::Request', body: "{\"object\":\"identity\",\"id\":1,\"externalId\":\"8b5439f2bc0bc5bc2b80817f29477f0d\",\"trackerIds\":[],\"rawData\":{\"name\":\"Runte, Macejkovic and Reinger\",\"email\":\"hardy@abernathy.com\",\"plan\":\"premium\",\"address\":{\"street\":\"680 Collins Branch\",\"city\":\"Holdenview\",\"state\":\"Alabama\",\"postal_code\":\"51094-2637\",\"country\":\"America\"}},\"devices\":{\"object\":\"list\",\"data\":[{\"object\":\"device\",\"bot\":false,\"botName\":null,\"brand\":null,\"browserName\":\"chrome\",\"fullVersion\":\"62.0.3202.94\",\"known\":true,\"name\":null,\"osFullVersion\":\"10.12.5\",\"osName\":\"mac\",\"osVersion\":\"10\",\"type\":\"desktop\",\"version\":\"62\",\"usedLastAt\":null}]}}") }
|
7
|
+
before { expect(LiveQA::Request).to receive(:execute).and_return(response) }
|
8
|
+
|
9
|
+
subject(:update) { LiveQA::Identity.update('8b5439f2bc0bc5bc2b80817f29477f0d', properties: { name: 'Runte, Macejkovic and Reinger' }) }
|
10
|
+
|
11
|
+
it { is_expected.to be_successful }
|
12
|
+
it { expect(update.external_id).to eq('8b5439f2bc0bc5bc2b80817f29477f0d') }
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -5,7 +5,24 @@ describe LiveQA::LiveQAObject do
|
|
5
5
|
let(:klass) { Class.new(LiveQA::LiveQAObject) }
|
6
6
|
subject(:instance) { klass.new(id: 42, name: 'test', test: true) }
|
7
7
|
|
8
|
-
let(:api_response) {
|
8
|
+
let(:api_response) {{
|
9
|
+
object: 'event',
|
10
|
+
id: 42,
|
11
|
+
other: 'other test'
|
12
|
+
}}
|
13
|
+
|
14
|
+
let(:api_responses) {{
|
15
|
+
object: 'list',
|
16
|
+
currentPage: 10,
|
17
|
+
data: [{
|
18
|
+
object: 'group',
|
19
|
+
id: 42,
|
20
|
+
other: 'other test'
|
21
|
+
}],
|
22
|
+
links: {
|
23
|
+
self: 'http://www.liveqa.io/test'
|
24
|
+
}
|
25
|
+
}}
|
9
26
|
|
10
27
|
describe 'add attribute accessors' do
|
11
28
|
it { expect(instance.id).to eq(42) }
|
@@ -62,10 +79,44 @@ describe LiveQA::LiveQAObject do
|
|
62
79
|
|
63
80
|
describe '.initialize_from' do
|
64
81
|
context 'with single object' do
|
65
|
-
subject(:instance) { klass.initialize_from(api_response) }
|
82
|
+
subject(:instance) { klass.initialize_from(api_response.to_json) }
|
66
83
|
|
67
84
|
it { is_expected.to be_successful }
|
85
|
+
it { expect(instance.id).to eq(42) }
|
86
|
+
it { expect(instance.other).to eq('other test') }
|
87
|
+
it { expect { instance.name }.to raise_error(NameError) }
|
68
88
|
end
|
89
|
+
|
90
|
+
context 'with array' do
|
91
|
+
subject(:instance) { klass.initialize_from(api_responses.to_json) }
|
92
|
+
|
93
|
+
it { is_expected.to be_successful }
|
94
|
+
it { expect(instance.data.size).to eq(1) }
|
95
|
+
it { expect(instance.data.first).to be_a(LiveQA::Group) }
|
96
|
+
it { expect(instance.current_page).to eq(10) }
|
97
|
+
it { expect(instance.links[:self]).to eq('http://www.liveqa.io/test') }
|
98
|
+
end
|
99
|
+
|
100
|
+
context 'with empty string' do
|
101
|
+
subject(:instance) { klass.initialize_from('') }
|
102
|
+
|
103
|
+
it { is_expected.to be_successful }
|
104
|
+
end
|
105
|
+
|
106
|
+
context 'with nil' do
|
107
|
+
subject(:instance) { klass.initialize_from(nil) }
|
108
|
+
|
109
|
+
it { is_expected.to be_successful }
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe '#update_from' do
|
114
|
+
before { instance.update_from(api_response) }
|
115
|
+
|
116
|
+
it { is_expected.to be_successful }
|
117
|
+
it { expect(instance.id).to eq(42) }
|
118
|
+
it { expect(instance.other).to eq('other test') }
|
119
|
+
it { expect { instance.name }.to raise_error(NameError) }
|
69
120
|
end
|
70
121
|
|
71
122
|
|