drudgery 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,413 +1,316 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Drudgery::Job do
4
- describe '#initialize' do
5
- before(:each) do
6
- @extractor = stub('extractor')
7
- @transformer = stub('transformer')
8
- @loader = stub('loader')
9
-
10
- @now = Time.now
11
- Time.stubs(:now).returns(@now)
12
-
13
- @job = Drudgery::Job.new(:extractor => @extractor, :transformer => @transformer, :loader => @loader)
14
- end
15
-
16
- it 'sets job id to nsec time' do
17
- @job.id.must_equal @now.nsec
18
- end
19
-
20
- it 'sets extractor, transformer, and loader with provided arguments' do
21
- @job.instance_variable_get('@extractor').must_equal @extractor
22
- @job.instance_variable_get('@transformer').must_equal @transformer
23
- @job.instance_variable_get('@loader').must_equal @loader
24
- end
25
-
26
- it 'sets batch_size with provided argument' do
27
- job = Drudgery::Job.new(:batch_size => 100)
28
- job.instance_variable_get('@batch_size').must_equal(100)
29
- end
30
-
31
- it 'initializes extractor, transformer, and loader if none provided' do
32
- job = Drudgery::Job.new
33
- job.instance_variable_get('@extractor').must_be_nil
34
- job.instance_variable_get('@transformer').must_be_nil
35
- job.instance_variable_get('@loader').must_be_nil
36
- end
37
-
38
- it 'initializes records as array' do
39
- @job.instance_variable_get('@records').must_equal []
40
- end
41
-
42
-
43
- it 'initializes batch_size as 1000 if none provided' do
44
- @job.instance_variable_get('@batch_size').must_equal 1000
45
- end
46
- end
47
-
48
- describe '#name' do
49
- it 'returns <extractor name> => <loader name>' do
50
- extractor = stub('extractor', :name => 'csv:file.csv')
51
- loader = stub('loader', :name => 'sqlite3:memory.tablename')
52
-
53
- job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
54
- job.name.must_equal 'csv:file.csv => sqlite3:memory.tablename'
55
- end
56
- end
57
-
58
- describe '#batch_size' do
59
- it 'sets batch_size to provided value' do
60
- job = Drudgery::Job.new
61
- job.batch_size 2
62
- job.instance_variable_get('@batch_size').must_equal 2
63
- end
64
- end
65
-
66
- describe '#extract' do
67
- describe 'when type and args provided' do
68
- it 'instantiates extractor with type and args' do
69
- Drudgery::Extractors.expects(:instantiate).with(:csv, 'filename.csv', :col_sep => '|')
70
-
71
- job = Drudgery::Job.new
72
- job.extract(:csv, 'filename.csv', :col_sep => '|')
3
+ module Drudgery
4
+ describe Job do
5
+ describe '#initialize' do
6
+ it 'sets job id to nsec time' do
7
+ now = Time.now
8
+ Time.stubs(:now).returns(now)
9
+
10
+ job = Job.new
11
+ job.id.must_equal now.nsec
73
12
  end
74
13
 
75
- it 'yields extractor if block_given' do
76
- extractor = mock('extractor')
77
- extractor.expects(:col_sep).with('|')
14
+ it 'sets extractor, transformer, and loader with provided arguments' do
15
+ extractor = Extractors::CSVExtractor.new('test.csv')
16
+ transformer = Transformer.new
17
+ loader = Loaders::CSVLoader.new('test.csv')
78
18
 
79
- Drudgery::Extractors.stubs(:instantiate).returns(extractor)
19
+ job = Job.new(
20
+ extractor: extractor,
21
+ transformer: transformer,
22
+ loader: loader
23
+ )
80
24
 
81
- job = Drudgery::Job.new
82
- job.extract(:csv, 'filename.csv') do |extractor|
83
- extractor.col_sep '|'
84
- end
25
+ job.extractor.must_equal extractor
26
+ job.transformer.must_equal transformer
27
+ job.loader.must_equal loader
85
28
  end
86
29
 
87
- it 'sets extractor' do
88
- extractor = stub('extractor')
30
+ it 'sets batch_size with provided argument' do
31
+ job = Job.new(:batch_size => 100)
32
+ job.batch_size.must_equal 100
33
+ end
89
34
 
