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
@@ -0,0 +1,303 @@
|
|
1
|
+
$:<< File.expand_path(File.dirname(__FILE__) + '/../..')
|
2
|
+
require 'test_helper.rb'
|
3
|
+
|
4
|
+
class ResponseTest < ActionDispatch::IntegrationTest
|
5
|
+
|
6
|
+
WARN_RESPONSE = {
|
7
|
+
:response => QBWC_CUSTOMER_QUERY_RESPONSE_WARN,
|
8
|
+
:code => '500',
|
9
|
+
:severity => 'Warn',
|
10
|
+
:message => QBWC_CUSTOMER_QUERY_STATUS_MESSAGE_WARN,
|
11
|
+
}
|
12
|
+
ERROR_RESPONSE = {
|
13
|
+
:response => QBWC_CUSTOMER_QUERY_RESPONSE_ERROR,
|
14
|
+
:code => '3120',
|
15
|
+
:severity => 'Error',
|
16
|
+
:message => QBWC_CUSTOMER_QUERY_STATUS_MESSAGE_ERROR,
|
17
|
+
}
|
18
|
+
|
19
|
+
def setup
|
20
|
+
ResponseTest.app = Rails.application
|
21
|
+
QBWC.on_error = :stop
|
22
|
+
QBWC.clear_jobs
|
23
|
+
|
24
|
+
$HANDLE_RESPONSE_EXECUTED = false
|
25
|
+
$HANDLE_RESPONSE_DATA = nil
|
26
|
+
$HANDLE_RESPONSE_IS_PASSED_DATA = false
|
27
|
+
end
|
28
|
+
|
29
|
+
def _receive_responses(*responses)
|
30
|
+
|
31
|
+
# Simulate controller authenticate
|
32
|
+
ticket_string = QBWC::ActiveRecord::Session.new(QBWC_USERNAME, COMPANY).ticket
|
33
|
+
session = QBWC::Session.new(nil, COMPANY)
|
34
|
+
|
35
|
+
responses.each do |resp|
|
36
|
+
expect_error = "QBWC #{resp[:severity].upcase}: #{resp[:code]} - #{resp[:message]}"
|
37
|
+
|
38
|
+
# Simulate controller receive_response
|
39
|
+
$HANDLE_RESPONSE_EXECUTED = false
|
40
|
+
session.response = resp[:response]
|
41
|
+
assert_equal resp[:progress], session.progress unless resp[:progress].nil?
|
42
|
+
assert_equal resp[:code], session.status_code
|
43
|
+
assert_equal resp[:severity], session.status_severity
|
44
|
+
assert_equal expect_error, session.error
|
45
|
+
assert $HANDLE_RESPONSE_EXECUTED
|
46
|
+
|
47
|
+
# Simulate controller send_request
|
48
|
+
if session.progress == 100
|
49
|
+
assert_nil(session.next_request)
|
50
|
+
return
|
51
|
+
end
|
52
|
+
|
53
|
+
assert_not_nil(session.next_request)
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
def _test_warning_then_error(expected_progress1 = 50)
|
59
|
+
warn = WARN_RESPONSE.merge(:progress => expected_progress1)
|
60
|
+
error = ERROR_RESPONSE.merge(:progress => 100)
|
61
|
+
|
62
|
+
_receive_responses(warn, error)
|
63
|
+
end
|
64
|
+
|
65
|
+
def _test_error_then_warning(expected_progress1 = 50)
|
66
|
+
error = ERROR_RESPONSE.merge(:progress => expected_progress1)
|
67
|
+
warn = WARN_RESPONSE.merge(:progress => 100)
|
68
|
+
|
69
|
+
_receive_responses(error, warn)
|
70
|
+
end
|
71
|
+
|
72
|
+
def _test_error_then_warning_that_stops
|
73
|
+
_test_error_then_warning(100)
|
74
|
+
end
|
75
|
+
|
76
|
+
class HandleResponseWithDataWorker < QBWC::Worker
|
77
|
+
def requests(job)
|
78
|
+
{:customer_query_rq => {:full_name => 'Quincy Bob William Carlos'}}
|
79
|
+
end
|
80
|
+
def handle_response(response, session, job, request, data)
|
81
|
+
$HANDLE_RESPONSE_EXECUTED = true
|
82
|
+
$HANDLE_RESPONSE_IS_PASSED_DATA = (data == $HANDLE_RESPONSE_DATA)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
test "handle_response is passed data" do
|
87
|
+
$HANDLE_RESPONSE_DATA = {:first => {:second => 2, :third => '3'} }
|
88
|
+
$HANDLE_RESPONSE_IS_PASSED_DATA = false
|
89
|
+
QBWC.add_job(:integration_test, true, '', HandleResponseWithDataWorker, nil, $HANDLE_RESPONSE_DATA)
|
90
|
+
session = QBWC::Session.new('foo', '')
|
91
|
+
assert_not_nil session.next_request
|
92
|
+
simulate_response(session, QBWC_CUSTOMER_ADD_RESPONSE_LONG)
|
93
|
+
assert_nil session.next_request
|
94
|
+
assert $HANDLE_RESPONSE_IS_PASSED_DATA
|
95
|
+
end
|
96
|
+
|
97
|
+
class HandleResponseRaisesExceptionWorker < QBWC::Worker
|
98
|
+
def requests(job)
|
99
|
+
{:customer_query_rq => {:full_name => 'Quincy Bob William Carlos'}}
|
100
|
+
end
|
101
|
+
def handle_response(response, session, job, request, data)
|
102
|
+
raise "Exception in handle_response"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
test "handle_response raises exception" do
|
107
|
+
QBWC.add_job(:integration_test, true, '', HandleResponseRaisesExceptionWorker)
|
108
|
+
session = QBWC::Session.new('foo', '')
|
109
|
+
assert_not_nil session.next_request
|
110
|
+
simulate_response(session)
|
111
|
+
assert_nil session.next_request
|
112
|
+
assert_equal "Exception in handle_response", session.error
|
113
|
+
end
|
114
|
+
|
115
|
+
class HandleResponseOmitsJobWorker < QBWC::Worker
|
116
|
+
def requests(job)
|
117
|
+
{:customer_query_rq => {:full_name => 'Quincy Bob William Carlos'}}
|
118
|
+
end
|
119
|
+
def handle_response(*response)
|
120
|
+
$HANDLE_RESPONSE_EXECUTED = true
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
test "handle_response must use splat operator when omitting remaining arguments" do
|
125
|
+
QBWC.add_job(:integration_test, true, '', HandleResponseOmitsJobWorker)
|
126
|
+
session = QBWC::Session.new('foo', '')
|
127
|
+
assert_not_nil session.next_request
|
128
|
+
simulate_response(session)
|
129
|
+
assert_nil session.next_request
|
130
|
+
assert $HANDLE_RESPONSE_EXECUTED
|
131
|
+
end
|
132
|
+
|
133
|
+
class QueryAndDeleteWorker < QBWC::Worker
|
134
|
+
def requests(job)
|
135
|
+
{:name => 'mrjoecustomer'}
|
136
|
+
end
|
137
|
+
|
138
|
+
def handle_response(resp, session, job, request, data)
|
139
|
+
QBWC.delete_job(job.name)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
test "processes warning responses and deletes the job" do
|
144
|
+
QBWC.on_error = :stop
|
145
|
+
|
146
|
+
# Add a job
|
147
|
+
QBWC.add_job(:query_joe_customer, true, COMPANY, QueryAndDeleteWorker)
|
148
|
+
|
149
|
+
# Simulate controller authenticate
|
150
|
+
ticket_string = QBWC::ActiveRecord::Session.new(QBWC_USERNAME, COMPANY).ticket
|
151
|
+
session = QBWC::Session.new(nil, COMPANY)
|
152
|
+
|
153
|
+
# Simulate controller receive_response
|
154
|
+
session.response = QBWC_CUSTOMER_QUERY_RESPONSE_WARN
|
155
|
+
assert_equal 100, session.progress
|
156
|
+
|
157
|
+
# Simulate controller send_request
|
158
|
+
assert_nil session.next_request
|
159
|
+
|
160
|
+
# Simulate arbitrary controller action
|
161
|
+
session = QBWC::ActiveRecord::Session.get(ticket_string) # simulated get_session
|
162
|
+
session.save # simulated save_session
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
test "processes error responses and deletes the job" do
|
167
|
+
QBWC.on_error = :stop
|
168
|
+
|
169
|
+
# Add a job
|
170
|
+
QBWC.add_job(:query_joe_customer, true, COMPANY, QueryAndDeleteWorker)
|
171
|
+
|
172
|
+
# Simulate controller authenticate
|
173
|
+
ticket_string = QBWC::ActiveRecord::Session.new(QBWC_USERNAME, COMPANY).ticket
|
174
|
+
session = QBWC::Session.new(nil, COMPANY)
|
175
|
+
|
176
|
+
# Simulate controller receive_response
|
177
|
+
session.response = QBWC_CUSTOMER_QUERY_RESPONSE_ERROR
|
178
|
+
assert_equal 100, session.progress
|
179
|
+
|
180
|
+
# Simulate controller send_request
|
181
|
+
assert_nil session.next_request
|
182
|
+
|
183
|
+
# Simulate controller get_last_error
|
184
|
+
session = QBWC::ActiveRecord::Session.get(ticket_string) # simulated get_session
|
185
|
+
session.save # simulated save_session
|
186
|
+
|
187
|
+
end
|
188
|
+
|
189
|
+
test "processes warning response stop" do
|
190
|
+
QBWC.on_error = :stop
|
191
|
+
QBWC.add_job(:query_joe_customer, true, COMPANY, HandleResponseWithDataWorker)
|
192
|
+
_receive_responses(WARN_RESPONSE.merge(:progress => 100))
|
193
|
+
end
|
194
|
+
|
195
|
+
test "processes warning response continue" do
|
196
|
+
QBWC.on_error = :continue
|
197
|
+
QBWC.add_job(:query_joe_customer, true, COMPANY, HandleResponseWithDataWorker)
|
198
|
+
_receive_responses(WARN_RESPONSE.merge(:progress => 100))
|
199
|
+
end
|
200
|
+
|
201
|
+
test "processes error response stop" do
|
202
|
+
QBWC.on_error = :stop
|
203
|
+
QBWC.add_job(:query_joe_customer, true, COMPANY, HandleResponseWithDataWorker)
|
204
|
+
_receive_responses(ERROR_RESPONSE.merge(:progress => 100))
|
205
|
+
end
|
206
|
+
|
207
|
+
test "processes error response continue" do
|
208
|
+
QBWC.on_error = :continue
|
209
|
+
QBWC.add_job(:query_joe_customer, true, COMPANY, HandleResponseWithDataWorker)
|
210
|
+
_receive_responses(ERROR_RESPONSE.merge(:progress => 100))
|
211
|
+
end
|
212
|
+
|
213
|
+
class MultiRequestWorker < QBWC::Worker
|
214
|
+
def requests(job)
|
215
|
+
[
|
216
|
+
{:customer_query_rq => {:full_name => 'First Request'}},
|
217
|
+
{:customer_query_rq => {:full_name => 'Second Request'}},
|
218
|
+
]
|
219
|
+
end
|
220
|
+
def handle_response(resp, session, job, request, data)
|
221
|
+
$HANDLE_RESPONSE_EXECUTED = true
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
test "processes warning then error stop 2jobs" do
|
226
|
+
QBWC.on_error = :stop
|
227
|
+
QBWC.add_job(:query_joe_customer, true, COMPANY, HandleResponseWithDataWorker)
|
228
|
+
QBWC.add_job(:query_joe_customer_again, true, COMPANY, HandleResponseWithDataWorker)
|
229
|
+
|
230
|
+
_test_warning_then_error
|
231
|
+
end
|
232
|
+
|
233
|
+
test "processes warning then error continue 2jobs" do
|
234
|
+
QBWC.on_error = :continue
|
235
|
+
QBWC.add_job(:query_joe_customer, true, COMPANY, HandleResponseWithDataWorker)
|
236
|
+
QBWC.add_job(:query_joe_customer_again, true, COMPANY, HandleResponseWithDataWorker)
|
237
|
+
|
238
|
+
_test_warning_then_error
|
239
|
+
end
|
240
|
+
|
241
|
+
test "processes warning then error stop 2requests byworker" do
|
242
|
+
QBWC.on_error = :stop
|
243
|
+
QBWC.add_job(:multiple_request_job, true, COMPANY, MultiRequestWorker)
|
244
|
+
_test_warning_then_error(0)
|
245
|
+
end
|
246
|
+
|
247
|
+
test "processes warning then error continue 2requests byworker" do
|
248
|
+
QBWC.on_error = :continue
|
249
|
+
QBWC.add_job(:multiple_request_job, true, COMPANY, MultiRequestWorker)
|
250
|
+
_test_warning_then_error(0)
|
251
|
+
end
|
252
|
+
|
253
|
+
test "processes warning then error stop 2requests byargument" do
|
254
|
+
QBWC.on_error = :stop
|
255
|
+
QBWC.add_job(:multiple_request_job, true, COMPANY, HandleResponseWithDataWorker, [QBWC_CUSTOMER_QUERY_RQ, QBWC_CUSTOMER_QUERY_RQ])
|
256
|
+
_test_warning_then_error(0)
|
257
|
+
end
|
258
|
+
|
259
|
+
test "processes warning then error continue 2requests byargument" do
|
260
|
+
QBWC.on_error = :continue
|
261
|
+
QBWC.add_job(:multiple_request_job, true, COMPANY, HandleResponseWithDataWorker, [QBWC_CUSTOMER_QUERY_RQ, QBWC_CUSTOMER_QUERY_RQ])
|
262
|
+
_test_warning_then_error(0)
|
263
|
+
end
|
264
|
+
|
265
|
+
test "processes error then warning stop 2jobs" do
|
266
|
+
QBWC.on_error = :stop
|
267
|
+
QBWC.add_job(:query_joe_customer, true, COMPANY, HandleResponseWithDataWorker)
|
268
|
+
QBWC.add_job(:query_joe_customer_again, true, COMPANY, HandleResponseWithDataWorker)
|
269
|
+
_test_error_then_warning_that_stops
|
270
|
+
end
|
271
|
+
|
272
|
+
test "processes error then warning continue 2jobs" do
|
273
|
+
QBWC.on_error = :continue
|
274
|
+
QBWC.add_job(:query_joe_customer, true, COMPANY, HandleResponseWithDataWorker)
|
275
|
+
QBWC.add_job(:query_joe_customer_again, true, COMPANY, HandleResponseWithDataWorker)
|
276
|
+
_test_error_then_warning
|
277
|
+
end
|
278
|
+
|
279
|
+
test "processes error then warning stop 2requests byworker" do
|
280
|
+
QBWC.on_error = :stop
|
281
|
+
QBWC.add_job(:multiple_request_job, true, COMPANY, MultiRequestWorker)
|
282
|
+
_test_error_then_warning_that_stops
|
283
|
+
end
|
284
|
+
|
285
|
+
test "processes error then warning continue 2requests byworker" do
|
286
|
+
QBWC.on_error = :continue
|
287
|
+
QBWC.add_job(:multiple_request_job, true, COMPANY, MultiRequestWorker)
|
288
|
+
_test_error_then_warning(0)
|
289
|
+
end
|
290
|
+
|
291
|
+
test "processes error then warning stop 2requests byargument" do
|
292
|
+
QBWC.on_error = :stop
|
293
|
+
QBWC.add_job(:multiple_request_job, true, COMPANY, HandleResponseWithDataWorker, [QBWC_CUSTOMER_QUERY_RQ, QBWC_CUSTOMER_QUERY_RQ])
|
294
|
+
_test_error_then_warning_that_stops
|
295
|
+
end
|
296
|
+
|
297
|
+
test "processes error then warning continue 2requests byargument" do
|
298
|
+
QBWC.on_error = :continue
|
299
|
+
QBWC.add_job(:multiple_request_job, true, COMPANY, HandleResponseWithDataWorker, [QBWC_CUSTOMER_QUERY_RQ, QBWC_CUSTOMER_QUERY_RQ])
|
300
|
+
_test_error_then_warning(0)
|
301
|
+
end
|
302
|
+
|
303
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
$:<< File.expand_path(File.dirname(__FILE__) + '/../..')
|
2
|
+
require 'test_helper.rb'
|
3
|
+
|
4
|
+
class RoutesTest < ActionDispatch::IntegrationTest
|
5
|
+
|
6
|
+
def setup
|
7
|
+
RoutesTest.app = Rails.application
|
8
|
+
|
9
|
+
# Initialize sets view paths
|
10
|
+
RoutesTest.app.initialize! unless RoutesTest.app.initialized?
|
11
|
+
|
12
|
+
# Assign routes
|
13
|
+
QbwcTestApplication::Application.routes.draw do
|
14
|
+
_assign_routes
|
15
|
+
end
|
16
|
+
|
17
|
+
QBWC.clear_jobs
|
18
|
+
end
|
19
|
+
|
20
|
+
test "qwc" do
|
21
|
+
#_inspect_routes
|
22
|
+
get '/qbwc/qwc'
|
23
|
+
|
24
|
+
assert_match /QBWCXML/, @response.body
|
25
|
+
assert_match Regexp.new("AppName.*QbwcTestApplication #{Rails.env}.*AppName"), @response.body
|
26
|
+
assert_match /AppURL.*http:\/\/www.example.com\/qbwc\/action.*AppURL/, @response.body
|
27
|
+
assert_match /AppDescription.*Quickbooks integration.*AppDescription/, @response.body
|
28
|
+
assert_match /AppSupport.*https:\/\/www.example.com\/.*AppSupport/, @response.body
|
29
|
+
assert_match /UserName.*#{QBWC_USERNAME}.*UserName/, @response.body
|
30
|
+
end
|
31
|
+
|
32
|
+
test "qbwc/action without soap returns successfully" do
|
33
|
+
#_inspect_routes
|
34
|
+
get '/qbwc/action'
|
35
|
+
assert_response :success
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
$:<< File.expand_path(File.dirname(__FILE__) + '/../..')
|
2
|
+
require 'test_helper.rb'
|
3
|
+
|
4
|
+
class SessionTest < ActionDispatch::IntegrationTest
|
5
|
+
|
6
|
+
def setup
|
7
|
+
SessionTest.app = Rails.application
|
8
|
+
QBWC.clear_jobs
|
9
|
+
end
|
10
|
+
|
11
|
+
class ProgressTestWorker < QBWC::Worker
|
12
|
+
def requests(job)
|
13
|
+
{:customer_query_rq => {:full_name => 'Quincy Bob William Carlos'}}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
test "progress increments when worker determines requests" do
|
18
|
+
|
19
|
+
# Add two jobs
|
20
|
+
QBWC.add_job(:session_test_1, true, COMPANY, ProgressTestWorker)
|
21
|
+
QBWC.add_job(:session_test_2, true, COMPANY, ProgressTestWorker)
|
22
|
+
|
23
|
+
assert_equal 2, QBWC.jobs.count
|
24
|
+
assert_equal 2, QBWC.pending_jobs(COMPANY).count
|
25
|
+
|
26
|
+
session = QBWC::Session.new(nil, COMPANY)
|
27
|
+
|
28
|
+
# Simulate controller 1st send_request and receive_response
|
29
|
+
request = session.current_request
|
30
|
+
session.response = QBWC_CUSTOMER_QUERY_RESPONSE_INFO
|
31
|
+
assert_equal 50, session.progress
|
32
|
+
|
33
|
+
# Simulate controller 2nd send_request and receive_response
|
34
|
+
request = session.current_request
|
35
|
+
session.response = QBWC_CUSTOMER_QUERY_RESPONSE_INFO
|
36
|
+
assert_equal 100, session.progress
|
37
|
+
end
|
38
|
+
|
39
|
+
test "progress increments when passing requests" do
|
40
|
+
|
41
|
+
# Add two jobs
|
42
|
+
QBWC.add_job(:session_test_1, true, COMPANY, QBWC::Worker, QBWC_CUSTOMER_ADD_RQ)
|
43
|
+
QBWC.add_job(:session_test_2, true, COMPANY, QBWC::Worker, QBWC_CUSTOMER_QUERY_RQ)
|
44
|
+
|
45
|
+
assert_equal 2, QBWC.jobs.count
|
46
|
+
assert_equal 2, QBWC.pending_jobs(COMPANY).count
|
47
|
+
|
48
|
+
session = QBWC::Session.new(nil, COMPANY)
|
49
|
+
|
50
|
+
# Simulate controller 1st send_request and receive_response
|
51
|
+
request = session.current_request
|
52
|
+
session.response = QBWC_CUSTOMER_ADD_RESPONSE_LONG
|
53
|
+
assert_equal 50, session.progress
|
54
|
+
|
55
|
+
# Simulate controller 2nd send_request and receive_response
|
56
|
+
request = session.current_request
|
57
|
+
session.response = QBWC_CUSTOMER_QUERY_RESPONSE_INFO
|
58
|
+
assert_equal 100, session.progress
|
59
|
+
end
|
60
|
+
|
61
|
+
test "sends request only once when passing requests to add_job" do
|
62
|
+
|
63
|
+
# Add a job and pass a request
|
64
|
+
QBWC.add_job(:add_joe_customer, true, COMPANY, QBWC::Worker, QBWC_CUSTOMER_ADD_RQ_LONG)
|
65
|
+
|
66
|
+
assert_equal 1, QBWC.jobs.count
|
67
|
+
assert_equal 1, QBWC.pending_jobs(COMPANY).count
|
68
|
+
|
69
|
+
# Omit these controller calls that normally occur during a QuickBooks Web Connector session:
|
70
|
+
# - server_version
|
71
|
+
# - client_version
|
72
|
+
# - authenticate
|
73
|
+
# - send_request
|
74
|
+
|
75
|
+
# Simulate controller receive_response
|
76
|
+
session = QBWC::Session.new(nil, COMPANY)
|
77
|
+
session.response = QBWC_CUSTOMER_ADD_RESPONSE_LONG
|
78
|
+
|
79
|
+
assert_equal 100, session.progress
|
80
|
+
end
|
81
|
+
|
82
|
+
test "request_to_send when no requests" do
|
83
|
+
|
84
|
+
QBWC.add_job(:add_joe_customer, true, COMPANY, QBWC::Worker, [])
|
85
|
+
|
86
|
+
assert_equal 1, QBWC.jobs.count
|
87
|
+
assert_equal 1, QBWC.pending_jobs(COMPANY).count
|
88
|
+
|
89
|
+
# Simulate controller send_request
|
90
|
+
session = QBWC::Session.new(nil, COMPANY)
|
91
|
+
request = session.request_to_send
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,248 @@
|
|
1
|
+
# http://stackoverflow.com/a/4402193
|
2
|
+
require 'bundler/setup'
|
3
|
+
Bundler.setup
|
4
|
+
|
5
|
+
require 'minitest/autorun'
|
6
|
+
|
7
|
+
require 'active_support'
|
8
|
+
require 'active_record'
|
9
|
+
require 'action_controller'
|
10
|
+
require 'rails'
|
11
|
+
|
12
|
+
$:<< File.expand_path(File.dirname(__FILE__) + '/../lib')
|
13
|
+
require 'qbwc'
|
14
|
+
require 'qbwc/controller'
|
15
|
+
require 'qbwc/active_record'
|
16
|
+
|
17
|
+
COMPANY = 'c:\\QuickBooks\MyFile.QBW'
|
18
|
+
QBWC_USERNAME = 'myUserName'
|
19
|
+
QBWC_PASSWORD = 'myPassword'
|
20
|
+
QBWC.api = :qb
|
21
|
+
|
22
|
+
ActiveSupport::TestCase.test_order = :random if defined? ActiveSupport::TestCase.test_order=()
|
23
|
+
|
24
|
+
#-------------------------------------------
|
25
|
+
# http://coryforsyth.com/2013/06/02/programmatically-list-routespaths-from-inside-your-rails-app/
|
26
|
+
def _inspect_routes
|
27
|
+
puts "\nRoutes:"
|
28
|
+
Rails.application.routes.routes.each do |route|
|
29
|
+
puts " Name #{route.name}: \t #{route.verb.source.gsub(/[$^]/, '')} #{route.path.spec.to_s}"
|
30
|
+
end
|
31
|
+
puts "\n"
|
32
|
+
end
|
33
|
+
|
34
|
+
#-------------------------------------------
|
35
|
+
# Stub Rails application
|
36
|
+
module QbwcTestApplication
|
37
|
+
class Application < Rails::Application
|
38
|
+
Rails.application.configure do
|
39
|
+
config.secret_key_base = "stub"
|
40
|
+
config.eager_load = false
|
41
|
+
end
|
42
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
43
|
+
require '../qbwc/lib/generators/qbwc/install/templates/db/migrate/create_qbwc_jobs'
|
44
|
+
require '../qbwc/lib/generators/qbwc/install/templates/db/migrate/create_qbwc_sessions'
|
45
|
+
ActiveRecord::Migration.run(CreateQbwcJobs)
|
46
|
+
ActiveRecord::Migration.run(CreateQbwcSessions)
|
47
|
+
QBWC.configure do |c|
|
48
|
+
c.username = QBWC_USERNAME
|
49
|
+
c.password = QBWC_PASSWORD
|
50
|
+
c.company_file_path = COMPANY
|
51
|
+
c.session_initializer = Proc.new{|session| $CONFIG_SESSION_INITIALIZER_PROC_EXECUTED = true }
|
52
|
+
end
|
53
|
+
|
54
|
+
# Logger
|
55
|
+
Rails.logger = Logger.new('/dev/null') # or STDOUT
|
56
|
+
QBWC.logger = Rails.logger
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
def _assign_routes
|
62
|
+
|
63
|
+
# Manually stub these generated routes:
|
64
|
+
# GET /qbwc/action(.:format) qbwc#_generate_wsdl
|
65
|
+
# qbwc_qwc GET /qbwc/qwc(.:format) qbwc#qwc
|
66
|
+
get 'qbwc/action' => 'qbwc#_generate_wsdl'
|
67
|
+
get 'qbwc/qwc' => 'qbwc#qwc', :as => :qbwc_qwc
|
68
|
+
|
69
|
+
# Add these routes:
|
70
|
+
# qbwc_wsdl GET /qbwc/wsdl qbwc#_generate_wsdl
|
71
|
+
# qbwc_action GET|POST /qbwc/action #<WashOut::Router:0x00000005cf46d0 @controller_name="QbwcController">
|
72
|
+
wash_out :qbwc
|
73
|
+
|
74
|
+
# Route needed for test_qwc
|
75
|
+
get 'qbwc/action' => 'qbwc#action'
|
76
|
+
|
77
|
+
get 'qbwc/authenticate' => 'qbwc#authenticate'
|
78
|
+
|
79
|
+
# Stub a root route
|
80
|
+
root :to => "qbwc#qwc"
|
81
|
+
end
|
82
|
+
|
83
|
+
QbwcTestApplication::Application.routes.draw do
|
84
|
+
_assign_routes
|
85
|
+
end
|
86
|
+
|
87
|
+
class QbwcController < ActionController::Base
|
88
|
+
include Rails.application.routes.url_helpers
|
89
|
+
include QBWC::Controller
|
90
|
+
end
|
91
|
+
|
92
|
+
QBWC_EMPTY_RESPONSE = "<?xml version=\"1.0\"?>\r
|
93
|
+
<?qbxml version=\"7.0\"?>\r
|
94
|
+
<QBXML>\r
|
95
|
+
<QBXMLMsgsRs onError=\"stopOnError\">\r
|
96
|
+
</QBXMLMsgsRs>\r
|
97
|
+
</QBXML>\r"
|
98
|
+
|
99
|
+
QBWC_CUSTOMER_ADD_RQ = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r
|
100
|
+
<?qbxml version=\"7.0\"?>\r
|
101
|
+
<QBXML>\r
|
102
|
+
<QBXMLMsgsRq onError = \"stopOnError\">\r
|
103
|
+
<CustomerAddRq>\r
|
104
|
+
<CustomerAdd>\r
|
105
|
+
<Name>#{QBWC_USERNAME}</Name>\r
|
106
|
+
</CustomerAdd>\r
|
107
|
+
</CustomerAddRq>\r
|
108
|
+
</QBXMLMsgsRq>\r
|
109
|
+
</QBXML>\r"
|
110
|
+
|
111
|
+
QBWC_CUSTOMER_ADD_RQ_LONG = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r
|
112
|
+
<?qbxml version=\"7.0\"?>\r
|
113
|
+
<QBXML>\r
|
114
|
+
<QBXMLMsgsRq onError = \"stopOnError\">\r
|
115
|
+
<CustomerAddRq>\r
|
116
|
+
<CustomerAdd>\r
|
117
|
+
<Name>mrjoecustomer</Name>\r
|
118
|
+
<IsActive>1</IsActive>\r
|
119
|
+
<CompanyName>Joes Garage</CompanyName>\r
|
120
|
+
<Salutation>Mr</Salutation>\r
|
121
|
+
<FirstName>Joe</FirstName>\r
|
122
|
+
<LastName>Customer</LastName>\r
|
123
|
+
<BillAddress>\r
|
124
|
+
<Addr1>123 Main St.</Addr1>\r
|
125
|
+
<City>Mountain View</City>\r
|
126
|
+
<State>CA</State>\r
|
127
|
+
<PostalCode>94566</PostalCode>\r
|
128
|
+
</BillAddress>\r
|
129
|
+
<Email>joecustomer@gmail.com</Email>\r
|
130
|
+
<AccountNumber>89087</AccountNumber>\r
|
131
|
+
<CreditLimit>2000.00</CreditLimit>\r
|
132
|
+
</CustomerAdd>\r
|
133
|
+
</CustomerAddRq>\r
|
134
|
+
</QBXMLMsgsRq>\r
|
135
|
+
</QBXML>\r"
|
136
|
+
|
137
|
+
QBWC_CUSTOMER_ADD_RESPONSE_LONG = "<?xml version=\"1.0\" ?><QBXML><QBXMLMsgsRs><CustomerAddRs statusCode=\"0\" statusSeverity=\"Info\" statusMessage=\"Status OK\"><CustomerRet><ListID>8000001B-1405768916</ListID><TimeCreated>2014-07-19T07:21:56-05:00</TimeCreated><TimeModified>2014-07-19T07:21:56-05:00</TimeModified><EditSequence>1405768916</EditSequence><Name>mrjoecustomer</Name><FullName>Joseph Customer</FullName><IsActive>true</IsActive><Sublevel>0</Sublevel><CompanyName>Joes Garage</CompanyName><Salutation>Mr</Salutation><FirstName>Joe</FirstName><LastName>Customer</LastName><BillAddress><Addr1>123 Main St.</Addr1><City>Mountain View</City><State>CA</State><PostalCode>94566</PostalCode></BillAddress><Email>joecustomer@gmail.com</Email><Balance>0.00</Balance><TotalBalance>0.00</TotalBalance><AccountNumber>89087</AccountNumber><CreditLimit>2000.00</CreditLimit><JobStatus>None</JobStatus></CustomerRet></CustomerAddRs></QBXMLMsgsRs></QBXML>"
|
138
|
+
|
139
|
+
QBWC_CUSTOMER_QUERY_RQ = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r
|
140
|
+
<?qbxml version=\"7.0\"?>\r
|
141
|
+
<QBXML>\r
|
142
|
+
<QBXMLMsgsRq onError = \"stopOnError\">\r
|
143
|
+
<CustomerQueryRq>\r
|
144
|
+
<FullName>#{QBWC_USERNAME}</FullName>\r
|
145
|
+
</CustomerQueryRq>\r
|
146
|
+
</QBXMLMsgsRq>\r
|
147
|
+
</QBXML>\r"
|
148
|
+
|
149
|
+
QBWC_CUSTOMER_QUERY_RESPONSE_INFO = "<?xml version=\"1.0\" ?><QBXML><QBXMLMsgsRs><CustomerQueryRs statusCode=\"0\" statusSeverity=\"Info\" statusMessage=\"Status OK\"><CustomerRet><ListID>8000001B-1405777862</ListID><TimeCreated>2014-07-30T21:11:20-05:00</TimeCreated><TimeModified>2005-07-30T21:11:20-05:00</TimeModified><EditSequence>1405777862</EditSequence><Name>#{QBWC_USERNAME}</Name><Salutation>Mr</Salutation><FullName>#{QBWC_USERNAME}</FullName><IsActive>true</IsActive><Sublevel>0</Sublevel><Email>#{QBWC_USERNAME}@gmail.com</Email><Balance>0.00</Balance><TotalBalance>0.00</TotalBalance><AccountNumber>123456789</AccountNumber><JobStatus>None</JobStatus></CustomerRet></CustomerQueryRs></QBXMLMsgsRs></QBXML>"
|
150
|
+
|
151
|
+
QBWC_CUSTOMER_QUERY_STATUS_MESSAGE_WARN = 'The query request has not been fully completed. There was a required element ("bleech") that could not be found in QuickBooks.'
|
152
|
+
|
153
|
+
QBWC_CUSTOMER_QUERY_RESPONSE_WARN = "<?xml version=\"1.0\" ?><QBXML><QBXMLMsgsRs><CustomerQueryRs statusCode=\"500\" statusSeverity=\"Warn\" statusMessage=\"The query request has not been fully completed. There was a required element ("bleech") that could not be found in QuickBooks.\" /></QBXMLMsgsRs></QBXML>"
|
154
|
+
|
155
|
+
QBWC_CUSTOMER_QUERY_STATUS_MESSAGE_ERROR = 'Object "8000001B-1405768916" specified in the request cannot be found. QuickBooks error message: Invalid argument. The specified record does not exist in the list.'
|
156
|
+
|
157
|
+
QBWC_CUSTOMER_QUERY_RESPONSE_ERROR = "<?xml version=\"1.0\" ?><QBXML><QBXMLMsgsRs><CustomerQueryRs statusCode=\"3120\" statusSeverity=\"Error\" statusMessage=\"Object "8000001B-1405768916" specified in the request cannot be found. QuickBooks error message: Invalid argument. The specified record does not exist in the list.\" /></QBXMLMsgsRs></QBXML>"
|
158
|
+
|
159
|
+
AUTHENTICATE_PARAMS = {
|
160
|
+
:strUserName => QBWC_USERNAME,
|
161
|
+
:strPassword => QBWC_PASSWORD,
|
162
|
+
:@xmlns => "http://developer.intuit.com/"
|
163
|
+
}
|
164
|
+
|
165
|
+
AUTHENTICATE_SOAP_ACTION = :authenticate
|
166
|
+
AUTHENTICATE_WASH_OUT_SOAP_DATA = {
|
167
|
+
:Envelope => {
|
168
|
+
:Body => { AUTHENTICATE_SOAP_ACTION => AUTHENTICATE_PARAMS },
|
169
|
+
:"@xmlns:soap" => "http://schemas.xmlsoap.org/soap/envelope/",
|
170
|
+
:"@xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
|
171
|
+
:"@xmlns:xsd" => "http://www.w3.org/2001/XMLSchema"
|
172
|
+
}
|
173
|
+
}
|
174
|
+
|
175
|
+
SEND_REQUEST_PARAMS = {
|
176
|
+
:qbXMLCountry => "US",
|
177
|
+
:qbXMLMajorVers => "13",
|
178
|
+
:qbXMLMinorVers => "0",
|
179
|
+
:ticket => "acc277c2d9351c6da12345887293fc6a32860006",
|
180
|
+
:strHCPResponse => "<?xml version=\"1.0\" ?><QBXML><QBXMLMsgsRs><HostQueryRs requestID=\"0\" statusCode=\"0\" statusSeverity=\"Info\" statusMessage=\"Status OK\"><HostRet><ProductName>QuickBooks Pro 2014</ProductName><MajorVersion>24</MajorVersion><MinorVersion>0</MinorVersion><Country>US</Country><SupportedQBXMLVersion>1.0</SupportedQBXMLVersion><SupportedQBXMLVersion>1.1</SupportedQBXMLVersion><SupportedQBXMLVersion>2.0</SupportedQBXMLVersion><SupportedQBXMLVersion>2.1</SupportedQBXMLVersion><SupportedQBXMLVersion>3.0</SupportedQBXMLVersion><SupportedQBXMLVersion>4.0</SupportedQBXMLVersion><SupportedQBXMLVersion>4.1</SupportedQBXMLVersion><SupportedQBXMLVersion>5.0</SupportedQBXMLVersion><SupportedQBXMLVersion>6.0</SupportedQBXMLVersion><SupportedQBXMLVersion>7.0</SupportedQBXMLVersion><SupportedQBXMLVersion>8.0</SupportedQBXMLVersion><SupportedQBXMLVersion>9.0</SupportedQBXMLVersion><SupportedQBXMLVersion>10.0</SupportedQBXMLVersion><SupportedQBXMLVersion>11.0</SupportedQBXMLVersion><SupportedQBXMLVersion>12.0</SupportedQBXMLVersion><SupportedQBXMLVersion>13.0</SupportedQBXMLVersion><IsAutomaticLogin>false</IsAutomaticLogin><QBFileMode>SingleUser</QBFileMode></HostRet></HostQueryRs><CompanyQueryRs requestID=\"1\" statusCode=\"0\" statusSeverity=\"Info\" statusMessage=\"Status OK\"><CompanyRet><IsSampleCompany>false</IsSampleCompany><CompanyName>myCompany</CompanyName><LegalCompanyName>myCompany Legal Name</LegalCompanyName><Address><City>P.O. Box 12345</City><State>CA</State><PostalCode>12345</PostalCode><Country>US</Country></Address><AddressBlock><Addr1>P.O. Box 12345</Addr1><Addr2>CA 12345</Addr2></AddressBlock><LegalAddress><Addr1>P.O. Box 12345</Addr1><City>Anytown</City><State>CA</State><PostalCode>12345</PostalCode><Country>US</Country></LegalAddress><Phone>800-123-4567</Phone><Email>myname@mydomain.com</Email><FirstMonthFiscalYear>January</FirstMonthFiscalYear><FirstMonthIncomeTaxYear>January</FirstMonthIncomeTaxYear><CompanyType>InformationTechnologyComputersSoftware</CompanyType><EIN>12-3456789</EIN><TaxForm>Form1120</TaxForm><SubscribedServices><Service><Name>QuickBooks Online Banking</Name><Domain>banking.qb</Domain><ServiceStatus>Never</ServiceStatus></Service><Service><Name>QuickBooks Online Billing</Name><Domain>billing.qb</Domain><ServiceStatus>Never</ServiceStatus></Service><Service><Name>QuickBooks Online Billing Level 1 Service</Name><Domain>qbob1.qbn</Domain><ServiceStatus>Never</ServiceStatus></Service><Service><Name>QuickBooks Online Billing Level 2 Service</Name><Domain>qbob2.qbn</Domain><ServiceStatus>Never</ServiceStatus></Service><Service><Name>QuickBooks Online Billing Payment Service</Name><Domain>qbobpay.qbn</Domain><ServiceStatus>Never</ServiceStatus></Service><Service><Name>QuickBooks Bill Payment</Name><Domain>billpay.qb</Domain><ServiceStatus>Never</ServiceStatus></Service><Service><Name>QuickBooks Online Billing Paper Mailing Service</Name><Domain>qbobpaper.qbn</Domain><ServiceStatus>Never</ServiceStatus></Service><Service><Name>QuickBooks Payroll Service</Name><Domain>payroll.qb</Domain><ServiceStatus>Never</ServiceStatus></Service><Service><Name>QuickBooks Basic Payroll Service</Name><Domain>payrollbsc.qb</Domain><ServiceStatus>Never</ServiceStatus></Service><Service><Name>QuickBooks Basic Disk Payroll Service</Name><Domain>payrollbscdisk.qb</Domain><ServiceStatus>Never</ServiceStatus></Service><Service><Name>QuickBooks Deluxe Payroll Service</Name><Domain>payrolldlx.qb</Domain><ServiceStatus>Never</ServiceStatus></Service><Service><Name>QuickBooks Premier Payroll Service</Name><Domain>payrollprm.qb</Domain><ServiceStatus>Never</ServiceStatus></Service><Service><Name>Basic Plus Federal</Name><Domain>basic_plus_fed.qb</Domain><ServiceStatus>Never</ServiceStatus></Service><Service><Name>Basic Plus Federal and State</Name><Domain>basic_plus_fed_state.qb</Domain><ServiceStatus>Never</ServiceStatus></Service><Service><Name>Basic Plus Direct Deposit</Name><Domain>basic_plus_dd.qb</Domain><ServiceStatus>Never</ServiceStatus></Service><Service><Name>Merchant Account Service</Name><Domain>mas.qbn</Domain><ServiceStatus>Never</ServiceStatus></Service></SubscribedServices><AccountantCopy><AccountantCopyExists>false</AccountantCopyExists></AccountantCopy><DataExtRet><OwnerID>{512349B1-1111-2222-3333-000DE1813D20}</OwnerID><DataExtName>AppLock</DataExtName><DataExtType>STR255TYPE<yzer/DataExtType><DataExtValue>LOCKED:REDACTED:631234599990000223</DataExtValue></DataExtRet><DataExtRet><OwnerID>{512349B1-1111-2222-3333-000DE1813D20}</OwnerID><DataExtName>FileID</DataExtName><DataExtType>STR255TYPE</DataExtType><DataExtValue>{00000ee-1111-ffff-cccc-5ff123456047}</DataExtValue></DataExtRet></CompanyRet></CompanyQueryRs><PreferencesQueryRs requestID=\"2\" statusCode=\"0\" statusSeverity=\"Info\" statusMessage=\"Status OK\"><PreferencesRet><AccountingPreferences><IsUsingAccountNumbers>false</IsUsingAccountNumbers><IsRequiringAccounts>true</IsRequiringAccounts><IsUsingClassTracking>false</IsUsingClassTracking><IsUsingAuditTrail>true</IsUsingAuditTrail><IsAssigningJournalEntryNumbers>true</IsAssigningJournalEntryNumbers></AccountingPreferences><FinanceChargePreferences><AnnualInterestRate>0.00</AnnualInterestRate><MinFinanceCharge>0.00</MinFinanceCharge><GracePeriod>0</GracePeriod><IsAssessingForOverdueCharges>false</IsAssessingForOverdueCharges><CalculateChargesFrom>DueDate</CalculateChargesFrom><IsMarkedToBePrinted>false</IsMarkedToBePrinted></FinanceChargePreferences><JobsAndEstimatesPreferences><IsUsingEstimates>true</IsUsingEstimates><IsUsingProgressInvoicing>false</IsUsingProgressInvoicing><IsPrintingItemsWithZeroAmounts>false</IsPrintingItemsWithZeroAmounts></JobsAndEstimatesPreferences><MultiCurrencyPreferences><IsMultiCurrencyOn>false</IsMultiCurrencyOn></MultiCurrencyPreferences><MultiLocationInventoryPreferences><IsMultiLocationInventoryAvailable>false</IsMultiLocationInventoryAvailable><IsMultiLocationInventoryEnabled>false</IsMultiLocationInventoryEnabled></MultiLocationInventoryPreferences><PurchasesAndVendorsPreferences><IsUsingInventory>false</IsUsingInventory><DaysBillsAreDue>10</DaysBillsAreDue><IsAutomaticallyUsingDiscounts>false</IsAutomaticallyUsingDiscounts></PurchasesAndVendorsPreferences><ReportsPreferences><AgingReportBasis>AgeFromDueDate</AgingReportBasis><SummaryReportBasis>Accrual</SummaryReportBasis></ReportsPreferences><SalesAndCustomersPreferences><IsTrackingReimbursedExpensesAsIncome>false</IsTrackingReimbursedExpensesAsIncome><IsAutoApplyingPayments>true</IsAutoApplyingPayments><PriceLevels><IsUsingPriceLevels>true</IsUsingPriceLevels><IsRoundingSalesPriceUp>true</IsRoundingSalesPriceUp></PriceLevels></SalesAndCustomersPreferences><TimeTrackingPreferences><FirstDayOfWeek>Monday</FirstDayOfWeek></TimeTrackingPreferences><CurrentAppAccessRights><IsAutomaticLoginAllowed>false</IsAutomaticLoginAllowed><IsPersonalDataAccessAllowed>false</IsPersonalDataAccessAllowed></CurrentAppAccessRights><ItemsAndInventoryPreferences><EnhancedInventoryReceivingEnabled>false</EnhancedInventoryReceivingEnabled><IsTrackingSerialOrLotNumber>None</IsTrackingSerialOrLotNumber><FIFOEnabled>false</FIFOEnabled><IsRSBEnabled>false</IsRSBEnabled><IsBarcodeEnabled>false</IsBarcodeEnabled></ItemsAndInventoryPreferences></PreferencesRet></PreferencesQueryRs></QBXMLMsgsRs></QBXML>",
|
181
|
+
}
|
182
|
+
|
183
|
+
SEND_REQUEST_SOAP_ACTION = :sendRequestXML
|
184
|
+
|
185
|
+
|
186
|
+
RECEIVE_RESPONSE_PARAMS = {
|
187
|
+
:ticket => "60676ae302a35ead77c81b16993ef073ff3c930e",
|
188
|
+
:response => "<?xml version=\"1.0\" ?><QBXML><QBXMLMsgsRs><CustomerAddRs statusCode=\"0\" statusSeverity=\"Info\" statusMessage=\"Status OK\"><CustomerRet><ListID>8000007B-1420967073</ListID><TimeCreated>2015-02-03T07:49:33-05:00</TimeCreated><TimeModified>2015-02-03T07:49:33-05:00</TimeModified><EditSequence>1420967073</EditSequence><Name>mrjoecustomer</Name><FullName>Joseph Customer</FullName><IsActive>true</IsActive><Sublevel>0</Sublevel><Email>joecustomer@gmail.com</Email><Balance>0.00</Balance><TotalBalance>0.00</TotalBalance><AccountNumber>8</AccountNumber><JobStatus>None</JobStatus></CustomerRet></CustomerAddRs></QBXMLMsgsRs></QBXML>",
|
189
|
+
:hresult => nil,
|
190
|
+
:message => nil}
|
191
|
+
|
192
|
+
RECEIVE_RESPONSE_ERROR_PARAMS = {
|
193
|
+
:ticket => "40fddf910fa903bde3caee77da7b30ab0bc90804",
|
194
|
+
:response => nil,
|
195
|
+
:hresult => "0x80040400",
|
196
|
+
:message => "QuickBooks found an error when parsing the provided XML text stream."
|
197
|
+
}
|
198
|
+
|
199
|
+
RECEIVE_RESPONSE_SOAP_ACTION = :receiveResponseXML
|
200
|
+
|
201
|
+
#-------------------------------------------
|
202
|
+
def _simulate_soap_request(http_action, soap_action, soap_params)
|
203
|
+
|
204
|
+
ticket = QBWC::ActiveRecord::Session::QbwcSession.first.ticket
|
205
|
+
wash_out_soap_data = { :Envelope => { :Body => { soap_action => soap_params.update(:ticket => ticket) }}}
|
206
|
+
|
207
|
+
# http://twobitlabs.com/2010/09/setting-request-headers-in-rails-functional-tests/
|
208
|
+
@request.env["wash_out.soap_action"] = soap_action.to_s
|
209
|
+
@request.env["wash_out.soap_data"] = wash_out_soap_data
|
210
|
+
@controller.env["wash_out.soap_data"] = @request.env["wash_out.soap_data"]
|
211
|
+
|
212
|
+
post http_action, use_route: :qbwc_action
|
213
|
+
end
|
214
|
+
|
215
|
+
#-------------------------------------------
|
216
|
+
def _authenticate
|
217
|
+
# http://twobitlabs.com/2010/09/setting-request-headers-in-rails-functional-tests/
|
218
|
+
@request.env["wash_out.soap_action"] = AUTHENTICATE_SOAP_ACTION.to_s
|
219
|
+
@request.env["wash_out.soap_data"] = AUTHENTICATE_WASH_OUT_SOAP_DATA
|
220
|
+
@controller.env["wash_out.soap_data"] = @request.env["wash_out.soap_data"]
|
221
|
+
|
222
|
+
process(:authenticate)
|
223
|
+
end
|
224
|
+
|
225
|
+
#-------------------------------------------
|
226
|
+
def _authenticate_with_queued_job
|
227
|
+
# Queue a job
|
228
|
+
QBWC.add_job(:customer_add_rq_job, true, COMPANY, QBWC::Worker)
|
229
|
+
|
230
|
+
_authenticate
|
231
|
+
end
|
232
|
+
|
233
|
+
#-------------------------------------------
|
234
|
+
def _authenticate_wrong_password
|
235
|
+
# deep copy
|
236
|
+
bad_password_soap_data = Marshal.load(Marshal.dump(AUTHENTICATE_WASH_OUT_SOAP_DATA))
|
237
|
+
bad_password_soap_data[:Envelope][:Body][AUTHENTICATE_SOAP_ACTION][:strPassword] = 'something wrong'
|
238
|
+
@request.env["wash_out.soap_action"] = AUTHENTICATE_SOAP_ACTION.to_s
|
239
|
+
@request.env["wash_out.soap_data"] = bad_password_soap_data
|
240
|
+
@controller.env["wash_out.soap_data"] = @request.env["wash_out.soap_data"]
|
241
|
+
|
242
|
+
process(:authenticate)
|
243
|
+
end
|
244
|
+
|
245
|
+
#-------------------------------------------
|
246
|
+
def simulate_response(session, response=QBWC_EMPTY_RESPONSE)
|
247
|
+
session.response = response
|
248
|
+
end
|