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.
Files changed (109) hide show
  1. data/.gitignore +7 -0
  2. data/.travis.yml +0 -1
  3. data/README.md +22 -7
  4. data/Rakefile +2 -2
  5. data/install.sh +0 -1
  6. data/lib/maglev_record/base.rb +10 -1
  7. data/lib/maglev_record/enumerable.rb +6 -1
  8. data/lib/maglev_record/errors.rb +3 -0
  9. data/lib/maglev_record/maglev_record.rb +1 -1
  10. data/lib/maglev_record/maglev_support/concern.rb +2 -3
  11. data/lib/maglev_record/maglev_support/secure_password.rb +2 -3
  12. data/lib/maglev_record/migration/loader.rb +1 -1
  13. data/lib/maglev_record/migration/migration.rb +14 -0
  14. data/lib/maglev_record/migration/migrator.rb +22 -4
  15. data/lib/maglev_record/migration/operations.rb +58 -0
  16. data/lib/maglev_record/persistence.rb +12 -5
  17. data/lib/maglev_record/read_write.rb +38 -7
  18. data/lib/maglev_record/rooted_enumerable.rb +6 -1
  19. data/lib/maglev_record/rooted_persistence.rb +4 -0
  20. data/lib/maglev_record/sensible.rb +2 -2
  21. data/lib/maglev_record/snapshot/change.rb +54 -15
  22. data/lib/maglev_record/snapshot/class_change.rb +66 -0
  23. data/lib/maglev_record/snapshot/class_snapshot.rb +63 -0
  24. data/lib/maglev_record/snapshot/snapshot.rb +44 -38
  25. data/lib/maglev_record/snapshot/snapshotable.rb +81 -26
  26. data/lib/maglev_record/snapshot/superclass_mismatch_change.rb +143 -0
  27. data/lib/maglev_record/snapshot.rb +3 -2
  28. data/lib/maglev_record/validations.rb +49 -0
  29. data/lib/maglev_record.rb +3 -2
  30. data/lib/tasks/database.rake +61 -17
  31. data/test/automigration/rake_task_base.rb +57 -0
  32. data/test/automigration/test_auto.slow.rb +38 -0
  33. data/test/automigration/test_migration_string.rb +173 -0
  34. data/test/automigration/test_rake_task_preconditions.slow.rb +41 -0
  35. data/test/automigration/test_show.slow.rb +21 -0
  36. data/test/automigration/test_superclass_mismatch.rb +96 -0
  37. data/test/example_model.rb +7 -5
  38. data/test/migration/base_lectures.rb +30 -0
  39. data/test/migration/operation_setup.rb +66 -56
  40. data/test/migration/projects/automigration/.gitignore +15 -0
  41. data/test/migration/projects/automigration/Gemfile +44 -0
  42. data/test/migration/projects/automigration/Gemfile.lock +115 -0
  43. data/test/migration/projects/automigration/README.rdoc +261 -0
  44. data/test/migration/projects/automigration/Rakefile +17 -0
  45. data/test/migration/projects/automigration/app/assets/images/rails.png +0 -0
  46. data/test/migration/projects/automigration/app/assets/javascripts/application.js +15 -0
  47. data/test/migration/projects/automigration/app/assets/stylesheets/application.css +13 -0
  48. data/test/migration/projects/automigration/app/controllers/application_controller.rb +3 -0
  49. data/test/migration/projects/automigration/app/helpers/application_helper.rb +2 -0
  50. data/test/migration/projects/automigration/app/mailers/.gitkeep +0 -0
  51. data/test/migration/projects/automigration/app/models/.gitkeep +0 -0
  52. data/test/migration/projects/automigration/app/models/project_model.rb +8 -0
  53. data/test/migration/projects/automigration/app/views/layouts/application.html.erb +14 -0
  54. data/test/migration/projects/automigration/config/application.rb +62 -0
  55. data/test/migration/projects/automigration/config/boot.rb +6 -0
  56. data/test/migration/projects/automigration/config/database.yml +25 -0
  57. data/test/migration/projects/automigration/config/environment.rb +5 -0
  58. data/test/migration/projects/automigration/config/environments/development.rb +37 -0
  59. data/test/migration/projects/automigration/config/environments/production.rb +67 -0
  60. data/test/migration/projects/automigration/config/initializers/backtrace_silencers.rb +7 -0
  61. data/test/migration/projects/automigration/config/initializers/inflections.rb +15 -0
  62. data/test/migration/projects/automigration/config/initializers/mime_types.rb +5 -0
  63. data/test/migration/projects/automigration/config/initializers/secret_token.rb +7 -0
  64. data/test/migration/projects/automigration/config/initializers/session_store.rb +8 -0
  65. data/test/migration/projects/automigration/config/initializers/wrap_parameters.rb +14 -0
  66. data/test/migration/projects/automigration/config/locales/en.yml +5 -0
  67. data/test/migration/projects/automigration/config/routes.rb +58 -0
  68. data/test/migration/projects/automigration/config.ru +4 -0
  69. data/test/migration/projects/automigration/db/seeds.rb +7 -0
  70. data/test/migration/projects/automigration/lib/assets/.gitkeep +0 -0
  71. data/test/migration/projects/automigration/lib/tasks/.gitkeep +0 -0
  72. data/test/migration/projects/automigration/log/.gitkeep +0 -0
  73. data/test/migration/projects/automigration/public/404.html +26 -0
  74. data/test/migration/projects/automigration/public/422.html +26 -0
  75. data/test/migration/projects/automigration/public/500.html +25 -0
  76. data/test/migration/projects/automigration/public/favicon.ico +0 -0
  77. data/test/migration/projects/automigration/public/index.html +241 -0
  78. data/test/migration/projects/automigration/public/robots.txt +5 -0
  79. data/test/migration/projects/automigration/script/rails +6 -0
  80. data/test/migration/projects/project2/Rakefile +2 -2
  81. data/test/migration/projects/project2/migrations/migration_2013-04-Apr-23_17.31.38.rb +1 -1
  82. data/test/migration/projects/project2/migrations/migration_2013-04-Apr-23_17.31.52.rb +1 -1
  83. data/test/migration/projects/project2/migrations/migration_2013-04-Apr-23_17.32.07.rb +1 -1
  84. data/test/migration/test_change_superclass.rb +111 -0
  85. data/test/migration/test_loader.rb +6 -0
  86. data/test/migration/test_project.rb +1 -29
  87. data/test/migration/test_project1.slow.rb +1 -0
  88. data/test/migration/test_project2.slow.rb +7 -0
  89. data/test/migration/test_remove.rb +123 -2
  90. data/test/migration/todo.txt +1 -1
  91. data/test/more_asserts.rb +1 -1
  92. data/test/snapshot/test_attributes.rb +33 -0
  93. data/test/snapshot/{test_snapshot_attributes.slow.rb → test_attributes.slow.rb} +3 -5
  94. data/test/snapshot/test_classes.rb +32 -0
  95. data/test/snapshot/{test_snapshot_classes.slow.rb → test_classes.slow.rb} +1 -1
  96. data/test/snapshot/test_from_file_system.rb +113 -0
  97. data/test/snapshot/test_methods.rb +136 -0
  98. data/test/snapshot/test_methods.slow.rb +67 -0
  99. data/test/snapshot/test_reset.rb +68 -0
  100. data/test/snapshot/test_snapshot.rb +41 -75
  101. data/test/snapshot/test_snapshot.slow.rb +98 -0
  102. data/test/snapshot/test_snapshotable.rb +0 -1
  103. data/test/temp_dir_test.rb +40 -0
  104. data/test/test_active_model_like_interface.rb +4 -1
  105. data/test/test_model_timestamps.rb +13 -5
  106. data/test/test_query_interface.rb +10 -0
  107. data/test/test_sensibles.rb +18 -10
  108. data/test/test_validation.rb +2 -12
  109. metadata +64 -5
