Skip to content

Commit 5a03530

Browse files
refactor: odp graphql query (#317)
* make graphql query more robust * rename odp api managers
1 parent 554bb91 commit 5a03530

9 files changed

+44
-55
lines changed

lib/optimizely/odp/odp_events_api_manager.rb renamed to lib/optimizely/odp/odp_event_api_manager.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
require 'json'
2020

2121
module Optimizely
22-
class OdpEventsApiManager
22+
class OdpEventApiManager
2323
# Interface that handles sending ODP events.
2424

2525
def initialize(logger: nil, proxy_config: nil)

lib/optimizely/odp/odp_event_manager.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# See the License for the specific language governing permissions and
1616
# limitations under the License.
1717
#
18-
require_relative 'odp_events_api_manager'
18+
require_relative 'odp_event_api_manager'
1919
require_relative '../helpers/constants'
2020
require_relative 'odp_event'
2121

@@ -47,7 +47,7 @@ def initialize(
4747
# received signal should be sent after adding item to event_queue
4848
@received = ConditionVariable.new
4949
@logger = logger
50-
@api_manager = api_manager || OdpEventsApiManager.new(logger: @logger, proxy_config: proxy_config)
50+
@api_manager = api_manager || OdpEventApiManager.new(logger: @logger, proxy_config: proxy_config)
5151
@batch_size = Helpers::Constants::ODP_EVENT_MANAGER[:DEFAULT_BATCH_SIZE]
5252
@flush_interval = Helpers::Constants::ODP_EVENT_MANAGER[:DEFAULT_FLUSH_INTERVAL_SECONDS]
5353
@flush_deadline = 0

lib/optimizely/odp/odp_segments_api_manager.rb renamed to lib/optimizely/odp/odp_segment_api_manager.rb

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
require 'json'
2020

2121
module Optimizely
22-
class OdpSegmentsApiManager
22+
class OdpSegmentApiManager
2323
# Interface that handles fetching audience segments.
2424

2525
def initialize(logger: nil, proxy_config: nil)
@@ -41,8 +41,13 @@ def fetch_segments(api_key, api_host, user_key, user_value, segments_to_check)
4141
headers = {'Content-Type' => 'application/json', 'x-api-key' => api_key.to_s}
4242

4343
payload = {
44-
'query' => %'query {customer(#{user_key}: "#{user_value}")' \
45-
"{audiences(subset:#{segments_to_check || '[]'}) {edges {node {name state}}}}}"
44+
query: 'query($userId: String, $audiences: [String]) {' \
45+
"customer(#{user_key}: $userId) " \
46+
'{audiences(subset: $audiences) {edges {node {name state}}}}}',
47+
variables: {
48+
userId: user_value.to_s,
49+
audiences: segments_to_check || []
50+
}
4651
}.to_json
4752

4853
begin

lib/optimizely/odp/odp_segment_manager.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#
1818

1919
require 'optimizely/logger'
20-
require_relative 'odp_segments_api_manager'
20+
require_relative 'odp_segment_api_manager'
2121

2222
module Optimizely
2323
class OdpSegmentManager
@@ -28,7 +28,7 @@ class OdpSegmentManager
2828
def initialize(segments_cache, api_manager = nil, logger = nil, proxy_config = nil)
2929
@odp_config = nil
3030
@logger = logger || NoOpLogger.new
31-
@api_manager = api_manager || OdpSegmentsApiManager.new(logger: @logger, proxy_config: proxy_config)
31+
@api_manager = api_manager || OdpSegmentApiManager.new(logger: @logger, proxy_config: proxy_config)
3232
@segments_cache = segments_cache
3333
end
3434

spec/odp/odp_events_api_manager_spec.rb renamed to spec/odp/odp_event_api_manager_spec.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
# limitations under the License.
1717
#
1818
require 'spec_helper'
19-
require 'optimizely/odp/odp_events_api_manager'
19+
require 'optimizely/odp/odp_event_api_manager'
2020

21-
describe Optimizely::OdpEventsApiManager do
21+
describe Optimizely::OdpEventApiManager do
2222
let(:user_key) { 'vuid' }
2323
let(:user_value) { 'test-user-value' }
2424
let(:api_key) { 'test-api-key' }
@@ -47,7 +47,7 @@
4747
body: events.to_json
4848
).to_return(status: 200)
4949

50-
api_manager = Optimizely::OdpEventsApiManager.new
50+
api_manager = Optimizely::OdpEventApiManager.new
5151
expect(spy_logger).not_to receive(:log)
5252
should_retry = api_manager.send_odp_events(api_key, api_host, events)
5353

@@ -56,7 +56,7 @@
5656

5757
it 'should return true on network error' do
5858
allow(Optimizely::Helpers::HttpUtils).to receive(:make_request).and_raise(SocketError)
59-
api_manager = Optimizely::OdpEventsApiManager.new(logger: spy_logger)
59+
api_manager = Optimizely::OdpEventApiManager.new(logger: spy_logger)
6060
expect(spy_logger).to receive(:log).with(Logger::ERROR, 'ODP event send failed (network error).')
6161

6262
should_retry = api_manager.send_odp_events(api_key, api_host, events)
@@ -70,7 +70,7 @@
7070
body: events.to_json
7171
).to_return(status: [400, 'Bad Request'], body: failure_response_data)
7272

