maglevrecord 0.1.1 → 0.1.2
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.
- data/.gitignore +7 -0
- data/.travis.yml +0 -1
- data/README.md +22 -7
- data/Rakefile +2 -2
- data/install.sh +0 -1
- data/lib/maglev_record/base.rb +10 -1
- data/lib/maglev_record/enumerable.rb +6 -1
- data/lib/maglev_record/errors.rb +3 -0
- data/lib/maglev_record/maglev_record.rb +1 -1
- data/lib/maglev_record/maglev_support/concern.rb +2 -3
- data/lib/maglev_record/maglev_support/secure_password.rb +2 -3
- data/lib/maglev_record/migration/loader.rb +1 -1
- data/lib/maglev_record/migration/migration.rb +14 -0
- data/lib/maglev_record/migration/migrator.rb +22 -4
- data/lib/maglev_record/migration/operations.rb +58 -0
- data/lib/maglev_record/persistence.rb +12 -5
- data/lib/maglev_record/read_write.rb +38 -7
- data/lib/maglev_record/rooted_enumerable.rb +6 -1
- data/lib/maglev_record/rooted_persistence.rb +4 -0
- data/lib/maglev_record/sensible.rb +2 -2
- data/lib/maglev_record/snapshot/change.rb +54 -15
- data/lib/maglev_record/snapshot/class_change.rb +66 -0
- data/lib/maglev_record/snapshot/class_snapshot.rb +63 -0
- data/lib/maglev_record/snapshot/snapshot.rb +44 -38
- data/lib/maglev_record/snapshot/snapshotable.rb +81 -26
- data/lib/maglev_record/snapshot/superclass_mismatch_change.rb +143 -0
- data/lib/maglev_record/snapshot.rb +3 -2
- data/lib/maglev_record/validations.rb +49 -0
- data/lib/maglev_record.rb +3 -2
- data/lib/tasks/database.rake +61 -17
- data/test/automigration/rake_task_base.rb +57 -0
- data/test/automigration/test_auto.slow.rb +38 -0
- data/test/automigration/test_migration_string.rb +173 -0
- data/test/automigration/test_rake_task_preconditions.slow.rb +41 -0
- data/test/automigration/test_show.slow.rb +21 -0
- data/test/automigration/test_superclass_mismatch.rb +96 -0
- data/test/example_model.rb +7 -5
- data/test/migration/base_lectures.rb +30 -0
- data/test/migration/operation_setup.rb +66 -56
- data/test/migration/projects/automigration/.gitignore +15 -0
- data/test/migration/projects/automigration/Gemfile +44 -0
- data/test/migration/projects/automigration/Gemfile.lock +115 -0
- data/test/migration/projects/automigration/README.rdoc +261 -0
- data/test/migration/projects/automigration/Rakefile +17 -0
- data/test/migration/projects/automigration/app/assets/images/rails.png +0 -0
- data/test/migration/projects/automigration/app/assets/javascripts/application.js +15 -0
- data/test/migration/projects/automigration/app/assets/stylesheets/application.css +13 -0
- data/test/migration/projects/automigration/app/controllers/application_controller.rb +3 -0
- data/test/migration/projects/automigration/app/helpers/application_helper.rb +2 -0
- data/test/migration/projects/automigration/app/mailers/.gitkeep +0 -0
- data/test/migration/projects/automigration/app/models/.gitkeep +0 -0
- data/test/migration/projects/automigration/app/models/project_model.rb +8 -0
- data/test/migration/projects/automigration/app/views/layouts/application.html.erb +14 -0
- data/test/migration/projects/automigration/config/application.rb +62 -0
- data/test/migration/projects/automigration/config/boot.rb +6 -0
- data/test/migration/projects/automigration/config/database.yml +25 -0
- data/test/migration/projects/automigration/config/environment.rb +5 -0
- data/test/migration/projects/automigration/config/environments/development.rb +37 -0
- data/test/migration/projects/automigration/config/environments/production.rb +67 -0
- data/test/migration/projects/automigration/config/initializers/backtrace_silencers.rb +7 -0
- data/test/migration/projects/automigration/config/initializers/inflections.rb +15 -0
- data/test/migration/projects/automigration/config/initializers/mime_types.rb +5 -0
- data/test/migration/projects/automigration/config/initializers/secret_token.rb +7 -0
- data/test/migration/projects/automigration/config/initializers/session_store.rb +8 -0
- data/test/migration/projects/automigration/config/initializers/wrap_parameters.rb +14 -0
- data/test/migration/projects/automigration/config/locales/en.yml +5 -0
- data/test/migration/projects/automigration/config/routes.rb +58 -0
- data/test/migration/projects/automigration/config.ru +4 -0
- data/test/migration/projects/automigration/db/seeds.rb +7 -0
- data/test/migration/projects/automigration/lib/assets/.gitkeep +0 -0
- data/test/migration/projects/automigration/lib/tasks/.gitkeep +0 -0
- data/test/migration/projects/automigration/log/.gitkeep +0 -0
- data/test/migration/projects/automigration/public/404.html +26 -0
- data/test/migration/projects/automigration/public/422.html +26 -0
- data/test/migration/projects/automigration/public/500.html +25 -0
- data/test/migration/projects/automigration/public/favicon.ico +0 -0
- data/test/migration/projects/automigration/public/index.html +241 -0
- data/test/migration/projects/automigration/public/robots.txt +5 -0
- data/test/migration/projects/automigration/script/rails +6 -0
- data/test/migration/projects/project2/Rakefile +2 -2
- data/test/migration/projects/project2/migrations/migration_2013-04-Apr-23_17.31.38.rb +1 -1
- data/test/migration/projects/project2/migrations/migration_2013-04-Apr-23_17.31.52.rb +1 -1
- data/test/migration/projects/project2/migrations/migration_2013-04-Apr-23_17.32.07.rb +1 -1
- data/test/migration/test_change_superclass.rb +111 -0
- data/test/migration/test_loader.rb +6 -0
- data/test/migration/test_project.rb +1 -29
- data/test/migration/test_project1.slow.rb +1 -0
- data/test/migration/test_project2.slow.rb +7 -0
- data/test/migration/test_remove.rb +123 -2
- data/test/migration/todo.txt +1 -1
- data/test/more_asserts.rb +1 -1
- data/test/snapshot/test_attributes.rb +33 -0
- data/test/snapshot/{test_snapshot_attributes.slow.rb → test_attributes.slow.rb} +3 -5
- data/test/snapshot/test_classes.rb +32 -0
- data/test/snapshot/{test_snapshot_classes.slow.rb → test_classes.slow.rb} +1 -1
- data/test/snapshot/test_from_file_system.rb +113 -0
- data/test/snapshot/test_methods.rb +136 -0
- data/test/snapshot/test_methods.slow.rb +67 -0
- data/test/snapshot/test_reset.rb +68 -0
- data/test/snapshot/test_snapshot.rb +41 -75
- data/test/snapshot/test_snapshot.slow.rb +98 -0
- data/test/snapshot/test_snapshotable.rb +0 -1
- data/test/temp_dir_test.rb +40 -0
- data/test/test_active_model_like_interface.rb +4 -1
- data/test/test_model_timestamps.rb +13 -5
- data/test/test_query_interface.rb +10 -0
- data/test/test_sensibles.rb +18 -10
- data/test/test_validation.rb +2 -12
- metadata +64 -5
@@ -0,0 +1,111 @@
|
|
1
|
+
require "migration/operation_setup"
|
2
|
+
|
3
|
+
class ChangeSuperclassTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
setup_migration_operations
|
7
|
+
cls.fill_with_examples
|
8
|
+
@example = cls.first
|
9
|
+
assert_not_equal Lecture2, cls.superclass
|
10
|
+
assert_equal Lecture, cls.superclass
|
11
|
+
cls.change_superclass_to Lecture2
|
12
|
+
end
|
13
|
+
|
14
|
+
def cls
|
15
|
+
Lecture3
|
16
|
+
end
|
17
|
+
|
18
|
+
def teardown
|
19
|
+
teardown_migration_operations
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_superclass_has_changed
|
23
|
+
assert_equal Lecture2, cls.superclass
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_objects_are_still_of_that_class
|
27
|
+
assert_equal @example.class, cls
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_example_is_of_own_class
|
31
|
+
Object.module_eval "
|
32
|
+
class Lecture3
|
33
|
+
def lecture3
|
34
|
+
true
|
35
|
+
end
|
36
|
+
end"
|
37
|
+
assert @example.lecture2
|
38
|
+
assert @example.lecture3
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_example_is_still_in_all
|
42
|
+
assert_include? Lecture3.all, @example
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
class MigrationChangesSuperclassTest < Test::Unit::TestCase
|
48
|
+
|
49
|
+
def setup
|
50
|
+
setup_migration_operations
|
51
|
+
end
|
52
|
+
|
53
|
+
def teardown
|
54
|
+
teardown_migration_operations
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_migrating_superclass_change
|
58
|
+
assert_not_equal Lecture2, Lecture3.superclass
|
59
|
+
assert_not_equal Object, Lecture3.superclass
|
60
|
+
MaglevRecord::Migration.new(Time.now, "change_superclass") do
|
61
|
+
def up
|
62
|
+
Lecture3.change_superclass_to Lecture2
|
63
|
+
end
|
64
|
+
end.do
|
65
|
+
assert_equal Lecture3.superclass, Lecture2
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_superclass_does_not_exist
|
69
|
+
original_superclass = Lecture3.superclass
|
70
|
+
assert_raises(NameError){ SuperclassThatDoesNotExist }
|
71
|
+
MaglevRecord::Migration.new(Time.now, "change_superclass") do
|
72
|
+
def up
|
73
|
+
Lecture3.change_superclass_to SuperclassThatDoesNotExist
|
74
|
+
end
|
75
|
+
end.do
|
76
|
+
assert_equal original_superclass, Lecture3.superclass
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_class_does_not_exist
|
80
|
+
assert_raises(NameError){ ClassThatDoesNotExist }
|
81
|
+
MaglevRecord::Migration.new(Time.now, "change_superclass") do
|
82
|
+
def up
|
83
|
+
ClassThatDoesNotExist.change_superclass_to Lecture3
|
84
|
+
end
|
85
|
+
end.do
|
86
|
+
assert_raises(NameError){ ClassThatDoesNotExist }
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_both_classes_do_not_exist
|
90
|
+
MaglevRecord::Migration.new(Time.now, "change_superclass") do
|
91
|
+
def up
|
92
|
+
ClassThatDoesNotExist.change_superclass_to SuperclassThatDoesNotExist
|
93
|
+
end
|
94
|
+
end.do
|
95
|
+
assert_raises(NameError){ ClassThatDoesNotExist }
|
96
|
+
assert_raises(NameError){ SuperclassThatDoesNotExist }
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
|
@@ -64,6 +64,12 @@ MIGRATION2
|
|
64
64
|
assert_equal 2014, @loader.migration_list.last.timestamp.year
|
65
65
|
end
|
66
66
|
|
67
|
+
def test_an_error_is_thrown_if_no_migration_is_read
|
68
|
+
assert_raise(MaglevRecord::NoMigrationReadError) {
|
69
|
+
@loader.load_string "1 + 2"
|
70
|
+
}
|
71
|
+
end
|
72
|
+
|
67
73
|
def test_load_from_file
|
68
74
|
@loader.load_file(migration_folder + 'migration_1.rb')
|
69
75
|
assert @loader.migration_list.any? { |m| m.name == "Change book title" }
|
@@ -1,37 +1,9 @@
|
|
1
1
|
require "more_asserts"
|
2
2
|
require "fileutils"
|
3
|
-
require "
|
3
|
+
require "temp_dir_test"
|
4
4
|
|
5
5
|
THIS_DIRECTORY = File.expand_path(File.dirname(__FILE__))
|
6
6
|
|
7
|
-
#
|
8
|
-
# this test creates a temporary directory for the test
|
9
|
-
#
|
10
|
-
|
11
|
-
class TempDirTest < Test::Unit::TestCase
|
12
|
-
def setup
|
13
|
-
# make temporary directory
|
14
|
-
# see http://ruby-doc.org/stdlib-2.0/libdoc/tmpdir/rdoc/Dir.html#method-c-mktmpdir
|
15
|
-
@tempdir = Dir.mktmpdir
|
16
|
-
end
|
17
|
-
|
18
|
-
def teardown
|
19
|
-
# remove the directory.
|
20
|
-
FileUtils.remove_dir tempdir
|
21
|
-
end
|
22
|
-
|
23
|
-
def tempdir
|
24
|
-
@tempdir
|
25
|
-
end
|
26
|
-
|
27
|
-
# test the project configuration
|
28
|
-
|
29
|
-
def test_tempdir_exists
|
30
|
-
assert File.directory?(tempdir)
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
7
|
class ProjectTest < TempDirTest
|
36
8
|
attr_reader :maglev_record_raketask_wd
|
37
9
|
|
@@ -3,6 +3,7 @@ require "migration/test_project"
|
|
3
3
|
class MigrationProject2 < ProjectTest
|
4
4
|
|
5
5
|
def setup
|
6
|
+
Maglev.abort_transaction
|
6
7
|
@project_name = 'project2'
|
7
8
|
super
|
8
9
|
Maglev.persistent do
|
@@ -15,6 +16,7 @@ class MigrationProject2 < ProjectTest
|
|
15
16
|
def teardown
|
16
17
|
super
|
17
18
|
puts @s unless @s.nil?
|
19
|
+
Maglev.abort_transaction
|
18
20
|
end
|
19
21
|
|
20
22
|
def test_no_models
|
@@ -31,4 +33,9 @@ class MigrationProject2 < ProjectTest
|
|
31
33
|
@s = nil
|
32
34
|
end
|
33
35
|
|
36
|
+
#def test_add_more_migrations_that_will_be_tested
|
37
|
+
# # maybe we are also in the need to autoload the model files?
|
38
|
+
# #fail('todo') # TODO
|
39
|
+
#end
|
40
|
+
|
34
41
|
end
|
@@ -8,8 +8,11 @@
|
|
8
8
|
#
|
9
9
|
# - classes
|
10
10
|
#
|
11
|
+
# - instance methods
|
12
|
+
#
|
13
|
+
# - class methods
|
14
|
+
#
|
11
15
|
|
12
|
-
require "maglev_record"
|
13
16
|
require "migration/operation_setup"
|
14
17
|
require "more_asserts"
|
15
18
|
require 'time'
|
@@ -213,7 +216,125 @@ class TestMigrationRemoveClass < Test::Unit::TestCase
|
|
213
216
|
Models::M1::Lecture
|
214
217
|
}
|
215
218
|
end
|
219
|
+
end
|
220
|
+
|
221
|
+
################## remove instance methods
|
216
222
|
|
217
|
-
|
223
|
+
class TestMigrationRemoveInstanceMethod < Test::Unit::TestCase
|
224
|
+
|
225
|
+
def setup
|
226
|
+
setup_migration_operations
|
227
|
+
Lecture.define_method :instance_method_to_remove do 2 end
|
228
|
+
Lecture.fill_with_examples
|
229
|
+
Lecture3.fill_with_examples
|
230
|
+
end
|
231
|
+
|
232
|
+
def test_Lecture_has_instance_method
|
233
|
+
assert_equal 2, Lecture.first.instance_method_to_remove
|
234
|
+
assert_equal 2, Lecture3.first.instance_method_to_remove
|
235
|
+
end
|
236
|
+
|
237
|
+
def teardown
|
238
|
+
super
|
239
|
+
teardown_migration_operations
|
240
|
+
end
|
241
|
+
|
242
|
+
def test_migration_removes_instance_method
|
243
|
+
MaglevRecord::Migration.new(Time.now, "remove instance method") do
|
244
|
+
def up
|
245
|
+
Lecture.remove_instance_method :instance_method_to_remove
|
246
|
+
end
|
247
|
+
end.do
|
248
|
+
assert_raises(NoMethodError){
|
249
|
+
Lecture.first.instance_method_to_remove
|
250
|
+
}
|
251
|
+
assert_raises(NoMethodError){
|
252
|
+
Lecture3.first.instance_method_to_remove
|
253
|
+
}
|
254
|
+
end
|
255
|
+
|
256
|
+
def test_migration_removes_nonexistent_instance_method
|
257
|
+
MaglevRecord::Migration.new(Time.now, "remove instance method") do
|
258
|
+
def up
|
259
|
+
Lecture.remove_instance_method :instance_method_to_remove2
|
260
|
+
end
|
261
|
+
end.do
|
262
|
+
assert_equal 2, Lecture.first.instance_method_to_remove
|
263
|
+
end
|
264
|
+
|
265
|
+
def test_remove_instance_method_of_nonexistent_class
|
266
|
+
MaglevRecord::Migration.new(Time.now, "remove instance method") do
|
267
|
+
def up
|
268
|
+
AbsentLectureClass.remove_instance_method :method_not_here
|
269
|
+
end
|
270
|
+
end.do
|
271
|
+
assert_equal 2, Lecture.first.instance_method_to_remove
|
272
|
+
end
|
273
|
+
|
274
|
+
def test_remove_instance_method_of_subclass_does_not_influence_superclass
|
275
|
+
MaglevRecord::Migration.new(Time.now, "remove instance method") do
|
276
|
+
def up
|
277
|
+
Lecture3.remove_instance_method :instance_method_to_remove
|
278
|
+
end
|
279
|
+
end.do
|
280
|
+
assert_equal 2, Lecture.first.instance_method_to_remove
|
281
|
+
assert_equal 2, Lecture3.first.instance_method_to_remove
|
282
|
+
end
|
218
283
|
end
|
219
284
|
|
285
|
+
################## remove class methods
|
286
|
+
|
287
|
+
class TestMigrationRemoveClassMethod < Test::Unit::TestCase
|
288
|
+
|
289
|
+
def setup
|
290
|
+
setup_migration_operations
|
291
|
+
def Lecture.class_method_to_remove;1;end
|
292
|
+
end
|
293
|
+
|
294
|
+
def teardown
|
295
|
+
super
|
296
|
+
teardown_migration_operations
|
297
|
+
end
|
298
|
+
|
299
|
+
def test_Lecture_has_class_method
|
300
|
+
assert_equal 1, Lecture.class_method_to_remove
|
301
|
+
end
|
302
|
+
|
303
|
+
def test_migration_removes_class_method
|
304
|
+
MaglevRecord::Migration.new(Time.now, "remove class method") do
|
305
|
+
def up
|
306
|
+
Lecture.remove_class_method :class_method_to_remove
|
307
|
+
end
|
308
|
+
end.do
|
309
|
+
assert_raises(NoMethodError){
|
310
|
+
Lecture.class_method_to_remove
|
311
|
+
}
|
312
|
+
end
|
313
|
+
|
314
|
+
def test_migration_removes_nonexistent_class_method
|
315
|
+
MaglevRecord::Migration.new(Time.now, "remove class method") do
|
316
|
+
def up
|
317
|
+
Lecture.remove_class_method :class_method_to_remove2
|
318
|
+
end
|
319
|
+
end.do
|
320
|
+
assert_equal 1, Lecture.class_method_to_remove
|
321
|
+
end
|
322
|
+
|
323
|
+
def test_remove_instance_method_of_nonexistent_class
|
324
|
+
MaglevRecord::Migration.new(Time.now, "remove class method") do
|
325
|
+
def up
|
326
|
+
AbsentLectureClass.remove_class_method :method_not_here
|
327
|
+
end
|
328
|
+
end.do
|
329
|
+
assert_equal 1, Lecture.class_method_to_remove
|
330
|
+
end
|
331
|
+
|
332
|
+
def test_remove_class_method_of_subclass_does_not_influence_superclass
|
333
|
+
MaglevRecord::Migration.new(Time.now, "remove class method") do
|
334
|
+
def up
|
335
|
+
Lecture3.remove_instance_method :class_method_to_remove
|
336
|
+
end
|
337
|
+
end.do
|
338
|
+
assert_equal 1, Lecture.class_method_to_remove
|
339
|
+
end
|
340
|
+
end
|
data/test/migration/todo.txt
CHANGED
data/test/more_asserts.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
require "snapshot/test_snapshot"
|
2
|
+
|
3
|
+
class LocalAttibuteAddSnapshotTest < FastSnapshotTest
|
4
|
+
def test_new_attribute
|
5
|
+
Lecture.attr_accessor :test_accessor
|
6
|
+
assert_equal ["Lecture"], changes.changed_class_names
|
7
|
+
assert_equal ["test_accessor"], changes.changed_classes[0].new_attributes
|
8
|
+
assert_not changes.nothing_changed?
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class LocalAttributeRemoveSnapshotTest < FastSnapshotTest
|
13
|
+
|
14
|
+
def setup
|
15
|
+
super
|
16
|
+
Lecture2.attr_accessor :test_accessor2
|
17
|
+
snapshot!
|
18
|
+
Lecture2.delete_attribute :test_accessor2
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_removed_attribute
|
22
|
+
assert_equal ["Lecture2"], changes.changed_class_names
|
23
|
+
assert_equal ["test_accessor2"], changes.changed_classes[0].removed_attributes
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_accessor_in_first_snapshot
|
27
|
+
assert_include? snapshot0[Lecture2].attributes, "test_accessor2"
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_accessor_not_in_second_snapshot
|
31
|
+
assert_not_include? snapshot[Lecture2].attributes, "test_accessor2"
|
32
|
+
end
|
33
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require "snapshot/test_snapshot"
|
1
|
+
require "snapshot/test_snapshot.slow"
|
2
2
|
|
3
3
|
class AttrSnapshotTest < SnapshotTest
|
4
4
|
|
@@ -43,15 +43,13 @@ class AttrSnapshotTest < SnapshotTest
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def test_accessor_added
|
46
|
-
assert_equal changed_class.
|
46
|
+
assert_equal changed_class.new_attributes, ["students"]
|
47
47
|
end
|
48
48
|
|
49
49
|
def test_accessor_removed
|
50
|
-
assert_equal changed_class.
|
50
|
+
assert_equal changed_class.removed_attributes, ["no_value"]
|
51
51
|
end
|
52
52
|
|
53
|
-
# TODO: add tests for attr_reader and attr_writer ...
|
54
|
-
|
55
53
|
end
|
56
54
|
|
57
55
|
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "snapshot/test_snapshot"
|
2
|
+
|
3
|
+
class LocalClassSnapshotTest < FastSnapshotTest
|
4
|
+
|
5
|
+
def test_lecture_classes_exist
|
6
|
+
['Lecture', 'Lecture2', 'Lecture3', 'Lecture4'].each { |lecture_name|
|
7
|
+
assert_include? snapshot.class_names, lecture_name
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_class_removed
|
12
|
+
remove_class Lecture2
|
13
|
+
assert_equal 1, changes.removed_classes.size
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_class_is_not_in_snashot_when_removed
|
17
|
+
remove_class Lecture2
|
18
|
+
assert_not_include? snapshot.class_names, "Lecture2"
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_class_is_in_snapshot0_when_removed
|
22
|
+
remove_class Lecture2
|
23
|
+
assert_include? snapshot0.class_names, "Lecture2"
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_removed_class_is_in_changes
|
27
|
+
remove_class Lecture4
|
28
|
+
assert_equal ["Lecture4"], changes.removed_class_names
|
29
|
+
assert_not changes.nothing_changed?
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'maglev_record'
|
2
|
+
require "temp_dir_test"
|
3
|
+
require 'more_asserts'
|
4
|
+
require 'migration/operation_setup'
|
5
|
+
|
6
|
+
class FileSystemSnapshotTest < TempDirTest
|
7
|
+
|
8
|
+
def teardown
|
9
|
+
"SomeClass AnotherClass Someclass2 NewClass A Class2 NewCls TheNew
|
10
|
+
TheClass ClassWithNoFuture".split.each{|name|
|
11
|
+
Object.remove_const name if Object.const_defined? name
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def write_to_files(*file_contents)
|
16
|
+
file_paths = []
|
17
|
+
file_contents.each{ |content|
|
18
|
+
file_paths << write_to_file(content)
|
19
|
+
}
|
20
|
+
file_paths
|
21
|
+
end
|
22
|
+
|
23
|
+
def snapshot_with_files(*file_contents)
|
24
|
+
file_paths = write_to_files(*file_contents)
|
25
|
+
MaglevRecord::Snapshot.with_files file_paths
|
26
|
+
end
|
27
|
+
|
28
|
+
def changes_with_files(s, *file_contents)
|
29
|
+
@file_count = 0
|
30
|
+
if s.is_a? String
|
31
|
+
file_contents << s
|
32
|
+
s = nil
|
33
|
+
end
|
34
|
+
s = MaglevRecord::Snapshot.new if s.nil?
|
35
|
+
file_paths = write_to_files(*file_contents)
|
36
|
+
assert s.is_a?(MaglevRecord::Snapshot), s.to_s
|
37
|
+
s.changes_in_files file_paths
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_new_class
|
41
|
+
s = snapshot_with_files "class SomeClass;include MaglevRecord::Base;end"
|
42
|
+
assert_include? s.snapshot_classes, SomeClass
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_old_clases_are_loaded_too
|
46
|
+
file_path = write_to_file "class AnotherClass; include MaglevRecord::Base;def x;end;end"
|
47
|
+
Kernel.load file_path
|
48
|
+
s0 = MaglevRecord::Snapshot.new
|
49
|
+
write_to_file "class AnotherClass; include MaglevRecord::Base;def y;end;end", file_path
|
50
|
+
s = snapshot_with_files "class SomeClass2;include MaglevRecord::Base;def v;end;end"
|
51
|
+
assert_include? s.snapshot_classes, AnotherClass
|
52
|
+
assert_include? s.snapshot_classes, SomeClass2
|
53
|
+
assert_include? s.changes_since(s0).changed_class_names, "AnotherClass"
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_snapshot_computes_changes
|
57
|
+
c = changes_with_files "class NewClass;include MaglevRecord::Base;def g;end;end"
|
58
|
+
assert_include? c.new_class_names, 'NewClass'
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_many_changes
|
62
|
+
s = snapshot_with_files "class A; include MaglevRecord::Base; def g; end;end",
|
63
|
+
"class Class2; include MaglevRecord::Base; attr_accessor :tral;end"
|
64
|
+
c = changes_with_files "class A; include MaglevRecord::Base; def h; end;end",
|
65
|
+
"class Class2; include MaglevRecord::Base; attr_accessor :tral2;end",
|
66
|
+
"class NewCls; include MaglevRecord::Base; def c;end ;end"
|
67
|
+
# the following line may change some day but it can help debugging
|
68
|
+
assert_equal "#new class: NewCls\n#new instance method: A.new.h\nA.remove_instance_method :g\nClass2.rename_attribute(:tral, :tral2)\n#new instance method: Class2.new.tral2\n#new instance method: Class2.new.tral2=\nClass2.remove_instance_method :tral\nClass2.remove_instance_method :tral=",
|
69
|
+
c.migration_string
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_changes_in_files_loads_all_files_required
|
73
|
+
file_path = write_to_file "class TheClass; include MaglevRecord::Base;def x;3;end;end"
|
74
|
+
Kernel.load file_path
|
75
|
+
s = MaglevRecord::Snapshot.new
|
76
|
+
write_to_file "class TheClass; include MaglevRecord::Base;def yy;end;end", file_path
|
77
|
+
file_paths = [write_to_file "class TheNew;include MaglevRecord::Base; def g;end;end"]
|
78
|
+
changes = s.changes_in_files(file_paths)
|
79
|
+
assert_include? changes.new_class_names, 'TheNew'
|
80
|
+
assert_include? changes.changed_class_names, 'TheClass'
|
81
|
+
assert_equal 3, TheClass.new.x
|
82
|
+
assert_equal changes[TheClass].new_instance_methods, ["yy"]
|
83
|
+
assert_equal changes[TheClass].removed_instance_methods, ["x"]
|
84
|
+
assert_raises(NoMethodError){
|
85
|
+
TheClass.new.yy
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_file_was_removed
|
90
|
+
file_path = write_to_file "class ClassWithNoFuture; include MaglevRecord::Base;def h;end;end"
|
91
|
+
s = MaglevRecord::Snapshot.with_files [file_path]
|
92
|
+
File.delete file_path
|
93
|
+
changes = s.changes_in_files
|
94
|
+
assert_include? changes.removed_class_names, 'ClassWithNoFuture'
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_if_error_occurs_everything_is_reset_to_normal
|
98
|
+
setup_migration_operations
|
99
|
+
begin
|
100
|
+
file_path = write_to_file "raise 'bam!'"
|
101
|
+
meth = Lecture3.methods
|
102
|
+
assert_raises(RuntimeError){
|
103
|
+
MaglevRecord::Snapshot.with_files [file_path]
|
104
|
+
}
|
105
|
+
assert_equal meth, Lecture3.methods
|
106
|
+
ensure
|
107
|
+
teardown_migration_operations
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
|