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.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -1
  3. data/.travis.yml +6 -0
  4. data/README.md +152 -144
  5. data/Rakefile +7 -1
  6. data/lib/generators/qbwc/install/install_generator.rb +20 -4
  7. data/lib/generators/qbwc/install/templates/config/qbwc.rb +42 -26
  8. data/lib/generators/qbwc/install/templates/controllers/qbwc_controller.rb +2 -38
  9. data/lib/generators/qbwc/install/templates/db/migrate/create_qbwc_jobs.rb +15 -0
  10. data/lib/generators/qbwc/install/templates/db/migrate/create_qbwc_sessions.rb +16 -0
  11. data/lib/qbwc.rb +107 -71
  12. data/lib/qbwc/active_record.rb +6 -0
  13. data/lib/qbwc/active_record/job.rb +111 -0
  14. data/lib/qbwc/active_record/session.rb +52 -0
  15. data/lib/qbwc/controller.rb +176 -0
  16. data/lib/qbwc/job.rb +81 -18
  17. data/lib/qbwc/railtie.rb +8 -0
  18. data/lib/qbwc/request.rb +14 -23
  19. data/lib/qbwc/session.rb +100 -72
  20. data/lib/qbwc/version.rb +1 -1
  21. data/lib/qbwc/worker.rb +16 -0
  22. data/qbwc.gemspec +11 -5
  23. data/test/qbwc/controllers/controller_test.rb +157 -0
  24. data/test/qbwc/integration/job_management_test.rb +86 -0
  25. data/test/qbwc/integration/request_generation_test.rb +340 -0
  26. data/test/qbwc/integration/response_test.rb +303 -0
  27. data/test/qbwc/integration/routes_test.rb +38 -0
  28. data/test/qbwc/integration/session_test.rb +94 -0
  29. data/test/test_helper.rb +248 -0
  30. data/test/wash_out_helper.rb +76 -0
  31. metadata +133 -55
  32. data/Gemfile.lock +0 -72
  33. data/lib/qbwc/soap_wrapper.rb +0 -35
  34. data/lib/qbwc/soap_wrapper/QBWebConnectorSvc.rb +0 -69
  35. data/lib/qbwc/soap_wrapper/QBWebConnectorSvc.wsdl +0 -312
  36. data/lib/qbwc/soap_wrapper/default.rb +0 -198
  37. data/lib/qbwc/soap_wrapper/defaultMappingRegistry.rb +0 -163
  38. data/lib/qbwc/soap_wrapper/defaultServant.rb +0 -133
  39. data/spec/spec_helper.rb +0 -17
@@ -1,3 +1,3 @@
1
1
  module QBWC
2
- VERSION = "0.0.5"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -0,0 +1,16 @@
1
+ module QBWC
2
+ class Worker
3
+
4
+ def requests(job)
5
+ []
6
+ end
7
+
8
+ def should_run?(job)
9
+ true
10
+ end
11
+
12
+ def handle_response(response, session, job, request, data)
13
+ end
14
+
15
+ end
16
+ end
@@ -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 "quickbooks_api", [">= 0.1.6"]
26
- s.add_dependency "rubyjedi-soap4r", [">= 1.5.8.20100619003610"]
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