rubyrep 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.
Files changed (140) hide show
  1. data/History.txt +4 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +137 -0
  4. data/README.txt +37 -0
  5. data/Rakefile +30 -0
  6. data/bin/rubyrep +8 -0
  7. data/config/hoe.rb +72 -0
  8. data/config/mysql_config.rb +25 -0
  9. data/config/postgres_config.rb +21 -0
  10. data/config/proxied_test_config.rb +14 -0
  11. data/config/redmine_config.rb +17 -0
  12. data/config/rep_config.rb +20 -0
  13. data/config/requirements.rb +32 -0
  14. data/config/test_config.rb +20 -0
  15. data/lib/rubyrep/base_runner.rb +195 -0
  16. data/lib/rubyrep/command_runner.rb +144 -0
  17. data/lib/rubyrep/committers/buffered_committer.rb +140 -0
  18. data/lib/rubyrep/committers/committers.rb +146 -0
  19. data/lib/rubyrep/configuration.rb +240 -0
  20. data/lib/rubyrep/connection_extenders/connection_extenders.rb +133 -0
  21. data/lib/rubyrep/connection_extenders/jdbc_extender.rb +284 -0
  22. data/lib/rubyrep/connection_extenders/mysql_extender.rb +168 -0
  23. data/lib/rubyrep/connection_extenders/postgresql_extender.rb +261 -0
  24. data/lib/rubyrep/database_proxy.rb +52 -0
  25. data/lib/rubyrep/direct_table_scan.rb +75 -0
  26. data/lib/rubyrep/generate_runner.rb +105 -0
  27. data/lib/rubyrep/initializer.rb +39 -0
  28. data/lib/rubyrep/logged_change.rb +326 -0
  29. data/lib/rubyrep/proxied_table_scan.rb +171 -0
  30. data/lib/rubyrep/proxy_block_cursor.rb +145 -0
  31. data/lib/rubyrep/proxy_connection.rb +318 -0
  32. data/lib/rubyrep/proxy_cursor.rb +44 -0
  33. data/lib/rubyrep/proxy_row_cursor.rb +43 -0
  34. data/lib/rubyrep/proxy_runner.rb +89 -0
  35. data/lib/rubyrep/replication_difference.rb +91 -0
  36. data/lib/rubyrep/replication_extenders/mysql_replication.rb +271 -0
  37. data/lib/rubyrep/replication_extenders/postgresql_replication.rb +204 -0
  38. data/lib/rubyrep/replication_extenders/replication_extenders.rb +26 -0
  39. data/lib/rubyrep/replication_helper.rb +104 -0
  40. data/lib/rubyrep/replication_initializer.rb +307 -0
  41. data/lib/rubyrep/replication_run.rb +48 -0
  42. data/lib/rubyrep/replication_runner.rb +138 -0
  43. data/lib/rubyrep/replicators/replicators.rb +37 -0
  44. data/lib/rubyrep/replicators/two_way_replicator.rb +334 -0
  45. data/lib/rubyrep/scan_progress_printers/progress_bar.rb +65 -0
  46. data/lib/rubyrep/scan_progress_printers/scan_progress_printers.rb +65 -0
  47. data/lib/rubyrep/scan_report_printers/scan_detail_reporter.rb +111 -0
  48. data/lib/rubyrep/scan_report_printers/scan_report_printers.rb +67 -0
  49. data/lib/rubyrep/scan_report_printers/scan_summary_reporter.rb +75 -0
  50. data/lib/rubyrep/scan_runner.rb +25 -0
  51. data/lib/rubyrep/session.rb +177 -0
  52. data/lib/rubyrep/sync_helper.rb +111 -0
  53. data/lib/rubyrep/sync_runner.rb +31 -0
  54. data/lib/rubyrep/syncers/syncers.rb +112 -0
  55. data/lib/rubyrep/syncers/two_way_syncer.rb +174 -0
  56. data/lib/rubyrep/table_scan.rb +54 -0
  57. data/lib/rubyrep/table_scan_helper.rb +38 -0
  58. data/lib/rubyrep/table_sorter.rb +70 -0
  59. data/lib/rubyrep/table_spec_resolver.rb +136 -0
  60. data/lib/rubyrep/table_sync.rb +68 -0
  61. data/lib/rubyrep/trigger_mode_switcher.rb +63 -0
  62. data/lib/rubyrep/type_casting_cursor.rb +31 -0
  63. data/lib/rubyrep/uninstall_runner.rb +92 -0
  64. data/lib/rubyrep/version.rb +9 -0
  65. data/lib/rubyrep.rb +68 -0
  66. data/script/destroy +14 -0
  67. data/script/generate +14 -0
  68. data/script/txt2html +74 -0
  69. data/setup.rb +1585 -0
  70. data/sims/performance/big_rep_spec.rb +100 -0
  71. data/sims/performance/big_scan_spec.rb +57 -0
  72. data/sims/performance/big_sync_spec.rb +141 -0
  73. data/sims/performance/performance.rake +228 -0
  74. data/sims/sim_helper.rb +24 -0
  75. data/spec/base_runner_spec.rb +218 -0
  76. data/spec/buffered_committer_spec.rb +271 -0
  77. data/spec/command_runner_spec.rb +145 -0
  78. data/spec/committers_spec.rb +174 -0
  79. data/spec/configuration_spec.rb +198 -0
  80. data/spec/connection_extender_interface_spec.rb +138 -0
  81. data/spec/connection_extenders_registration_spec.rb +129 -0
  82. data/spec/database_proxy_spec.rb +48 -0
  83. data/spec/database_rake_spec.rb +40 -0
  84. data/spec/db_specific_connection_extenders_spec.rb +34 -0
  85. data/spec/db_specific_replication_extenders_spec.rb +38 -0
  86. data/spec/direct_table_scan_spec.rb +61 -0
  87. data/spec/generate_runner_spec.rb +84 -0
  88. data/spec/initializer_spec.rb +46 -0
  89. data/spec/logged_change_spec.rb +480 -0
  90. data/spec/postgresql_replication_spec.rb +48 -0
  91. data/spec/postgresql_support_spec.rb +57 -0
  92. data/spec/progress_bar_spec.rb +77 -0
  93. data/spec/proxied_table_scan_spec.rb +151 -0
  94. data/spec/proxy_block_cursor_spec.rb +197 -0
  95. data/spec/proxy_connection_spec.rb +399 -0
  96. data/spec/proxy_cursor_spec.rb +56 -0
  97. data/spec/proxy_row_cursor_spec.rb +66 -0
  98. data/spec/proxy_runner_spec.rb +70 -0
  99. data/spec/replication_difference_spec.rb +160 -0
  100. data/spec/replication_extender_interface_spec.rb +365 -0
  101. data/spec/replication_extenders_spec.rb +32 -0
  102. data/spec/replication_helper_spec.rb +121 -0
  103. data/spec/replication_initializer_spec.rb +477 -0
  104. data/spec/replication_run_spec.rb +166 -0
  105. data/spec/replication_runner_spec.rb +213 -0
  106. data/spec/replicators_spec.rb +31 -0
  107. data/spec/rubyrep_spec.rb +8 -0
  108. data/spec/scan_detail_reporter_spec.rb +119 -0
  109. data/spec/scan_progress_printers_spec.rb +68 -0
  110. data/spec/scan_report_printers_spec.rb +67 -0
  111. data/spec/scan_runner_spec.rb +50 -0
  112. data/spec/scan_summary_reporter_spec.rb +61 -0
  113. data/spec/session_spec.rb +212 -0
  114. data/spec/spec.opts +1 -0
  115. data/spec/spec_helper.rb +295 -0
  116. data/spec/sync_helper_spec.rb +157 -0
  117. data/spec/sync_runner_spec.rb +78 -0
  118. data/spec/syncers_spec.rb +171 -0
  119. data/spec/table_scan_helper_spec.rb +29 -0
  120. data/spec/table_scan_spec.rb +49 -0
  121. data/spec/table_sorter_spec.rb +31 -0
  122. data/spec/table_spec_resolver_spec.rb +102 -0
  123. data/spec/table_sync_spec.rb +84 -0
  124. data/spec/trigger_mode_switcher_spec.rb +83 -0
  125. data/spec/two_way_replicator_spec.rb +551 -0
  126. data/spec/two_way_syncer_spec.rb +256 -0
  127. data/spec/type_casting_cursor_spec.rb +50 -0
  128. data/spec/uninstall_runner_spec.rb +86 -0
  129. data/tasks/database.rake +439 -0
  130. data/tasks/deployment.rake +29 -0
  131. data/tasks/environment.rake +9 -0
  132. data/tasks/java.rake +37 -0
  133. data/tasks/redmine_test.rake +47 -0
  134. data/tasks/rspec.rake +68 -0
  135. data/tasks/rubyrep.tailor +18 -0
  136. data/tasks/stats.rake +19 -0
  137. data/tasks/task_helper.rb +20 -0
  138. data.tar.gz.sig +0 -0
  139. metadata +243 -0
  140. metadata.gz.sig +0 -0