90
- Drudgery::Extractors.stubs(:instantiate).returns(extractor)
35
+ it 'initializes batch_size as 1000 if none provided' do
36
+ job = Job.new
37
+ job.batch_size.must_equal 1000
38
+ end
39
+ end
91
40
 
92
- job = Drudgery::Job.new
93
- job.extract(:csv, 'filename.csv', :col_sep => '|')
41
+ describe '#name' do
42
+ it 'returns <extractor name> => <loader name>' do
43
+ job = Job.new(
44
+ :extractor => Extractors::CSVExtractor.new('their-records.csv'),
45
+ :loader => Loaders::CSVLoader.new('my-records.csv')
46
+ )
94
47
 
95
- job.instance_variable_get('@extractor').must_equal extractor
48
+ job.name.must_equal 'csv:their-records.csv => csv:my-records.csv'
96
49
  end
97
50
  end
98
51
 
99
- describe 'when extractor provided' do
100
- it 'does not instantiat extractor with type and args' do
101
- extractor = stub('extractor')
52
+ describe '#record_count' do
53
+ describe 'when extractor exists' do
54
+ it "returns the extractor's record_count" do
55
+ extractor = Extractors::CSVExtractor.new('test.csv')
56
+ extractor.stubs(:record_count).returns(1000)
102
57
 
103
- Drudgery::Extractors.expects(:instantiate).never
58
+ job = Job.new(extractor: extractor)
59
+ job.record_count.must_equal 1000
60
+ end
104
61
 
105
- job = Drudgery::Job.new
106
- job.extract(extractor)
107
62
  end
108
63
 
109
- it 'yields extractor if block_given' do
110
- extractor = mock('extractor')
111
- extractor.expects(:col_sep).with('|')
112
-
113
- job = Drudgery::Job.new
114
- job.extract(extractor) do |ext|
115
- ext.col_sep '|'
64
+ describe 'when extractor does not exist' do
65
+ it 'returns nil' do
66
+ job = Job.new
67
+ job.record_count.must_be_nil
116
68
  end
117
69
  end
70
+ end
118
71
 
119
- it 'sets extractor' do
120
- extractor = stub('extractor')
72
+ describe '#extract' do
73
+ describe 'when type and args provided' do
74
+ it 'instantiates extractor with type and args' do
75
+ job = Job.new
76
+ job.extract(:csv, 'test.csv', :col_sep => '|')
121
77
 
122
- job = Drudgery::Job.new
123
- job.extract(extractor)
78
+ job.extractor.name.must_equal 'csv:test.csv'
79
+ job.extractor.col_sep.must_equal '|'
80
+ end
124
81
 
125
- job.instance_variable_get('@extractor').must_equal extractor
126
- end
127
- end
128
- end
82
+ it 'yields extractor if block_given' do
83
+ job = Job.new
84
+ job.extract(:csv, 'test.csv') do |extractor|
85
+ extractor.col_sep = '|'
86
+ end
129
87
 
130
- describe '#transform' do
131
- describe 'when transformer provided' do
132
- it 'sets transformer to provided transformer' do
133
- transformer = stub('transformer', :register => nil)
88
+ job.extractor.name.must_equal 'csv:test.csv'
89
+ job.extractor.col_sep.must_equal '|'
90
+ end
134
91
 
135
- job = Drudgery::Job.new
136
- job.transform(transformer)
92
+ it 'sets extractor' do
93
+ job = Job.new
94
+ job.extract(:csv, 'test.csv', :col_sep => '|')
137
95
 
138
- job.instance_variable_get('@transformer').must_equal transformer
96
+ job.extractor.wont_be_nil
97
+ job.extractor.name.must_equal 'csv:test.csv'
98
+ job.extractor.col_sep.must_equal '|'
99
+ end
139
100
  end
140
101
 
141
- it 'registers provided proc with provided transformer' do
142
- block = Proc.new { |data, cache| data }
102
+ describe 'when extractor provided' do
103
+ it 'yields extractor if block_given' do
104
+ extractor = Extractors::CSVExtractor.new('test.csv')
143
105
 
144
- transformer = mock('transformer')
145
- transformer.expects(:register).with(block)
106
+ job = Job.new
107
+ job.extract(extractor) do |ext|
108
+ ext.col_sep = '|'
109
+ end
146
110
 
