drudgery 0.0.3 → 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.
@@ -3,13 +3,20 @@ require 'spec_helper'
3
3
  describe Drudgery::Job do
4
4
  describe '#initialize' do
5
5
  before(:each) do
6
- @extractor = mock
7
- @transformer = mock
8
- @loader = mock
6
+ @extractor = stub('extractor')
7
+ @transformer = stub('transformer')
8
+ @loader = stub('loader')
9
+
10
+ @now = Time.now
11
+ Time.stubs(:now).returns(@now)
9
12
 
10
13
  @job = Drudgery::Job.new(:extractor => @extractor, :transformer => @transformer, :loader => @loader)
11
14
  end
12
15
 
16
+ it 'sets job id to nsec time' do
17
+ @job.id.must_equal @now.nsec
18
+ end
19
+
13
20
  it 'sets extractor, transformer, and loader with provided arguments' do
14
21
  @job.instance_variable_get('@extractor').must_equal @extractor
15
22
  @job.instance_variable_get('@transformer').must_equal @transformer
@@ -38,6 +45,16 @@ describe Drudgery::Job do
38
45
  end
39
46
  end
40
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
+
41
58
  describe '#batch_size' do
42
59
  it 'sets batch_size to provided value' do
43
60
  job = Drudgery::Job.new
@@ -56,7 +73,7 @@ describe Drudgery::Job do
56
73
  end
57
74
 
58
75
  it 'yields extractor if block_given' do
59
- extractor = mock
76
+ extractor = mock('extractor')
60
77
  extractor.expects(:col_sep).with('|')
61
78
 
62
79
  Drudgery::Extractors.stubs(:instantiate).returns(extractor)
@@ -68,7 +85,7 @@ describe Drudgery::Job do
68
85
  end
69
86
 
70
87
  it 'sets extractor' do
71
- extractor = mock
88
+ extractor = stub('extractor')
72
89
 
73
90
  Drudgery::Extractors.stubs(:instantiate).returns(extractor)
74
91
 
@@ -81,7 +98,7 @@ describe Drudgery::Job do
81
98
 
82
99
  describe 'when extractor provided' do
83
100
  it 'does not instantiat extractor with type and args' do
84
- extractor = mock
101
+ extractor = stub('extractor')
85
102
 
86
103
  Drudgery::Extractors.expects(:instantiate).never
87
104
 
@@ -90,7 +107,7 @@ describe Drudgery::Job do
90
107
  end
91
108
 
92
109
  it 'yields extractor if block_given' do
93
- extractor = mock
110
+ extractor = mock('extractor')
94
111
  extractor.expects(:col_sep).with('|')
95
112
 
96
113
  job = Drudgery::Job.new
@@ -100,7 +117,7 @@ describe Drudgery::Job do
100
117
  end
101
118
 
102
119
  it 'sets extractor' do
103
- extractor = mock
120
+ extractor = stub('extractor')
104
121
 
105
122
  job = Drudgery::Job.new
106
123
  job.extract(extractor)
@@ -113,8 +130,7 @@ describe Drudgery::Job do
113
130
  describe '#transform' do
114
131
  describe 'when transformer provided' do
115
132
  it 'sets transformer to provided transformer' do
116
- transformer = mock
117
- transformer.stubs(:register)
133
+ transformer = stub('transformer', :register => nil)
118
134
 
119
135
  job = Drudgery::Job.new
120
136
  job.transform(transformer)
@@ -125,7 +141,7 @@ describe Drudgery::Job do
125
141
  it 'registers provided proc with provided transformer' do
126
142
  block = Proc.new { |data, cache| data }
127
143
 
128
- transformer = mock
144
+ transformer = mock('transformer')
129
145
  transformer.expects(:register).with(block)
130
146
 
131
147
  job = Drudgery::Job.new
@@ -133,7 +149,7 @@ describe Drudgery::Job do
133
149
  end
134
150
 