@@ -0,0 +1,256 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ include RR
4
+
5
+ describe Syncers::TwoWaySyncer do
6
+ before(:each) do
7
+ Initializer.configuration = deep_copy(standard_config)
8
+ Initializer.configuration.options = {:syncer => :two_way}
9
+ end
10
+
11
+ it "should register itself" do
12
+ Syncers::syncers[:two_way].should == Syncers::TwoWaySyncer
13
+ end
14
+
15
+ it "initialize should store sync_helper" do
16
+ sync = TableSync.new(Session.new, 'scanner_records')
17
+ helper = SyncHelper.new(sync)
18
+ syncer = Syncers::TwoWaySyncer.new(helper)
19
+ syncer.sync_helper.should == helper
20
+ end
21
+
22
+ it "initialize should throw an error if options are invalid" do
23
+ sync = TableSync.new(Session.new, 'scanner_records')
24
+ helper = SyncHelper.new(sync)
25
+ base_options = {
26
+ :syncer => :two_way,
27
+ :left_record_handling => :ignore,
28
+ :right_record_handling => :ignore,
29
+ :sync_conflict_handling => :ignore,
30
+ :logged_sync_events => []
31
+ }
32
+
33
+ # Verify that correct options don't raise errors.
34
+ helper.stub!(:sync_options).and_return(base_options)
35
+ lambda {Syncers::TwoWaySyncer.new(helper)}.should_not raise_error
36
+
37
+ # Also lambda options should not raise errors.
38
+ l = lambda {}
39
+ helper.stub!(:sync_options).and_return(base_options.merge(
40
+ {
41
+ :left_record_handling => l,
42
+ :right_record_handling => l,
43
+ :sync_conflict_handling => l
44
+ })
45
+ )
46
+ lambda {Syncers::TwoWaySyncer.new(helper)}.should_not raise_error
47
+
48
+ # Invalid options should raise errors
49
+ invalid_options = [
50
+ {:left_record_handling => :invalid_left_option},
51
+ {:right_record_handling => :invalid_right_option},
52
+ {:sync_conflict_handling => :invalid_conflict_option},
53
+ {:logged_sync_events => [:invalid_logging_option]}
54
+ ]
55
+ invalid_options.each do |options|
56
+ helper.stub!(:sync_options).and_return(base_options.merge(options))
57
+ lambda {Syncers::TwoWaySyncer.new(helper)}.should raise_error(ArgumentError)
58
+ end
59
+ end
60
+
61
+ it "log_sync_outcome should not log if not so configured" do
62
+ sync = TableSync.new(Session.new, 'scanner_records')
63
+
64
+ helper = SyncHelper.new(sync)
65
+ helper.should_not_receive(:log_sync_outcome)
66
+ helper.stub!(:sync_options).and_return(
67
+ {
68
+ :rep_prefix => 'rr',
69
+ :left_record_handling => :ignore,
70
+ :right_record_handling => :ignore,
71
+ :sync_conflict_handling => :ignore,
72
+ :logged_sync_events => []
73
+ })
74
+ syncer = Syncers::TwoWaySyncer.new(helper)
75
+ [:left, :right, :conflict].each do |diff_type|
76
+ syncer.sync_difference(diff_type, :dummy_row)
77
+ end
78
+
79
+ helper = SyncHelper.new(sync)
80
+ helper.should_not_receive(:log_sync_outcome)
81
+ helper.stub!(:sync_options).and_return(
82
+ {
83
+ :rep_prefix => 'rr',
84
+ :left_record_handling => :insert,
85
+ :right_record_handling => :insert,
86
+ :sync_conflict_handling => :right_wins,
87
+ :logged_sync_events => [:ignored_changes, :ignored_conflicts]
88
+ })
89
+ helper.stub!(:insert_record)
90
+ helper.stub!(:update_record)
91
+ syncer.sync_difference :left, :dummy_row
92
+ syncer.sync_difference :right, :dummy_row
93
+ syncer.sync_difference :conflict, [:left_dummy_row, :right_dummy_row]
94
+ end
95
+
96
+ it "log_sync_outcome should log sync actions correctly" do
97
+ sync = TableSync.new(Session.new, 'scanner_records')
98
+
99
+ helper = SyncHelper.new(sync)
100
+ helper.should_receive(:log_sync_outcome).with(:dummy_row, 'left_record', :insert).ordered
101
+ helper.should_receive(:log_sync_outcome).with(:dummy_row, 'right_record', :insert).ordered
102
+ helper.should_receive(:log_sync_outcome).with(:left_dummy_row, 'conflict', :right_wins).ordered
103
+ helper.stub!(:sync_options).and_return(
104
+ {
105
+ :rep_prefix => 'rr',
106
+ :left_record_handling => :insert,
107
+ :right_record_handling => :insert,
108
+ :sync_conflict_handling => :right_wins,
109
+ :logged_sync_events => [:all_changes, :all_conflicts]
110
+ })
111
+ helper.stub!(:insert_record)
112
+ helper.stub!(:update_record)
113
+ syncer = Syncers::TwoWaySyncer.new(helper)
114
+ syncer.sync_difference :left, :dummy_row
115
+ syncer.sync_difference :right, :dummy_row
116
+ syncer.sync_difference :conflict, [:left_dummy_row, :right_dummy_row]
117
+ end
118
+
119
+ it "log_sync_outcome should log ignored syncs correctly" do
120
+ sync = TableSync.new(Session.new, 'scanner_records')
121
+
122
+ helper = SyncHelper.new(sync)
123
+ helper.should_receive(:log_sync_outcome).with(:dummy_row, 'left_record', :ignore).ordered
124
+ helper.should_receive(:log_sync_outcome).with(:dummy_row, 'right_record', :ignore).ordered
125
+ helper.should_receive(:log_sync_outcome).with(:left_dummy_row, 'conflict', :ignore).ordered
126
+ helper.stub!(:sync_options).and_return(
127
+ {
128
+ :rep_prefix => 'rr',
129
+ :left_record_handling => :ignore,
130
+ :right_record_handling => :ignore,
131
+ :sync_conflict_handling => :ignore,
132
+ :logged_sync_events => [:ignored_changes, :ignored_conflicts]
133
+ })
134
+ syncer = Syncers::TwoWaySyncer.new(helper)
135
+ syncer.sync_difference :left, :dummy_row
136
+ syncer.sync_difference :right, :dummy_row
137
+ syncer.sync_difference :conflict, [:left_dummy_row, :right_dummy_row]
138
+ end
139
+
140
+ it "sync_difference should not do anything if ignore option is given" do
141
+ sync = TableSync.new(Session.new, 'scanner_records')
142
+ helper = SyncHelper.new(sync)
143
+ helper.stub!(:sync_options).and_return(
144
+ {
145
+ :left_record_handling => :ignore,
146
+ :right_record_handling => :ignore,
147
+ :sync_conflict_handling => :ignore,
148
+ :logged_sync_events => []
149
+ })
150
+
151
+ syncer = Syncers::TwoWaySyncer.new(helper)
152
+ helper.should_not_receive(:delete_record)
153
+ helper.should_not_receive(:update_record)
154
+ helper.should_not_receive(:insert_record)
155
+
156
+ [:left, :right, :conflict].each do |diff_type|
157
+ syncer.sync_difference(diff_type, :dummy_row)
158
+ end
159
+ end
160
+
161
+ it "sync_difference should call the provided Proc objects" do
162
+ sync = TableSync.new(Session.new, 'scanner_records')
163
+ helper = SyncHelper.new(sync)
164
+
165
+ lambda_parameters = []
166
+ l = lambda do |sync_helper, type, row|
167
+ lambda_parameters << [sync_helper, type, row]
168
+ end
169
+ helper.stub!(:sync_options).and_return(
170
+ {
171
+ :left_record_handling => l,
172
+ :right_record_handling => l,
173
+ :sync_conflict_handling => l,
174
+ :logged_sync_events => [:ignored_conflicts]
175
+ })
176
+
177
+ syncer = Syncers::TwoWaySyncer.new(helper)
178
+ syncer.sync_difference(:left, :dummy_left)
179
+ syncer.sync_difference(:right, :dummy_right)
180
+ syncer.sync_difference(:conflict, [:dummy_left2, :dummy_right2])
181
+
182
+ lambda_parameters.should == [
183
+ [helper, :left, :dummy_left],
184
+ [helper, :right, :dummy_right],
185
+ [helper, :conflict, [:dummy_left2, :dummy_right2]]
186
+ ]
187
+ end
188
+
189
+ it "sync_difference should delete left or right records from source if that option is given" do
190
+ sync = TableSync.new(Session.new, 'scanner_records')
191
+ helper = SyncHelper.new(sync)
192
+ helper.stub!(:sync_options).and_return(
193
+ {
194
+ :left_record_handling => :delete,
195
+ :right_record_handling => :delete,
196
+ :sync_conflict_handling => :ignore,
197
+ :logged_sync_events => [:ignored_conflicts]
198
+ })
199
+
200
+ syncer = Syncers::TwoWaySyncer.new(helper)
201
+ helper.should_receive(:delete_record).with(:left, :dummy_left)
202
+ helper.should_receive(:delete_record).with(:right, :dummy_right)
203
+ syncer.sync_difference(:left, :dummy_left)
204
+ syncer.sync_difference(:right, :dummy_right)
205
+ end
206
+
207
+ it "sync_difference should insert left or right records to target if that option is given" do
208
+ sync = TableSync.new(Session.new, 'scanner_records')
209
+ helper = SyncHelper.new(sync)
210
+ helper.stub!(:sync_options).and_return(
211
+ {
212
+ :left_record_handling => :insert,
213
+ :right_record_handling => :insert,
214
+ :sync_conflict_handling => :ignore,
215
+ :logged_sync_events => [:ignored_conflicts]
216
+ })
217
+
218
+ syncer = Syncers::TwoWaySyncer.new(helper)
219
+ helper.should_receive(:insert_record).with(:right, :dummy_left)
220
+ helper.should_receive(:insert_record).with(:left, :dummy_right)
221
+ syncer.sync_difference(:left, :dummy_left)
222
+ syncer.sync_difference(:right, :dummy_right)
223
+ end
224
+
225
+ it "sync_difference should update the left database if conflict handling is specified with :right_wins" do
226
+ sync = TableSync.new(Session.new, 'scanner_records')
227
+ helper = SyncHelper.new(sync)
228
+ helper.stub!(:sync_options).and_return(
229
+ {
230
+ :left_record_handling => :ignore,
231
+ :right_record_handling => :ignore,
232
+ :sync_conflict_handling => :right_wins,
233
+ :logged_sync_events => [:ignored_conflicts]
234
+ })
235
+
236
+ syncer = Syncers::TwoWaySyncer.new(helper)
237
+ helper.should_receive(:update_record).with(:left, :dummy_right)
238
+ syncer.sync_difference(:conflict, [:dummy_left, :dummy_right])
239
+ end
240
+
241
+ it "sync_difference should update the right database if conflict handling is specified with :left_wins" do
242
+ sync = TableSync.new(Session.new, 'scanner_records')
243
+ helper = SyncHelper.new(sync)
244
+ helper.stub!(:sync_options).and_return(
245
+ {
246
+ :left_record_handling => :ignore,
247
+ :right_record_handling => :ignore,
248
+ :sync_conflict_handling => :left_wins,
249
+ :logged_sync_events => [:ignored_conflicts]
250
+ })
251
+
252
+ syncer = Syncers::TwoWaySyncer.new(helper)
253
+ helper.should_receive(:update_record).with(:right, :dummy_left)
254
+ syncer.sync_difference(:conflict, [:dummy_left, :dummy_right])
255
+ end
256
+ end
@@ -0,0 +1,50 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ include RR
4
+
5
+ describe TypeCastingCursor do
6
+ before(:each) do
7
+ Initializer.configuration = standard_config
8
+ end
9
+
10
+ it "initialize should cache the provided cursor and the retrieved Column objects" do
11
+ cursor = TypeCastingCursor.new Session.new.left, 'extender_type_check', :dummy_org_cursor
12
+ cursor.columns['id'].name.should == 'id'
13
+ cursor.columns['decimal_test'].name.should == 'decimal_test'
14
+ cursor.org_cursor.should == :dummy_org_cursor
15
+ end
16
+
17
+ it "next_row should delegate next? and clear to the original cursor" do
18
+ session = Session.new
19
+ org_cursor = session.left.select_cursor(:query => "select id from extender_type_check where id = 1")
20
+
21
+ cursor = TypeCastingCursor.new session.left, 'extender_type_check', org_cursor
22
+ cursor.next?.should be_true
23
+ row = cursor.next_row
24
+ cursor.next?.should be_false
25
+ cursor.clear
26
+ end
27
+
28
+ it "next_row should cast rows - including uncommon data types - correctly" do
29
+ session = Session.new
30
+ org_cursor = session.left.select_cursor(:query => "select id, decimal_test, timestamp, binary_test from extender_type_check where id = 1")
31
+ cursor = TypeCastingCursor.new session.left, 'extender_type_check', org_cursor
32
+
33
+ row = cursor.next_row
34
+
35
+ # verify that the row fields have been converted to the correct types
36
+ row['id'].should be_an_instance_of(Fixnum)
37
+ row['timestamp'].should be_an_instance_of(Time)
38
+ row['decimal_test'].should be_an_instance_of(BigDecimal)
39
+ row['binary_test'].should be_an_instance_of(String)
40
+
41
+ # verify that the row values were converted correctly
42
+ row.should == {
43
+ 'id' => 1,
44
+ 'decimal_test' => BigDecimal.new("1.234"),
45
+ 'timestamp' => Time.local(2007,"nov",10,20,15,1),
46
+ 'binary_test' => Marshal.dump(['bla',:dummy,1,2,3])
47
+ }
48
+ cursor.clear
49
+ end
50
+ end
@@ -0,0 +1,86 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ include RR
4
+
5
+ describe UninstallRunner do
6
+ before(:each) do
7
+ end
8
+
9
+ it "should register itself with CommandRunner" do
10
+ CommandRunner.commands['uninstall'][:command].should == UninstallRunner
11
+ CommandRunner.commands['uninstall'][:description].should be_an_instance_of(String)
12
+ end
13
+
14
+ it "process_options should make options as nil and teturn status as 1 if command line parameters are unknown" do
15
+ # also verify that an error message is printed
16
+ $stderr.should_receive(:puts).any_number_of_times
17
+ runner = UninstallRunner.new
18
+ status = runner.process_options ["--nonsense"]
19
+ runner.options.should == nil
20
+ status.should == 1
21
+ end
22
+
23
+ it "process_options should make options as nil and return status as 1 if config option is not given" do
24
+ # also verify that an error message is printed
25
+ $stderr.should_receive(:puts).any_number_of_times
26
+ runner = UninstallRunner.new
27
+ status = runner.process_options []
28
+ runner.options.should == nil
29
+ status.should == 1
30
+ end
31
+
32
+ it "process_options should make options as nil and return status as 0 if command line includes '--help'" do
33
+ # also verify that the help message is printed
34
+ $stderr.should_receive(:puts)
35
+ runner = UninstallRunner.new
36
+ status = runner.process_options ["--help"]
37
+ runner.options.should == nil
38
+ status.should == 0
39
+ end
40
+
41
+ it "process_options should set the correct options" do
42
+ runner = UninstallRunner.new
43
+ runner.process_options ["-c", "config_path"]
44
+ runner.options[:config_file].should == 'config_path'
45
+ end
46
+
47
+ it "run should not start an uninstall if the command line is invalid" do
48
+ $stderr.should_receive(:puts).any_number_of_times
49
+ UninstallRunner.any_instance_should_not_receive(:execute) {
50
+ UninstallRunner.run(["--nonsense"])
51
+ }
52
+ end
53
+
54
+ it "run should start an uninstall if the command line is correct" do
55
+ UninstallRunner.any_instance_should_receive(:execute) {
56
+ UninstallRunner.run(["--config=path"])
57
+ }
58
+ end
59
+
60
+ it "session should create and return the session" do
61
+ runner = UninstallRunner.new
62
+ runner.options = {:config_file => "config/test_config.rb"}
63
+ runner.session.should be_an_instance_of(Session)
64
+ runner.session.should == runner.session # should only be created one time
65
+ end
66
+
67
+ it "execute should uninstall all rubyrep elements" do
68
+ config = deep_copy(standard_config)
69
+ config.options[:rep_prefix] = 'rx'
70
+ session = Session.new(config)
71
+ initializer = ReplicationInitializer.new(session)
72
+
73
+ initializer.ensure_infrastructure
74
+ initializer.create_trigger :left, 'scanner_records'
75
+
76
+ runner = UninstallRunner.new
77
+ runner.stub!(:session).and_return(session)
78
+
79
+ runner.execute
80
+
81
+ initializer.trigger_exists?(:left, 'scanner_records').should be_false
82
+ initializer.change_log_exists?(:left).should be_false
83
+ session.right.tables.include?('rx_running_flags').should be_false
84
+ initializer.event_log_exists?.should be_false
85
+ end
86
+ end