@@ -0,0 +1,136 @@
1
+ require "snapshot/test_snapshot"
2
+
3
+ class FastMethodSnapshotTestBase < FastSnapshotTest
4
+ def setup
5
+ super
6
+ def Lecture.removed_method;end
7
+ Lecture.class_eval{def removed_i_method;end}
8
+ Lecture.attr_accessor :accessor1
9
+ snapshot!
10
+ def Lecture.new_method;end
11
+ Lecture.class_eval{def new_i_method;5;end}
12
+ Lecture.remove_method :removed_i_method
13
+ Lecture.singleton_class.remove_method :removed_method
14
+ end
15
+
16
+ def test
17
+ Lecture.fill_with_examples
18
+ assert_equal 5, Lecture.first.new_i_method
19
+ end
20
+ end
21
+
22
+ class FastMethodSnapshotEnvironmentTest < FastMethodSnapshotTestBase
23
+
24
+ # depends on FastMethodSnapshotTestBase
25
+
26
+ def test_Lecture_has_new_method
27
+ assert_include? Lecture.instance_methods, "new_i_method"
28
+ assert_include? Lecture.methods, "new_method"
29
+ end
30
+
31
+ def test_Lecture_has_no_removed_method
32
+ assert_not_include? Lecture.instance_methods, "removed_i_method"
33
+ assert_not_include? Lecture.methods, "removed_method"
34
+ end
35
+
36
+ def test_Lecture3_has_methods_of_Lecture
37
+ assert_include? Lecture3.instance_methods, "new_i_method"
38
+ assert_include? Lecture3.methods, "new_method"
39
+ end
40
+
41
+ def test_Lecture3_has_no_removed_method
42
+ assert_not_include? Lecture3.instance_methods, "removed_i_method"
43
+ assert_not_include? Lecture3.methods, "removed_method"
44
+ end
45
+ end
46
+
47
+ class FastMethodSnapshotTest < FastMethodSnapshotTestBase
48
+
49
+ # depends on FastMethodSnapshotEnvironmentTest
50
+
51
+ def test_Lecture_has_new_method
52
+ assert_include? snapshot[Lecture].class_methods, "new_method"
53
+ assert_include? snapshot[Lecture].instance_methods, "new_i_method"
54
+ end
55
+
56
+ def test_Lecture_has_no_removed_method
57
+ assert_not_include? snapshot[Lecture].class_methods, "removed_method"
58
+ assert_not_include? snapshot[Lecture].instance_methods, "removed_i_method"
59
+ end
60
+
61
+ def test_Lecture3_has_no_new_method
62
+ assert_not_include? snapshot[Lecture3].class_methods, "new_method"
63
+ assert_not_include? snapshot[Lecture3].instance_methods, "new_i_method"
64
+ end
65
+ def test_Lecture3_has_no_removed_method
66
+ assert_not_include? snapshot[Lecture3].class_methods, "removed_method"
67
+ assert_not_include? snapshot[Lecture3].instance_methods, "removed_i_method"
68
+ end
69
+ end
70
+
71
+ class FastMethodChangeTest < FastMethodSnapshotTestBase
72
+
73
+ # depends on FastMethodSnapshotTest
74
+
75
+ def test_only_Lecture_changed
76
+ assert_equal [], changes.new_classes
77
+ assert_equal [], changes.removed_classes
78
+ assert_equal 1, changes.changed_classes.size, "#{changes.changed_classes.size}"
79
+ end
80
+
81
+ def lecture_changes
82
+ changes.changed_classes.first
83
+ end
84
+
85
+ def test_removed_instance_method
86
+ assert_equal ["removed_i_method"], lecture_changes.removed_instance_methods
87
+ end
88
+
89
+ def test_removed_class_method
90
+ assert_equal ["removed_method"], lecture_changes.removed_class_methods
91
+ end
92
+
93
+ def test_new_instance_method
94
+ assert_equal ["new_i_method"], lecture_changes.new_instance_methods
95
+ end
96
+
97
+ def test_new_class_method
98
+ assert_equal ["new_method"], lecture_changes.new_class_methods
99
+ end
100
+
101
+ end
102
+
103
+ class FastMethodVSAcessorChangeTest < FastMethodChangeTest
104
+
105
+ def setup
106
+ super
107
+ Lecture.remove_method :accessor1
108
+ Lecture.remove_method :accessor1=
109
+ Lecture.attr_accessor :accessor2
110
+ end
111
+
112
+ def test_new_instance_method
113
+ assert_equal ["new_i_method"], lecture_changes.new_instance_methods
114
+ end
115
+
116
+ def test_new_instance_method
117
+ assert_equal ["accessor2", "accessor2=", "new_i_method"], lecture_changes.new_instance_methods
118
+ end
119
+
120
+ def test_removed_instance_method
121
+ assert_equal ["accessor1", "accessor1=", "removed_i_method"], lecture_changes.removed_instance_methods
122
+ end
123
+
124
+ end
125
+
126
+ class FastMethodVSAcessorSnapshotTest < FastMethodSnapshotTestBase
127
+
128
+ def setup
129
+ super
130
+ Lecture.remove_method :accessor1
131
+ Lecture.remove_method :accessor1=
132
+ Lecture.attr_accessor :accessor2
133
+ end
134
+ end
135
+
136
+ # TODO add test for attr becomes method and reverse
@@ -0,0 +1,67 @@
1
+ require "snapshot/test_snapshot.slow"
2
+
3
+ class MethodSnapshotTest < SnapshotTest
4
+
5
+ def self.changes
6
+ @changes
7
+ end
8
+
9
+ as_instance_method :changes
10
+
11
+ def self.startup
12
+ super
13
+ clean
14
+ @changes = compare(
15
+ class_string('MyTestClass2', 'def exists1;end; def exists;end;def self.cls1;end;def self.cls;end;'),
16
+ class_string('MyTestClass2', 'def exists2;end; def exists;end;def self.cls2;end;def self.cls;end;'))
17
+ end
18
+
19
+ def self.shutdown
20
+ super
21
+ clean
22
+ end
23
+
24
+ def test_snapshot_without_error
25
+ assert_not_nil changes
26
+ end
27
+
28
+ def test_no_class_removed
29
+ assert_equal changes.removed_classes, []
30
+ end
31
+
32
+ def test_class_changed
33
+ assert_equal changes.changed_classes.size, 1
34
+ end
35
+
36
+ def test_no_class_was_added
37
+ assert_equal [], changes.new_classes
38
+ end
39
+
40
+ def changed_class
41
+ assert_not_nil changes.changed_classes[0], 'a class must have changed'
42
+ changes.changed_classes[0]
43
+ end
44
+
45
+ def test_method_added
46
+ assert_equal changed_class.new_instance_methods, ["exists2"]
47
+ end
48
+
49
+ def test_method_removed
50
+ assert_equal changed_class.removed_instance_methods, ["exists1"]
51
+ end
52
+
53
+ def test_class_method_added
54
+ assert_equal changed_class.new_class_methods, ["cls2"]
55
+ end
56
+
57
+ def test_class_method_removed
58
+ assert_equal changed_class.removed_class_methods, ["cls1"]
59
+ end
60
+
61
+ # TODO: test subclasses to not contain methods of superclasses
62
+
63
+ end
64
+
65
+
66
+
67
+
@@ -0,0 +1,68 @@
1
+ require "migration/operation_setup"
2
+
3
+ class ResetTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ setup_migration_operations
7
+ end
8
+
9
+ def teardown
10
+ teardown_migration_operations
11
+ end
12
+
13
+ def test_reset_an_no_methods_remain
14
+ Lecture.reset
15
+ assert_equal [], Lecture.methods(false)
16
+ assert_equal [], Lecture.instance_methods(false)
17
+ end
18
+
19
+ def test_subclasses_do_not_dfelete_superclass_methods
20
+ assert_equal Lecture, Lecture3.superclass
21
+ Lecture3.reset
22
+ assert_equal [], Lecture3.instance_methods(false)
23
+ assert_not_equal [], Lecture.instance_methods(false)
24
+ end
25
+
26
+ def test_also_subclasses_lose_methods
27
+ Lecture3.reset
28
+ assert_equal [], Lecture3.methods(false)
29
+ assert_not_equal [], Lecture.methods(false)
30
+ end
31
+
32
+ def test_methods_can_be_restored
33
+ m = Lecture3.methods(false)
34
+ im = Lecture3.instance_methods(false)
35
+ restore = Lecture3.reset
36
+ restore.call
37
+ assert_equal m, Lecture3.methods(false)
38
+ assert_equal im, Lecture3.instance_methods(false)
39
+ end
40
+
41
+ def test_even_new_methods_get_restored
42
+ def Lecture.something
43
+ 5
44
+ end
45
+ restore = Lecture.reset
46
+ assert_raises(NoMethodError){ Lecture.something }
47
+ restore.call
48
+ assert_equal 5, Lecture.something
49
+ end
50
+
51
+ def test_accessors
52
+ Lecture.attr_accessor :lala
53
+ assert_include? Lecture.attributes, "lala"
54
+ end
55
+
56
+ def test_attributes_get_removed
57
+ Lecture.attr_accessor :lala
58
+ Lecture.reset
59
+ assert_equal Lecture.attributes, []
60
+ end
61
+
62
+ def test_attributes_get_restored
63
+ Lecture.attr_accessor :lala
64
+ restore = Lecture.reset
65
+ restore.call
66
+ assert_include? Lecture.attributes, "lala"
67
+ end
68
+ end
@@ -1,99 +1,65 @@
1
- require "maglev_record"
2
1
  require "more_asserts"