135
151
  it 'registers provided block with provided transformer' do
136
- transformer = mock
152
+ transformer = mock('transformer')
137
153
  transformer.expects(:register).with { |data, cache| data }
138
154
 
139
155
  job = Drudgery::Job.new
@@ -143,11 +159,10 @@ describe Drudgery::Job do
143
159
 
144
160
  describe 'when no transformer provided' do
145
161
  it 'sets transformer to default transformer' do
146
- transformer = mock
147
- transformer.stubs(:register)
148
-
162
+ transformer = stub('transformer', :register => nil)
163
+
149
164
  Drudgery::Transformer.expects(:new).returns(transformer)
150
-
165
+
151
166
  job = Drudgery::Job.new
152
167
  job.transform
153
168
 
@@ -157,9 +172,9 @@ describe Drudgery::Job do
157
172
  it 'registers provided proc with default transformer' do
158
173
  block = Proc.new { |data, cache| data }
159
174
 
160
- transformer = mock
175
+ transformer = mock('transformer')
161
176
  transformer.expects(:register).with(block)
162
-
177
+
163
178
  Drudgery::Transformer.stubs(:new).returns(transformer)
164
179
 
165
180
  job = Drudgery::Job.new
@@ -188,7 +203,7 @@ describe Drudgery::Job do
188
203
  end
189
204
 
190
205
  it 'yields loader if block_given' do
191
- loader = mock
206
+ loader = mock('loader')
192
207
  loader.expects(:select).with('a', 'b', 'c')
193
208
 
194
209
  Drudgery::Loaders.stubs(:instantiate).with(:sqlite3, 'db.sqlite3', 'tablename').returns(loader)
@@ -200,7 +215,7 @@ describe Drudgery::Job do
200
215
  end
201
216
 
202
217
  it 'sets loader' do
203
- loader = mock
218
+ loader = stub('loader')
204
219
 
205
220
  Drudgery::Loaders.expects(:instantiate).with(:sqlite3, 'db.sqlite3', 'tablename').returns(loader)
206
221
 
@@ -212,7 +227,7 @@ describe Drudgery::Job do
212
227
 
213
228
  describe 'when loader provided' do
214
229
  it 'does not instantiate loader with type with args' do
215
- loader = mock
230
+ loader = stub('loader')
216
231
 
217
232
  Drudgery::Loaders.expects(:instantiate).never
218
233
 
@@ -221,7 +236,7 @@ describe Drudgery::Job do
221
236
  end
222
237
 
223
238
  it 'yields loader if block_given' do
224
- loader = mock
239
+ loader = mock('loader')
225
240
  loader.expects(:select).with('a', 'b', 'c')
226
241
 
227
242
  job = Drudgery::Job.new
@@ -231,7 +246,7 @@ describe Drudgery::Job do
231
246
  end
232
247
 
233
248
  it 'sets loader' do
234
- loader = mock
249
+ loader = stub('loader')
235
250
 
236
251
  job = Drudgery::Job.new
237
252
  job.load(loader)
@@ -240,13 +255,25 @@ describe Drudgery::Job do
240
255
  end
241
256
  end
242
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
+
243
266
  describe '#perform' do
267
+ before(:each) do
268
+ Drudgery.show_progress = false
269
+ Drudgery::JobLogger.stubs(:new).returns(mock_logger)
270
+ end
271
+
244
272
  it 'extracts records from extractor' do
245
- extractor = mock
246
- extractor.expects(:extract).yields({ 'a' => 1 })
273
+ extractor = stub('extractor', :record_count => 1, :name => 'extractor')
274
+ extractor.expects(:extract).yields([{ 'a' => 1 }, 0])
247
275
 
248
- loader = mock
249
- loader.stubs(:load)
276
+ loader = stub('loader', :name => 'loader', :load => nil)
250
277
 
251
278
  job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
252
279
 
@@ -254,25 +281,51 @@ describe Drudgery::Job do
254
281
  end
255
282
 
