salesforcebulk 1.0.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.
- data/.gitignore +4 -0
- data/.rbenv-version +1 -0
- data/Gemfile +2 -0
- data/README.md +143 -0
- data/Rakefile +22 -0
- data/lib/salesforce_bulk.rb +15 -0
- data/lib/salesforce_bulk/batch.rb +50 -0
- data/lib/salesforce_bulk/batch_result.rb +39 -0
- data/lib/salesforce_bulk/batch_result_collection.rb +29 -0
- data/lib/salesforce_bulk/client.rb +254 -0
- data/lib/salesforce_bulk/core_extensions/string.rb +14 -0
- data/lib/salesforce_bulk/job.rb +70 -0
- data/lib/salesforce_bulk/query_result_collection.rb +48 -0
- data/lib/salesforce_bulk/salesforce_error.rb +30 -0
- data/lib/salesforce_bulk/version.rb +3 -0
- data/salesforcebulk.gemspec +28 -0
- data/test/fixtures/batch_create_request.csv +3 -0
- data/test/fixtures/batch_create_response.xml +13 -0
- data/test/fixtures/batch_info_list_response.xml +27 -0
- data/test/fixtures/batch_info_response.xml +13 -0
- data/test/fixtures/batch_result_list_response.csv +3 -0
- data/test/fixtures/config.yml +7 -0
- data/test/fixtures/invalid_batch_error.xml +5 -0
- data/test/fixtures/invalid_error.xml +5 -0
- data/test/fixtures/invalid_job_error.xml +5 -0
- data/test/fixtures/invalid_session_error.xml +5 -0
- data/test/fixtures/job_abort_request.xml +1 -0
- data/test/fixtures/job_abort_response.xml +25 -0
- data/test/fixtures/job_close_request.xml +1 -0
- data/test/fixtures/job_close_response.xml +25 -0
- data/test/fixtures/job_create_request.xml +1 -0
- data/test/fixtures/job_create_response.xml +25 -0
- data/test/fixtures/job_info_response.xml +25 -0
- data/test/fixtures/login_error.xml +1 -0
- data/test/fixtures/login_request.xml +1 -0
- data/test/fixtures/login_response.xml +39 -0
- data/test/fixtures/query_result_list_response.xml +1 -0
- data/test/fixtures/query_result_response.csv +5 -0
- data/test/lib/test_batch.rb +258 -0
- data/test/lib/test_batch_result.rb +40 -0
- data/test/lib/test_core_extensions.rb +15 -0
- data/test/lib/test_initialization.rb +86 -0
- data/test/lib/test_job.rb +256 -0
- data/test/lib/test_query_result_collection.rb +87 -0
- data/test/test_helper.rb +32 -0
- metadata +222 -0
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?><result-list xmlns="http://www.force.com/2009/06/asyncapi/dataload"><result>752E0000000TNaq</result></result-list>
|
@@ -0,0 +1,258 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestBatch < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
options = {
|
7
|
+
:username => 'myusername',
|
8
|
+
:password => 'mypassword',
|
9
|
+
:token => "somelongtoken"
|
10
|
+
}
|
11
|
+
|
12
|
+
@client = SalesforceBulk::Client.new(options)
|
13
|
+
bypass_authentication(@client)
|
14
|
+
@batch = SalesforceBulk::Batch.new
|
15
|
+
@headers = {"Content-Type" => "text/csv; charset=UTF-8", 'X-Sfdc-Session' => '123456789'}
|
16
|
+
@headersWithXml = {'Content-Type' => 'application/xml', 'X-Sfdc-Session' => '123456789'}
|
17
|
+
end
|
18
|
+
|
19
|
+
test "initialize from XML" do
|
20
|
+
xml = fixture("batch_info_response.xml")
|
21
|
+
batch = SalesforceBulk::Batch.new_from_xml(XmlSimple.xml_in(xml, 'ForceArray' => false))
|
22
|
+
|
23
|
+
assert_equal batch.id, '751E00000004ZRbIAM'
|
24
|
+
assert_equal batch.job_id, '750E00000004N97IAE'
|
25
|
+
assert_equal batch.state, 'Completed'
|
26
|
+
assert_equal batch.created_at, DateTime.parse('2012-05-31T01:22:47.000Z')
|
27
|
+
assert_equal batch.completed_at, DateTime.parse('2012-05-31T01:22:47.000Z')
|
28
|
+
assert_equal batch.processed_records, 2
|
29
|
+
assert_equal batch.failed_records, 0
|
30
|
+
assert_equal batch.total_processing_time, 72
|
31
|
+
assert_equal batch.api_active_processing_time, 28
|
32
|
+
assert_equal batch.apex_processing_time, 0
|
33
|
+
end
|
34
|
+
|
35
|
+
test "state?" do
|
36
|
+
@batch.state = "Completed"
|
37
|
+
assert @batch.state?('Completed')
|
38
|
+
|
39
|
+
@batch.state = "COMPLETED"
|
40
|
+
assert @batch.state?('completed')
|
41
|
+
|
42
|
+
@batch.state = "Failed"
|
43
|
+
assert !@batch.state?('Queued')
|
44
|
+
end
|
45
|
+
|
46
|
+
test "state is marked queued" do
|
47
|
+
@batch.state = "Queued"
|
48
|
+
assert @batch.queued?
|
49
|
+
|
50
|
+
@batch.state = nil
|
51
|
+
assert !@batch.queued?
|
52
|
+
end
|
53
|
+
|
54
|
+
test "state is marked in progress" do
|
55
|
+
@batch.state = "InProgress"
|
56
|
+
assert @batch.in_progress?
|
57
|
+
|
58
|
+
@batch.state = nil
|
59
|
+
assert !@batch.in_progress?
|
60
|
+
end
|
61
|
+
|
62
|
+
test "state is marked completed" do
|
63
|
+
@batch.state = "Completed"
|
64
|
+
assert @batch.completed?
|
65
|
+
|
66
|
+
@batch.state = nil
|
67
|
+
assert !@batch.completed?
|
68
|
+
end
|
69
|
+
|
70
|
+
test "state is marked failed" do
|
71
|
+
@batch.state = "Failed"
|
72
|
+
assert @batch.failed?
|
73
|
+
|
74
|
+
@batch.state = nil
|
75
|
+
assert !@batch.failed?
|
76
|
+
end
|
77
|
+
|
78
|
+
test "should add a batch to a job and return a successful response" do
|
79
|
+
request = fixture("batch_create_request.csv")
|
80
|
+
response = fixture("batch_create_response.xml")
|
81
|
+
job_id = "750E00000004NRfIAM"
|
82
|
+
batch_id = "751E00000004ZmUIAU"
|
83
|
+
data = [
|
84
|
+
{:Id__c => '12345', :Title__c => "This is a test video", :IsPreview__c => nil},
|
85
|
+
{:Id__c => '23456', :Title__c => "A second test!", :IsPreview__c => true}
|
86
|
+
]
|
87
|
+
|
88
|
+
stub_request(:post, "#{api_url(@client)}job/#{job_id}/batch")
|
89
|
+
.with(:body => request, :headers => @headers)
|
90
|
+
.to_return(:body => response, :status => 200)
|
91
|
+
|
92
|
+
batch = @client.add_batch(job_id, data)
|
93
|
+
|
94
|
+
assert_requested :post, "#{api_url(@client)}job/#{job_id}/batch", :body => request, :headers => @headers, :times => 1
|
95
|
+
|
96
|
+
assert_equal batch.id, batch_id
|
97
|
+
assert_equal batch.job_id, job_id
|
98
|
+
assert_equal batch.state, 'Queued'
|
99
|
+
assert_equal batch.created_at, DateTime.parse('2012-06-02T21:03:56.000Z')
|
100
|
+
assert_equal batch.completed_at, DateTime.parse('2012-06-02T21:03:56.000Z')
|
101
|
+
assert_equal batch.processed_records, 0
|
102
|
+
assert_equal batch.failed_records, 0
|
103
|
+
assert_equal batch.total_processing_time, 0
|
104
|
+
assert_equal batch.api_active_processing_time, 0
|
105
|
+
assert_equal batch.apex_processing_time, 0
|
106
|
+
end
|
107
|
+
|
108
|
+
test "should raise ArgumentError when given data array length exceeding 10000" do
|
109
|
+
data = (1..10100).map { |index| {:Id => index} }
|
110
|
+
|
111
|
+
assert_raise ArgumentError do
|
112
|
+
@client.add_batch("750E00000004NRfIAM", data)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
test "should retrieve info for all batches in a job in a single request" do
|
117
|
+
response = fixture("batch_info_list_response.xml")
|
118
|
+
job_id = "750E00000004N97IAE"
|
119
|
+
|
120
|
+
stub_request(:get, "#{api_url(@client)}job/#{job_id}/batch").with(:headers => @headersWithXml).to_return(:body => response, :status => 200)
|
121
|
+
|
122
|
+
batches = @client.batch_info_list(job_id)
|
123
|
+
|
124
|
+
assert_requested :get, "#{api_url(@client)}job/#{job_id}/batch", :headers => @headersWithXml, :times => 1
|
125
|
+
|
126
|
+
assert_kind_of Array, batches
|
127
|
+
assert_kind_of SalesforceBulk::Batch, batches.first
|
128
|
+
assert_equal batches.length, 2
|
129
|
+
|
130
|
+
batch = batches.first
|
131
|
+
assert_equal batch.id, "751E00000004ZRbIAM"
|
132
|
+
assert_equal batch.job_id, job_id
|
133
|
+
assert_equal batch.state, 'Completed'
|
134
|
+
assert_equal batch.created_at, DateTime.parse('2012-05-31T01:22:47.000Z')
|
135
|
+
assert_equal batch.completed_at, DateTime.parse('2012-05-31T01:22:47.000Z')
|
136
|
+
assert_equal batch.processed_records, 2
|
137
|
+
assert_equal batch.failed_records, 0
|
138
|
+
assert_equal batch.total_processing_time, 72
|
139
|
+
assert_equal batch.api_active_processing_time, 28
|
140
|
+
assert_equal batch.apex_processing_time, 0
|
141
|
+
|
142
|
+
batch = batches.last
|
143
|
+
assert_equal batch.id, "751E00000004ZQsIAM"
|
144
|
+
assert_equal batch.job_id, job_id
|
145
|
+
assert_equal batch.state, 'Completed'
|
146
|
+
assert_equal batch.created_at, DateTime.parse('2012-05-31T01:23:20.000Z')
|
147
|
+
assert_equal batch.completed_at, DateTime.parse('2012-05-31T01:23:20.000Z')
|
148
|
+
assert_equal batch.processed_records, 2
|
149
|
+
assert_equal batch.failed_records, 0
|
150
|
+
assert_equal batch.total_processing_time, 72
|
151
|
+
assert_equal batch.api_active_processing_time, 28
|
152
|
+
assert_equal batch.apex_processing_time, 0
|
153
|
+
end
|
154
|
+
|
155
|
+
test "should retrieve batch info" do
|
156
|
+
response = fixture("batch_info_response.xml")
|
157
|
+
job_id = "750E00000004N97IAE"
|
158
|
+
batch_id = "751E00000004ZRbIAM"
|
159
|
+
|
160
|
+
stub_request(:get, "#{api_url(@client)}job/#{job_id}/batch/#{batch_id}")
|
161
|
+
.with(:headers => @headersWithXml)
|
162
|
+
.to_return(:body => response, :status => 200)
|
163
|
+
|
164
|
+
batch = @client.batch_info(job_id, batch_id)
|
165
|
+
|
166
|
+
assert_requested :get, "#{api_url(@client)}job/#{job_id}/batch/#{batch_id}", :headers => @headersWithXml, :times => 1
|
167
|
+
|
168
|
+
assert_equal batch.id, batch_id
|
169
|
+
assert_equal batch.job_id, job_id
|
170
|
+
assert_equal batch.state, 'Completed'
|
171
|
+
assert_equal batch.created_at, DateTime.parse('2012-05-31T01:22:47.000Z')
|
172
|
+
assert_equal batch.completed_at, DateTime.parse('2012-05-31T01:22:47.000Z')
|
173
|
+
assert_equal batch.processed_records, 2
|
174
|
+
assert_equal batch.failed_records, 0
|
175
|
+
assert_equal batch.total_processing_time, 72
|
176
|
+
assert_equal batch.api_active_processing_time, 28
|
177
|
+
assert_equal batch.apex_processing_time, 0
|
178
|
+
end
|
179
|
+
|
180
|
+
test "should return batch result for a non-querying job" do
|
181
|
+
response = fixture("batch_result_list_response.csv")
|
182
|
+
job_id = "750E00000004NRa"
|
183
|
+
batch_id = "751E00000004ZmK"
|
184
|
+
|
185
|
+
# Batches that are created using CSV will always return
|
186
|
+
# results in CSV format despite requesting with XML content type.
|
187
|
+
# Thus the content type header is ignored.
|
188
|
+
|
189
|
+
stub_request(:get, "#{api_url(@client)}job/#{job_id}/batch/#{batch_id}/result").to_return(:body => response, :status => 200)
|
190
|
+
|
191
|
+
results = @client.batch_result(job_id, batch_id)
|
192
|
+
|
193
|
+
assert_requested :get, "#{api_url(@client)}job/#{job_id}/batch/#{batch_id}/result", :times => 1
|
194
|
+
|
195
|
+
assert_kind_of SalesforceBulk::BatchResultCollection, results
|
196
|
+
assert_kind_of Array, results
|
197
|
+
assert_equal results.length, 2
|
198
|
+
assert_equal results.job_id, job_id
|
199
|
+
assert_equal results.batch_id, batch_id
|
200
|
+
assert_equal results.first.success, true
|
201
|
+
assert_equal results.first.created, false
|
202
|
+
assert_equal results.first.error?, false
|
203
|
+
assert_equal results.first.error, ''
|
204
|
+
end
|
205
|
+
|
206
|
+
test "retrieve result id for a query operation" do
|
207
|
+
response = fixture("query_result_list_response.xml")
|
208
|
+
job_id = "750E00000004NnR"
|
209
|
+
batch_id = "751E00000004aEY"
|
210
|
+
result_id = "752E0000000TNaq"
|
211
|
+
|
212
|
+
stub_request(:get, "#{api_url(@client)}job/#{job_id}/batch/#{batch_id}/result")
|
213
|
+
.with(:headers => @headersWithXml)
|
214
|
+
.to_return(:body => response, :status => 200)
|
215
|
+
|
216
|
+
@client.expects(:query_result).with(job_id, batch_id, result_id).returns([])
|
217
|
+
|
218
|
+
result = @client.batch_result(job_id, batch_id)
|
219
|
+
|
220
|
+
assert_requested :get, "#{api_url(@client)}job/#{job_id}/batch/#{batch_id}/result", :headers => @headersWithXml, :times => 1
|
221
|
+
assert_kind_of SalesforceBulk::QueryResultCollection, result
|
222
|
+
assert_equal result.job_id, job_id
|
223
|
+
assert_equal result.batch_id, batch_id
|
224
|
+
assert_equal result.result_id, result_id
|
225
|
+
end
|
226
|
+
|
227
|
+
test "retrieve and parse a query result successfully" do
|
228
|
+
response = fixture("query_result_response.csv")
|
229
|
+
job_id = "750E00000004NnR"
|
230
|
+
batch_id = "751E00000004aEY"
|
231
|
+
result_id = "752E0000000TNaq"
|
232
|
+
|
233
|
+
stub_request(:get, "#{api_url(@client)}job/#{job_id}/batch/#{batch_id}/result/#{result_id}")
|
234
|
+
.with(:headers => @headers)
|
235
|
+
.to_return(:body => response, :status => 200)
|
236
|
+
|
237
|
+
result = @client.query_result(job_id, batch_id, result_id)
|
238
|
+
|
239
|
+
assert_requested :get, "#{api_url(@client)}job/#{job_id}/batch/#{batch_id}/result/#{result_id}", :headers => @headers, :times => 1
|
240
|
+
assert_kind_of Array, result
|
241
|
+
assert result.length == 4
|
242
|
+
end
|
243
|
+
|
244
|
+
test "should raise SalesforceError on invalid batch response" do
|
245
|
+
response = fixture("invalid_batch_error.xml")
|
246
|
+
job_id = "750E00000004NnR"
|
247
|
+
batch_id = "751E00000004aEY"
|
248
|
+
|
249
|
+
stub_request(:get, "#{api_url(@client)}job/#{job_id}/batch/#{batch_id}/result")
|
250
|
+
.with(:headers => @headersWithXml)
|
251
|
+
.to_return(:body => response, :status => 400)
|
252
|
+
|
253
|
+
assert_raise SalesforceBulk::SalesforceError do
|
254
|
+
@client.batch_result(job_id, batch_id)
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestBatchResult < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@result_created = SalesforceBulk::BatchResult.new('123', true, true, '')
|
7
|
+
@result_updated = SalesforceBulk::BatchResult.new('123', true, false, '')
|
8
|
+
@result_failed = SalesforceBulk::BatchResult.new('123', false, false, 'Some Error Message This Is')
|
9
|
+
end
|
10
|
+
|
11
|
+
test "basic initialization" do
|
12
|
+
assert_equal @result_created.id, '123'
|
13
|
+
assert_equal @result_created.success, true
|
14
|
+
assert_equal @result_created.successful?, true
|
15
|
+
assert_equal @result_created.created, true
|
16
|
+
assert_equal @result_created.created?, true
|
17
|
+
assert_equal @result_created.error, ''
|
18
|
+
assert_equal @result_created.error?, false
|
19
|
+
assert_equal @result_created.updated?, false
|
20
|
+
end
|
21
|
+
|
22
|
+
test "initialization from CSV row" do
|
23
|
+
#@br = SalesforceBulk::BatchResult.new_from_csv()
|
24
|
+
end
|
25
|
+
|
26
|
+
test "error?" do
|
27
|
+
assert @result_failed.error?
|
28
|
+
|
29
|
+
assert !@result_created.error?
|
30
|
+
assert !@result_updated.error?
|
31
|
+
end
|
32
|
+
|
33
|
+
test "updated?" do
|
34
|
+
assert @result_updated.updated?
|
35
|
+
|
36
|
+
assert !@result_created.updated?
|
37
|
+
assert !@result_failed.updated?
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestCoreExtensions < Test::Unit::TestCase
|
4
|
+
|
5
|
+
test "to_b" do
|
6
|
+
assert_equal "true".to_b, true
|
7
|
+
assert_equal "TRUE".to_b, true
|
8
|
+
assert_equal "false".to_b, false
|
9
|
+
assert_equal "FALSE".to_b, false
|
10
|
+
assert_equal " true ".to_b, true
|
11
|
+
assert_equal " false ".to_b, false
|
12
|
+
assert_equal "Any true value".to_b, "Any true value"
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestInitialization < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@options = {
|
7
|
+
:username => 'MyUsername',
|
8
|
+
:password => 'MyPassword',
|
9
|
+
:token => 'MySecurityToken'
|
10
|
+
}
|
11
|
+
|
12
|
+
@client = SalesforceBulk::Client.new(@options)
|
13
|
+
end
|
14
|
+
|
15
|
+
test "initialization with default values" do
|
16
|
+
assert_not_nil @client
|
17
|
+
assert_equal @client.username, @options[:username]
|
18
|
+
assert_equal @client.password, "#{@options[:password]}#{@options[:token]}"
|
19
|
+
assert_equal @client.token, @options[:token]
|
20
|
+
assert_equal @client.host, 'login.salesforce.com'
|
21
|
+
assert_equal @client.version, 24.0
|
22
|
+
assert_equal @client.debugging, false
|
23
|
+
end
|
24
|
+
|
25
|
+
test "initialization overriding all default values" do
|
26
|
+
@options.merge!({:debugging => true, :host => 'newhost.salesforce.com', :version => 1.0})
|
27
|
+
|
28
|
+
client = SalesforceBulk::Client.new(@options)
|
29
|
+
|
30
|
+
assert_equal client.username, @options[:username]
|
31
|
+
assert_equal client.password, "#{@options[:password]}#{@options[:token]}"
|
32
|
+
assert_equal client.token, @options[:token]
|
33
|
+
assert_equal client.debugging, @options[:debugging]
|
34
|
+
assert_equal client.host, @options[:host]
|
35
|
+
assert_equal client.version, @options[:version]
|
36
|
+
end
|
37
|
+
|
38
|
+
test "initialization with a YAML file" do
|
39
|
+
client = SalesforceBulk::Client.new(fixture_path('config.yml'))
|
40
|
+
|
41
|
+
assert_equal client.username, 'MyUsername'
|
42
|
+
assert_equal client.password, 'MyPasswordMySecurityToken'
|
43
|
+
assert_equal client.token, 'MySecurityToken'
|
44
|
+
assert_equal client.debugging, true
|
45
|
+
assert_equal client.host, 'myhost.mydomain.com'
|
46
|
+
assert_equal client.version, 88.0
|
47
|
+
end
|
48
|
+
|
49
|
+
test "initialization with invalid key raises ArgumentError" do
|
50
|
+
assert_raise ArgumentError do
|
51
|
+
SalesforceBulk::Client.new(:non_existing_key => '')
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
test "authentication" do
|
56
|
+
headers = {'Content-Type' => 'text/xml', 'SOAPAction' => 'login'}
|
57
|
+
request = fixture("login_request.xml")
|
58
|
+
response = fixture("login_response.xml")
|
59
|
+
|
60
|
+
stub_request(:post, "https://#{@client.host}/services/Soap/u/24.0")
|
61
|
+
.with(:body => request, :headers => headers)
|
62
|
+
.to_return(:body => response, :status => 200)
|
63
|
+
|
64
|
+
@client.authenticate()
|
65
|
+
|
66
|
+
assert_requested :post, "https://#{@client.host}/services/Soap/u/24.0", :body => request, :headers => headers, :times => 1
|
67
|
+
|
68
|
+
assert_equal @client.instance_host, 'na9-api.salesforce.com'
|
69
|
+
assert_equal @client.instance_variable_get('@session_id'), '00DE0000000YSKp!AQ4AQNQhDKLMORZx2NwZppuKfure.ChCmdI3S35PPxpNA5MHb3ZVxhYd5STM3euVJTI5.39s.jOBT.3mKdZ3BWFDdIrddS8O'
|
70
|
+
end
|
71
|
+
|
72
|
+
test "parsing instance id from server url" do
|
73
|
+
assert_equal @client.instance_id('https://na1-api.salesforce.com'), 'na1-api'
|
74
|
+
assert_equal @client.instance_id('https://na23-api.salesforce.com'), 'na23-api'
|
75
|
+
assert_equal @client.instance_id('https://na345-api.salesforce.com'), 'na345-api'
|
76
|
+
|
77
|
+
# protocol shouldn't matter, its just part of the host name we are after
|
78
|
+
assert_equal @client.instance_id('://na1-api.salesforce.com'), 'na1-api'
|
79
|
+
assert_equal @client.instance_id('://na23-api.salesforce.com'), 'na23-api'
|
80
|
+
|
81
|
+
# in fact the .com portion shouldn't matter either
|
82
|
+
assert_equal @client.instance_id('://na1-api.salesforce'), 'na1-api'
|
83
|
+
assert_equal @client.instance_id('://na23-api.salesforce'), 'na23-api'
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
@@ -0,0 +1,256 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestJob < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
options = {
|
7
|
+
:username => 'myusername',
|
8
|
+
:password => 'mypassword',
|
9
|
+
:token => "somelongtoken"
|
10
|
+
}
|
11
|
+
|
12
|
+
@client = SalesforceBulk::Client.new(options)
|
13
|
+
@job = SalesforceBulk::Job.new
|
14
|
+
@headers = {'Content-Type' => 'application/xml', 'X-Sfdc-Session' => '123456789'}
|
15
|
+
|
16
|
+
bypass_authentication(@client)
|
17
|
+
end
|
18
|
+
|
19
|
+
test "initialization from XML" do
|
20
|
+
xml = fixture("job_info_response.xml")
|
21
|
+
job = SalesforceBulk::Job.new_from_xml(XmlSimple.xml_in(xml, 'ForceArray' => false))
|
22
|
+
|
23
|
+
assert_equal job.id, '750E00000004N1mIAE'
|
24
|
+
assert_equal job.operation, 'upsert'
|
25
|
+
assert_equal job.sobject, 'VideoEvent__c'
|
26
|
+
assert_equal job.created_by, '005E00000017spfIAA'
|
27
|
+
assert_equal job.created_at, DateTime.parse('2012-05-30T04:08:30.000Z')
|
28
|
+
assert_equal job.completed_at, DateTime.parse('2012-05-30T04:08:30.000Z')
|
29
|
+
assert_equal job.state, 'Open'
|
30
|
+
assert_equal job.external_id_field_name, 'Id__c'
|
31
|
+
assert_equal job.concurrency_mode, 'Parallel'
|
32
|
+
assert_equal job.content_type, 'CSV'
|
33
|
+
assert_equal job.queued_batches, 0
|
34
|
+
assert_equal job.in_progress_batches, 0
|
35
|
+
assert_equal job.completed_batches, 0
|
36
|
+
assert_equal job.failed_batches, 0
|
37
|
+
assert_equal job.total_batches, 0
|
38
|
+
assert_equal job.processed_records, 0
|
39
|
+
assert_equal job.failed_records, 0
|
40
|
+
assert_equal job.retries, 0
|
41
|
+
assert_equal job.api_active_processing_time, 0
|
42
|
+
assert_equal job.apex_processing_time, 0
|
43
|
+
assert_equal job.total_processing_time, 0
|
44
|
+
assert_equal job.api_version, 24.0
|
45
|
+
end
|
46
|
+
|
47
|
+
test "state?" do
|
48
|
+
@job.state = 'Closed'
|
49
|
+
assert @job.state?('closed')
|
50
|
+
|
51
|
+
@job.state = 'Closed'
|
52
|
+
assert @job.state?('CLOSED')
|
53
|
+
|
54
|
+
@job.state = nil
|
55
|
+
assert !@job.state?('closed')
|
56
|
+
end
|
57
|
+
|
58
|
+
test "aborted?" do
|
59
|
+
@job.state = 'Aborted'
|
60
|
+
assert @job.aborted?
|
61
|
+
|
62
|
+
@job.state = nil
|
63
|
+
assert !@job.aborted?
|
64
|
+
end
|
65
|
+
|
66
|
+
test "closed?" do
|
67
|
+
@job.state = 'Closed'
|
68
|
+
assert @job.closed?
|
69
|
+
|
70
|
+
@job.state = nil
|
71
|
+
assert !@job.closed?
|
72
|
+
end
|
73
|
+
|
74
|
+
test "open?" do
|
75
|
+
@job.state = 'Open'
|
76
|
+
assert @job.open?
|
77
|
+
|
78
|
+
@job.state = nil
|
79
|
+
assert !@job.open?
|
80
|
+
end
|
81
|
+
|
82
|
+
test "add_job returns successful response" do
|
83
|
+
request = fixture("job_create_request.xml")
|
84
|
+
response = fixture("job_create_response.xml")
|
85
|
+
|
86
|
+
stub_request(:post, "#{api_url(@client)}job")
|
87
|
+
.with(:body => request, :headers => @headers)
|
88
|
+
.to_return(:body => response, :status => 200)
|
89
|
+
|
90
|
+
job = @client.add_job(:upsert, :VideoEvent__c, :external_id_field_name => :Id__c)
|
91
|
+
|
92
|
+
assert_requested :post, "#{api_url(@client)}job", :body => request, :headers => @headers, :times => 1
|
93
|
+
|
94
|
+
assert_equal job.id, '750E00000004MzbIAE'
|
95
|
+
assert_equal job.operation, 'upsert'
|
96
|
+
assert_equal job.sobject, 'VideoEvent__c'
|
97
|
+
assert_equal job.created_by, '005E00000017spfIAA'
|
98
|
+
assert_equal job.created_at, DateTime.parse('2012-05-29T21:50:47.000Z')
|
99
|
+
assert_equal job.completed_at, DateTime.parse('2012-05-29T21:50:47.000Z')
|
100
|
+
assert_equal job.state, 'Open'
|
101
|
+
assert_equal job.external_id_field_name, 'Id__c'
|
102
|
+
assert_equal job.concurrency_mode, 'Parallel'
|
103
|
+
assert_equal job.content_type, 'CSV'
|
104
|
+
assert_equal job.queued_batches, 0
|
105
|
+
assert_equal job.in_progress_batches, 0
|
106
|
+
assert_equal job.completed_batches, 0
|
107
|
+
assert_equal job.failed_batches, 0
|
108
|
+
assert_equal job.total_batches, 0
|
109
|
+
assert_equal job.processed_records, 0
|
110
|
+
assert_equal job.failed_records, 0
|
111
|
+
assert_equal job.retries, 0
|
112
|
+
assert_equal job.api_active_processing_time, 0
|
113
|
+
assert_equal job.apex_processing_time, 0
|
114
|
+
assert_equal job.total_processing_time, 0
|
115
|
+
assert_equal job.api_version, 24.0
|
116
|
+
end
|
117
|
+
|
118
|
+
test "add_job raises ArgumentError if provided with invalid operation" do
|
119
|
+
assert_raise ArgumentError do
|
120
|
+
job = @client.add_job(:SomeOtherOperation, nil)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
test "add_job raises ArgumentError if provided with invalid key for options" do
|
125
|
+
assert_raise ArgumentError do
|
126
|
+
job = @client.add_job(:upsert, :VideoEvent__c, :non_existing_key => '')
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
test "add_job raises ArgumentError if provided with invalid concurrency mode" do
|
131
|
+
assert_raise ArgumentError do
|
132
|
+
job = @client.add_job(:upsert, :VideoEvent__c, :concurrency_mode => 'SomeMode')
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
test "should close job and return successful response" do
|
137
|
+
request = fixture("job_close_request.xml")
|
138
|
+
response = fixture("job_close_response.xml")
|
139
|
+
job_id = "750E00000004MzbIAE"
|
140
|
+
|
141
|
+
stub_request(:post, "#{api_url(@client)}job/#{job_id}")
|
142
|
+
.with(:body => request, :headers => @headers)
|
143
|
+
.to_return(:body => response, :status => 200)
|
144
|
+
|
145
|
+
job = @client.close_job(job_id)
|
146
|
+
|
147
|
+
assert_requested :post, "#{api_url(@client)}job/#{job_id}", :body => request, :headers => @headers, :times => 1
|
148
|
+
|
149
|
+
assert_equal job.id, job_id
|
150
|
+
assert_equal job.operation, 'upsert'
|
151
|
+
assert_equal job.sobject, 'VideoEvent__c'
|
152
|
+
assert_equal job.created_by, '005E00000017spfIAA'
|
153
|
+
assert_equal job.created_at, DateTime.parse('2012-05-29T23:51:53.000Z')
|
154
|
+
assert_equal job.completed_at, DateTime.parse('2012-05-29T23:51:53.000Z')
|
155
|
+
assert_equal job.state, 'Closed'
|
156
|
+
assert_equal job.external_id_field_name, 'Id__c'
|
157
|
+
assert_equal job.concurrency_mode, 'Parallel'
|
158
|
+
assert_equal job.content_type, 'CSV'
|
159
|
+
assert_equal job.queued_batches, 0
|
160
|
+
assert_equal job.in_progress_batches, 0
|
161
|
+
assert_equal job.completed_batches, 0
|
162
|
+
assert_equal job.failed_batches, 0
|
163
|
+
assert_equal job.total_batches, 0
|
164
|
+
assert_equal job.processed_records, 0
|
165
|
+
assert_equal job.failed_records, 0
|
166
|
+
assert_equal job.retries, 0
|
167
|
+
assert_equal job.api_active_processing_time, 0
|
168
|
+
assert_equal job.apex_processing_time, 0
|
169
|
+
assert_equal job.total_processing_time, 0
|
170
|
+
assert_equal job.api_version, 24.0
|
171
|
+
end
|
172
|
+
|
173
|
+
test "should abort job and return successful response" do
|
174
|
+
request = fixture("job_abort_request.xml")
|
175
|
+
response = fixture("job_abort_response.xml")
|
176
|
+
job_id = "750E00000004N1NIAU"
|
177
|
+
|
178
|
+
stub_request(:post, "#{api_url(@client)}job/#{job_id}")
|
179
|
+
.with(:body => request, :headers => @headers)
|
180
|
+
.to_return(:body => response, :status => 200)
|
181
|
+
|
182
|
+
job = @client.abort_job(job_id)
|
183
|
+
|
184
|
+
assert_requested :post, "#{api_url(@client)}job/#{job_id}", :body => request, :headers => @headers, :times => 1
|
185
|
+
|
186
|
+
assert_equal job.id, job_id
|
187
|
+
assert_equal job.operation, 'upsert'
|
188
|
+
assert_equal job.sobject, 'VideoEvent__c'
|
189
|
+
assert_equal job.created_by, '005E00000017spfIAA'
|
190
|
+
assert_equal job.created_at, DateTime.parse('2012-05-30T00:16:04.000Z')
|
191
|
+
assert_equal job.completed_at, DateTime.parse('2012-05-30T00:16:04.000Z')
|
192
|
+
assert_equal job.state, 'Aborted'
|
193
|
+
assert_equal job.external_id_field_name, 'Id__c'
|
194
|
+
assert_equal job.concurrency_mode, 'Parallel'
|
195
|
+
assert_equal job.content_type, 'CSV'
|
196
|
+
assert_equal job.queued_batches, 0
|
197
|
+
assert_equal job.in_progress_batches, 0
|
198
|
+
assert_equal job.completed_batches, 0
|
199
|
+
assert_equal job.failed_batches, 0
|
200
|
+
assert_equal job.total_batches, 0
|
201
|
+
assert_equal job.processed_records, 0
|
202
|
+
assert_equal job.failed_records, 0
|
203
|
+
assert_equal job.retries, 0
|
204
|
+
assert_equal job.api_active_processing_time, 0
|
205
|
+
assert_equal job.apex_processing_time, 0
|
206
|
+
assert_equal job.total_processing_time, 0
|
207
|
+
assert_equal job.api_version, 24.0
|
208
|
+
end
|
209
|
+
|
210
|
+
test "should return job info" do
|
211
|
+
response = fixture("job_info_response.xml")
|
212
|
+
job_id = "750E00000004N1mIAE"
|
213
|
+
|
214
|
+
stub_request(:get, "#{api_url(@client)}job/#{job_id}")
|
215
|
+
.with(:body => '', :headers => @headers)
|
216
|
+
.to_return(:body => response, :status => 200)
|
217
|
+
|
218
|
+
job = @client.job_info(job_id)
|
219
|
+
|
220
|
+
assert_requested :get, "#{api_url(@client)}job/#{job_id}", :body => '', :headers => @headers, :times => 1
|
221
|
+
|
222
|
+
assert_equal job.id, job_id
|
223
|
+
assert_equal job.operation, 'upsert'
|
224
|
+
assert_equal job.sobject, 'VideoEvent__c'
|
225
|
+
assert_equal job.created_by, '005E00000017spfIAA'
|
226
|
+
assert_equal job.created_at, DateTime.parse('2012-05-30T04:08:30.000Z')
|
227
|
+
assert_equal job.completed_at, DateTime.parse('2012-05-30T04:08:30.000Z')
|
228
|
+
assert_equal job.state, 'Open'
|
229
|
+
assert_equal job.external_id_field_name, 'Id__c'
|
230
|
+
assert_equal job.concurrency_mode, 'Parallel'
|
231
|
+
assert_equal job.content_type, 'CSV'
|
232
|
+
assert_equal job.queued_batches, 0
|
233
|
+
assert_equal job.in_progress_batches, 0
|
234
|
+
assert_equal job.completed_batches, 0
|
235
|
+
assert_equal job.failed_batches, 0
|
236
|
+
assert_equal job.total_batches, 0
|
237
|
+
assert_equal job.processed_records, 0
|
238
|
+
assert_equal job.failed_records, 0
|
239
|
+
assert_equal job.retries, 0
|
240
|
+
assert_equal job.api_active_processing_time, 0
|
241
|
+
assert_equal job.apex_processing_time, 0
|
242
|
+
assert_equal job.total_processing_time, 0
|
243
|
+
assert_equal job.api_version, 24.0
|
244
|
+
end
|
245
|
+
|
246
|
+
test "should raise SalesforceError on invalid job" do
|
247
|
+
response = fixture("invalid_job_error.xml")
|
248
|
+
|
249
|
+
stub_request(:post, "#{api_url(@client)}job").to_return(:body => response, :status => 500)
|
250
|
+
|
251
|
+
assert_raise SalesforceBulk::SalesforceError do
|
252
|
+
job = @client.add_job(:upsert, :SomeNonExistingObject__c, :external_id_field_name => :Id__c)
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
end
|