2
+ require "migration/operation_setup"
3
3
 
4
- class SnapshotTest < Test::Unit::TestCase
5
-
6
- # the file with the content of what shell be snapshot
7
- def self.module_file_path
8
- # todo: pot this into a temp dir
9
- 'module_content.rb'
4
+ class FastSnapshotTest < Test::Unit::TestCase
5
+
6
+ def lectures
7
+ MaglevRecord::Snapshotable.snapshotable_classes.select{ |cls|
8
+ cls.name.start_with? "Lecture"
9
+ }
10
10
  end
11
11
 
12
- # the file content that snapshots
13
- def self.snapshot_content
14
- <<-EOF
15
- $LOAD_PATH << "lib"
16
- require "rubygems"
17
- require "maglev_record"
18
- load "#{module_file_path}"
19
- Maglev::PERSISTENT_ROOT['test_snapshot'] = MaglevRecord::Snapshot.new
20
- Maglev.commit_transaction
21
- EOF
12
+ def assert_migration_string(string, *args)
13
+ assert_equal string, changes.migration_string(*args)
22
14
  end
23
15
 
24
- # the path of the file that snapshots
25
- def self.snapshot_file_path
26
- filepath = 'caller_content.rb'
27
- File.open(filepath, 'w') { |file| file.write(snapshot_content) }
28
- filepath
16
+ def snapshot
17
+ MaglevRecord::Snapshot.new(lectures)
29
18
  end