147
- job = Drudgery::Job.new
148
- job.transform(transformer, &block)
149
- end
111
+ extractor.name.must_equal 'csv:test.csv'
112
+ extractor.col_sep.must_equal '|'
113
+ end
150
114
 
151
- it 'registers provided block with provided transformer' do
152
- transformer = mock('transformer')
153
- transformer.expects(:register).with { |data, cache| data }
115
+ it 'sets extractor' do
116
+ extractor = Extractors::CSVExtractor.new('test.csv')
154
117
 
155
- job = Drudgery::Job.new
156
- job.transform(transformer) { |data, cache| data }
118
+ job = Job.new
119
+ job.extract(extractor)
120
+ job.extractor.must_equal extractor
121
+ end
157
122
  end
158
123
  end
159
124
 
160
- describe 'when no transformer provided' do
161
- it 'sets transformer to default transformer' do
162
- transformer = stub('transformer', :register => nil)
125
+ describe '#transform' do
126
+ describe 'when transformer provided' do
127
+ it 'registers provided proc with provided transformer' do
128
+ block = Proc.new { |data, cache| data[:a] += 1; data }
163
129
 
164
- Drudgery::Transformer.expects(:new).returns(transformer)
130
+ transformer = Transformer.new
165
131
 
166
- job = Drudgery::Job.new
167
- job.transform
168
-
169
- job.instance_variable_get('@transformer').must_equal transformer
170
- end
132
+ job = Job.new
133
+ job.transform(transformer, &block)
171
134
 
172
- it 'registers provided proc with default transformer' do
173
- block = Proc.new { |data, cache| data }
174
-
175
- transformer = mock('transformer')
176
- transformer.expects(:register).with(block)
135
+ transformer.transform('a' => 1).must_equal({ :a => 2 })
136
+ end
177
137
 
178
- Drudgery::Transformer.stubs(:new).returns(transformer)
138
+ it 'registers provided block with provided transformer' do
139
+ transformer = Transformer.new
179
140
 
180
- job = Drudgery::Job.new
181
- job.transform(&block)
182
- end
141
+ job = Job.new
142
+ job.transform(transformer) { |data, cache| data[:a] += 2; data }
183
143
 
184
- it 'registers provided block with default transformer' do
185
- transformer = Drudgery::Transformer.new
186
- transformer.expects(:register).with { |data, cache| data }
187
-
188
- Drudgery::Transformer.stubs(:new).returns(transformer)
144
+ transformer.transform('a' => 1).must_equal({ :a => 3 })
145
+ end
189
146
 
190
- job = Drudgery::Job.new
191
- job.transform { |data, cache| data }
192
- end
193
- end
194
- end
147
+ it 'sets transformer' do
148
+ transformer = Transformer.new
195
149
 
196
- describe '#load' do
197
- describe 'when type and args provided' do
198
- it 'instantiates loader with type with args' do
199
- Drudgery::Loaders.expects(:instantiate).with(:sqlite3, 'db.sqlite3', 'tablename')
150
+ job = Job.new
151
+ job.transform(transformer)
200
152
 
201
- job = Drudgery::Job.new
202
- job.load(:sqlite3, 'db.sqlite3', 'tablename')
153
+ transformer.must_equal transformer
154
+ end
203
155
  end
204
156
 
205
- it 'yields loader if block_given' do
206
- loader = mock('loader')
207
- loader.expects(:select).with('a', 'b', 'c')
157
+ describe 'when no transformer provided' do
158
+ it 'registers provided proc with default transformer' do
159
+ block = Proc.new { |data, cache| data[:a] += 1; data }
208
160
 
209
- Drudgery::Loaders.stubs(:instantiate).with(:sqlite3, 'db.sqlite3', 'tablename').returns(loader)
210
-
211
- job = Drudgery::Job.new
212
- job.load(:sqlite3, 'db.sqlite3', 'tablename') do |loader|
213
- loader.select('a', 'b', 'c')
161
+ job = Job.new
162
+ job.transform(&block)
163
+ job.transformer.transform('a' => 1).must_equal({ :a => 2 })
214
164
  end
215
- end
216
165
 
217
- it 'sets loader' do
218
- loader = stub('loader')
166
+ it 'registers provided block with default transformer' do
167
+ job = Job.new
168
+ job.transform { |data, cache| data[:a] += 2; data }
169
+ job.transformer.transform('a' => 1).must_equal({ :a => 3 })
170
+ end
219
171
 
