ruport 0.6.1 → 0.7.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.
Files changed (83) hide show
  1. data/AUTHORS +6 -0
  2. data/Rakefile +4 -4
  3. data/TODO +3 -2
  4. data/bin/rope +2 -103
  5. data/examples/pdf_complex_report.rb +53 -0
  6. data/lib/ruport/config.rb +7 -7
  7. data/lib/ruport/data/collection.rb +8 -7
  8. data/lib/ruport/data/groupable.rb +3 -2
  9. data/lib/ruport/data/record.rb +13 -16
  10. data/lib/ruport/data/table.rb +89 -18
  11. data/lib/ruport/format/csv.rb +29 -0
  12. data/lib/ruport/format/html.rb +40 -0
  13. data/lib/ruport/format/latex.rb +50 -0
  14. data/lib/ruport/format/pdf.rb +78 -0
  15. data/lib/ruport/format/plugin.rb +20 -65
  16. data/lib/ruport/format/svg.rb +39 -0
  17. data/lib/ruport/format/text.rb +77 -0
  18. data/lib/ruport/format/xml.rb +32 -0
  19. data/lib/ruport/format.rb +1 -159
  20. data/lib/ruport/generator.rb +158 -0
  21. data/lib/ruport/layout/component.rb +7 -0
  22. data/lib/ruport/layout.rb +1 -0
  23. data/lib/ruport/query.rb +3 -3
  24. data/lib/ruport/renderer/graph.rb +48 -0
  25. data/lib/ruport/renderer/table.rb +132 -0
  26. data/lib/ruport/renderer.rb +193 -0
  27. data/lib/ruport/report/graph.rb +2 -2
  28. data/lib/ruport/report.rb +94 -96
  29. data/lib/ruport/system_extensions.rb +3 -6
  30. data/lib/ruport.rb +6 -4
  31. data/test/samples/dates.csv +1409 -0
  32. data/test/samples/foo.rtxt +3 -0
  33. data/test/test_collection.rb +0 -14
  34. data/test/test_config.rb +6 -6
  35. data/test/test_graph_renderer.rb +97 -0
  36. data/test/test_groupable.rb +1 -0
  37. data/test/test_query.rb +325 -324
  38. data/test/test_record.rb +3 -2
  39. data/test/test_renderer.rb +74 -0
  40. data/test/test_report.rb +29 -26
  41. data/test/test_table.rb +54 -29
  42. data/test/test_table_renderer.rb +93 -0
  43. data/test/test_text_table.rb +61 -0
  44. data/test/unit.log +24 -0
  45. metadata +41 -63
  46. data/CHANGELOG +0 -587
  47. data/examples/basic_grouping.rb +0 -19
  48. data/examples/fieldless_table.rb +0 -13
  49. data/examples/latex_table.rb +0 -17
  50. data/examples/line_graph.rb +0 -22
  51. data/examples/line_graph_report.rb +0 -23
  52. data/examples/line_plotter.rb +0 -46
  53. data/examples/long.txt +0 -24
  54. data/examples/new_plugin.rb +0 -24
  55. data/examples/report.rb +0 -35
  56. data/examples/sample_invoice_report.rb +0 -32
  57. data/examples/simple_mail.rb +0 -15
  58. data/examples/simple_table_interface.rb +0 -20
  59. data/examples/sql_erb.rb +0 -20
  60. data/examples/template.rb +0 -15
  61. data/examples/text_processors.rb +0 -13
  62. data/lib/ruport/format/engine/document.rb +0 -28
  63. data/lib/ruport/format/engine/graph.rb +0 -18
  64. data/lib/ruport/format/engine/invoice.rb +0 -23
  65. data/lib/ruport/format/engine/table.rb +0 -54
  66. data/lib/ruport/format/engine.rb +0 -108
  67. data/lib/ruport/format/plugin/csv_plugin.rb +0 -26
  68. data/lib/ruport/format/plugin/html_plugin.rb +0 -32
  69. data/lib/ruport/format/plugin/latex_plugin.rb +0 -50
  70. data/lib/ruport/format/plugin/pdf_plugin.rb +0 -126
  71. data/lib/ruport/format/plugin/svg_plugin.rb +0 -61
  72. data/lib/ruport/format/plugin/text_plugin.rb +0 -77
  73. data/lib/ruport/meta_tools.rb +0 -66
  74. data/lib/ruport/report/invoice.rb +0 -29
  75. data/test/_test_groupable.rb +0 -0
  76. data/test/test_format.rb +0 -39
  77. data/test/test_format_engine.rb +0 -264
  78. data/test/test_graph.rb +0 -93
  79. data/test/test_invoice.rb +0 -32
  80. data/test/test_latex.rb +0 -20
  81. data/test/test_meta_tools.rb +0 -14
  82. data/test/test_plugin.rb +0 -277
  83. data/test/ts_all.rb +0 -21