30
19
 
31
- #
32
- # snapshot the program after the sting was executed
33
- # returns the snapshot and aborts the transaction
34
- #
35
- def self.snapshot(module_content)
36
- File.open(module_file_path, 'w') { |file| file.write(module_content) }
37
- stone = Maglev::System.stone_name
38
- command = "export MAGLEV_OPTS=\"-W0 --stone #{stone}\" && "
39
- command += "bundle exec "
40
- command += "maglev-ruby #{snapshot_file_path}"
41
- IO.popen(command) { |f|
42
- line = f.gets
43
- status = 1 # $? does not work here so we work around
44
- while not line.nil?
45
- puts line
46
- line = f.gets
47
- end
48
- status
49
- }
50
- Maglev.abort_transaction
51
- Maglev::PERSISTENT_ROOT['test_snapshot']
20
+ def changes
21
+ snapshot.changes_since snapshot0
52
22
  end
53
23
 
54
- def self.shutdown
55
- File.delete(snapshot_file_path)
56
- File.delete(module_file_path) if File.file?(module_file_path)
24
+ def setup
25
+ setup_migration_operations
26
+ snapshot!
57
27
  end
58
28
 
59
- #
60
- # compare two sources and return the MaglevRecord Snapshot
61
- #
62
- def self.compare(s1, s2)
63
- s1 = snapshot(s1)
64
- s2 = snapshot(s2)
65
- s2.changes_since(s1) unless s1.nil? or s2.nil?
29
+ def teardown
30
+ teardown_migration_operations
66
31
  end
