mongify 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.yardopts +3 -0
  4. data/CHANGELOG.rdoc +5 -0
  5. data/Gemfile.lock +52 -6
  6. data/LICENSE +1 -1
  7. data/README.rdoc +29 -11
  8. data/Rakefile +37 -9
  9. data/features/options.feature +2 -0
  10. data/features/print.feature +1 -1
  11. data/features/process.feature +10 -1
  12. data/features/step_definitions/process_steps.rb +11 -1
  13. data/features/support/env.rb +1 -1
  14. data/lib/mongify/cli/application.rb +7 -7
  15. data/lib/mongify/cli/command/worker.rb +18 -14
  16. data/lib/mongify/cli/options.rb +2 -1
  17. data/lib/mongify/configuration.rb +5 -5
  18. data/lib/mongify/database/base_connection.rb +6 -6
  19. data/lib/mongify/database/column.rb +40 -40
  20. data/lib/mongify/database/data_row.rb +9 -9
  21. data/lib/mongify/database/no_sql_connection.rb +61 -35
  22. data/lib/mongify/database/sql_connection.rb +44 -15
  23. data/lib/mongify/database/table.rb +62 -46
  24. data/lib/mongify/exceptions.rb +5 -5
  25. data/lib/mongify/progressbar.rb +15 -15
  26. data/lib/mongify/status.rb +8 -8
  27. data/lib/mongify/translation.rb +19 -17
  28. data/lib/mongify/translation/process.rb +16 -123
  29. data/lib/mongify/translation/processor_common.rb +132 -0
  30. data/lib/mongify/translation/sync.rb +112 -0
  31. data/lib/mongify/ui.rb +9 -9
  32. data/lib/mongify/version.rb +1 -1
  33. data/mongify.gemspec +4 -2
  34. data/spec/files/deleting_fields_from_embedding_parent_translation.rb +19 -0
  35. data/spec/files/embedded_parent_translation.rb +1 -1
  36. data/spec/mongify/cli/application_spec.rb +1 -1
  37. data/spec/mongify/cli/options_spec.rb +1 -1
  38. data/spec/mongify/cli/worker_command_spec.rb +46 -17
  39. data/spec/mongify/database/column_spec.rb +21 -21
  40. data/spec/mongify/database/data_row_spec.rb +11 -11
  41. data/spec/mongify/database/no_sql_connection_spec.rb +61 -27
  42. data/spec/mongify/database/sql_connection_spec.rb +62 -2
  43. data/spec/mongify/database/table_spec.rb +53 -29
  44. data/spec/mongify/translation/printer_spec.rb +2 -2
  45. data/spec/mongify/translation/process_spec.rb +50 -34
  46. data/spec/mongify/translation/sync_spec.rb +184 -0
  47. data/spec/mongify/translation_spec.rb +8 -8
  48. data/spec/mongify/ui_spec.rb +12 -12
  49. data/spec/mongify_spec.rb +1 -1
  50. data/spec/spec_helper.rb +8 -1
  51. data/spec/support/config_reader.rb +2 -2
  52. data/spec/support/database_generator.rb +68 -25
  53. data/spec/support/database_output.txt +17 -0
  54. metadata +41 -6
@@ -13,11 +13,11 @@ describe Mongify::Translation do
13
13
  @table2.column('id', :key)
14
14
  @translation.add_table(@table2)
15
15
  end
16
-
16
+
17
17
  subject{@translation}
18
18
 
19
19
  it "should output correctly" do
20
- subject.print.should == <<-EOF
20
+ subject.print.should == <<-EOF
21
21
  table "users" do
22
22
  \tcolumn "first_name", :string
23
23
  \tcolumn "age", :integer
@@ -8,15 +8,15 @@ describe Mongify::Translation::Process do
8
8
  @translation = Mongify::Translation.new
9
9
  Mongify::Configuration.out_stream = nil
10
10
  end
11
-
11
+
12
12
  it "validates a sqlconnection" do
13
13
  lambda { @translation.process('bad param', 'bad param2') }.should raise_error(Mongify::SqlConnectionRequired)
14
14
  end
15
-
15
+
16
16
  it "should require a NoSqlConnection" do