data/test/test_query.rb CHANGED
@@ -1,35 +1,35 @@
1
- require "test/unit"
2
- require "ruport"
3
-
4
- begin
5
- require 'mocha'
6
- require 'stubba'
7
- require 'dbi'
8
- rescue LoadError
9
- $stderr.puts "Warning: Mocha not found -- skipping some Query tests"
10
- end
11
-
12
- class TestQuery < Test::Unit::TestCase
13
- def setup
14
- @sources = {
15
- :default => {
16
- :dsn => 'ruport:test', :user => 'greg', :password => 'apple' },
17
- :alternative => {
18
- :dsn => "ruport:test2", :user => "sandal", :password => "harmonix" },
19
- }
20
- Ruport::Config.source :default, @sources[:default]
21
- Ruport::Config.source :alternative, @sources[:alternative]
22
-
23
- @columns = %w(a b c)
24
- @data = [ [[1,2,3],[4,5,6],[7,8,9]],
25
- [[9,8,7],[6,5,4],[3,2,1]],
26
- [[7,8,9],[4,5,6],[1,2,3]], ]
27
- @datasets = @data.dup
28
-
29
- @sql = [ "select * from foo", "create table foo ..." ]
30
- @sql << @sql.values_at(0, 0).join(";\n")
31
- @sql << @sql.values_at(1, 0).join(";\n")
32
- @query = {
1
+ require "test/unit"
2
+ require "ruport"
3
+
4
+ begin
5
+ require 'mocha'
6
+ require 'stubba'
7
+ require 'dbi'
8
+ rescue LoadError
9
+ $stderr.puts "Warning: Mocha not found -- skipping some Query tests"
10
+ end
11
+
12
+ class TestQuery < Test::Unit::TestCase
13
+ def setup
14
+ @sources = {
15
+ :default => {
16
+ :dsn => 'ruport:test', :user => 'greg', :password => 'apple' },
17
+ :alternative => {
18
+ :dsn => "ruport:test2", :user => "sandal", :password => "harmonix" },
19
+ }
20
+ Ruport::Config.source :default, @sources[:default]
21
+ Ruport::Config.source :alternative, @sources[:alternative]
22
+
23
+ @columns = %w(a b c)
24
+ @data = [ [[1,2,3],[4,5,6],[7,8,9]],
25
+ [[9,8,7],[6,5,4],[3,2,1]],
26
+ [[7,8,9],[4,5,6],[1,2,3]], ]
27
+ @datasets = @data.dup
28
+
29
+ @sql = [ "select * from foo", "create table foo ..." ]
30
+ @sql << @sql.values_at(0, 0).join(";\n")
31
+ @sql << @sql.values_at(1, 0).join(";\n")
32
+ @query = {
33
33
  :plain => Ruport::Query.new(@sql[0]),
34
34
  :sourced => Ruport::Query.new(@sql[0], :source => :alternative),
35
35
  :paramed => Ruport::Query.new(@sql[0], :params => [ 42 ]),
@@ -41,297 +41,298 @@ class TestQuery < Test::Unit::TestCase
41
41
  :resultless => Ruport::Query.new(@sql[1]),
42
42
  :multi => Ruport::Query.new(@sql[2]),
43
43
  :mixed => Ruport::Query.new(@sql[3]),
44
- }
45
- @query[:precached].cached_data = @data[0]
46
- end
47
-
48
- def test_execute
49
- return unless Object.const_defined? :Mocha
50
- query = @query[:uncached]
51
- setup_mock_dbi(1)
52
-
53
- assert_equal nil, query.execute
54
- end
55
-
56
- def test_execute_sourced
57
- return unless Object.const_defined? :Mocha
58
- query = @query[:sourced]
59
- setup_mock_dbi(1, :source => :alternative)
60
-
61
- assert_equal nil, query.execute
62
- end
63
-
64
- def test_execute_paramed
65
- return unless Object.const_defined? :Mocha
66
- query = @query[:paramed]
67
- setup_mock_dbi(1, :params => [ 42 ])
68
-
69
- assert_equal nil, query.execute
70
- end
71
-
72
- def test_result_cache_disabled
73
- return unless Object.const_defined? :Mocha
74
- query = @query[:uncached]
75
- setup_mock_dbi(3)
76
-
77
- assert_nothing_raised { query.result }
78
- assert_equal @data[1], get_raw(query.result)
79
- assert_equal @data[2], get_raw(query.result)
80
- end
81
-
82
- def test_result_cache_enabled
83
- return unless Object.const_defined? :Mocha
84
- query = @query[:cached]
85
- setup_mock_dbi(1)
86
-
87
- assert_nothing_raised { query.result }
88
- assert_equal @data[0], get_raw(query.result)
89
- assert_equal @data[0], get_raw(query.result)
90
- end
91
-
92
- def test_result_resultless
93
- return unless Object.const_defined? :Mocha
94
- query = @query[:resultless]
95
- setup_mock_dbi(1, :resultless => true, :sql => @sql[1])
96
-
97
- assert_equal nil, query.result
98
- end
99
-
100
- def test_result_multi
101
- return unless Object.const_defined? :Mocha
102
- query = @query[:multi]
103
- setup_mock_dbi(2)
104
-
105
- assert_equal @data[1], get_raw(query.result)
106
- end
107
-
108
- def test_result_raw_disabled
109
- return unless Object.const_defined? :Mocha
110
- query = @query[:unraw]
111
- setup_mock_dbi(1)
112
-
113
- assert_equal @data[0].to_table(@columns), query.result
114
- end
115
-
116
- def test_result_raw_enabled
117
- return unless Object.const_defined? :Mocha
118
- query = @query[:raw]
119
- setup_mock_dbi(1)
120
-
121
- assert_equal @data[0], query.result
122
- end
123
-
124
- def test_update_cache
125
- return unless Object.const_defined? :Mocha
126
- query = @query[:cached]
127
- setup_mock_dbi(2)
128
-
129
- assert_equal @data[0], get_raw(query.result)
130
- query.update_cache
131
- assert_equal @data[1], get_raw(query.cached_data)
132
- assert_equal @data[1], get_raw(query.result)
133
- end
134
-
135
- def test_clear_cache
136
- return unless Object.const_defined? :Mocha
137
- query = @query[:cached]
138
- setup_mock_dbi(2)
139
-
140
- assert_equal @data[0], get_raw(query.result)
141
- query.clear_cache
142
- assert_equal nil, query.cached_data
143
- assert_equal @data[1], get_raw(query.result)
144
- end
145
-
146
- def test_disable_caching
147
- return unless Object.const_defined? :Mocha
148
- query = @query[:cached]
149
- setup_mock_dbi(3)
150
-
151
- assert_equal @data[0], get_raw(query.result)
152
- assert_equal @data[0], get_raw(query.result)
153
- query.disable_caching
154
- assert_equal @data[1], get_raw(query.result)
155
- assert_equal @data[2], get_raw(query.result)
156
- end
157
-
158
- def test_enable_caching
159
- return unless Object.const_defined? :Mocha
160
- query = @query[:uncached]
161
- setup_mock_dbi(3)
162
-
163
- assert_equal @data[0], get_raw(query.result)
164
- assert_equal @data[1], get_raw(query.result)
165
- query.enable_caching
166
- assert_equal @data[2], get_raw(query.result)
167
- assert_equal @data[2], get_raw(query.result)
168
- end
169
-
170
- def test_load_file
171
- return unless Object.const_defined? :Mocha
172
- File.expects(:read).
173
- with("query_test.sql").
174
- returns("select * from foo\n")
175
-
176
- query = Ruport::Query.new "query_test.sql"
177
- assert_equal "select * from foo", query.sql
178
- end
179
-
180
- def test_load_file_erb
181
- return unless Object.const_defined? :Mocha
182
- @table = 'bar'
183
- File.expects(:read).
184
- with("query_test.sql").
185
- returns("select * from <%= @table %>\n")
186
-
187
- query = Ruport::Query.new "query_test.sql", :binding => binding
188
- assert_equal "select * from bar", query.sql
189
- end
190
-
191
- def test_load_file_not_found
192
- return unless Object.const_defined? :Mocha
193
- File.expects(:read).
194
- with("query_test.sql").
195
- raises(Errno::ENOENT)
196
- Ruport.expects(:log).
197
- with("Could not open query_test.sql",
198
- :status => :fatal, :exception => LoadError).
199
- raises(LoadError)
200
-
201
- assert_raises LoadError do
202
- query = Ruport::Query.new "query_test.sql"
203
- end
204
- end
205
-
206
- def test_each_cache_disabled
207
- return unless Object.const_defined? :Mocha
208
- query = @query[:uncached]
209
- setup_mock_dbi(2)
210
-
211
- result = []; query.each { |r| result << r.to_a }
212
- assert_equal @data[0], result
213
-
214
- result = []; query.each { |r| result << r.to_a }
215
- assert_equal @data[1], result
216
- end
217
-
218
- def test_each_cache_enabled
219
- return unless Object.const_defined? :Mocha
220
- query = @query[:cached]
221
- setup_mock_dbi(1)
222
-
223
- result = []; query.each { |r| result << r.to_a }
224
- assert_equal @data[0], result
225
-
226
- result = []; query.each { |r| result << r.to_a }
227
- assert_equal @data[0], result
228
- end
229
-
230
- def test_each_multi
231
- return unless Object.const_defined? :Mocha
232
- query = @query[:multi]
233
- setup_mock_dbi(2)
234
-
235
- result = []; query.each { |r| result << r.to_a }
236
- assert_equal @data[1], result
237
- end
238
-
239
- def test_each_without_block
240
- assert_raise (LocalJumpError) { @query[:precached].each }
241
- end
242
-
243
- def test_select_source
244
- query = @query[:precached]
245
- assert_equal @sources[:default], get_query_source(query)
246
-
247
- query.select_source :alternative
248
- assert_equal @sources[:alternative], get_query_source(query)
249
-
250
- query.select_source :default
251
- assert_equal @sources[:default], get_query_source(query)
252
- end
253
-
254
- def test_initialize_source_temporary
255
- query = Ruport::Query.new "<unused>", @sources[:alternative]
256
- assert_equal @sources[:alternative], get_query_source(query)
257
- end
258
-
259
- def test_initialize_source_temporary_multiple
260
- query1 = Ruport::Query.new "<unused>", @sources[:default]
261
- query2 = Ruport::Query.new "<unused>", @sources[:alternative]
262
-
263
- assert_equal @sources[:default], get_query_source(query1)
264
- assert_equal @sources[:alternative], get_query_source(query2)
265
- end
266
-
267
- def test_generator
268
- query = @query[:precached]
269
- gen = query.generator
270
- assert_equal @data[0][0], gen.next
271
- assert_equal @data[0][1], gen.next
272
- assert_equal @data[0][2], gen.next
273
- assert_raise(EOFError) { gen.next }
274
- end
275
-
276
- def test_to_table
277
- return unless Object.const_defined? :Mocha
278
- query = @query[:raw]
279
- setup_mock_dbi(3, :returns => @data[0])
280
-
281
- assert_equal @data[0], query.result
282
- assert_equal @data[0].to_table(@columns), query.to_table
283
- assert_equal @data[0], query.result
284
- end
285
-
286
- def test_to_csv
287
- return unless Object.const_defined? :Mocha
288
- query = @query[:plain]
289
- setup_mock_dbi(1)
290
-
291
- csv = @data[0].to_table(@columns).as(:csv)
292
- assert_equal csv, query.to_csv
293
- end
294
-
295
- private
296
- def setup_mock_dbi(count, options={})
297
- sql = options[:sql] || @sql[0]
298
- source = options[:source] || :default
299
- returns = options[:returns] || Proc.new { @datasets.shift }
300
- resultless = options[:resultless]
301
- params = options[:params] || []
302
-
303
- @dbh = mock("database_handle")
304
- @sth = mock("statement_handle")
305
- def @dbh.execute(*a, &b); execute__(*a, &b); ensure; sth__.finish if b; end
306
- def @sth.each; data__.each { |x| yield(x) }; end
307
- def @sth.fetch_all; data__; end
308
-
309
- DBI.expects(:connect).
310
- with(*@sources[source].values_at(:dsn, :user, :password)).
311
- yields(@dbh).times(count)
312
- @dbh.expects(:execute__).with(sql, *params).
313
- yields(@sth).returns(@sth).times(count)
314
- @dbh.stubs(:sth__).returns(@sth)
315
- @sth.expects(:finish).with().times(count)
316
- unless resultless
317
- @sth.stubs(:fetchable?).returns(true)
318
- @sth.stubs(:column_names).returns(@columns)
319
- @sth.expects(:data__).returns(returns).times(count)
320
- else
321
- @sth.stubs(:fetchable?).returns(false)
322
- @sth.stubs(:column_names).returns([])
323
- @sth.stubs(:cancel)
324
- @sth.expects(:data__).times(0)
325
- end
326
- end
327
-
328
- def get_query_source(query)
329
- [ :dsn, :user, :password ].inject({}) do |memo, var|
330
- memo.update var => query.instance_variable_get("@#{var}")
331
- end
332
- end
44
+ }
45
+ @query[:precached].cached_data = @data[0]
46
+ end
47
+
48
+ def test_execute
49
+ return unless Object.const_defined? :Mocha
50
+ query = @query[:uncached]
51
+ setup_mock_dbi(1)
52
+
53
+ assert_equal nil, query.execute
54
+ end
55
+
56
+ def test_execute_sourced
57
+ return unless Object.const_defined? :Mocha
58
+ query = @query[:sourced]
59
+ setup_mock_dbi(1, :source => :alternative)
60
+
61
+ assert_equal nil, query.execute
62
+ end
63
+
64
+ def test_execute_paramed
65
+ return unless Object.const_defined? :Mocha
66
+ query = @query[:paramed]
67
+ setup_mock_dbi(1, :params => [ 42 ])
68
+
69
+ assert_equal nil, query.execute
70
+ end
71
+
72
+ def test_result_cache_disabled
73
+ return unless Object.const_defined? :Mocha
74
+ query = @query[:uncached]
75
+ setup_mock_dbi(3)
76
+
77
+ assert_nothing_raised { query.result }
78
+ assert_equal @data[1], get_raw(query.result)
79
+ assert_equal @data[2], get_raw(query.result)
80
+ end
81
+
82
+ def test_result_cache_enabled
83
+ return unless Object.const_defined? :Mocha
84
+ query = @query[:cached]
85
+ setup_mock_dbi(1)
86
+
87
+ assert_nothing_raised { query.result }
88
+ assert_equal @data[0], get_raw(query.result)
89
+ assert_equal @data[0], get_raw(query.result)
90
+ end
91
+
92
+ def test_result_resultless
93
+ return unless Object.const_defined? :Mocha
94
+ query = @query[:resultless]
95
+ setup_mock_dbi(1, :resultless => true, :sql => @sql[1])
96
+
97
+ assert_equal nil, query.result
98
+ end
99
+
100
+ def test_result_multi
101
+ return unless Object.const_defined? :Mocha
102
+ query = @query[:multi]
103
+ setup_mock_dbi(2)
104
+
105
+ assert_equal @data[1], get_raw(query.result)
106
+ end
107
+
108
+ def test_result_raw_disabled
109
+ return unless Object.const_defined? :Mocha
110
+ query = @query[:unraw]
111
+ setup_mock_dbi(1)
112
+
113
+ assert_equal @data[0].to_table(@columns), query.result
114
+ end
115
+
116
+ def test_result_raw_enabled
117
+ return unless Object.const_defined? :Mocha
118
+ query = @query[:raw]
119
+ setup_mock_dbi(1)
120
+
121
+ assert_equal @data[0], query.result
122
+ end
123
+
124
+ def test_update_cache
125
+ return unless Object.const_defined? :Mocha
126
+ query = @query[:cached]
127
+ setup_mock_dbi(2)
128
+
129
+ assert_equal @data[0], get_raw(query.result)
130
+ query.update_cache
131
+ assert_equal @data[1], get_raw(query.cached_data)
132
+ assert_equal @data[1], get_raw(query.result)
133
+ end
134
+
135
+ def test_clear_cache
136
+ return unless Object.const_defined? :Mocha
137
+ query = @query[:cached]
138
+ setup_mock_dbi(2)
139
+
140
+ assert_equal @data[0], get_raw(query.result)
141
+ query.clear_cache
142
+ assert_equal nil, query.cached_data
143
+ assert_equal @data[1], get_raw(query.result)
144
+ end
145
+
146
+ def test_disable_caching
147
+ return unless Object.const_defined? :Mocha
148
+ query = @query[:cached]
149
+ setup_mock_dbi(3)
150
+
151
+ assert_equal @data[0], get_raw(query.result)
152
+ assert_equal @data[0], get_raw(query.result)
153
+ query.disable_caching
154
+ assert_equal @data[1], get_raw(query.result)
155
+ assert_equal @data[2], get_raw(query.result)
156
+ end
157
+
158
+ def test_enable_caching
159
+ return unless Object.const_defined? :Mocha
160
+ query = @query[:uncached]
161
+ setup_mock_dbi(3)
162
+
163
+ assert_equal @data[0], get_raw(query.result)
164
+ assert_equal @data[1], get_raw(query.result)
165
+ query.enable_caching
166
+ assert_equal @data[2], get_raw(query.result)
167
+ assert_equal @data[2], get_raw(query.result)
168
+ end
169
+
170
+ def test_load_file
171
+ return unless Object.const_defined? :Mocha
172
+ File.expects(:read).
173
+ with("query_test.sql").
174
+ returns("select * from foo\n")
175
+
176
+ query = Ruport::Query.new "query_test.sql"
177
+ assert_equal "select * from foo", query.sql
178
+ end
179
+
180
+ def test_load_file_erb
181
+ return unless Object.const_defined? :Mocha
182
+ @table = 'bar'
183
+ File.expects(:read).
184
+ with("query_test.sql").
185
+ returns("select * from <%= @table %>\n")
186
+
187
+ query = Ruport::Query.new "query_test.sql", :binding => binding
188
+ assert_equal "select * from bar", query.sql
189
+ end
190
+
191
+ def test_load_file_not_found
192
+ return unless Object.const_defined? :Mocha
193
+ File.expects(:read).
194
+ with("query_test.sql").
195
+ raises(Errno::ENOENT)
196
+ Ruport.expects(:log).
197
+ with("Could not open query_test.sql",
198
+ :status => :fatal, :exception => LoadError).
199
+ raises(LoadError)
200
+
201
+ assert_raises LoadError do
202
+ query = Ruport::Query.new "query_test.sql"
203
+ end
204
+ end
205
+
206
+ def test_each_cache_disabled
207
+ return unless Object.const_defined? :Mocha
208
+ query = @query[:uncached]
209
+ setup_mock_dbi(2)
210
+
211
+ result = []; query.each { |r| result << r.to_a }
212
+ assert_equal @data[0], result
213
+
214
+ result = []; query.each { |r| result << r.to_a }
215
+ assert_equal @data[1], result
216
+ end
217
+
218
+ def test_each_cache_enabled
219
+ return unless Object.const_defined? :Mocha
220
+ query = @query[:cached]
221
+ setup_mock_dbi(1)
222
+
223
+ result = []; query.each { |r| result << r.to_a }
224
+ assert_equal @data[0], result
225
+
226
+ result = []; query.each { |r| result << r.to_a }
227
+ assert_equal @data[0], result
228
+ end
229
+
230
+ def test_each_multi
231
+ return unless Object.const_defined? :Mocha
232
+ query = @query[:multi]
233
+ setup_mock_dbi(2)
234
+
235
+ result = []; query.each { |r| result << r.to_a }
236
+ assert_equal @data[1], result
237
+ end
238
+
239
+ def test_each_without_block
240
+ assert_raise (LocalJumpError) { @query[:precached].each }
241
+ end
242
+
243
+ def test_select_source
244
+ query = @query[:precached]
245
+ assert_equal @sources[:default], get_query_source(query)
246
+
247
+ query.select_source :alternative
248
+ assert_equal @sources[:alternative], get_query_source(query)
249
+
250
+ query.select_source :default
251
+ assert_equal @sources[:default], get_query_source(query)
252
+ end
253
+
254
+ def test_initialize_source_temporary
255
+ query = Ruport::Query.new "<unused>", @sources[:alternative]
256
+ assert_equal @sources[:alternative], get_query_source(query)
257
+ end
258
+
259
+ def test_initialize_source_temporary_multiple
260
+ query1 = Ruport::Query.new "<unused>", @sources[:default]
261
+ query2 = Ruport::Query.new "<unused>", @sources[:alternative]
262
+
263
+ assert_equal @sources[:default], get_query_source(query1)
264
+ assert_equal @sources[:alternative], get_query_source(query2)
265
+ end
266
+
267
+ def test_generator
268
+ query = @query[:precached]
269
+ gen = query.generator
270
+ assert_equal @data[0][0], gen.next
271
+ assert_equal @data[0][1], gen.next
272
+ assert_equal @data[0][2], gen.next
273
+ assert_raise(EOFError) { gen.next }
274
+ end
275
+
276
+ def test_to_table
277
+ return unless Object.const_defined? :Mocha
278
+ query = @query[:raw]
279
+ setup_mock_dbi(3, :returns => @data[0])
280
+
281
+ assert_equal @data[0], query.result
282
+ assert_equal @data[0].to_table(@columns), query.to_table
283
+ assert_equal @data[0], query.result
284
+ end
285
+
286
+ def test_to_csv
287
+ return unless Object.const_defined? :Mocha
288
+ query = @query[:plain]
289
+ setup_mock_dbi(1)
290
+
291
+ csv = @data[0].to_table(@columns).as(:csv)
292
+ assert_equal csv, query.to_csv
293
+ end
294
+
295
+ private
296
+ def setup_mock_dbi(count, options={})
297
+ sql = options[:sql] || @sql[0]
298
+ source = options[:source] || :default
299
+ returns = options[:returns] || Proc.new { @datasets.shift }
300
+ resultless = options[:resultless]
301
+ params = options[:params] || []
302
+
303
+ @dbh = mock("database_handle")
304
+ @sth = mock("statement_handle")
305
+ def @dbh.execute(*a, &b); execute__(*a, &b); ensure; sth__.finish if b; end
306
+ def @sth.each; data__.each { |x| yield(x) }; end
307
+ def @sth.fetch_all; data__; end
308
+
309
+ DBI.expects(:connect).
310
+ with(*@sources[source].values_at(:dsn, :user, :password)).
311
+ yields(@dbh).times(count)
312
+ @dbh.expects(:execute__).with(sql, *params).
313
+ yields(@sth).returns(@sth).times(count)
314
+ @dbh.stubs(:sth__).returns(@sth)
315
+ @sth.expects(:finish).with().times(count)
316
+ unless resultless
317
+ @sth.stubs(:fetchable?).returns(true)
318
+ @sth.stubs(:column_names).returns(@columns)
319
+ @sth.expects(:data__).returns(returns).times(count)
320
+ else
321
+ @sth.stubs(:fetchable?).returns(false)
322
+ @sth.stubs(:column_names).returns([])
323
+ @sth.stubs(:cancel)
324
+ @sth.expects(:data__).times(0)
325
+ end
326
+ end
327
+
328
+ def get_query_source(query)
329
+ [ :dsn, :user, :password ].inject({}) do |memo, var|
330
+ memo.update var => query.instance_variable_get("@#{var}")
331
+ end
332
+ end
333
+
334
+ def get_raw(table)
335
+ table.collect { |row| row.to_a }
336
+ end
333
337
 
334
- def get_raw(table)
335
- table.collect { |row| row.to_a }
336
- end
337
338
  end