67
32
 
68
- def self.class_string(name, content = '')
69
- "class #{name}
70
- include MaglevRecord::Base
71
- self.maglev_record_persistable
72
- # content follows
73
- #{content}
74
- # content ends
75
- end"
33
+ def snapshot!
34
+ @snapshot0 = snapshot
76
35
  end
77
36
 
78
- def self.clean
79
- Maglev.abort_transaction
80
- consts = [:MyTestClass, :MyTestClass2]
37
+ def snapshot0
38
+ @snapshot0
39
+ end
40
+
41
+ def remove_class(*classes)
81
42
  Maglev.persistent do
82
- consts.each { |const|
83
- Object.remove_const(const) if Object.const_defined? const
43
+ classes.each { |cls|
44
+ Object.remove_const cls.name
45
+ LECTURES_NOT_TO_LOAD << cls.name
84
46
  }
85
47
  end
86
- Maglev.commit_transaction
87
48
  end
88
49
 
89
- as_instance_method :class_string, :compare, :snapshot, :clean
90
-
91
- ############### Test
92
-
93
- def test_class_string_include_class_name
94
- s = class_string('MyTestClass123123', 'xxxx')
95
- assert_include? s, 'class MyTestClass123123'
96
- assert_include? s, 'xxxx'
50
+ def test_removed_class
51
+ remove_class Lecture3
52
+ assert_raise(NameError) {
53
+ Lecture3
54
+ }
55
+ assert_not_include? Object.constants, "Lecture3"
56
+ assert_equal ["Lecture3"], LECTURES_NOT_TO_LOAD
57
+ Kernel.load LECTURE_TEMPFILE.path
58
+ assert_raise(NameError) {
59
+ Lecture3
60
+ }
97
61
  end
98
62
 
99
63
  end
64
+
65
+
@@ -0,0 +1,98 @@
1
+ require "more_asserts"
2
+
3
+ class SnapshotTest < Test::Unit::TestCase
4
+
5
+ # the file with the content of what shell be snapshot
6
+ def self.module_file_path
7
+ # todo: pot this into a temp dir
8
+ 'module_content.rb'
9
+ end
10
+
11
+ # the file content that snapshots
12
+ def self.snapshot_content
13
+ <<-EOF
14
+ $LOAD_PATH << "lib"
15
+ require "rubygems"
16
+ require "maglev_record"
17
+ load "#{module_file_path}"
18
+ Maglev::PERSISTENT_ROOT['test_snapshot'] = MaglevRecord::Snapshot.new
19
+ Maglev.commit_transaction
20
+ EOF
21
+ end
22
+
23
+ # the path of the file that snapshots
24
+ def self.snapshot_file_path
25
+ filepath = 'caller_content.rb'
26
+ File.open(filepath, 'w') { |file| file.write(snapshot_content) }
27
+ filepath
28
+ end
29
+
30
+ #
31
+ # snapshot the program after the sting was executed
32
+ # returns the snapshot and aborts the transaction
33
+ #
34
+ def self.snapshot(module_content)
35
+ File.open(module_file_path, 'w') { |file| file.write(module_content) }
36
+ stone = Maglev::System.stone_name
37
+ command = "export MAGLEV_OPTS=\"-W0 --stone #{stone}\" && "
38
+ command += "bundle exec "
39
+ command += "maglev-ruby #{snapshot_file_path}"
40
+ IO.popen(command) { |f|
41
+ line = f.gets
42
+ status = 1 # $? does not work here so we work around
43
+ while not line.nil?
44
+ puts line
45
+ line = f.gets
46
+ end
47
+ status
48
+ }
49
+ Maglev.abort_transaction
50
+ Maglev::PERSISTENT_ROOT['test_snapshot']
51
+ end
52
+
53
+ def self.shutdown
54
+ File.delete(snapshot_file_path)
55
+ File.delete(module_file_path) if File.file?(module_file_path)
56
+ end
57
+
58
+ #
59
+ # compare two sources and return the MaglevRecord Snapshot
60
+ #
61
+ def self.compare(s1, s2)
62
+ s1 = snapshot(s1)
63
+ s2 = snapshot(s2)
64
+ s2.changes_since(s1) unless s1.nil? or s2.nil?
65
+ end
66
+
67
+ def self.class_string(name, content = '')
68
+ "class #{name}
69
+ include MaglevRecord::Base
70
+ self.maglev_record_persistable
71
+ # content follows
72
+ #{content}
73
+ # content ends
74
+ end"
75
+ end
76
+
77
+ def self.clean
78
+ Maglev.abort_transaction
79
+ consts = [:MyTestClass, :MyTestClass2]
80
+ Maglev.persistent do
81
+ consts.each { |const|
82
+ Object.remove_const(const) if Object.const_defined? const
83
+ }
84
+ end
85
+ Maglev.commit_transaction
86
+ end
87
+
88
+ as_instance_method :class_string, :compare, :snapshot, :clean
89
+
90
+ ############### Test
91
+
92
+ def test_class_string_include_class_name
93
+ s = class_string('MyTestClass123123', 'xxxx')
94
+ assert_include? s, 'class MyTestClass123123'
95
+ assert_include? s, 'xxxx'
96
+ end
97
+
98
+ end
@@ -1,4 +1,3 @@
1
- require "maglev_record"
2
1
  require "more_asserts"
3
2
 
4
3
  class MySnapshotableClass
@@ -0,0 +1,40 @@
1
+ require "tmpdir"
2
+ require 'test/unit'
3
+
4
+ #
5
+ # this test creates a temporary directory for the test
6
+ #
7
+
8
+ class TempDirTest < Test::Unit::TestCase
9
+ def setup
10
+ # make temporary directory
11
+ # see http://ruby-doc.org/stdlib-2.0/libdoc/tmpdir/rdoc/Dir.html#method-c-mktmpdir
12
+ @tempdir = Dir.mktmpdir
13
+ @file_count = 0
14
+ end
15
+
16
+ def teardown
17
+ # remove the directory
18
+ FileUtils.remove_dir tempdir
19
+ end
20
+
21
+ def tempdir
22
+ @tempdir
23
+ end
24
+
25
+ def write_to_file(content, file_path = File.join(tempdir, "x#{@file_count += 1}.rb"))
26
+ File.open(file_path, 'w'){ |f| f.write content}
27
+ file_path
28
+ end
29
+
30
+ # test the project configuration
31
+
32
+ def test_tempdir_exists
33
+ assert File.directory?(tempdir)
34
+ end
35
+
36
+ end
37
+
38
+
39
+
40
+
@@ -6,6 +6,9 @@ class ActiveModelLikeInterfaceTest < Test::Unit::TestCase
6
6
  include ActiveModel::Lint::Tests
7
7
 
8
8
  def model
9
- RootedBook.example
9
+ b = RootedBook.example
10
+ # need to trigger method_missing, because respond_to? does not call method_missing
11
+ b.valid?
12
+ b
10
13
  end
11
14
  end
@@ -8,15 +8,23 @@ class ModelTimestampTest < Test::Unit::TestCase
8
8
  def test_time
9
9
  @test_time ||= Time.local(2008, 9, 1, 10, 5, 0)
10
10
  end
11
- def test_created_at
11
+
12
+ def setup
12
13
  Timecop.freeze(test_time)
13
- model = RootedBook.example
14
- assert_equal model.created_at, test_time
15
14
  end
16
-
17
15
  def teardown
18
16
  Timecop.return
19
17
  end
20
18
 
19
+ def test_created_at
20
+ model = RootedBook.example
21
+ assert_equal model.created_at, test_time
22
+ end
21
23
 
22
- end
24
+ def test_updated_at
25
+ model = RootedBook.example
26
+ Timecop.freeze(test_time + 10)
27
+ model.author = 'Another author'
28
+ assert_equal model.updated_at, test_time + 10
29
+ end
30
+ end
@@ -42,4 +42,14 @@ class QueryInterfaceTest < Test::Unit::TestCase
42
42
  assert_equal book, RootedBook.find_by_objectid(book.object_id)
43
43
  end
44
44
 
45
+ def test_reset
46
+ book = RootedBook.find { |b| b.title == "Harry Potter and the Philosopher's stone" }
47
+ book.author = "J. R. R. Tolkien"
48
+ book.title = "The Lord of the Rings"
49
+
50
+ assert_nil RootedBook.find { |b| b.title == "Harry Potter and the Philosopher's stone" }
51
+ MaglevRecord.reset
52
+ assert_not_nil RootedBook.find { |b| b.title == "Harry Potter and the Philosopher's stone" }
53
+ end
54
+
45
55
  end
@@ -1,16 +1,24 @@
1
1
  require "more_asserts"
2
2
  require "maglev_record"
3
3
 
4
- class User
5
- include MaglevRecord::RootedBase
6
- attr_accessor :password_digest
7
-
8
- has_secure_password
9
- # TODO: No validations so far
10
- # validates_presence_of :password, :on => :create
11
- end
4
+ class SensibleTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ Object.class_eval "
8
+ class User
9
+ include MaglevRecord::RootedBase
10
+ attr_accessor :password_digest
11
+ has_secure_password
12
+ validates_presence_of :password, :on => :create
13
+ end
14
+ User.maglev_record_persistable"
15
+ end
12
16
 
13
- class SensibleTest #< Test::Unit::TestCase
17
+ def teardown
18
+ Maglev.persistent do
19
+ Object.remove_const "User"
20
+ end
21
+ end
14
22
 
15
23
  def pass
16
24
  "some_pass"
@@ -35,4 +43,4 @@ class SensibleTest #< Test::Unit::TestCase
35
43
  assert_equal user.password, nil
36
44
  assert_equal user.password_confirmation, nil
37
45
  end
38
- end
46
+ end
@@ -10,16 +10,6 @@ class ValidationTest < Test::Unit::TestCase
10
10
  MaglevRecord.save
11
11
  end
12
12
 
13
- # TODO
14
- # def test_reset
15
- # book = Book.find { |b| b.title == "Harry Potter and the Philosopher's stone" }
16
- # book.author = "J. R. R. Tolkien"
17
- # book.title = "The Lord of the Rings"
18
-
19
- # MaglevRecord.reset
20
- # assert_not_nil Book.find { |b| b.title == "Harry Potter and the Philosopher's stone" }
21
- # end
22
-
23
13
  def test_validation_works
24
14
  book = RootedBook.new(:author => "Book")
25
15
  assert book.valid?
@@ -28,14 +18,14 @@ class ValidationTest < Test::Unit::TestCase
28
18
  end
29
19
 
30
20
  def test_validation_fails
31
- book = RootedBook.new()
21
+ book = RootedBook.new
32
22
  assert !book.valid?
33
23
  assert book.invalid?
34
24
  MaglevRecord.save
35
25
  end
36
26
 
37
27
  def test_errors_not_empty
38
- book = RootedBook.new()
28
+ book = RootedBook.new
39
29
  book.valid?
40
30
  assert book.errors.count > 0
41
31
  end