17
17
  lambda { @translation.process(@sql_connection, 'bad param2') }.should raise_error(Mongify::NoSqlConnectionRequired)
18
18
  end
19
-
19
+
20
20
  describe "process" do
21
21
  before(:each) do
22
22
  @translation.stub(:remove_pre_mongified_ids)
@@ -44,7 +44,7 @@ describe Mongify::Translation::Process do
44
44
  @translation.should_receive(:remove_pre_mongified_ids)
45
45
  @translation.process(@sql_connection, @no_sql_connection)
46
46
  end
47
-
47
+
48
48
  it "should add pre_mongified_id index to database" do
49
49
  tables = [stub(:name => 'users')]
50
50
  @translation.stub(:copy_tables).and_return(tables)
@@ -52,13 +52,13 @@ describe Mongify::Translation::Process do
52
52
  @translation.process(@sql_connection, @no_sql_connection)
53
53
  end
54
54
  end
55
-
55
+
56
56
  it "should ask_to_drop_database if mongodb_connection is forced" do
57
57
  @no_sql_connection.should_receive(:forced?).and_return(true)
58
58
  @no_sql_connection.should_receive(:ask_to_drop_database).and_return(false)
59
59
  @translation.process(@sql_connection, @no_sql_connection)
60
60
  end
61
-
61
+
62
62
  context "fetch_reference_ids" do
63
63
  it "should get correct information" do
64
64
  @no_sql_connection = mock()
@@ -81,37 +81,38 @@ describe Mongify::Translation::Process do
81
81
  @translation.send(:fetch_reference_ids, @table, {'user_ids' => [1, 2]}).should == {'user_ids' => [500, 501]}
82
82
  end
83
83
  end
84
-
84
+
85
85
  context "processing actions" do
86
86
  before(:each) do
87
- @sql_connection = mock(:select_rows => [{'first_name'=> 'Timmy', 'last_name' => 'Zuza', 'preference_id' => 1}])
87
+ @sql_connection.stub(:select_paged_rows).and_return([{'first_name'=> 'Timmy', 'last_name' => 'Zuza', 'preference_id' => 1}])
88
88
  @translation.stub(:sql_connection).and_return(@sql_connection)
89
-
89
+
90
90
  @no_sql_connection = mock()
91
91
  @translation.stub(:no_sql_connection).and_return(@no_sql_connection)
92
-
92
+
93
93
  @table = mock(:translate => {'first_name'=> 'Timmy', 'last_name' => 'Zuza', 'preference_id' => 1},
94
- :name => 'users',
95
- :embedded? => false,
94
+ :name => 'users',
95
+ :embedded? => false,
96
96
  :sql_name => 'users')
97
-
97
+
98
98
  @translation.stub(:tables).and_return([@table])
99
99
  end
100
-
100
+
101
101
  context "copy_data" do
102
102
  it "should call translate on the tables" do
103
- @no_sql_connection.should_receive(:insert_into).with("users", {"last_name"=>"Zuza", "preference_id"=>1, "first_name"=>"Timmy"}).and_return(true)
103
+ @no_sql_connection.should_receive(:insert_into).with("users", [{"last_name"=>"Zuza", "preference_id"=>1, "first_name"=>"Timmy"}]).and_return(true)
104
104
  @translation.send(:copy_data)
105
105
  end
106
106
  it "should allow rename of table" do
107
107
  @table.stub(:name).and_return('people')
108
- @no_sql_connection.should_receive(:insert_into).with("people", {"last_name"=>"Zuza", "preference_id"=>1, "first_name"=>"Timmy"}).and_return(true)
108
+ @no_sql_connection.should_receive(:insert_into).with("people", [{"last_name"=>"Zuza", "preference_id"=>1, "first_name"=>"Timmy"}]).and_return(true)
109
109
  @translation.send(:copy_data)
110
110
  end
111
111
  end
112
-
112
+
113
113
  context "copy_embed_tables" do
114
114
  before(:each) do
115
+ @sql_connection.stub(:select_rows).and_return([{'first_name'=> 'Timmy', 'last_name' => 'Zuza', 'preference_id' => 1}])
115
116
  @target_table = mock(:name => 'posts', :embedded? => false, :sql_name => 'posts')