73-
api_manager = Optimizely::OdpEventsApiManager.new(logger: spy_logger)
73+
api_manager = Optimizely::OdpEventApiManager.new(logger: spy_logger)
7474
expect(spy_logger).to receive(:log).with(
7575
Logger::ERROR, 'ODP event send failed ({"title":"Bad Request","status":400,' \
7676
'"timestamp":"2022-07-01T20:44:00.945Z","detail":{"invalids":' \
@@ -88,7 +88,7 @@
8888
body: events.to_json
8989
).to_return(status: [500, 'Internal Server Error'])
9090

91-
api_manager = Optimizely::OdpEventsApiManager.new(logger: spy_logger)
91+
api_manager = Optimizely::OdpEventApiManager.new(logger: spy_logger)
9292
expect(spy_logger).to receive(:log).with(Logger::ERROR, 'ODP event send failed (500: Internal Server Error).')
9393

9494
should_retry = api_manager.send_odp_events(api_key, api_host, events)

spec/odp/odp_event_manager_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
require 'optimizely/odp/odp_event'
1818
require 'optimizely/odp/lru_cache'
1919
require 'optimizely/odp/odp_config'
20-
require 'optimizely/odp/odp_events_api_manager'
20+
require 'optimizely/odp/odp_event_api_manager'
2121
require 'optimizely/logger'
2222
require 'optimizely/helpers/validator'
2323

@@ -98,7 +98,7 @@
9898
it 'should return OdpEventManager instance' do
9999
config = Optimizely::OdpConfig.new
100100

101-
api_manager = Optimizely::OdpEventsApiManager.new
101+
api_manager = Optimizely::OdpEventApiManager.new
102102
event_manager = Optimizely::OdpEventManager.new(api_manager: api_manager, logger: spy_logger)
103103
event_manager.start!(config)
104104

@@ -109,7 +109,7 @@
109109

110110
event_manager = Optimizely::OdpEventManager.new
111111
expect(event_manager.logger).to be_a Optimizely::NoOpLogger
112-
expect(event_manager.api_manager).to be_a Optimizely::OdpEventsApiManager
112+
expect(event_manager.api_manager).to be_a Optimizely::OdpEventApiManager
113113
end
114114
end
115115

spec/odp/odp_manager_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
require 'optimizely/odp/odp_event'
1919
require 'optimizely/odp/lru_cache'
2020
require 'optimizely/odp/odp_config'
21-
require 'optimizely/odp/odp_events_api_manager'
21+
require 'optimizely/odp/odp_event_api_manager'
2222
require 'optimizely/logger'
2323
require 'optimizely/helpers/validator'
2424
require 'optimizely/helpers/constants'

spec/odp/odp_segments_api_manager_spec.rb renamed to spec/odp/odp_segment_api_manager_spec.rb

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,21 @@
1616
# limitations under the License.
1717
#
1818
require 'spec_helper'
19-
require 'optimizely/odp/odp_segments_api_manager'
19+
require 'optimizely/odp/odp_segment_api_manager'
2020