220
- Drudgery::Loaders.expects(:instantiate).with(:sqlite3, 'db.sqlite3', 'tablename').returns(loader)
221
172
 
222
- job = Drudgery::Job.new
223
- job.load(:sqlite3, 'db.sqlite3', 'tablename')
224
- job.instance_variable_get('@loader').must_equal loader
173
+ it 'sets transformer to default transformer' do
174
+ job = Job.new
175
+ job.transform
176
+ job.transformer.must_be_instance_of Transformer
177
+ end
225
178
  end
226
179
  end
227
180
 
228
- describe 'when loader provided' do
229
- it 'does not instantiate loader with type with args' do
230
- loader = stub('loader')
181
+ describe '#load' do
182
+ describe 'when type and args provided' do
183
+ it 'instantiates loader with type with args' do
184
+ job = Job.new
185
+ job.load(:csv, 'test.csv', :col_sep => '|')
231
186
 
232
- Drudgery::Loaders.expects(:instantiate).never
233
-
234
- job = Drudgery::Job.new
235
- job.load(loader)
236
- end
187
+ job.loader.name.must_equal 'csv:test.csv'
188
+ job.loader.col_sep.must_equal '|'
189
+ end
237
190
 
238
- it 'yields loader if block_given' do
239
- loader = mock('loader')
240
- loader.expects(:select).with('a', 'b', 'c')
191
+ it 'yields loader if block_given' do
192
+ job = Job.new
193
+ job.load(:csv, 'test.csv') do |loader|
194
+ loader.col_sep = '|'
195
+ end
241
196
 
242
- job = Drudgery::Job.new
243
- job.load(loader) do |loader|
244
- loader.select('a', 'b', 'c')
197
+ job.loader.name.must_equal 'csv:test.csv'
198
+ job.loader.col_sep.must_equal '|'
245
199
  end
246
- end
247
200
 
248
- it 'sets loader' do
249
- loader = stub('loader')
201
+ it 'sets loader' do
202
+ job = Job.new
203
+ job.load(:csv, 'test.csv', :col_sep => '|')
250
204
 
251
- job = Drudgery::Job.new
252
- job.load(loader)
253
- job.instance_variable_get('@loader').must_equal loader
205
+ job.loader.wont_be_nil
206
+ job.loader.name.must_equal 'csv:test.csv'
207
+ job.loader.col_sep.must_equal '|'
208
+ end
254
209
  end
255
- end
256
- end
257
-
258
- def mock_logger
259
- stub('job_logger', :log => nil, :log_with_progress => nil)
260
- end
261
-
262
- def stub_logging
263
-
264
- end
265
-
266
- describe '#perform' do
267
- before(:each) do
268
- Drudgery.show_progress = false
269
- Drudgery::JobLogger.stubs(:new).returns(mock_logger)
270
- end
271
-
272
- it 'extracts records from extractor' do
273
- extractor = stub('extractor', :record_count => 1, :name => 'extractor')
274
- extractor.expects(:extract).yields([{ 'a' => 1 }, 0])
275
-
276
- loader = stub('loader', :name => 'loader', :load => nil)
277
-
278
- job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
279
-
280
- job.perform
281
- end
282
-
283
- it 'transforms records with transformer' do
284
- extractor = stub('extractor', :record_count => 1, :name => 'extractor')
285
- extractor.stubs(:extract).yields([{ 'a' => 1 }, 0])
286
-
287
- transformer = mock('transformer')
288
- transformer.expects(:transform).with({ 'a' => 1 }).returns({ :a => 1 })
289
-
290
- loader = stub('loader', :name => 'loader', :load => nil)
291
-
292
- job = Drudgery::Job.new(:extractor => extractor, :transformer => transformer, :loader => loader)
293
210
 
294
- job.perform
295
- end
296
-
297
- it 'skips nil records' do
298
- extractor = stub('extractor', :record_count => 1, :name => 'extractor')
299
- extractor.stubs(:extract).yields([{ 'a' => 1 }, 0])
300
-
301
- transformer = mock('transformer')
302
- transformer.expects(:transform).with({ 'a' => 1 }).returns(nil)
303
-
304
- loader = stub('loader', :name => 'loader')
305
- loader.expects(:load).with([{ '1' => 1 }]).never
306
-
307
- job = Drudgery::Job.new(:extractor => extractor, :transformer => transformer, :loader => loader)
308
-
309
- job.perform
310
- end
211
+ describe 'when loader provided' do
212
+ it 'yields loader if block_given' do
213
+ loader = Loaders::CSVLoader.new('test.csv')
311
214
 