116
117
  @embed_table = mock(:translate => {}, :name => 'comments', :embedded? => true, :embed_on => 'post_id', :embed_in => 'posts', :embedded_as_object? => false, :sql_name => 'comments')
117
118
  @no_sql_connection.stub(:find_one).and_return({'_id' => 500})
@@ -148,29 +149,35 @@ describe Mongify::Translation::Process do
148
149
  @no_sql_connection.should_receive(:update).with("posts", 500, {"$set"=>{"notes"=>{'first_name' => 'bob'}}})
149
150
  @translation.send(:copy_embedded_tables)
150
151
  end
151
-
152
+
152
153
  context "parent modification" do
154
+ it 'should unset fields deleted in the parent row' do
155
+ @embed_table = mock(:translate => [{}, {'email' => 'true'}, {'field_1' => '1'}], :name => 'preferences', :sql_name => 'preferences', :embedded? => true, :embed_on => 'post_id', :embed_in => 'posts', :embedded_as_object? => true)
156
+ @translation.stub(:tables).and_return([@target_table, @embed_table])
157
+ @no_sql_connection.should_receive(:update).with("posts", 500, {"$set"=>{"preferences"=>{}, "email"=>"true"}, "$unset"=>{'field_1' => '1'}})
158
+ @translation.send(:copy_embedded_tables)
159
+ end
153
160
  it "should work with embedded objects" do
154
- @embed_table = mock(:translate => [{}, {'email' => 'true'}], :name => 'preferences', :sql_name => 'preferences', :embedded? => true, :embed_on => 'post_id', :embed_in => 'posts', :embedded_as_object? => true)
161
+ @embed_table = mock(:translate => [{}, {'email' => 'true'}, {}], :name => 'preferences', :sql_name => 'preferences', :embedded? => true, :embed_on => 'post_id', :embed_in => 'posts', :embedded_as_object? => true)
155
162
  @translation.stub(:tables).and_return([@target_table, @embed_table])
156
163
  @no_sql_connection.should_receive(:update).with("posts", 500, {"$set"=>{"preferences"=>{}, "email"=>"true"}})
157
164
  @translation.send(:copy_embedded_tables)
158
165
  end
159
166
  it "should work with embedded arrays" do
160
- @embed_table = mock(:translate => [{}, {'email' => 'true'}], :name => 'preferences', :sql_name => 'preferences', :embedded? => true, :embed_on => 'post_id', :embed_in => 'posts', :embedded_as_object? => false)
167
+ @embed_table = mock(:translate => [{}, {'email' => 'true'}, {}], :name => 'preferences', :sql_name => 'preferences', :embedded? => true, :embed_on => 'post_id', :embed_in => 'posts', :embedded_as_object? => false)
161
168
  @translation.stub(:tables).and_return([@target_table, @embed_table])
162
169
  @no_sql_connection.should_receive(:update).with("posts", 500, {"$addToSet"=>{"preferences"=>{}}, "$set" => {"email"=>"true"}})
163
170
  @translation.send(:copy_embedded_tables)
164
171
  end
165
172
  it "should not set embedded attribute in parent" do
166
- @embed_table = mock(:translate => [{'first_name' => 'joe'}, {'email' => 'true', 'comments' => [{'first_name' => 'bob'}]}], :name => 'comments', :sql_name => 'comments', :embedded? => true, :embed_on => 'post_id', :embed_in => 'posts', :embedded_as_object? => false)
173
+ @embed_table = mock(:translate => [{'first_name' => 'joe'}, {'email' => 'true', 'comments' => [{'first_name' => 'bob'}]}, {}], :name => 'comments', :sql_name => 'comments', :embedded? => true, :embed_on => 'post_id', :embed_in => 'posts', :embedded_as_object? => false)
167
174
  @translation.stub(:tables).and_return([@target_table, @embed_table])
168
175
  @no_sql_connection.should_receive(:update).with("posts", 500, {"$addToSet" => {"comments" => {"first_name" => "joe"}}, "$set" => {"email" => "true"}})
169
176
  @translation.send(:copy_embedded_tables)
170
177
  end
171
178
  end
172
179
  end
173
-
180
+
174
181
  context "append_parent_object" do
