mongify 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +9 -0
- data/Gemfile.lock +22 -24
- data/README.rdoc +20 -2
- data/lib/mongify.rb +2 -1
- data/lib/mongify/cli/application.rb +4 -1
- data/lib/mongify/cli/options.rb +2 -0
- data/lib/mongify/database/base_connection.rb +2 -2
- data/lib/mongify/database/column.rb +88 -13
- data/lib/mongify/database/no_sql_connection.rb +17 -0
- data/lib/mongify/exceptions.rb +18 -4
- data/lib/mongify/progressbar.rb +270 -0
- data/lib/mongify/status.rb +44 -11
- data/lib/mongify/translation/process.rb +54 -40
- data/lib/mongify/ui.rb +8 -0
- data/lib/mongify/version.rb +1 -1
- data/mongify.gemspec +1 -1
- data/spec/mongify/database/base_connection_spec.rb +2 -2
- data/spec/mongify/database/column_spec.rb +67 -6
- data/spec/mongify/database/no_sql_connection_spec.rb +14 -0
- data/spec/mongify/status_spec.rb +35 -0
- data/spec/mongify/translation/process_spec.rb +31 -4
- data/spec/mongify/ui_spec.rb +6 -0
- metadata +13 -9
data/lib/mongify/status.rb
CHANGED
@@ -1,25 +1,58 @@
|
|
1
1
|
module Mongify
|
2
2
|
# This class is responsible for generating progress bars with status of mongify
|
3
3
|
class Status
|
4
|
+
# List of known notifications
|
5
|
+
NOTIFICATIONS = ['copy_data', 'copy_embedded', 'copy_polymorphic', 'update_references', 'remove_pre_mongified']
|
6
|
+
|
4
7
|
class << self
|
8
|
+
#List of all the progress bars.
|
9
|
+
def bars
|
10
|
+
@bars ||= {}
|
11
|
+
end
|
12
|
+
#Add a new bar to the list of progress bars
|
13
|
+
def add_bar(name, bar)
|
14
|
+
self.bars[name] = bar
|
15
|
+
end
|
16
|
+
|
5
17
|
# Registers the ActiveSupport::Notifications for Mongify
|
6
18
|
def register
|
7
|
-
@bars = {}
|
8
19
|
ActiveSupport::Notifications.subscribe(/^mongify\./) do |*args|
|
9
20
|
event = ActiveSupport::Notifications::Event.new(*args)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
21
|
+
|
22
|
+
action_name = event.name.split('.', 2)[1]
|
23
|
+
|
24
|
+
if Status::NOTIFICATIONS.include?(action_name)
|
25
|
+
case event.payload[:action]
|
26
|
+
when 'add'
|
27
|
+
self.add_bar(action_name, ProgressBar.new(event.payload[:name], event.payload[:size]))
|
28
|
+
when 'inc'
|
29
|
+
self.bars[action_name].try(:inc)
|
30
|
+
when 'finish'
|
31
|
+
self.bars[action_name].try(:finish)
|
32
|
+
else
|
33
|
+
UI.warn("Unknown Notification Action #{event.payload[:action]}")
|
34
|
+
end
|
35
|
+
#puts event.payload.inspect
|
19
36
|
else
|
20
|
-
UI.warn("Unknown Notification Event #{
|
37
|
+
UI.warn("Unknown Notification Event #{action_name}")
|
21
38
|
end
|
22
39
|
end
|
40
|
+
|
41
|
+
# Unregisters from {ActiveSupport::Notifications}
|
42
|
+
def unregister
|
43
|
+
ActiveSupport::Notifications.unsubscribe(/^mongify\./)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Publish an notification event
|
47
|
+
# This will publish the event as an mongify.[name]
|
48
|
+
# @param [String] name Name of the notification
|
49
|
+
# @param [Hash] payload to be sent with the notification
|
50
|
+
# @return [nil]
|
51
|
+
def publish(name, payload={})
|
52
|
+
payload.reverse_merge!(:name => name.humanize, :action => 'inc')
|
53
|
+
ActiveSupport::Notifications.instrument("mongify.#{name}", payload)
|
54
|
+
nil
|
55
|
+
end
|
23
56
|
end
|
24
57
|
end
|
25
58
|
end
|
@@ -5,7 +5,6 @@ module Mongify
|
|
5
5
|
#
|
6
6
|
module Process
|
7
7
|
attr_accessor :sql_connection, :no_sql_connection
|
8
|
-
|
9
8
|
# Does the actual act of processing the translation.
|
10
9
|
# Takes in boht a sql connection and a no sql connection
|
11
10
|
def process(sql_connection, no_sql_connection)
|
@@ -13,12 +12,13 @@ module Mongify
|
|
13
12
|
raise Mongify::NoSqlConnectionRequired, "Can only write to Mongify::Database::NoSqlConnection" unless no_sql_connection.is_a?(Mongify::Database::NoSqlConnection)
|
14
13
|
|
15
14
|
self.sql_connection = sql_connection
|
16
|
-
raise "SQL Connection is not valid" unless self.sql_connection.valid?
|
15
|
+
raise SqlConnectionInvalid, "SQL Connection is not valid" unless self.sql_connection.valid?
|
17
16
|
self.no_sql_connection = no_sql_connection
|
18
|
-
raise "noSql Connection is not valid" unless self.no_sql_connection.valid?
|
17
|
+
raise NoSqlConnectionInvalid, "noSql Connection is not valid" unless self.no_sql_connection.valid?
|
19
18
|
|
20
19
|
no_sql_connection.ask_to_drop_database if no_sql_connection.forced?
|
21
20
|
|
21
|
+
setup_db_index
|
22
22
|
copy_data
|
23
23
|
copy_embedded_tables
|
24
24
|
update_reference_ids
|
@@ -31,23 +31,32 @@ module Mongify
|
|
31
31
|
private
|
32
32
|
#######
|
33
33
|
|
34
|
+
# Setups up pre_mongifed_id as an index to speed up lookup performance
|
35
|
+
def setup_db_index
|
36
|
+
self.copy_tables.each do |t|
|
37
|
+
no_sql_connection.create_pre_mongified_id_index(t.name)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
34
41
|
# Does the straight copy (of tables)
|
35
42
|
def copy_data
|
36
|
-
ActiveSupport::Notifications.instrument('mongify.copy_data.start', :size => self.copy_tables.count)
|
37
43
|
self.copy_tables.each do |t|
|
38
|
-
sql_connection.select_rows(t.sql_name)
|
44
|
+
rows = sql_connection.select_rows(t.sql_name)
|
45
|
+
Mongify::Status.publish('copy_data', :size => rows.count, :name => "Copying #{t.name}", :action => 'add')
|
46
|
+
rows.each do |row|
|
39
47
|
no_sql_connection.insert_into(t.name, t.translate(row))
|
48
|
+
Mongify::Status.publish('copy_data')
|
40
49
|
end
|
41
|
-
|
50
|
+
Mongify::Status.publish('copy_data', :action => 'finish')
|
42
51
|
end
|
43
|
-
ActiveSupport::Notifications.instrument('mongify.copy_data.finish')
|
44
52
|
end
|
45
53
|
|
46
54
|
# Does a copy of the embedded tables
|
47
55
|
def copy_embedded_tables
|
48
|
-
ActiveSupport::Notifications.instrument('mongify.copy_embedded_tables.start', :size => self.embed_tables.count)
|
49
56
|
self.embed_tables.each do |t|
|
50
|
-
sql_connection.select_rows(t.sql_name)
|
57
|
+
rows = sql_connection.select_rows(t.sql_name)
|
58
|
+
Mongify::Status.publish('copy_embedded', :size => rows.count, :name => "Embedding #{t.name}", :action => 'add')
|
59
|
+
rows.each do |row|
|
51
60
|
target_row = no_sql_connection.find_one(t.embed_in, {:pre_mongified_id => row[t.embed_on]})
|
52
61
|
next unless target_row.present?
|
53
62
|
row = t.translate(row)
|
@@ -56,54 +65,60 @@ module Mongify
|
|
56
65
|
row.delete('pre_mongified_id')
|
57
66
|
save_function_call = t.embedded_as_object? ? '$set' : '$addToSet'
|
58
67
|
no_sql_connection.update(t.embed_in, target_row['_id'], {save_function_call => {t.name => row}})
|
68
|
+
Mongify::Status.publish('copy_embedded')
|
59
69
|
end
|
60
|
-
|
70
|
+
Mongify::Status.publish('copy_embedded', :action => 'finish')
|
61
71
|
end
|
62
|
-
ActiveSupport::Notifications.instrument('mongify.copy_embedded_tables.finish')
|
63
72
|
end
|
64
73
|
|
65
74
|
# Moves over polymorphic data
|
66
75
|
def copy_polymorphic_tables
|
67
|
-
ActiveSupport::Notifications.instrument('mongify.copy_polymorphic_tables.start', :size => self.polymorphic_tables.count)
|
68
76
|
self.polymorphic_tables.each do |t|
|
69
77
|
polymorphic_id_col, polymorphic_type_col = "#{t.polymorphic_as}_id", "#{t.polymorphic_as}_type"
|
70
|
-
sql_connection.select_rows(t.sql_name)
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
row.
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
78
|
+
rows = sql_connection.select_rows(t.sql_name)
|
79
|
+
Mongify::Status.publish('copy_polymorphic', :size => rows.count, :name => "Polymorphicizing #{t.name}", :action => 'add')
|
80
|
+
rows.each do |row|
|
81
|
+
|
82
|
+
#If no data is in the column, skip importing
|
83
|
+
|
84
|
+
if (row[polymorphic_type_col])
|
85
|
+
table_name = row[polymorphic_type_col].tableize
|
86
|
+
new_id = no_sql_connection.get_id_using_pre_mongified_id(table_name, row[polymorphic_id_col])
|
87
|
+
end
|
88
|
+
|
89
|
+
row = t.translate(row)
|
90
|
+
row[polymorphic_id_col] = new_id if new_id
|
91
|
+
row.merge!(fetch_reference_ids(t, row))
|
92
|
+
row.delete('pre_mongified_id')
|
93
|
+
|
94
|
+
if t.embedded? && table_name
|
95
|
+
row.delete(polymorphic_id_col)
|
96
|
+
row.delete(polymorphic_type_col)
|
97
|
+
save_function_call = t.embedded_as_object? ? '$set' : '$addToSet'
|
98
|
+
no_sql_connection.update(table_name, new_id, {save_function_call => {t.name => row}})
|
86
99
|
else
|
87
|
-
|
100
|
+
no_sql_connection.insert_into(t.name, row)
|
88
101
|
end
|
102
|
+
|
103
|
+
Mongify::Status.publish('copy_polymorphic')
|
89
104
|
end
|
90
|
-
|
105
|
+
Mongify::Status.publish('copy_polymorphic', :action => 'finish')
|
91
106
|
end
|
92
|
-
ActiveSupport::Notifications.instrument('mongify.copy_polymorphic_tables.finish')
|
93
107
|
end
|
94
108
|
|
95
109
|
# Updates the reference ids in the no sql database
|
96
110
|
def update_reference_ids
|
97
|
-
|
98
|
-
|
99
|
-
|
111
|
+
self.copy_tables.each do |t|
|
112
|
+
rows = no_sql_connection.select_rows(t.name)
|
113
|
+
Mongify::Status.publish('update_references', :size => rows.count, :name => "Updating References #{t.name}", :action => 'add')
|
114
|
+
rows.each do |row|
|
100
115
|
id = row["_id"]
|
101
116
|
attributes = fetch_reference_ids(t, row)
|
102
117
|
no_sql_connection.update(t.name, id, {"$set" => attributes}) unless attributes.blank?
|
118
|
+
Mongify::Status.publish('update_references')
|
103
119
|
end
|
104
|
-
|
120
|
+
Mongify::Status.publish('update_references', :action => 'finish')
|
105
121
|
end
|
106
|
-
ActiveSupport::Notifications.instrument('mongify.update_reference_ids.finish')
|
107
122
|
end
|
108
123
|
|
109
124
|
# Fetches the new _id from a collection
|
@@ -118,13 +133,12 @@ module Mongify
|
|
118
133
|
|
119
134
|
# Removes 'pre_mongiifed_id's from all collection
|
120
135
|
def remove_pre_mongified_ids
|
121
|
-
ActiveSupport::Notifications.instrument('mongify.remove_pre_mongified_ids.start', :size => self.tables.size)
|
122
|
-
p = ProgressBar.new("Removed pre_mongified_ids", self.copy_tables.count)
|
123
136
|
self.copy_tables.each do |t|
|
137
|
+
Mongify::Status.publish('remove_pre_mongified', :size => 1, :name => "Removing pre_mongified_id #{t.name}", :action => 'add')
|
124
138
|
no_sql_connection.remove_pre_mongified_ids(t.name)
|
125
|
-
|
139
|
+
Mongify::Status.publish('remove_pre_mongified', :action => 'finish')
|
140
|
+
# Mongify::Status.publish('remove_pre_mongified')
|
126
141
|
end
|
127
|
-
ActiveSupport::Notifications.instrument('mongify.remove_pre_mongified_ids.finish')
|
128
142
|
end
|
129
143
|
|
130
144
|
end
|
data/lib/mongify/ui.rb
CHANGED
@@ -49,6 +49,14 @@ module Mongify
|
|
49
49
|
def out_stream
|
50
50
|
Configuration.out_stream
|
51
51
|
end
|
52
|
+
|
53
|
+
# Creates an instance of HighLine
|
54
|
+
# which lets us figure out width of console
|
55
|
+
# plus a whole lot more
|
56
|
+
# @reutrn [HighLine] instance
|
57
|
+
def terminal_helper
|
58
|
+
@terminal_helper ||= HighLine.new
|
59
|
+
end
|
52
60
|
end
|
53
61
|
end
|
54
62
|
end
|
data/lib/mongify/version.rb
CHANGED
data/mongify.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.add_dependency('mongo', ">= 1.1.5")
|
20
20
|
s.add_dependency('bson_ext', ">= 1.1.5")
|
21
21
|
s.add_dependency('net-ssh', ">= 2.0")
|
22
|
-
s.add_dependency('
|
22
|
+
s.add_dependency('highline', '>= 1.6.1')
|
23
23
|
|
24
24
|
s.add_development_dependency('rspec', '>= 2.0')
|
25
25
|
s.add_development_dependency('rcov', '>= 0.9.9')
|
@@ -26,10 +26,10 @@ describe Mongify::Database::BaseConnection do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
it "should raise error when trying to call has_connection?" do
|
29
|
-
lambda { @base_connection.has_connection? }.should raise_error(
|
29
|
+
lambda { @base_connection.has_connection? }.should raise_error(Mongify::NotImplementedMongifyError)
|
30
30
|
end
|
31
31
|
it "should raise error when trying to call setup_connection_adapter" do
|
32
|
-
lambda { @base_connection.setup_connection_adapter}.should raise_error(
|
32
|
+
lambda { @base_connection.setup_connection_adapter}.should raise_error(Mongify::NotImplementedMongifyError)
|
33
33
|
end
|
34
34
|
|
35
35
|
it "should raise error on setting unknown variable setting" do
|
@@ -122,6 +122,35 @@ describe Mongify::Database::Column do
|
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
125
|
+
context "as" do
|
126
|
+
subject {Mongify::Database::Column.new('total', :decimal)}
|
127
|
+
it "should default to string" do
|
128
|
+
subject.as.should == 'string'
|
129
|
+
end
|
130
|
+
it "should allow it to be set to integer" do
|
131
|
+
subject.as = 'integer'
|
132
|
+
subject.should be_as_integer
|
133
|
+
end
|
134
|
+
it "should not allow other values" do
|
135
|
+
subject.as = "zuza"
|
136
|
+
subject.as.should == 'string'
|
137
|
+
end
|
138
|
+
end
|
139
|
+
context "scale" do
|
140
|
+
subject {Mongify::Database::Column.new('total', :decimal, :as => 'integer')}
|
141
|
+
it "should be defaulted to 0" do
|
142
|
+
subject.scale.should be_zero
|
143
|
+
end
|
144
|
+
it "should let you set the scale" do
|
145
|
+
subject.scale = 3
|
146
|
+
subject.scale.should == 3
|
147
|
+
end
|
148
|
+
it "should return 0 on invalid input" do
|
149
|
+
subject.scale = 'zuza'
|
150
|
+
subject.scale.should be_zero
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
125
154
|
context :to_print do
|
126
155
|
before(:each) do
|
127
156
|
@column = Mongify::Database::Column.new('first_name', :string)
|
@@ -160,6 +189,10 @@ describe Mongify::Database::Column do
|
|
160
189
|
@column = Mongify::Database::Column.new('id', :key)
|
161
190
|
@column.translate(123123).should == {"pre_mongified_id" => 123123}
|
162
191
|
end
|
192
|
+
it "should return an integer for pre_mongified_id" do
|
193
|
+
@column = Mongify::Database::Column.new('id', :key)
|
194
|
+
@column.translate('123123').should == {"pre_mongified_id" => 123123}
|
195
|
+
end
|
163
196
|
end
|
164
197
|
context :type_cast do
|
165
198
|
it "should return value if unknown type" do
|
@@ -212,14 +245,42 @@ describe Mongify::Database::Column do
|
|
212
245
|
before(:each) do
|
213
246
|
@column = Mongify::Database::Column.new('price', :decimal)
|
214
247
|
end
|
215
|
-
it "should convert numbers to decimal" do
|
216
|
-
@column.send(:type_cast, 101.43).should ==
|
248
|
+
it "should convert numbers to decimal string" do
|
249
|
+
@column.send(:type_cast, 101.43).should == "101.43"
|
217
250
|
end
|
218
|
-
it "should convert integers to decimal" do
|
219
|
-
@column.send(:type_cast, 101).should ==
|
251
|
+
it "should convert integers to decimal string" do
|
252
|
+
@column.send(:type_cast, 101).should == "101.0"
|
220
253
|
end
|
221
|
-
it "should convert strings to 0.0" do
|
222
|
-
@column.send(:type_cast, 'zuza').should ==
|
254
|
+
it "should convert strings to 0.0 (string)" do
|
255
|
+
@column.send(:type_cast, 'zuza').should == "0.0"
|
256
|
+
end
|
257
|
+
it "should return a string value" do
|
258
|
+
@column.send(:type_cast, 101.43).should be_a_kind_of String
|
259
|
+
end
|
260
|
+
|
261
|
+
context "as integer" do
|
262
|
+
before(:each) do
|
263
|
+
@column = Mongify::Database::Column.new('price', :decimal, :as => 'integer')
|
264
|
+
@value = 101.123455
|
265
|
+
end
|
266
|
+
it "should be as_integer" do
|
267
|
+
@column.should be_as_integer
|
268
|
+
end
|
269
|
+
it "should convert number to integer" do
|
270
|
+
@column.send(:type_cast, @value).should == 101
|
271
|
+
end
|
272
|
+
it "should let you specify scale" do
|
273
|
+
@column.scale = 3
|
274
|
+
@column.send(:type_cast, @value).should == 101123
|
275
|
+
end
|
276
|
+
it "should round correctly to specified scale" do
|
277
|
+
@column.scale = 4
|
278
|
+
@column.send(:type_cast, @value).should == 1011235
|
279
|
+
end
|
280
|
+
it "should return an integer value" do
|
281
|
+
@column.scale = 3
|
282
|
+
@column.send(:type_cast, @value).should be_an_integer
|
283
|
+
end
|
223
284
|
end
|
224
285
|
end
|
225
286
|
context :timestamp do
|
@@ -116,9 +116,23 @@ describe Mongify::Database::NoSqlConnection do
|
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
|
+
it "should create index for pre_mongified_id" do
|
120
|
+
@collection.should_receive(:create_index).with([["pre_mongified_id", Mongo::ASCENDING]]).and_return(true)
|
121
|
+
@mongodb_connection.create_pre_mongified_id_index('users')
|
122
|
+
end
|
123
|
+
|
119
124
|
context "remove_pre_mongified_ids" do
|
125
|
+
before(:each) do
|
126
|
+
@collection.stub(:index_information).and_return('pre_mongified_id_1' => 'something')
|
127
|
+
end
|
120
128
|
it "should call update with unset" do
|
121
129
|
@collection.should_receive(:update).with({},{'$unset' => {'pre_mongified_id' => 1}}, {:multi=>true})
|
130
|
+
@collection.stub(:drop_index)
|
131
|
+
@mongodb_connection.remove_pre_mongified_ids('users')
|
132
|
+
end
|
133
|
+
it "should drop the index" do
|
134
|
+
@collection.should_receive(:drop_index).with('pre_mongified_id_1')
|
135
|
+
@collection.stub(:update)
|
122
136
|
@mongodb_connection.remove_pre_mongified_ids('users')
|
123
137
|
end
|
124
138
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mongify::Status do
|
4
|
+
it "should warn if it's an unknown notification" do
|
5
|
+
Mongify::UI.should_receive(:warn).at_least(1)
|
6
|
+
Mongify::Status.publish('unknwon')
|
7
|
+
end
|
8
|
+
context "publish" do
|
9
|
+
before(:each) do
|
10
|
+
@bar = stub(:title= => '')
|
11
|
+
Mongify::Status.bars.stub(:[]).and_return(@bar)
|
12
|
+
end
|
13
|
+
it "should create a new progress bar" do
|
14
|
+
Mongify::ProgressBar.should_receive(:new)
|
15
|
+
Mongify::Status.publish('copy_data', :size => 100, :action => 'add')
|
16
|
+
end
|
17
|
+
context "on inc" do
|
18
|
+
before(:each) do
|
19
|
+
@bar.stub(:inc)
|
20
|
+
end
|
21
|
+
it "should inc a already created progress bar" do
|
22
|
+
@bar.should_receive(:inc)
|
23
|
+
Mongify::Status.publish('copy_data', :action => 'inc')
|
24
|
+
end
|
25
|
+
it "should inc by default action" do
|
26
|
+
@bar.should_receive(:inc)
|
27
|
+
Mongify::Status.publish('copy_data')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
it "should finish the progress bar" do
|
31
|
+
@bar.should_receive(:finish)
|
32
|
+
Mongify::Status.publish('copy_data', :action => 'finish')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -23,6 +23,10 @@ describe Mongify::Translation::Process do
|
|
23
23
|
@translation.stub(:copy_data)
|
24
24
|
@translation.stub(:copy_embedded_tables)
|
25
25
|
end
|
26
|
+
it "should setup index on pre_mongify_id" do
|
27
|
+
@translation.should_receive(:setup_db_index)
|
28
|
+
@translation.process(@sql_connection, @no_sql_connection)
|
29
|
+
end
|
26
30
|
it "should call copy_data" do
|
27
31
|
@translation.should_receive(:copy_data)
|
28
32
|
@translation.process(@sql_connection, @no_sql_connection)
|
@@ -39,6 +43,13 @@ describe Mongify::Translation::Process do
|
|
39
43
|
@translation.should_receive(:remove_pre_mongified_ids)
|
40
44
|
@translation.process(@sql_connection, @no_sql_connection)
|
41
45
|
end
|
46
|
+
|
47
|
+
it "should add pre_mongified_id index to database" do
|
48
|
+
tables = [stub(:name => 'users')]
|
49
|
+
@translation.stub(:copy_tables).and_return(tables)
|
50
|
+
@no_sql_connection.should_receive(:create_pre_mongified_id_index).with('users')
|
51
|
+
@translation.process(@sql_connection, @no_sql_connection)
|
52
|
+
end
|
42
53
|
end
|
43
54
|
|
44
55
|
it "should ask_to_drop_database if mongodb_connection is forced" do
|
@@ -47,7 +58,6 @@ describe Mongify::Translation::Process do
|
|
47
58
|
@translation.process(@sql_connection, @no_sql_connection)
|
48
59
|
end
|
49
60
|
|
50
|
-
|
51
61
|
context "fetch_reference_ids" do
|
52
62
|
it "should get correct information" do
|
53
63
|
@no_sql_connection = mock()
|
@@ -153,8 +163,8 @@ describe Mongify::Translation::Process do
|
|
153
163
|
:sql_name => 'user_accounts')
|
154
164
|
@translation.stub(:find).with('user_accounts').and_return([@ref_table])
|
155
165
|
|
156
|
-
@sql_connection.
|
157
|
-
@no_sql_connection.
|
166
|
+
@sql_connection.stub(:select_rows).with('comments').and_return([{'commentable_id' => 1, 'commentable_type' => 'UserAccount', 'data' => 'good'}])
|
167
|
+
@no_sql_connection.stub(:get_id_using_pre_mongified_id).with('user_accounts', 1).and_return(500)
|
158
168
|
end
|
159
169
|
context "embedded" do
|
160
170
|
it "should work correctly" do
|
@@ -187,10 +197,27 @@ describe Mongify::Translation::Process do
|
|
187
197
|
:reference_columns => [])
|
188
198
|
|
189
199
|
@translation.stub(:all_tables).and_return([@table])
|
190
|
-
|
200
|
+
@no_sql_connection.should_receive(:get_id_using_pre_mongified_id).with('user_accounts', 1).and_return(500)
|
191
201
|
@no_sql_connection.should_receive(:insert_into).with('comments', {'data' => 123, 'commentable_type' => 'UserAccount', 'commentable_id' => 500})
|
192
202
|
@translation.send(:copy_polymorphic_tables)
|
193
203
|
end
|
204
|
+
it "should copy even if there is no polymorphic data" do
|
205
|
+
@table = mock(:translate => {'data' => 123, 'commentable_type' => nil, 'commentable_id' => nil},
|
206
|
+
:name => 'comments',
|
207
|
+
:embedded? => false,
|
208
|
+
:polymorphic_as => 'commentable',
|
209
|
+
:polymorphic? => true,
|
210
|
+
:ignored? => false,
|
211
|
+
:embedded_as_object? => false,
|
212
|
+
:sql_name => 'comments',
|
213
|
+
:reference_columns => [])
|
214
|
+
|
215
|
+
@translation.stub(:all_tables).and_return([@table])
|
216
|
+
@sql_connection.should_receive(:select_rows).with('comments').and_return([{'commentable_id' => nil, 'commentable_type' => nil, 'data' => 'good'}])
|
217
|
+
@no_sql_connection.should_receive(:insert_into).with('comments', {'data' => 123, 'commentable_type' => nil, 'commentable_id' => nil})
|
218
|
+
@no_sql_connection.should_receive(:get_id_using_pre_mongified_id).never
|
219
|
+
@translation.send(:copy_polymorphic_tables)
|
220
|
+
end
|
194
221
|
end
|
195
222
|
end
|
196
223
|
|