qbwc 0.0.5 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|