175
182
  before(:each) do
176
183
  @parent = {"preference" => "email"}
@@ -188,8 +195,17 @@ describe Mongify::Translation::Process do
188
195
  @obj = {"$setAppend" => {"existing" => "true"}}
189
196
  @translation.send(:append_parent_object, @obj, @parent).should == {"$setAppend" => {"existing" => "true"}}
190
197
  end
198
+ it "should not unset values if no unset_key is given" do
199
+ @obj = {"$setAppend" => {"existing" => "true"}}
200
+ @translation.send(:append_parent_object, @obj, @parent, {}).should == {"$set" => {"preference" => "email"}, "$setAppend" => {"existing" => "true"}}
201
+ end
202
+ it "should unset values if unset_keys are given" do
203
+ @obj = {"$set" => {"existing" => "true"}}
204
+ @translation.send(:append_parent_object, @obj, @parent, {'field_1' => '1'}).should ==
205
+ {"$set" => {"existing" => "true", "preference" => "email"}, '$unset' => {'field_1' => '1'}}
206
+ end
191
207
  end
192
-
208
+
193
209
  context "update_reference_ids" do
194
210
  it "should work correctly" do
195
211
  @no_sql_connection.should_receive(:select_rows).and_return([{'_id' => 100, 'user_id' => 1}, {'_id'=> 101, 'user_id' => 2}])
@@ -206,32 +222,32 @@ describe Mongify::Translation::Process do
206
222
  @translation.send(:update_reference_ids)
207
223
  end
208
224
  end
209
-
225
+
210
226
  context "copy_polymorphic_tables" do
211
227
  before(:each) do