312
- it 'does not load empty records' do
313
- extractor = stub('extractor', :record_count => 1, :name => 'extractor')
314
- extractor.stubs(:extract)
215
+ job = Job.new
216
+ job.load(loader) do |loader|
217
+ loader.col_sep = '|'
218
+ end
315
219
 
316
- loader = stub('loader', :name => 'loader')
317
- loader.expects(:load).with([]).never
318
-
319
- job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
320
-
321
- job.perform
322
- end
323
-
324
- it 'loads records with loader in batches' do
325
- extractor = stub('extractor', :record_count => 3, :name => 'extractor')
326
- extractor.stubs(:extract).multiple_yields([{ 'a' => 1 }, 0], [{ 'b' => 2 }, 1], [{ 'c' => 3 }, 2])
327
-
328
- loader = stub('loader', :name => 'loader')
329
- loader.expects(:load).with([{ 'a' => 1 }, { 'b' => 2 }])
330
- loader.expects(:load).with([{ 'c' => 3 }])
220
+ loader.name.must_equal 'csv:test.csv'
221
+ loader.col_sep.must_equal '|'
222
+ end
331
223
 
332
- job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
333
- job.batch_size 2
224
+ it 'sets loader' do
225
+ loader = Loaders::CSVLoader.new('test.csv')
334
226
 
335
- job.perform
227
+ job = Job.new
228
+ job.load(loader)
229
+ job.loader.must_equal loader
230
+ end
231
+ end
336
232
  end
337
233
 
338
- describe 'with progress on' do
339
- it 'tracks progress information' do
340
- Drudgery.show_progress = true
234
+ describe '#perform' do
235
+ before do
236
+ @source = 'tmp/source.csv'
237
+ @destination = 'tmp/destination.csv'
238
+ File.delete(@source) if File.exists?(@source)
239
+ File.delete(@destination) if File.exists?(@destination)
240
+
241
+ File.open(@source, 'w') do |f|
242
+ f.puts 'a,b'
243
+ f.puts '1,2'
244
+ f.puts '3,4'
245
+ f.puts '5,6'
246
+ end
341
247
 
342
- extractor = stub('extractor', :record_count => 3, :name => 'extractor')
343
- extractor.stubs(:extract).multiple_yields([{ 'a' => 1 }, 0], [{ 'b' => 2 }, 1], [{ 'c' => 3 }, 2])
248
+ @extractor = Extractors::CSVExtractor.new(@source)
249
+ @loader = Loaders::CSVLoader.new(@destination)
344
250
 
345
- loader = stub('loader', :name => 'loader', :load => nil)
251
+ @job = Job.new(:extractor => @extractor, :loader => @loader, :transformer => @transformer)
252
+ end
346
253
 
347
- job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
254
+ after do
255
+ File.delete(@source) if File.exists?(@source)
256
+ File.delete(@destination) if File.exists?(@destination)
257
+ end
348
258
 
349
- progress = mock('job_progress') do
350
- expects(:inc).times(3)
351
- expects(:finish)
352
- end
353
- Drudgery::JobProgress.stubs(:new).with(job.id, 3).returns(progress)
259
+ it 'sets started_at and completed_at' do
260
+ @job.perform
354
261
 
355
- job.perform
262
+ @job.started_at.must_be_instance_of Time
263
+ @job.completed_at.must_be_instance_of Time
264
+ @job.completed_at.must_be :>, @job.started_at
356
265
  end
357
- end
358
266
 
359
- describe 'with progress off' do
360
- it 'does not track progress information' do
361
- extractor = stub('extractor', :record_count => 3, :name => 'extractor')
362
- extractor.stubs(:extract).multiple_yields([{ 'a' => 1 }, 0], [{ 'b' => 2 }, 1], [{ 'c' => 3 }, 2])
267
+ it 'extracts records from extractor and loads records with loader' do
268
+ @job.perform
363
269
 
