qbwc 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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