212
- @ref_table = mock(:name => 'user_accounts',
228
+ @ref_table = mock(:name => 'user_accounts',
213
229
  :embedded? => false,
214
230
  :ignored? => false,
215
231
  :sql_name => 'user_accounts')
216
232
  @translation.stub(:find).with('user_accounts').and_return([@ref_table])
217
-
233
+
218
234
  @sql_connection.stub(:select_rows).with('comments').and_return([{'commentable_id' => 1, 'commentable_type' => 'UserAccount', 'data' => 'good'}])
219
235
  @no_sql_connection.stub(:get_id_using_pre_mongified_id).with('user_accounts', 1).and_return(500)
220
236
  end
221
237
  context "embedded" do
222
238
  it "should work correctly" do
223
239
  @table = mock(:translate => {'data' => 123},
224
- :name => 'comments',
240
+ :name => 'comments',
225
241
  :embedded? => true,
226
242
  :polymorphic_as => 'commentable',
227
- :polymorphic? => true,
243
+ :polymorphic? => true,
228
244
  :ignored? => false,
229
245
  :embedded_as_object? => false,
230
246
  :sql_name => 'comments',
231
247
  :reference_columns => [])
232
248
 
233
249
  @translation.stub(:all_tables).and_return([@table])
234
-
250
+
235
251
  @no_sql_connection.should_receive(:update).with('user_accounts', 500, {'$addToSet' => {'comments' => {'data' => 123}}})
236
252
  @translation.send(:copy_polymorphic_tables)
237
253
  end
@@ -239,10 +255,10 @@ describe Mongify::Translation::Process do
239
255
  context "not embedded" do
240
256
  it "should work" do
241
257
  @table = mock(:translate => {'data' => 123, 'commentable_type' => 'UserAccount', 'commentable_id' => 1},
242
- :name => 'comments',
258
+ :name => 'comments',
243
259
  :embedded? => false,
244
260
  :polymorphic_as => 'commentable',
245
- :polymorphic? => true,
261
+ :polymorphic? => true,
246
262
  :ignored? => false,
247
263
  :embedded_as_object? => false,
248
264
  :sql_name => 'comments',
@@ -255,10 +271,10 @@ describe Mongify::Translation::Process do
255
271
  end
256
272
  it "should copy even if there is no polymorphic data" do
257
273
  @table = mock(:translate => {'data' => 123, 'commentable_type' => nil, 'commentable_id' => nil},
258
- :name => 'comments',
274
+ :name => 'comments',
259
275
  :embedded? => false,
260
276
  :polymorphic_as => 'commentable',
261
- :polymorphic? => true,
277
+ :polymorphic? => true,
262
278
  :ignored? => false,
263
279
  :embedded_as_object? => false,
264
280
  :sql_name => 'comments',
@@ -272,7 +288,7 @@ describe Mongify::Translation::Process do
272
288
  end
273
289
  end
274
290
  end
275
-
291
+
276
292
  context "remove_pre_mongified_ids" do
277
293
  it "should remove_pre_mongified_ids on no_sql_connection" do
278
294
  @no_sql_connection.should_receive(:remove_pre_mongified_ids).with(anything)
@@ -0,0 +1,184 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongify::Translation::Sync do
4
+ before(:each) do
5
+ DatabaseGenerator.clear_mongodb
6
+ @sql_connection = DatabaseGenerator.sqlite_connection
7
+ @no_sql_connection = DatabaseGenerator.mongo_connection
8
+ @translation = Mongify::Translation.new
9
+ Mongify::Configuration.out_stream = nil
10
+ end
11
+
12
+ it "validates a sqlconnection" do
13
+ lambda { @translation.sync('bad param', 'bad param2') }.should raise_error(Mongify::SqlConnectionRequired)
14
+ end
15
+
16
+ it "should require a NoSqlConnection" do
17
+ lambda { @translation.sync(@sql_connection, 'bad param2') }.should raise_error(Mongify::NoSqlConnectionRequired)
18
+ end
19
+
20
+ describe "sync" do
21
+ before(:each) do
22
+ @translation.stub(:setup_sync_table)
23
+ @translation.stub(:setup_db_index)
24
+ @translation.stub(:sync_data)
25
+ @translation.stub(:set_last_updated_at)
26
+ @translation.stub(:sync_update_reference_ids)
27
+ @translation.stub(:copy_embedded_tables)
28
+ end
29
+ it "should create sync helper table if it doesn't exist" do
30
+ @translation.should_receive(:setup_sync_table)
31
+ @translation.sync(@sql_connection, @no_sql_connection)
32
+ end
33
+ it "should setup index on pre_mongify_id" do
34
+ @translation.should_receive(:setup_db_index)
35
+ @translation.sync(@sql_connection, @no_sql_connection)
36
+ end
37
+ it "should call copy_data" do
38
+ @translation.should_receive(:sync_data)
39
+ @translation.sync(@sql_connection, @no_sql_connection)
40
+ end
41
+ it "should call set_last_updated_at to mark synced data in the source" do
42
+ @translation.should_receive(:set_last_updated_at)
43
+ @translation.sync(@sql_connection, @no_sql_connection)
44
+ end
45
+ it "should call sync_update_reference_ids" do
46
+ @translation.should_receive(:sync_update_reference_ids)
47
+ @translation.sync(@sql_connection, @no_sql_connection)
48
+ end
49
+ it "should call copy_embedded_tables" do
50
+ @translation.should_receive(:copy_embedded_tables)
51
+ @translation.sync(@sql_connection, @no_sql_connection)
52
+ end
53
+ end
54
+
55
+ context "syncing actions" do
56
+ before(:each) do
57
+ @sql_connection = mock(:select_rows => [{'first_name'=> 'Timmy', 'last_name' => 'Zuza', 'preference_id' => 1}])
58
+ @translation.stub(:sql_connection).and_return(@sql_connection)
59
+
60
+ @no_sql_connection = mock()
61
+ @translation.stub(:no_sql_connection).and_return(@no_sql_connection)
62
+
63
+ @table = mock(:translate => {'first_name'=> 'Timmy', 'last_name' => 'Zuza', 'preference_id' => 1},
64
+ :name => 'users',
65
+ :embedded? => false,
66
+ :sql_name => 'users')
67
+
68
+ @translation.stub(:tables).and_return([@table])
69
+ end
70
+
71
+ context "SyncHelperMigrator" do
72
+ it "should create a table with index in the up dir" do
73
+ migrator = Mongify::Translation::Sync::SyncHelperMigrator.new
74
+ helper = Mongify::Translation::Sync::SYNC_HELPER_TABLE
75
+ t = mock({:string => 1, :datetime => 1})
76
+ t.should_receive(:string).with(:table_name)
77
+ t.should_receive(:datetime).with(:last_updated_at)
78
+ migrator.stub(:create_table).and_yield(t)
79
+ migrator.should_receive(:create_table).with(helper, :id => false)
80
+ migrator.stub(:add_index)
81
+ migrator.should_receive(:add_index).with(helper, :table_name)
82
+ migrator.up
83
+ end
84
+ end
85
+
86
+ context "setup_sync_table" do
87
+ before(:each) do
88
+ @helper = Mongify::Translation::Sync::SYNC_HELPER_TABLE
89
+ @query = "SELECT count(*) FROM #{@helper}"
90
+ @sql_connection.stub(:execute).with(@query).and_return(5)
91
+ @sql_connection.should_receive(:execute).with(@query)
92
+ @translation.stub(:copy_tables).and_return([mock(:sql_name => 'table1')])
93
+ end
94
+
95
+ it "should create sync helper table if it doesn't exist" do
96
+ @sql_connection.stub(:execute).with(@query).and_raise
97
+ migrator = mock(:up)
98
+ Mongify::Translation::Sync::SyncHelperMigrator.stub(:new).and_return(migrator)
99
+ migrator.should_receive(:up)
100
+ @translation.stub(:copy_tables).and_return([])
101
+ @translation.send(:setup_sync_table)
102
+ end
103
+
104
+ it "should find rows for existing table representatives" do
105
+ @sql_connection.stub(:count).and_return(1)
106
+ @sql_connection.should_receive(:count).with(@helper, "table_name = 'table1'")
107
+ @translation.send(:setup_sync_table)
108
+ end
109
+
110
+ it "should insert new records for non existing table representatives" do
111
+ @sql_connection.stub(:count).and_return(0)
112
+ @sql_connection.should_receive(:count).with(@helper, "table_name = 'table1'")
113
+ insert_query = "INSERT INTO #{@helper} (table_name, last_updated_at) VALUES ('table1', '1970-01-01')"
114
+ @sql_connection.stub(:execute).with(insert_query)
115
+ @sql_connection.should_receive(:execute).with(insert_query)
116
+ @translation.send(:setup_sync_table)
117
+ end
118
+ end
119
+
120
+ context "set_last_updated_at" do
121
+ it "should update last_updated_at timestamp for each table that generated sync data" do
122
+ @translation.stub(:copy_tables).and_return([mock(:sql_name => 'table1')])
123
+ @translation.max_updated_at = {'table1' => {'max_updated_at_id' => 1, 'key_column' => 'id'}}
124
+ helper = Mongify::Translation::Sync::SYNC_HELPER_TABLE
125
+ query = "UPDATE #{helper} SET last_updated_at = (SELECT updated_at FROM table1 WHERE id = '1') WHERE table_name = 'table1'"
126
+ @sql_connection.stub(:execute).with(query)
127
+ @sql_connection.should_receive(:execute).with(query)
128
+ @translation.send(:set_last_updated_at)
129
+ end
130
+ it "should not update last_updated_at timestamp for each table that did not generate any sync data" do
131
+ @translation.stub(:copy_tables).and_return([mock(:sql_name => 'table1')])
132
+ @translation.max_updated_at = {}
133
+ @translation.send(:set_last_updated_at)
134
+ @translation.max_updated_at = {'table1' => {'key_column' => 'id'}}
135
+ @translation.send(:set_last_updated_at)
136
+ end
137
+ end
138
+
139
+ context "sync_data" do
140
+ it "should upsert rows that match the new/updated query, mark them as drafts and compute the max updated at" do
141
+ helper = Mongify::Translation::Sync::SYNC_HELPER_TABLE
142
+ t = mock(:sql_name => 'table1', :name => 'table1')
143
+ @translation.stub(:copy_tables).and_return([t])
144
+ t1, t2 = Time.new(1980).to_s, Time.new(2000).to_s
145
+ rows = [{"id" => 1, "updated_at" => t1}, {"id" => 2, "updated_at" => t2}]
146
+ t.stub(:translate).twice.and_return({'pre_mongified_id' => 1, 'updated_at' => t1}, {'pre_mongified_id' => 2, 'updated_at' => t2})
147
+
148
+ query = "SELECT t.* FROM table1 t, #{helper} u WHERE t.updated_at > u.last_updated_at AND u.table_name = 'table1'"
149
+ @sql_connection.stub(:select_by_query).and_return(rows)
150
+ @sql_connection.should_receive(:select_by_query).with(query)
151
+
152
+ draft = Mongify::Translation::Sync::DRAFT_KEY
153
+
154
+ @no_sql_connection.stub(:upsert).with('table1', {'pre_mongified_id' => 1, 'updated_at' => t1, draft => true}).and_return(true)
155
+ @no_sql_connection.stub(:upsert).with('table1', {'pre_mongified_id' => 2, 'updated_at' => t2, draft => true}).and_return(true)
156
+ @no_sql_connection.should_receive(:upsert).twice
157
+
158
+ t.stub(:key_column).and_return(mock({name: 'id'}))
159
+
160
+ @translation.send(:sync_data)
161
+
162
+ @translation.max_updated_at.should == {'table1' => {'max_updated_at_id' => 2, 'key_column' => 'id'}}
163
+
164
+ end
165
+ end
166
+
167
+ context "sync_update_reference_ids" do
168
+ it "should delete the draft key" do
169
+ t = mock(:name => 'table1')
170
+ @translation.stub(:copy_tables).and_return([t])
171
+ query = {Mongify::Translation::Sync::DRAFT_KEY => true}
172
+ row = mock
173
+ row.stub(:[]).with("_id").and_return(1)
174
+ @no_sql_connection.stub(:select_by_query).and_return([row])
175
+ @no_sql_connection.should_receive(:select_by_query).with('table1', query)
176
+ @translation.stub(:fetch_reference_ids).and_return({})
177
+ @translation.should_receive(:fetch_reference_ids).with(t, row)
178
+ @no_sql_connection.should_receive(:update).with('table1', 1, {"$unset" => query})
179
+ @translation.send(:sync_update_reference_ids)
180
+ end
181
+ end
182
+
183
+ end
184
+ end
@@ -5,7 +5,7 @@ describe Mongify::Translation do
5
5
  @file_path = File.expand_path(File.dirname(__FILE__) + '/../files/translation.rb')
6
6
  @translation = Mongify::Translation.parse(@file_path)
7
7
  end
8
-
8
+
9
9
  context "self.load" do
10
10
  it "should require connection" do
11
11
  lambda {Mongify::Translation.load}.should raise_error(ArgumentError)
@@ -33,13 +33,13 @@ describe Mongify::Translation do
33
33
  end
34
34
  end
35
35
  end
36
-
36
+
37
37
  context "parsed content" do
38
38
  context "tables" do
39
39
  it "should have 4 tables" do
40
40
  @translation.should have(4).tables
41
41
  end
42
-
42
+
43
43
  it "should setup 'comments'" do
44
44
  table = @translation.tables.find{|t| t.name == 'comments'}
45
45
  table.should_not be_nil
@@ -47,23 +47,23 @@ describe Mongify::Translation do
47
47
  end
48
48
  end
49
49
  end
50
-
50
+
51
51
  context "find" do
52
52
  before(:each) do
53
53
  @user_table = mock(:name => 'users')
54
54
  @translation.stub(:all_tables).and_return([mock(:name => 'comments'),
55
- @user_table,
55
+ @user_table,
56
56
  mock(:name => 'posts')])
57
57
  end
58
58
  it "should work" do
59
-
59
+
60
60
  @translation.find('users').should == @user_table
61
61
  end
62
62
  it "should return nil if nothing is found" do
63
63
  @translation.find('apples').should be_nil
64
64
  end
65
65
  end
66
-
66
+
67
67
  context "tables reference" do
68
68
  before(:each) do
69
69
  @copy_table = mock(:name => 'users', :ignored? => false, :embedded? => false, :polymorphic? => false)
@@ -93,7 +93,7 @@ describe Mongify::Translation do
93
93
  @translation.polymorphic_tables.should == [@polymorphic_table]
94
94
  end
95
95
  end
96
-
96
+
97
97
  context "add_table" do
98
98
  before(:each) do
99
99
  @table = Mongify::Database::Table.new("users")