364
- loader = stub('loader', :name => 'loader', :load => nil)
270
+ records = File.readlines(@destination).map { |line| line.strip.split(',') }
271
+ records.must_equal [%w[a b], %w[1 2], %w[3 4], %w[5 6]]
272
+ end
365
273
 
366
- job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
274
+ it 'transforms records with transformer' do
275
+ transformer = Transformer.new
276
+ transformer.register Proc.new { |data, cache| data[:c] = 99; data }
367
277
 
368
- Drudgery::JobProgress.expects(:new).never
278
+ @job.transformer = transformer
279
+ @job.perform
369
280
 
370
- job.perform
281
+ records = File.readlines(@destination).map { |line| line.strip.split(',') }
282
+ records.must_equal [%w[a b c], %w[1 2 99], %w[3 4 99], %w[5 6 99]]
371
283
  end
372
- end
373
-
374
- it 'logs job details' do
375
- extractor = stub('extractor', :record_count => 3, :name => 'extractor')
376
- extractor.stubs(:extract).multiple_yields([{ 'a' => 1 }, 0], [{ 'b' => 2 }, 1], [{ 'c' => 3 }, 2])
377
284
 
378
- loader = stub('loader', :name => 'loader', :load => nil)
285
+ it 'skips nil records' do
286
+ transformer = Transformer.new
287
+ transformer.register Proc.new { |data, cache| data[:a] == '1' ? nil : data }
379
288
 
380
- job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
381
- job.batch_size 2
289
+ @job.transformer = transformer
290
+ @job.perform
382
291
 
383
- Benchmark.stubs(:realtime).returns(1.25333).yields
292
+ records = File.readlines(@destination).map { |line| line.strip.split(',') }
293
+ records.must_equal [%w[a b], %w[3 4], %w[5 6]]
294
+ end
384
295
 
385
- logger = mock_logger
386
- logger.expects(:log_with_progress).with(:info, "extractor => loader")
296
+ it 'does not load empty records' do
297
+ transformer = Transformer.new
298
+ transformer.register Proc.new { |data, cache| nil}
387
299
 
388
- logger.expects(:log).with(:debug, "Extracting Record -- Index: 0")
389
- logger.expects(:log).with(:debug, "#{{ 'a' => 1 }.inspect}")
390
- logger.expects(:log).with(:debug, "Transforming Record -- Index: 0")
391
- logger.expects(:log).with(:debug, "#{{ 'a' => 1 }.inspect}")
392
- logger.expects(:log).with(:debug, "Extracting Record -- Index: 1")
393
- logger.expects(:log).with(:debug, "#{{ 'b' => 2 }.inspect}")
394
- logger.expects(:log).with(:debug, "Transforming Record -- Index: 1")
395
- logger.expects(:log).with(:debug, "#{{ 'b' => 2 }.inspect}")
396
- logger.expects(:log).with(:debug, "Loading Records -- Count: 2")
397
- logger.expects(:log).with(:debug, "#{[{ 'a' => 1 }, { 'b' => 2 }].inspect}")
300
+ @loader.expects(:load).never
398
301
 
399
- logger.expects(:log).with(:debug, "Extracting Record -- Index: 2")
400
- logger.expects(:log).with(:debug, "#{{ 'c' => 3 }.inspect}")
401
- logger.expects(:log).with(:debug, "Transforming Record -- Index: 2")
402
- logger.expects(:log).with(:debug, "#{{ 'c' => 3 }.inspect}")
403
- logger.expects(:log).with(:debug, "Loading Records -- Count: 1")
404
- logger.expects(:log).with(:debug, "#{[{ 'c' => 3 }].inspect}")
302
+ @job.transformer = transformer
303
+ @job.perform
304
+ end
405
305
 
406
- logger.expects(:log_with_progress).with(:info, "Completed in 1.25s\n\n")
306
+ it 'loads records with loader in batches' do
307
+ @job.batch_size = 2
407
308
 
408
- Drudgery::JobLogger.stubs(:new).returns(logger)
309
+ @loader.expects(:load).with([{ 'a' => '1', 'b' => '2' }, { 'a' => '3', 'b' => '4' }])
310
+ @loader.expects(:load).with([{ 'a' => '5', 'b' => '6' }])
409
311
 
410
- job.perform
312
+ @job.perform
313
+ end
411
314
  end
412
315
  end
413
316
  end