21-
describe Optimizely::OdpSegmentsApiManager do
21+
describe Optimizely::OdpSegmentApiManager do
2222
let(:user_key) { 'vuid' }
2323
let(:user_value) { 'test-user-value' }
2424
let(:api_key) { 'test-api-key' }
2525
let(:api_host) { 'https://test-host' }
2626
let(:error_handler) { Optimizely::RaiseErrorHandler.new }
2727
let(:spy_logger) { spy('logger') }
28-
let(:api_manager) { Optimizely::OdpSegmentsApiManager.new(logger: spy_logger) }
28+
let(:api_manager) { Optimizely::OdpSegmentApiManager.new(logger: spy_logger) }
29+
let(:graphql_query) do
30+
'query($userId: String, $audiences: [String]) {' \
31+
"customer(#{user_key}: $userId) " \
32+
'{audiences(subset: $audiences) {edges {node {name state}}}}}'
33+
end
2934
let(:good_response_data) do
3035
{
3136
data: {
@@ -221,10 +226,7 @@
221226
stub_request(:post, "#{api_host}/v3/graphql")
222227
.with(
223228
headers: {'content-type': 'application/json', 'x-api-key': api_key},
224-
body: {
225-
query: %'query {customer(#{user_key}: "#{user_value}")' \
226-
'{audiences(subset:["a", "b", "c"]) {edges {node {name state}}}}}'
227-
}
229+
body: {query: graphql_query, variables: {userId: user_value, audiences: %w[a b c]}}
228230
)
229231
.to_return(status: 200, body: good_response_data.to_json)
230232

@@ -390,47 +392,27 @@
390392

391393
it 'should create correct subset filter' do
392394
stub_request(:post, "#{api_host}/v3/graphql")
393-
.with(
394-
body: {
395-
query: %'query {customer(#{user_key}: "#{user_value}")' \
396-
'{audiences(subset:[]) {edges {node {name state}}}}}'
397-
}
398-
)
395+
.with(body: {query: graphql_query, variables: {userId: user_value, audiences: []}})
399396
api_manager.fetch_segments(api_key, api_host, user_key, user_value, nil)
400397

401398
stub_request(:post, "#{api_host}/v3/graphql")
402-
.with(
403-
body: {
404-
query: %'query {customer(#{user_key}: "#{user_value}")' \
405-
'{audiences(subset:[]) {edges {node {name state}}}}}'
406-
}
407-
)
399+
.with(body: {query: graphql_query, variables: {userId: user_value, audiences: []}})
408400
api_manager.fetch_segments(api_key, api_host, user_key, user_value, [])
409401

410402
stub_request(:post, "#{api_host}/v3/graphql")
411-
.with(
412-
body: {
413-
query: %'query {customer(#{user_key}: "#{user_value}")' \
414-
'{audiences(subset:["a"]) {edges {node {name state}}}}}'
415-
}
416-
)
403+
.with(body: {query: graphql_query, variables: {userId: user_value, audiences: %w[a]}})
417404
api_manager.fetch_segments(api_key, api_host, user_key, user_value, %w[a])
418405

419406
stub_request(:post, "#{api_host}/v3/graphql")
420-
.with(
421-
body: {
422-
query: %'query {customer(#{user_key}: "#{user_value}")' \
423-
'{audiences(subset:["a", "b", "c"]) {edges {node {name state}}}}}'
424-
}
425-
)
407+
.with(body: {query: graphql_query, variables: {userId: user_value, audiences: %w[a b c]}})
426408
api_manager.fetch_segments(api_key, api_host, user_key, user_value, %w[a b c])
427409
end
428410

429411
it 'should pass the proxy config that is passed in' do
430412
allow(Optimizely::Helpers::HttpUtils).to receive(:make_request).and_raise(SocketError)
431413
stub_request(:post, "#{api_host}/v3/graphql")
432414

433-
api_manager = Optimizely::OdpSegmentsApiManager.new(logger: spy_logger, proxy_config: :proxy_config)
415+
api_manager = Optimizely::OdpSegmentApiManager.new(logger: spy_logger, proxy_config: :proxy_config)
434416
api_manager.fetch_segments(api_key, api_host, user_key, user_value, [])
435417
expect(Optimizely::Helpers::HttpUtils).to have_received(:make_request).with(anything, anything, anything, anything, anything, :proxy_config)
436418
end

spec/odp/odp_segment_manager_spec.rb

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
require 'optimizely/odp/odp_segment_manager'
1717
require 'optimizely/odp/lru_cache'
1818
require 'optimizely/odp/odp_config'
19-
require 'optimizely/odp/odp_segments_api_manager'
19+
require 'optimizely/odp/odp_segment_api_manager'
2020
require 'optimizely/logger'
2121

2222
describe Optimizely::OdpSegmentManager do
@@ -63,7 +63,7 @@
6363

6464
describe '#initialize' do
6565
it 'should return OdpSegmentManager instance' do
66-
api_manager = Optimizely::OdpSegmentsApiManager.new
66+
api_manager = Optimizely::OdpSegmentApiManager.new
6767
segment_manager = Optimizely::OdpSegmentManager.new(segments_cache, api_manager, spy_logger)
6868

6969
expect(segment_manager.segments_cache).to be_a Optimizely::LRUCache
@@ -74,16 +74,18 @@
7474

7575
segment_manager = Optimizely::OdpSegmentManager.new(segments_cache)
7676
expect(segment_manager.logger).to be_a Optimizely::NoOpLogger
77-
expect(segment_manager.api_manager).to be_a Optimizely::OdpSegmentsApiManager
77+
expect(segment_manager.api_manager).to be_a Optimizely::OdpSegmentApiManager
7878
end
7979
end
8080

8181
describe '#fetch_qualified_segments' do
8282
it 'should return segments successfully' do
8383
stub_request(:post, "#{api_host}/v3/graphql")
8484
.with({headers: {'x-api-key': api_key}, body: {
85-
'query' => %'query {customer(#{user_key}: "#{user_value}")' \
86-
"{audiences(subset:#{segments_to_check}) {edges {node {name state}}}}}"
85+
query: 'query($userId: String, $audiences: [String]) {' \
86+
"customer(#{user_key}: $userId) " \
87+
'{audiences(subset: $audiences) {edges {node {name state}}}}}',
88+
variables: {userId: user_value, audiences: %w[a b c]}
8789
}})
8890
.to_return(status: 200, body: good_response_data)
8991

0 commit comments

Comments
 (0)