256
283
  it 'transforms records with transformer' do
257
- extractor = mock
258
- extractor.stubs(:extract).yields({ 'a' => 1 })
284
+ extractor = stub('extractor', :record_count => 1, :name => 'extractor')
285
+ extractor.stubs(:extract).yields([{ 'a' => 1 }, 0])
259
286
 
260
- transformer = mock
287
+ transformer = mock('transformer')
261
288
  transformer.expects(:transform).with({ 'a' => 1 }).returns({ :a => 1 })
262
289
 
263
- loader = mock
264
- loader.stubs(:load)
290
+ loader = stub('loader', :name => 'loader', :load => nil)
265
291
 
266
292
  job = Drudgery::Job.new(:extractor => extractor, :transformer => transformer, :loader => loader)
267
293
 
268
294
  job.perform
269
295
  end
270
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
311
+
312
+ it 'does not load empty records' do
313
+ extractor = stub('extractor', :record_count => 1, :name => 'extractor')
314
+ extractor.stubs(:extract)
315
+
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
+
271
324
  it 'loads records with loader in batches' do
272
- extractor = mock
273
- extractor.stubs(:extract).multiple_yields([{ 'a' => 1 }], [{ 'b' => 2 }], [{ 'c' => 3 }])
325
+ extractor = stub('extractor', :record_count => 3, :name => 'extractor')
326
+ extractor.stubs(:extract).multiple_yields([{ 'a' => 1 }, 0], [{ 'b' => 2 }, 1], [{ 'c' => 3 }, 2])
274
327
 
275
- loader = mock
328
+ loader = stub('loader', :name => 'loader')
276
329
  loader.expects(:load).with([{ 'a' => 1 }, { 'b' => 2 }])
277
330
  loader.expects(:load).with([{ 'c' => 3 }])
278
331
 
@@ -281,5 +334,80 @@ describe Drudgery::Job do
281
334
 
282
335
  job.perform
283
336
  end
337
+
338
+ describe 'with progress on' do
339
+ it 'tracks progress information' do
340
+ Drudgery.show_progress = true
341
+
342
+ extractor = stub('extractor', :record_count => 3, :name => 'extractor')
343
+ extractor.stubs(:extract).multiple_yields([{ 'a' => 1 }, 0], [{ 'b' => 2 }, 1], [{ 'c' => 3 }, 2])
344
+
345
+ loader = stub('loader', :name => 'loader', :load => nil)
346
+
347
+ job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
348
+
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)
354
+
355
+ job.perform
356
+ end
357
+ end
358
+
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])
363
+
364
+ loader = stub('loader', :name => 'loader', :load => nil)
365
+
366
+ job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
367
+
368
+ Drudgery::JobProgress.expects(:new).never
369
+
370
+ job.perform
371
+ 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
+
378
+ loader = stub('loader', :name => 'loader', :load => nil)
379
+
380
+ job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
381
+ job.batch_size 2
382
+
383
+ Benchmark.stubs(:realtime).returns(1.25333).yields
384
+
385
+ logger = mock_logger
386
+ logger.expects(:log_with_progress).with(:info, "extractor => loader")
387
+
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}")
398
+
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}")
405
+
406
+ logger.expects(:log_with_progress).with(:info, "Completed in 1.25s\n\n")
407
+
408
+ Drudgery::JobLogger.stubs(:new).returns(logger)
409
+
410
+ job.perform
411
+ end
284
412
  end
285
413
  end
@@ -5,13 +5,22 @@ require 'activerecord-import'
5
5
  describe Drudgery::Loaders::ActiveRecordImportLoader do
6
6
  class Record < ActiveRecord::Base; end
7
7
 
8
+ def mock_model
9
+ stub('model', :name => 'Record')
10
+ end
11
+
8
12
  describe '#initialize' do
9
13
  it 'sets model to provided argument' do
10
- model = mock
14
+ model = mock_model
11
15
 
