qbwc 0.0.5 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +5 -1
- data/.travis.yml +6 -0
- data/README.md +152 -144
- data/Rakefile +7 -1
- data/lib/generators/qbwc/install/install_generator.rb +20 -4
- data/lib/generators/qbwc/install/templates/config/qbwc.rb +42 -26
- data/lib/generators/qbwc/install/templates/controllers/qbwc_controller.rb +2 -38
- data/lib/generators/qbwc/install/templates/db/migrate/create_qbwc_jobs.rb +15 -0
- data/lib/generators/qbwc/install/templates/db/migrate/create_qbwc_sessions.rb +16 -0
- data/lib/qbwc.rb +107 -71
- data/lib/qbwc/active_record.rb +6 -0
- data/lib/qbwc/active_record/job.rb +111 -0
- data/lib/qbwc/active_record/session.rb +52 -0
- data/lib/qbwc/controller.rb +176 -0
- data/lib/qbwc/job.rb +81 -18
- data/lib/qbwc/railtie.rb +8 -0
- data/lib/qbwc/request.rb +14 -23
- data/lib/qbwc/session.rb +100 -72
- data/lib/qbwc/version.rb +1 -1
- data/lib/qbwc/worker.rb +16 -0
- data/qbwc.gemspec +11 -5
- data/test/qbwc/controllers/controller_test.rb +157 -0
- data/test/qbwc/integration/job_management_test.rb +86 -0
- data/test/qbwc/integration/request_generation_test.rb +340 -0
- data/test/qbwc/integration/response_test.rb +303 -0
- data/test/qbwc/integration/routes_test.rb +38 -0
- data/test/qbwc/integration/session_test.rb +94 -0
- data/test/test_helper.rb +248 -0
- data/test/wash_out_helper.rb +76 -0
- metadata +133 -55
- data/Gemfile.lock +0 -72
- data/lib/qbwc/soap_wrapper.rb +0 -35
- data/lib/qbwc/soap_wrapper/QBWebConnectorSvc.rb +0 -69
- data/lib/qbwc/soap_wrapper/QBWebConnectorSvc.wsdl +0 -312
- data/lib/qbwc/soap_wrapper/default.rb +0 -198
- data/lib/qbwc/soap_wrapper/defaultMappingRegistry.rb +0 -163
- data/lib/qbwc/soap_wrapper/defaultServant.rb +0 -133
- data/spec/spec_helper.rb +0 -17
data/lib/qbwc/version.rb
CHANGED
data/lib/qbwc/worker.rb
ADDED
data/qbwc.gemspec
CHANGED
@@ -5,8 +5,8 @@ require "qbwc/version"
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "qbwc"
|
7
7
|
s.version = QBWC::VERSION
|
8
|
-
s.authors = ["Alex Skryl", "Russell Osborne", "German Garcia"]
|
9
|
-
s.email = ["rut216@gmail.com", "russell@burningpony.com", "geermc4@gmail.com"]
|
8
|
+
s.authors = ["Alex Skryl", "Russell Osborne", "German Garcia", "Jason Barnabe"]
|
9
|
+
s.email = ["rut216@gmail.com", "russell@burningpony.com", "geermc4@gmail.com", "jason.barnabe@gmail.com"]
|
10
10
|
s.homepage = ""
|
11
11
|
s.summary = %q{A Rails interface for Intuit's Quickbooks Web Connector}
|
12
12
|
s.description = %q{A Rails interface for Intuit's Quickbooks Web Connector that's OPEN SOURCE!}
|
@@ -22,12 +22,18 @@ Gem::Specification.new do |s|
|
|
22
22
|
"README.md"
|
23
23
|
]
|
24
24
|
|
25
|
-
s.add_dependency "
|
26
|
-
s.add_dependency "
|
25
|
+
s.add_dependency "qbxml", [">= 0.3.0"]
|
26
|
+
s.add_dependency "wash_out", [">= 0.7.1"]
|
27
|
+
|
27
28
|
s.add_development_dependency('guard')
|
28
29
|
s.add_development_dependency('guard-rspec')
|
29
30
|
s.add_development_dependency('rb-fsevent')
|
30
31
|
s.add_development_dependency('webmock')
|
31
32
|
s.add_development_dependency('rspec')
|
32
|
-
|
33
|
+
s.add_development_dependency('activerecord')
|
34
|
+
s.add_development_dependency('actionpack')
|
35
|
+
s.add_development_dependency('rails', [">= 4.1.0"])
|
36
|
+
s.add_development_dependency('sqlite3')
|
37
|
+
s.add_development_dependency('minitest')
|
38
|
+
s.add_development_dependency('rake')
|
33
39
|
end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
$:<< File.expand_path(File.dirname(__FILE__) + '/../..')
|
2
|
+
require 'test_helper.rb'
|
3
|
+
|
4
|
+
# http://pivotallabs.com/writing-rails-engine-rspec-controller-tests/
|
5
|
+
# http://jkamenik.github.io/blog/2014/02/07/controller-test-in-rails-engines/
|
6
|
+
# https://www.honeybadger.io/blog/2014/01/28/rails4-engine-controller-specs
|
7
|
+
class QBWCControllerTest < ActionController::TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@routes = Rails.application.routes # https://github.com/blowmage/minitest-rails/issues/133#issuecomment-36401436
|
11
|
+
@controller = QbwcController.new # http://stackoverflow.com/a/7743176
|
12
|
+
|
13
|
+
@controller.prepend_view_path("#{Gem::Specification.find_by_name("wash_out").gem_dir}/app/views")
|
14
|
+
#p @controller.view_paths
|
15
|
+
|
16
|
+
QBWC.on_error = :stop
|
17
|
+
QBWC::ActiveRecord::Session::QbwcSession.all.each {|qbs| qbs.destroy}
|
18
|
+
QBWC.clear_jobs
|
19
|
+
QBWC.set_session_initializer() {|session| }
|
20
|
+
|
21
|
+
$HANDLE_RESPONSE_EXECUTED = false
|
22
|
+
end
|
23
|
+
|
24
|
+
test "qwc" do
|
25
|
+
#_inspect_routes
|
26
|
+
process(:qwc)
|
27
|
+
|
28
|
+
assert_match /QBWCXML/, @response.body
|
29
|
+
assert_match Regexp.new("AppName.*QbwcTestApplication #{Rails.env}.*AppName"), @response.body
|
30
|
+
assert_match /AppURL.*http:\/\/test.host\/qbwc\/action.*AppURL/, @response.body
|
31
|
+
assert_match /AppDescription.*Quickbooks integration.*AppDescription/, @response.body
|
32
|
+
assert_match /AppSupport.*https:\/\/test.host\/.*AppSupport/, @response.body
|
33
|
+
assert_match /UserName.*#{QBWC_USERNAME}.*UserName/, @response.body
|
34
|
+
end
|
35
|
+
|
36
|
+
test "authenticate with no jobs" do
|
37
|
+
_authenticate
|
38
|
+
assert_equal 0, QBWC.pending_jobs(COMPANY).count
|
39
|
+
assert @response.body.include?(QBWC::Controller::AUTHENTICATE_NO_WORK), @response.body
|
40
|
+
end
|
41
|
+
|
42
|
+
test "authenticate with jobs" do
|
43
|
+
_authenticate_with_queued_job
|
44
|
+
assert_equal 1, QBWC.pending_jobs(COMPANY).count
|
45
|
+
assert @response.body.include?(COMPANY), @response.body
|
46
|
+
end
|
47
|
+
|
48
|
+
test "authenticate fail" do
|
49
|
+
_authenticate_wrong_password
|
50
|
+
assert @response.body.include?(QBWC::Controller::AUTHENTICATE_NOT_VALID_USER), @response.body
|
51
|
+
end
|
52
|
+
|
53
|
+
test "authenticate with initialization block" do
|
54
|
+
initializer_called = false
|
55
|
+
QBWC.set_session_initializer() do |session|
|
56
|
+
initializer_called = true
|
57
|
+
assert_not_nil session
|
58
|
+
assert_equal QBWC_USERNAME, session.user
|
59
|
+
assert_equal 0, session.progress
|
60
|
+
assert_nil session.error
|
61
|
+
#assert_not_nil session.current_job
|
62
|
+
#assert_not_nil session.pending_jobs
|
63
|
+
#assert_equal 1, session.pending_jobs.count
|
64
|
+
end
|
65
|
+
|
66
|
+
_authenticate_with_queued_job
|
67
|
+
assert initializer_called
|
68
|
+
end
|
69
|
+
|
70
|
+
test "most recent initialization block is executed" do
|
71
|
+
initializer1_called = false
|
72
|
+
initializer2_called = false
|
73
|
+
|
74
|
+
QBWC.set_session_initializer() do |session|
|
75
|
+
initializer1_called = true
|
76
|
+
end
|
77
|
+
|
78
|
+
QBWC.set_session_initializer() do |session|
|
79
|
+
initializer2_called = true
|
80
|
+
end
|
81
|
+
|
82
|
+
_authenticate_with_queued_job
|
83
|
+
assert ! initializer1_called
|
84
|
+
assert initializer2_called
|
85
|
+
end
|
86
|
+
|
87
|
+
test "send_request" do
|
88
|
+
QBWC.add_job(:customer_add_rq_job, true, COMPANY, QBWC::Worker, QBWC_CUSTOMER_ADD_RQ)
|
89
|
+
_authenticate
|
90
|
+
_simulate_soap_request('send_request', SEND_REQUEST_SOAP_ACTION, SEND_REQUEST_PARAMS)
|
91
|
+
end
|
92
|
+
|
93
|
+
test "receive_response" do
|
94
|
+
_authenticate_with_queued_job
|
95
|
+
_simulate_soap_request('receive_response', RECEIVE_RESPONSE_SOAP_ACTION, RECEIVE_RESPONSE_PARAMS)
|
96
|
+
|
97
|
+
assert_match /tns:receiveResponseXMLResult.*100..tns:receiveResponseXMLResult/, @response.body
|
98
|
+
end
|
99
|
+
|
100
|
+
class CheckErrorValuesWorker < QBWC::Worker
|
101
|
+
def worker_assert_equal(expected_value, value, tag)
|
102
|
+
raise "#{tag} is not correct" if expected_value != value && ! expected_value.blank?
|
103
|
+
end
|
104
|
+
|
105
|
+
def requests(job)
|
106
|
+
{:customer_query_rq => {:full_name => 'Quincy Bob William Carlos'}}
|
107
|
+
end
|
108
|
+
|
109
|
+
def handle_response(response, session, job, request, expected)
|
110
|
+
unless expected.blank?
|
111
|
+
worker_assert_equal(expected[:session_error], session.error, "session.error")
|
112
|
+
worker_assert_equal(expected[:session_status_code], session.status_code, "session.status_code")
|
113
|
+
worker_assert_equal(expected[:session_status_severity], session.status_severity, "session.status_severity")
|
114
|
+
end
|
115
|
+
$HANDLE_RESPONSE_EXECUTED = true
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def _receive_response_error_helper(receive_response_xml_result, schedule_second_job)
|
120
|
+
expected_values = {
|
121
|
+
:session_error => RECEIVE_RESPONSE_ERROR_PARAMS[:message],
|
122
|
+
:session_status_code => RECEIVE_RESPONSE_ERROR_PARAMS[:hresult],
|
123
|
+
:session_status_severity => 'Error',
|
124
|
+
}
|
125
|
+
|
126
|
+
QBWC.add_job(:customer_add_rq_job1, true, COMPANY, CheckErrorValuesWorker, nil, expected_values)
|
127
|
+
QBWC.add_job(:customer_add_rq_job2, true, COMPANY, CheckErrorValuesWorker) if schedule_second_job
|
128
|
+
|
129
|
+
_authenticate
|
130
|
+
_simulate_soap_request('receive_response', RECEIVE_RESPONSE_SOAP_ACTION, RECEIVE_RESPONSE_ERROR_PARAMS)
|
131
|
+
|
132
|
+
assert $HANDLE_RESPONSE_EXECUTED # https://github.com/skryl/qbwc/pull/50#discussion_r23764154
|
133
|
+
assert_match /tns:receiveResponseXMLResult.*#{receive_response_xml_result}..tns:receiveResponseXMLResult/, @response.body
|
134
|
+
end
|
135
|
+
|
136
|
+
test "receive_response error stop" do
|
137
|
+
QBWC.on_error = :stop
|
138
|
+
_receive_response_error_helper(-1, false)
|
139
|
+
end
|
140
|
+
|
141
|
+
test "receive_response error continue" do
|
142
|
+
QBWC.on_error = :continue
|
143
|
+
_receive_response_error_helper(100, false)
|
144
|
+
end
|
145
|
+
|
146
|
+
test "receive_response error stop 2jobs" do
|
147
|
+
QBWC.on_error = :stop
|
148
|
+
_receive_response_error_helper(-1, true)
|
149
|
+
end
|
150
|
+
|
151
|
+
test "receive_response error continue 2jobs" do
|
152
|
+
QBWC.on_error = :continue
|
153
|
+
_receive_response_error_helper(50, true)
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
|
@@ -0,0 +1,86 @@
|
|
1
|
+
$:<< File.expand_path(File.dirname(__FILE__) + '/../..')
|
2
|
+
require 'test_helper.rb'
|
3
|
+
|
4
|
+
class JobManagementTest < ActionDispatch::IntegrationTest
|
5
|
+
|
6
|
+
def setup
|
7
|
+
JobManagementTest.app = Rails.application
|
8
|
+
Rails.logger = Logger.new('/dev/null') # or STDOUT
|
9
|
+
QBWC.clear_jobs
|
10
|
+
end
|
11
|
+
|
12
|
+
test "add_job" do
|
13
|
+
QBWC.add_job(:integration_test, true, '', QBWC::Worker)
|
14
|
+
assert_equal 1, QBWC.jobs.length
|
15
|
+
|
16
|
+
# Overwrite existing job
|
17
|
+
QBWC.add_job(:integration_test, true, 'my-company', QBWC::Worker)
|
18
|
+
assert_equal 1, QBWC.jobs.length
|
19
|
+
end
|
20
|
+
|
21
|
+
test "pending_jobs" do
|
22
|
+
QBWC.add_job(:integration_test, true, 'my-company', QBWC::Worker)
|
23
|
+
assert_equal 1, QBWC.pending_jobs('my-company').length
|
24
|
+
assert_empty QBWC.pending_jobs('another-company')
|
25
|
+
end
|
26
|
+
|
27
|
+
test "pending_jobs_disabled" do
|
28
|
+
QBWC.add_job(:integration_test, false, 'my-company', QBWC::Worker)
|
29
|
+
assert_empty QBWC.pending_jobs('my-company')
|
30
|
+
end
|
31
|
+
|
32
|
+
test "get_job" do
|
33
|
+
QBWC.add_job(:integration_test, true, 'my-company', QBWC::Worker)
|
34
|
+
assert_not_nil QBWC.get_job(:integration_test)
|
35
|
+
assert_nil QBWC.get_job(:doesnt_exist)
|
36
|
+
end
|
37
|
+
|
38
|
+
test "clear_jobs" do
|
39
|
+
QBWC.add_job(:integration_test, true, 'my-company', QBWC::Worker)
|
40
|
+
assert_equal 1, QBWC.jobs.length
|
41
|
+
QBWC.clear_jobs
|
42
|
+
assert_empty QBWC.jobs
|
43
|
+
end
|
44
|
+
|
45
|
+
test "delete_job by name" do
|
46
|
+
jobname = :delete_job
|
47
|
+
QBWC.add_job(jobname, true, 'my-company', QBWC::Worker)
|
48
|
+
assert_not_nil QBWC.get_job(jobname)
|
49
|
+
QBWC.delete_job(jobname)
|
50
|
+
assert_nil QBWC.get_job(jobname)
|
51
|
+
|
52
|
+
# Degenerate case does not crash
|
53
|
+
QBWC.delete_job('')
|
54
|
+
end
|
55
|
+
|
56
|
+
test "delete_job by object" do
|
57
|
+
jobname = :delete_job
|
58
|
+
QBWC.add_job(jobname, true, 'my-company', QBWC::Worker)
|
59
|
+
job = QBWC.get_job(jobname)
|
60
|
+
QBWC.delete_job(job)
|
61
|
+
assert_nil QBWC.get_job(jobname)
|
62
|
+
|
63
|
+
# Degenerate case does not crash
|
64
|
+
QBWC.delete_job(nil)
|
65
|
+
end
|
66
|
+
|
67
|
+
class DeleteJobWorker < QBWC::Worker
|
68
|
+
def requests(job)
|
69
|
+
{:customer_query_rq => {:full_name => 'Quincy Bob William Carlos'}}
|
70
|
+
end
|
71
|
+
|
72
|
+
def handle_response(resp, session, job, request, data)
|
73
|
+
QBWC.delete_job(job.name)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
test "job deletes itself after running" do
|
78
|
+
QBWC.add_job(:job_deletes_itself_after_running, true, COMPANY, DeleteJobWorker)
|
79
|
+
assert_equal 1, QBWC.pending_jobs(COMPANY).length
|
80
|
+
session = QBWC::Session.new('foo', COMPANY)
|
81
|
+
assert_not_nil session.next_request
|
82
|
+
simulate_response(session)
|
83
|
+
assert_equal 0, QBWC.pending_jobs(COMPANY).length
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
@@ -0,0 +1,340 @@
|
|
1
|
+
$:<< File.expand_path(File.dirname(__FILE__) + '/../..')
|
2
|
+
require 'test_helper.rb'
|
3
|
+
|
4
|
+
class RequestGenerationTest < ActionDispatch::IntegrationTest
|
5
|
+
|
6
|
+
def setup
|
7
|
+
RequestGenerationTest.app = Rails.application
|
8
|
+
QBWC.clear_jobs
|
9
|
+
end
|
10
|
+
|
11
|
+
test "worker with nothing" do
|
12
|
+
QBWC.add_job(:integration_test, true, '', QBWC::Worker)
|
13
|
+
session = QBWC::Session.new('foo', '')
|
14
|
+
assert_nil session.next_request
|
15
|
+
end
|
16
|
+
|
17
|
+
class NilRequestWorker < QBWC::Worker
|
18
|
+
def requests(job)
|
19
|
+
nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
test "worker with nil" do
|
24
|
+
QBWC.add_job(:integration_test, true, '', NilRequestWorker)
|
25
|
+
session = QBWC::Session.new('foo', '')
|
26
|
+
assert_nil session.next_request
|
27
|
+
simulate_response(session)
|
28
|
+
assert_nil session.next_request
|
29
|
+
end
|
30
|
+
|
31
|
+
class SingleRequestWorker < QBWC::Worker
|
32
|
+
def requests(job)
|
33
|
+
$SINGLE_REQUESTS_INVOKED_COUNT += 1 if $SINGLE_REQUESTS_INVOKED_COUNT.is_a?(Integer)
|
34
|
+
{:customer_query_rq => {:full_name => 'Quincy Bob William Carlos'}}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
test "simple request worker" do
|
39
|
+
QBWC.add_job(:integration_test, true, '', SingleRequestWorker)
|
40
|
+
QBWC.jobs.each {|job| assert job.requests_provided_when_job_added == false}
|
41
|
+
session = QBWC::Session.new('foo', '')
|
42
|
+
nr = session.next_request
|
43
|
+
assert_not_nil nr
|
44
|
+
assert_match /FullName.*Quincy Bob William Carlos.*FullName/, nr.request
|
45
|
+
simulate_response(session)
|
46
|
+
assert_nil session.next_request
|
47
|
+
end
|
48
|
+
|
49
|
+
class SingleStringRequestWorker < QBWC::Worker
|
50
|
+
def requests(job)
|
51
|
+
$SINGLE_REQUESTS_INVOKED_COUNT += 1 if $SINGLE_REQUESTS_INVOKED_COUNT.is_a?(Integer)
|
52
|
+
QBWC_CUSTOMER_QUERY_RQ
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
test "simple string request worker" do
|
57
|
+
QBWC.add_job(:integration_test, true, '', SingleStringRequestWorker)
|
58
|
+
QBWC.jobs.each {|job| assert job.requests_provided_when_job_added == false}
|
59
|
+
session = QBWC::Session.new('foo', '')
|
60
|
+
nr = session.next_request
|
61
|
+
assert_not_nil nr
|
62
|
+
assert_match /FullName.*#{QBWC_USERNAME}.*FullName/, nr.request
|
63
|
+
simulate_response(session)
|
64
|
+
assert_nil session.next_request
|
65
|
+
end
|
66
|
+
|
67
|
+
class MultipleRequestWorker < QBWC::Worker
|
68
|
+
def requests(job)
|
69
|
+
$MULTIPLE_REQUESTS_INVOKED_COUNT += 1 if $MULTIPLE_REQUESTS_INVOKED_COUNT.is_a?(Integer)
|
70
|
+
[
|
71
|
+
{:customer_query_rq => {:full_name => 'Quincy Bob William Carlos'}},
|
72
|
+
{:customer_query_rq => {:full_name => 'Quentin Billy Wyatt Charles'}}
|
73
|
+
]
|
74
|
+
end
|
75
|
+
def handle_response(response, session, job, request, data)
|
76
|
+
$REQUESTS_FOUND_IN_RESPONSE = request
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
test "multiple request worker" do
|
81
|
+
$MULTIPLE_REQUESTS_INVOKED_COUNT = 0
|
82
|
+
$REQUESTS_FOUND_IN_RESPONSE = []
|
83
|
+
|
84
|
+
QBWC.add_job(:integration_test, true, '', MultipleRequestWorker)
|
85
|
+
session = QBWC::Session.new('foo', '')
|
86
|
+
assert_not_nil session.next_request
|
87
|
+
simulate_response(session)
|
88
|
+
assert_equal ({:customer_query_rq => {:full_name => 'Quincy Bob William Carlos'}}), $REQUESTS_FOUND_IN_RESPONSE
|
89
|
+
|
90
|
+
assert_not_nil session.next_request
|
91
|
+
simulate_response(session)
|
92
|
+
assert_equal ({:customer_query_rq => {:full_name => 'Quentin Billy Wyatt Charles'}}), $REQUESTS_FOUND_IN_RESPONSE
|
93
|
+
|
94
|
+
assert_nil session.next_request
|
95
|
+
|
96
|
+
assert_equal 1, $MULTIPLE_REQUESTS_INVOKED_COUNT
|
97
|
+
|
98
|
+
# requests should be generated once per session
|
99
|
+
session2 = QBWC::Session.new('foo', '')
|
100
|
+
assert_not_nil session2.next
|
101
|
+
simulate_response(session2)
|
102
|
+
assert_not_nil session2.next
|
103
|
+
simulate_response(session2)
|
104
|
+
assert_nil session2.next
|
105
|
+
|
106
|
+
assert_equal 2, $MULTIPLE_REQUESTS_INVOKED_COUNT
|
107
|
+
end
|
108
|
+
|
109
|
+
class RequestsFromDbWorker < QBWC::Worker
|
110
|
+
$REQUESTS_FROM_DB = [
|
111
|
+
{:customer_query_rq => {:full_name => 'Quincy Bob William Carlos'}},
|
112
|
+
{:customer_query_rq => {:full_name => 'Quentin Billy Wyatt Charles'}},
|
113
|
+
{:customer_query_rq => {:full_name => 'Quigley Brian Wally Colin'}},
|
114
|
+
]
|
115
|
+
|
116
|
+
def requests(job)
|
117
|
+
$REQUESTS_FROM_DB
|
118
|
+
end
|
119
|
+
|
120
|
+
def handle_response(response, session, job, request, data)
|
121
|
+
$REQUESTS_FROM_DB.shift # Simulate marking first request as completed
|
122
|
+
job.reset
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
test 'multiple requests from db' do
|
127
|
+
QBWC.add_job(:integration_test_multiple_requests_from_db, true, '', RequestsFromDbWorker)
|
128
|
+
assert_equal 1, QBWC.jobs.length
|
129
|
+
session = QBWC::Session.new('foo', '')
|
130
|
+
|
131
|
+
req1 = session.next_request
|
132
|
+
assert_not_nil req1
|
133
|
+
assert_match /xml.*FullName.*Quincy Bob William Carlos.*FullName/m, req1.request
|
134
|
+
simulate_response(session)
|
135
|
+
|
136
|
+
req2 = session.next_request
|
137
|
+
assert_not_nil req2
|
138
|
+
assert_match /xml.*FullName.*Quentin Billy Wyatt Charles.*FullName/m, req2.request
|
139
|
+
simulate_response(session)
|
140
|
+
|
141
|
+
req3 = session.next_request
|
142
|
+
assert_not_nil req3
|
143
|
+
assert_match /xml.*FullName.*Quigley Brian Wally Colin.*FullName/m, req3.request
|
144
|
+
simulate_response(session)
|
145
|
+
|
146
|
+
assert_nil session.next_request
|
147
|
+
end
|
148
|
+
|
149
|
+
test 'multiple jobs' do
|
150
|
+
$SINGLE_REQUESTS_INVOKED_COUNT = 0
|
151
|
+
$MULTIPLE_REQUESTS_INVOKED_COUNT = 0
|
152
|
+
|
153
|
+
QBWC.add_job(:integration_test_1, true, '', SingleRequestWorker)
|
154
|
+
QBWC.add_job(:integration_test_2, true, '', MultipleRequestWorker)
|
155
|
+
assert_equal 2, QBWC.jobs.length
|
156
|
+
session = QBWC::Session.new('foo', '')
|
157
|
+
|
158
|
+
# one request from SingleRequestWorker
|
159
|
+
assert_not_nil session.next_request
|
160
|
+
simulate_response(session)
|
161
|
+
|
162
|
+
# two requests from MultipleRequestWorker
|
163
|
+
assert_not_nil session.next_request
|
164
|
+
simulate_response(session)
|
165
|
+
assert_not_nil session.next_request
|
166
|
+
simulate_response(session)
|
167
|
+
assert_nil session.next_request
|
168
|
+
|
169
|
+
assert_equal 1, $SINGLE_REQUESTS_INVOKED_COUNT
|
170
|
+
assert_equal 1, $MULTIPLE_REQUESTS_INVOKED_COUNT
|
171
|
+
end
|
172
|
+
|
173
|
+
test 'multiple jobs using different request techniques' do
|
174
|
+
$MULTIPLE_REQUESTS_INVOKED_COUNT = 0
|
175
|
+
|
176
|
+
QBWC.add_job(:integration_test_1, true, '', SingleRequestWorker)
|
177
|
+
QBWC.add_job(:integration_test_2, true, '', MultipleRequestWorker, QBWC_CUSTOMER_ADD_RQ)
|
178
|
+
QBWC.jobs.each {|job| assert job.requests_provided_when_job_added == (job.name == 'integration_test_2')}
|
179
|
+
session = QBWC::Session.new('foo', '')
|
180
|
+
|
181
|
+
# one request from SingleRequestWorker
|
182
|
+
assert_not_nil session.next
|
183
|
+
simulate_response(session)
|
184
|
+
|
185
|
+
# Requests from MultipleRequestWorker are suppressed; instead use one request passed when job added
|
186
|
+
assert_not_nil session.next
|
187
|
+
simulate_response(session)
|
188
|
+
assert_nil session.next
|
189
|
+
|
190
|
+
assert_equal 0, $MULTIPLE_REQUESTS_INVOKED_COUNT
|
191
|
+
QBWC.jobs.each {|job| assert job.requests_provided_when_job_added == (job.name == 'integration_test_2')}
|
192
|
+
end
|
193
|
+
|
194
|
+
# https://github.com/skryl/qbwc/issues/58
|
195
|
+
test 'multiple jobs when first job has no requests' do
|
196
|
+
QBWC.add_job(:test_empty, true, '', QBWC::Worker, [])
|
197
|
+
QBWC.add_job(:test_income, true, '', QBWC::Worker, [{:account_query_rq => {:active_status => 'All', :account_type => 'Income'}}])
|
198
|
+
session = QBWC::Session.new('foo', '')
|
199
|
+
|
200
|
+
# No requests from :test_empty
|
201
|
+
|
202
|
+
# One request from :test_income
|
203
|
+
assert_not_nil session.next_request
|
204
|
+
simulate_response(session)
|
205
|
+
assert_nil session.next_request
|
206
|
+
end
|
207
|
+
|
208
|
+
class ShouldntRunWorker < QBWC::Worker
|
209
|
+
def requests(job)
|
210
|
+
[
|
211
|
+
{:customer_query_rq => {:full_name => 'Quincy Bob William Carlos'}},
|
212
|
+
{:customer_query_rq => {:full_name => 'Quentin Billy Wyatt Charles'}}
|
213
|
+
]
|
214
|
+
end
|
215
|
+
|
216
|
+
def should_run?(job)
|
217
|
+
false
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
test "shouldnt run worker" do
|
222
|
+
QBWC.add_job(:integration_test, true, '', ShouldntRunWorker)
|
223
|
+
session = QBWC::Session.new('foo', '')
|
224
|
+
assert_nil session.next_request
|
225
|
+
end
|
226
|
+
|
227
|
+
$VARIABLE_REQUEST_COUNT = 2
|
228
|
+
class VariableRequestWorker < QBWC::Worker
|
229
|
+
def requests(job)
|
230
|
+
r = []
|
231
|
+
$VARIABLE_REQUEST_COUNT.times do
|
232
|
+
r << {:customer_query_rq => {:full_name => 'Quincy Bob William Carlos'}}
|
233
|
+
end
|
234
|
+
return r
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
test "variable request worker" do
|
239
|
+
QBWC.add_job(:integration_test, true, '', VariableRequestWorker)
|
240
|
+
session = QBWC::Session.new('foo', '')
|
241
|
+
assert_not_nil session.next_request
|
242
|
+
simulate_response(session)
|
243
|
+
# The number of requests should be fixed after the job starts.
|
244
|
+
$VARIABLE_REQUEST_COUNT = 5
|
245
|
+
assert_not_nil session.next_request
|
246
|
+
simulate_response(session)
|
247
|
+
assert_nil session.next_request
|
248
|
+
end
|
249
|
+
|
250
|
+
class RequestsArgumentSuppressesRequestWorker < QBWC::Worker
|
251
|
+
def requests(job)
|
252
|
+
{:foo => 'bar'}
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
test "requests argument suppresses request worker" do
|
257
|
+
QBWC.add_job(:integration_test, true, '', RequestsArgumentSuppressesRequestWorker, QBWC_CUSTOMER_ADD_RQ)
|
258
|
+
QBWC.jobs.each {|job| assert job.requests_provided_when_job_added == true}
|
259
|
+
session = QBWC::Session.new('foo', '')
|
260
|
+
request = session.next_request
|
261
|
+
assert_not_nil request
|
262
|
+
assert_match /CustomerAddRq.*\/CustomerAddRq/m, request.request
|
263
|
+
simulate_response(session)
|
264
|
+
assert_nil session.next_request
|
265
|
+
|
266
|
+
assert_match /CustomerAddRq.*\/CustomerAddRq/m, QBWC::ActiveRecord::Job::QbwcJob.first[:requests][0]
|
267
|
+
QBWC.jobs.each {|job| assert job.requests_provided_when_job_added == true}
|
268
|
+
end
|
269
|
+
|
270
|
+
class RequestsArgumentOverridesRequestWorker < QBWC::Worker
|
271
|
+
def requests(job)
|
272
|
+
nil
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
class SimulatedUserModel
|
277
|
+
attr_accessor :name
|
278
|
+
end
|
279
|
+
|
280
|
+
class RequestsArgumentEstablishesRequestEarlyWorker < QBWC::Worker
|
281
|
+
def requests(job)
|
282
|
+
nil
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
test "requests argument establishes request early" do
|
287
|
+
usr = SimulatedUserModel.new
|
288
|
+
usr.name = QBWC_USERNAME
|
289
|
+
|
290
|
+
QBWC.add_job(:integration_test, true, '', RequestsArgumentEstablishesRequestEarlyWorker, {:customer_query_rq => {:full_name => QBWC_USERNAME}})
|
291
|
+
QBWC.jobs.each {|job| assert job.requests_provided_when_job_added == true}
|
292
|
+
usr.name = 'bleech'
|
293
|
+
|
294
|
+
session = QBWC::Session.new('foo', '')
|
295
|
+
request = session.next_request
|
296
|
+
assert_match /FullName.#{QBWC_USERNAME}.\/FullName/, request.request
|
297
|
+
|
298
|
+
assert_equal [{:customer_query_rq => {:full_name => QBWC_USERNAME}}], QBWC::ActiveRecord::Job::QbwcJob.first[:requests]
|
299
|
+
QBWC.jobs.each {|job| assert job.requests_provided_when_job_added == true}
|
300
|
+
end
|
301
|
+
|
302
|
+
class RequestsArgumentReturnsMultipleRequestsWorker < QBWC::Worker
|
303
|
+
def requests(job)
|
304
|
+
nil
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
test "requests argument returns multiple requests" do
|
309
|
+
usr1 = SimulatedUserModel.new
|
310
|
+
usr1.name = QBWC_USERNAME
|
311
|
+
|
312
|
+
usr2 = SimulatedUserModel.new
|
313
|
+
usr2.name = 'usr2 name'
|
314
|
+
|
315
|
+
multiple_requests = [
|
316
|
+
{:customer_query_rq => {:full_name => usr1.name}},
|
317
|
+
{:customer_query_rq => {:full_name => usr2.name}}
|
318
|
+
]
|
319
|
+
QBWC.add_job(:integration_test, true, '', RequestsArgumentEstablishesRequestEarlyWorker, multiple_requests)
|
320
|
+
QBWC.jobs.each {|job| assert job.requests_provided_when_job_added == true}
|
321
|
+
usr1.name = 'bleech'
|
322
|
+
usr2.name = 'bleech'
|
323
|
+
|
324
|
+
session = QBWC::Session.new('foo', '')
|
325
|
+
request1 = session.next_request
|
326
|
+
assert_match /FullName.#{QBWC_USERNAME}.\/FullName/, request1.request
|
327
|
+
simulate_response(session)
|
328
|
+
|
329
|
+
request2 = session.next_request
|
330
|
+
assert_match /FullName.usr2 name.\/FullName/, request2.request
|
331
|
+
simulate_response(session)
|
332
|
+
|
333
|
+
assert_nil session.next_request
|
334
|
+
|
335
|
+
assert_equal multiple_requests[0], QBWC::ActiveRecord::Job::QbwcJob.first[:requests][0]
|
336
|
+
assert_equal multiple_requests[1], QBWC::ActiveRecord::Job::QbwcJob.first[:requests][1]
|
337
|
+
QBWC.jobs.each {|job| assert job.requests_provided_when_job_added == true}
|
338
|
+
end
|
339
|
+
|
340
|
+
end
|