12
16
  loader = Drudgery::Loaders::ActiveRecordImportLoader.new(model)
13
17
  loader.instance_variable_get('@model').must_equal model
14
18
  end
19
+
20
+ it 'sets name to active_record_import:<model name>' do
21
+ loader = Drudgery::Loaders::ActiveRecordImportLoader.new(mock_model)
22
+ loader.name.must_equal 'active_record_import:Record'
23
+ end
15
24
  end
16
25
 
17
26
  describe '#load' do
@@ -19,27 +28,29 @@ describe Drudgery::Loaders::ActiveRecordImportLoader do
19
28
  record1 = { :a => 1, :b => 2 }
20
29
  record2 = { :a => 3, :b => 4 }
21
30
 
22
- model = mock
31
+ model = mock_model
23
32
  model.expects(:import).with([:a, :b], [[1, 2], [3, 4]], :validate => false)
24
33
 
25
34
  loader = Drudgery::Loaders::ActiveRecordImportLoader.new(model)
26
35
  loader.load([record1, record2])
27
36
  end
37
+ end
28
38
 
29
- describe 'without stubs' do
30
- before(:each) do
31
- ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
32
- ActiveRecord::Base.connection.create_table(:records) do |t|
33
- t.integer :a
34
- t.integer :b
35
- end
39
+ describe 'without stubs' do
40
+ before(:each) do
41
+ ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
42
+ ActiveRecord::Base.connection.create_table(:records) do |t|
43
+ t.integer :a
44
+ t.integer :b
36
45
  end
46
+ end
37
47
 
38
- after(:each) do
39
- ActiveRecord::Base.clear_active_connections!
40
- end
48
+ after(:each) do
49
+ ActiveRecord::Base.clear_active_connections!
50
+ end
41
51
 
42
- it 'yields each record as a hash' do
52
+ describe '#load' do
53
+ it 'writes records using model.import' do
43
54
  record1 = { :a => 1, :b => 2 }
44
55
  record2 = { :a => 3, :b => 4 }
45
56
 
@@ -4,13 +4,22 @@ require 'active_record'
4
4
  describe Drudgery::Loaders::ActiveRecordLoader do
5
5
  class Record < ActiveRecord::Base; end
6
6
 
7
+ def mock_model
8
+ stub('model', :name => 'Record')
9
+ end
10
+
7
11
  describe '#initialize' do
8
12
  it 'sets model to provided argument' do
9
- model = mock
13
+ model = mock_model
10
14
 
11
15
  loader = Drudgery::Loaders::ActiveRecordLoader.new(model)
12
16
  loader.instance_variable_get('@model').must_equal model
13
17
  end
18
+
19
+ it 'sets name to active_record:<model name>' do
20
+ loader = Drudgery::Loaders::ActiveRecordLoader.new(mock_model)
21
+ loader.name.must_equal 'active_record:Record'
22
+ end
14
23
  end
15
24
 
16
25
  describe '#load' do
@@ -18,10 +27,10 @@ describe Drudgery::Loaders::ActiveRecordLoader do
18
27
  record1 = { :a => 1 }
19
28
  record2 = { :a => 2 }
20
29
 
21
- obj1 = mock
22
- obj2 = mock
30
+ obj1 = mock('obj1')
31
+ obj2 = mock('obj2')
23
32
 
24
- model = mock
33
+ model = mock_model
25
34
  model.expects(:new).with(record1).returns(obj1)
26
35
  model.expects(:new).with(record2).returns(obj2)
27
36
 
@@ -31,21 +40,23 @@ describe Drudgery::Loaders::ActiveRecordLoader do
31
40
  loader = Drudgery::Loaders::ActiveRecordLoader.new(model)
32
41
  loader.load([record1, record2])
33
42
  end
43
+ end
34
44
 
35
- describe 'without stubs' do
36
- before(:each) do
37
- ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
38
- ActiveRecord::Base.connection.create_table(:records) do |t|
39
- t.integer :a
40
- t.integer :b
41
- end
45
+ describe 'without stubs' do
46
+ before(:each) do
47
+ ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
48
+ ActiveRecord::Base.connection.create_table(:records) do |t|
49
+ t.integer :a
50
+ t.integer :b
42
51
  end
52
+ end
43
53
 
44
- after(:each) do
45
- ActiveRecord::Base.clear_active_connections!
46
- end
54
+ after(:each) do
55
+ ActiveRecord::Base.clear_active_connections!
56
+ end
47
57
 
48
- it 'yields each record as a hash' do
58
+ describe '#load' do
59
+ it 'writes records using model.create' do
49
60
  record1 = { :a => 1, :b => 2 }
50
61
  record2 = { :a => 3, :b => 4 }
51
62
 
@@ -18,6 +18,11 @@ describe Drudgery::Loaders::CSVLoader do
18
18
  loader = Drudgery::Loaders::CSVLoader.new('file.csv', options)
19
19
  loader.instance_variable_get('@options').must_equal({ :col_sep => '|' })
20
20
  end
21
+
22
+ it 'sets name to csv:<file base name>' do
23
+ loader = Drudgery::Loaders::CSVLoader.new('tmp/file.csv')
24
+ loader.name.must_equal 'csv:file.csv'
25
+ end
21
26
  end
22
27
 
23
28
  describe '#load' do
@@ -33,7 +38,7 @@ describe Drudgery::Loaders::CSVLoader do
33
38
  record2 = { :a => 3, :b => 4 }
34
39
  record3 = { :a => 5, :b => 6 }
35
40
 
36
- csv = mock
41
+ csv = mock('csv')
37
42
  csv.expects(:<<).with([:a, :b])
38
43
  csv.expects(:<<).with([1, 2])
39
44
  csv.expects(:<<).with([3, 4])
@@ -45,16 +50,18 @@ describe Drudgery::Loaders::CSVLoader do
45
50
  loader.load([record1, record2])
46
51
  loader.load([record3])
47
52
  end
53
+ end
48
54
 
49
- describe 'without stubs' do
50
- before(:each) do
51
- File.delete('file.csv') if File.exists?('file.csv')
52
- end
55
+ describe 'without stubs' do
56
+ before(:each) do
57
+ File.delete('file.csv') if File.exists?('file.csv')
58
+ end
53
59
 
54
- after(:each) do
55
- File.delete('file.csv') if File.exists?('file.csv')
56
- end
60
+ after(:each) do
61
+ File.delete('file.csv') if File.exists?('file.csv')
62
+ end
57
63
 
64
+ describe '#load' do
58
65
  it 'writes hash keys as header and records as rows' do
59
66
  record1 = { :a => 1, :b => 2 }
60
67
  record2 = { :a => 3, :b => 4 }
@@ -1,14 +1,37 @@
1
1
  require 'spec_helper'
2
+ require 'sqlite3'
2
3
 
3
4
  describe Drudgery::Loaders::SQLite3Loader do
5
+
6
+ def mock_db
7
+ stub('db', :database_list => [{ 'name' => 'main', 'file' => '' }], :results_as_hash= => nil, :type_translation= => nil)
8
+ end
9
+
4
10
  describe '#initialize' do
5
11
  it 'sets db to SQLite3 database using provided db name and table to provided table name' do
6
- db = mock
12
+ db = mock_db
7
13
 
8
14
  loader = Drudgery::Loaders::SQLite3Loader.new(db, 'tablename')
9
15
  loader.instance_variable_get('@db').must_equal db
10
16
  loader.instance_variable_get('@table').must_equal 'tablename'
11
17
  end
18
+
19
+ describe 'with in memory db' do
20
+ it 'sets name to sqlite3:memory:<table name>' do
21
+ loader = Drudgery::Loaders::SQLite3Loader.new(mock_db, 'tablename')
22
+ loader.name.must_equal 'sqlite3:memory.tablename'
23
+ end
24
+ end
25
+
26
+ describe 'with file based db' do
27
+ it 'sets name to sqlite3:<main db name>:<table name>' do
28
+ db = mock_db
29
+ db.expects(:database_list).returns([{ 'name' => 'main', 'file' => 'db/test.sqlite3.db' }])
30
+
31
+ loader = Drudgery::Loaders::SQLite3Loader.new(db, 'tablename')
32
+ loader.name.must_equal 'sqlite3:test.tablename'
33
+ end
34
+ end
12
35
  end
13
36
 
14
37
  describe '#load' do
@@ -16,7 +39,7 @@ describe Drudgery::Loaders::SQLite3Loader do
16
39
  record1 = { :a => 1, :b => 2 }
17
40
  record2 = { :a => 3, :b => 4 }
18
41
 
19
- db = mock
42
+ db = mock_db
20
43
  db.expects(:transaction).yields(db)
21
44
  db.expects(:execute).with('INSERT INTO tablename (a, b) VALUES (?, ?)', [1, 2])
22
45
  db.expects(:execute).with('INSERT INTO tablename (a, b) VALUES (?, ?)', [3, 4])
@@ -24,17 +47,26 @@ describe Drudgery::Loaders::SQLite3Loader do
24
47
  loader = Drudgery::Loaders::SQLite3Loader.new(db, 'tablename')
25
48
  loader.load([record1, record2])
26
49
  end
50
+ end
27
51
 
28
- describe 'without stubs' do
29
- before(:each) do
30
- @db = SQLite3::Database.new(':memory:')
31
- @db.execute('CREATE TABLE records (a INTEGER, b INTEGER)')
32
- end
52
+ describe 'without stubs' do
53
+ before(:each) do
54
+ @db = SQLite3::Database.new(':memory:')
55
+ @db.execute('CREATE TABLE records (a INTEGER, b INTEGER)')
56
+ end
33
57
 
34
- after(:each) do
35
- @db.close
58
+ after(:each) do
59
+ @db.close
60
+ end
61
+
62
+ describe '#initialize' do
63
+ it 'sets name to sqlite3:memory:records' do
64
+ loader = Drudgery::Loaders::SQLite3Loader.new(@db, 'records')
65
+ loader.name.must_equal 'sqlite3:memory.records'
36
66
  end
67
+ end
37
68
 
69
+ describe '#load' do
38
70
  it 'writes each record in single transaction' do
39
71
  record1 = { :a => 1, :b => 2 }
40
72
  record2 = { :a => 3, :b => 4 }
@@ -48,8 +80,8 @@ describe Drudgery::Loaders::SQLite3Loader do
48
80
  end
49
81
 
50
82
  results.must_equal([
51
- [1, 2],
52
- [3, 4]
83
+ { 'a' => 1, 'b' => 2, 0 => 1, 1 => 2 },
84
+ { 'a' => 3, 'b' => 4, 0 => 3, 1 => 4}
53
85
  ])
54
86
  end
55
87
  end
@@ -13,7 +13,7 @@ describe Drudgery::Manager do
13
13
 
14
14
  describe '#prepare' do
15
15
  it 'adds obj to jobs array' do
16
- job = mock
16
+ job = stub('job')
17
17
 
18
18
  @manager.prepare(job)
19
19
  @manager.instance_variable_get('@jobs').must_include job
@@ -22,13 +22,9 @@ describe Drudgery::Manager do
22
22
 
23
23
  describe '#run' do
24
24
  it 'performs each job' do
25
- job1 = mock
26
- job1.expects(:perform)
27
-
28
- job2 = mock
29
- job2.expects(:perform)
30
-
31
- job3 = mock
25
+ job1 = mock('job1', :perform => nil)
26
+ job2 = mock('job2', :perform => nil)
27
+ job3 = mock('job3')
32
28
  job3.expects(:perform).never
33
29
 
34
30
  @manager.prepare(job1)