ObjectModel 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. data/README +849 -0
  2. data/lib/ObjectModel.res/config.yaml +5 -0
  3. data/lib/ObjectModel/AnEntity/BackReferences.rb +113 -0
  4. data/lib/ObjectModel/AnEntity/Bag.rb +129 -0
  5. data/lib/ObjectModel/AnEntity/BagCopy.rb +29 -0
  6. data/lib/ObjectModel/AnEntity/ChildrenBag.rb +10 -0
  7. data/lib/ObjectModel/AnEntity/EntityCopy.rb +38 -0
  8. data/lib/ObjectModel/AnEntity/EntityType.rb +408 -0
  9. data/lib/ObjectModel/AnEntity/ReferencesBag.rb +10 -0
  10. data/lib/ObjectModel/AnEntity/entity_cm.rb +108 -0
  11. data/lib/ObjectModel/Entity.rb +278 -0
  12. data/lib/ObjectModel/Errors/LoadError.rb +3 -0
  13. data/lib/ObjectModel/Errors/NoTransactionError.rb +3 -0
  14. data/lib/ObjectModel/Errors/NotFoundError.rb +2 -0
  15. data/lib/ObjectModel/Errors/OutdatedError.rb +8 -0
  16. data/lib/ObjectModel/Errors/ValidationError.rb +3 -0
  17. data/lib/ObjectModel/Indexes/HashIndex.rb +64 -0
  18. data/lib/ObjectModel/Indexes/IndexStorage.rb +64 -0
  19. data/lib/ObjectModel/Indexes/Manager.rb +72 -0
  20. data/lib/ObjectModel/Metadata.rb +34 -0
  21. data/lib/ObjectModel/Metadata.res/after_event_types.rb +25 -0
  22. data/lib/ObjectModel/Metadata.res/attribute_types_shortcuts.rb +10 -0
  23. data/lib/ObjectModel/Metadata.res/before_event_types.rb +25 -0
  24. data/lib/ObjectModel/Metadata.res/child_types_shortcuts.rb +4 -0
  25. data/lib/ObjectModel/Metadata.res/metadata_checks.rb +9 -0
  26. data/lib/ObjectModel/Metadata.res/reference_types_shortcuts.rb +4 -0
  27. data/lib/ObjectModel/Metadata/DSL.rb +11 -0
  28. data/lib/ObjectModel/Metadata/attribute.rb +56 -0
  29. data/lib/ObjectModel/Metadata/child.rb +50 -0
  30. data/lib/ObjectModel/Metadata/events.rb +109 -0
  31. data/lib/ObjectModel/Metadata/name.rb +20 -0
  32. data/lib/ObjectModel/Metadata/reference.rb +50 -0
  33. data/lib/ObjectModel/Metadata/require.rb +10 -0
  34. data/lib/ObjectModel/Metadata/validate.rb +66 -0
  35. data/lib/ObjectModel/Repository.rb +326 -0
  36. data/lib/ObjectModel/Repository/EventProcessor.rb +58 -0
  37. data/lib/ObjectModel/Repository/ObjectStorage.rb +102 -0
  38. data/lib/ObjectModel/Repository/StreamID.rb +20 -0
  39. data/lib/ObjectModel/Repository/StreamStorage.rb +121 -0
  40. data/lib/ObjectModel/Repository/SystemListener.rb +143 -0
  41. data/lib/ObjectModel/Repository/Transaction.rb +63 -0
  42. data/lib/ObjectModel/Repository/TransactionProcessor.rb +36 -0
  43. data/lib/ObjectModel/Tools/DefaultTransactionStrategy.rb +9 -0
  44. data/lib/ObjectModel/Tools/InMemoryCache.rb +9 -0
  45. data/lib/ObjectModel/Tools/NoCache.rb +18 -0
  46. data/lib/ObjectModel/Tools/OGLRUCache.rb +37 -0
  47. data/lib/ObjectModel/Types/BagType.rb +94 -0
  48. data/lib/ObjectModel/Types/BooleanType.rb +42 -0
  49. data/lib/ObjectModel/Types/ClassType.rb +43 -0
  50. data/lib/ObjectModel/Types/DataType.rb +44 -0
  51. data/lib/ObjectModel/Types/DateType.rb +43 -0
  52. data/lib/ObjectModel/Types/NumberType.rb +62 -0
  53. data/lib/ObjectModel/Types/ObjectType.rb +164 -0
  54. data/lib/ObjectModel/Types/ProcType.rb +43 -0
  55. data/lib/ObjectModel/Types/SingleType.rb +59 -0
  56. data/lib/ObjectModel/Types/StringType.rb +39 -0
  57. data/lib/ObjectModel/_require.rb +43 -0
  58. data/lib/ObjectModel/require.rb +1 -0
  59. data/rakefile +62 -0
  60. data/spec/ObjectModel/BasicSpec/BaseClass.rb +7 -0
  61. data/spec/ObjectModel/BasicSpec/BaseTypes.rb +11 -0
  62. data/spec/ObjectModel/BasicSpec/Descendant.rb +5 -0
  63. data/spec/ObjectModel/BasicSpec/EachTest.rb +14 -0
  64. data/spec/ObjectModel/BasicSpec/UpChild.rb +10 -0
  65. data/spec/ObjectModel/BasicSpec/UpParent.rb +11 -0
  66. data/spec/ObjectModel/ErrorsSpec/AfterCommitError.rb +9 -0
  67. data/spec/ObjectModel/ExtendedSpec/CustomInitialization.rb +11 -0
  68. data/spec/ObjectModel/ExtendedSpec/UpNotNil.rb +8 -0
  69. data/spec/ObjectModel/ExtendedSpec/UpParent.rb +11 -0
  70. data/spec/ObjectModel/ValidationSpec/BaseTypes.rb +11 -0
  71. data/spec/aspect_spec.rb +55 -0
  72. data/spec/back_references_spec.rb +161 -0
  73. data/spec/basic_spec.rb +162 -0
  74. data/spec/cascade_delete_spec.rb +168 -0
  75. data/spec/complex_events_spec.rb +134 -0
  76. data/spec/concurrency_spec.rb +186 -0
  77. data/spec/containment_spec.rb +146 -0
  78. data/spec/data_migration_spec.rb +51 -0
  79. data/spec/errors_spec.rb +65 -0
  80. data/spec/events_spec.rb +173 -0
  81. data/spec/extended_spec.rb +171 -0
  82. data/spec/indexing_spec.rb +56 -0
  83. data/spec/set_in_memory.rb +2 -0
  84. data/spec/set_no_cache.rb +2 -0
  85. data/spec/smoke_test_spec.rb +85 -0
  86. data/spec/stream_spec.rb +143 -0
  87. data/spec/stream_storage.rb +148 -0
  88. data/spec/timer.rb +5 -0
  89. data/spec/validation_spec.rb +87 -0
  90. metadata +186 -0
@@ -0,0 +1,146 @@
1
+ require 'ObjectModel/require'
2
+ require 'spec'
3
+
4
+ module ObjectModel
5
+ module ContainmentSpec
6
+ describe "Containment" do
7
+ before :each do
8
+ CONFIG[:directory] = "#{File.dirname __FILE__}/data"
9
+ Repository.delete :test
10
+ @r = Repository.new :test
11
+ end
12
+
13
+ after :each do
14
+ @r.close
15
+ Repository.delete :test
16
+ end
17
+
18
+ class SimpleEntity
19
+ inherit Entity
20
+
21
+ metadata do
22
+ attribute :label, :string
23
+ child :child
24
+ child :children, :bag
25
+ end
26
+ end
27
+
28
+ it "Access by Path" do
29
+ @r.transaction{
30
+ p = SimpleEntity.new('p').set :label => 'Parent'
31
+ c1 = SimpleEntity.new('c1').set :label => 'Child1'
32
+ c2 = SimpleEntity.new('c2').set :label => 'Child2'
33
+ p.child = c1
34
+ p.children << c2
35
+ }.commit
36
+
37
+ @r.should include('p/c1')
38
+ @r.should include('p/c2')
39
+ @r['p/c1'].label.should == "Child1"
40
+ @r['p/c2'].label.should == "Child2"
41
+ end
42
+
43
+ it "Change name" do
44
+ @r.transaction{
45
+ p = SimpleEntity.new 'e', 'id1'
46
+ p.name = 'e2'
47
+ }.commit
48
+ @r.should_not include('e')
49
+ @r.should include('e2')
50
+
51
+ tr = @r.transaction{
52
+ e = @r['e2']
53
+ e.name = 'e3'
54
+ e.name.should == 'e3'
55
+ }
56
+ @r.should include('e2')
57
+
58
+ tr.commit
59
+ @r.should_not include('e2')
60
+ @r.should include('e3')
61
+ end
62
+
63
+ it "Check duplicate name beneath Children" do
64
+ @r.transaction{
65
+ p = SimpleEntity.new 'p'
66
+ lambda{
67
+ SimpleEntity.new 'p'
68
+ }.should raise_error(/Not unique/)
69
+ }
70
+ end
71
+
72
+ it "Check duplicate name when moving from Root Space to Children" do
73
+ @r.transaction{
74
+ p = SimpleEntity.new 'p'
75
+ c = SimpleEntity.new 'c'
76
+ p.child = c
77
+
78
+ c2 = SimpleEntity.new 'c'
79
+ lambda{
80
+ p.children << c2
81
+ }.should raise_error(/Not unique/)
82
+ }
83
+ end
84
+
85
+ it "Check duplicate name between Existing Entity and New One" do
86
+ @r.transaction{
87
+ SimpleEntity.new 'p'
88
+ }.commit
89
+ @r.transaction{
90
+ lambda{
91
+ SimpleEntity.new 'p'
92
+ }.should raise_error(/Not unique/)
93
+ }
94
+ end
95
+
96
+ it "Check duplicate name when moving Entity to Root space" do
97
+ @r.transaction{
98
+ p = SimpleEntity.new 'p'
99
+ p.child = c = SimpleEntity.new
100
+ p.child.name = 'p'
101
+ lambda{
102
+ p.child = nil
103
+ p c.parent
104
+ }.should raise_error(/Not unique/)
105
+ }.commit
106
+ end
107
+
108
+ it "Check duplicate name when moving Entity to Another Entity" do
109
+ @r.transaction{
110
+ p1 = SimpleEntity.new 'p1', 'id1'
111
+ p2 = SimpleEntity.new 'p2'
112
+ c1 = SimpleEntity.new 'c1'
113
+ c2 = SimpleEntity.new 'c2'
114
+ p1.child = c1
115
+ p2.child = c2
116
+
117
+ c2.name = 'c1'
118
+ lambda{
119
+ p1.children << c2
120
+ }.should raise_error(/Not unique/)
121
+ }.commit
122
+ end
123
+
124
+ it "Entity methods: [], include_child?" do
125
+ @r.transaction{
126
+ p = SimpleEntity.new 'p'
127
+ c = SimpleEntity.new('c').set :label => "child"
128
+ p.child = c
129
+ }.commit
130
+ @r['p'].should include('c')
131
+ @r['p']['c'].label.should == "child"
132
+ lambda{@r['p']['invalid']}.should raise_error(NotFoundError)
133
+ end
134
+
135
+ it "path" do
136
+ @r.transaction{
137
+ p = SimpleEntity.new 'p'
138
+ c = SimpleEntity.new('c').set :label => "child"
139
+ p.child = c
140
+ }.commit
141
+ @r['p'].path.should == 'p'
142
+ @r['p/c'].path.should == 'p/c'
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,51 @@
1
+ require 'ObjectModel/require'
2
+ require 'spec'
3
+
4
+ module ObjectModel
5
+ module DataMigrationSpec
6
+ describe "Data Migration" do
7
+ it "when loading outdated attribute instead of :default check_for :initialize" do
8
+ class InitEntity
9
+ inherit Entity
10
+
11
+ metadata do
12
+ end
13
+ end
14
+
15
+ @r.transaction{InitEntity.new "ie"}.commit
16
+
17
+ class InitEntity
18
+ inherit Entity
19
+
20
+ metadata do
21
+ attribute :value, :object, :initialize => "custom value"
22
+ end
23
+ end
24
+
25
+ @r.transaction{
26
+ @r["ie"].value.should == "custom value"
27
+ }.commit
28
+ end
29
+
30
+ before :all do
31
+ @restore = ObjectModel::CONFIG[:cache]
32
+ ObjectModel::CONFIG[:cache] = "ObjectModel::Tools::NoCache"
33
+ end
34
+
35
+ after :all do
36
+ ObjectModel::CONFIG[:cache] = @restore
37
+ end
38
+
39
+ before :each do
40
+ CONFIG[:directory] = "#{File.dirname __FILE__}/data"
41
+ Repository.delete :test
42
+ @r = Repository.new :test
43
+ end
44
+
45
+ after :each do
46
+ @r.close
47
+ Repository.delete :test
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,65 @@
1
+ require 'ObjectModel/require'
2
+ require 'spec'
3
+
4
+ module ObjectModel
5
+ module ErrorsSpec
6
+ describe "ErrorsSpec" do
7
+ before :each do
8
+ CONFIG[:directory] = "#{File.dirname __FILE__}/data"
9
+ Repository.delete :test
10
+ @r = Repository.new :test
11
+ end
12
+
13
+ after :each do
14
+ @r.close
15
+ Repository.delete :test
16
+ end
17
+
18
+ class SimpleEntity
19
+ inherit Entity
20
+
21
+ metadata do
22
+ attribute :label, :string
23
+ attribute :value, :object
24
+ child :child
25
+ end
26
+ end
27
+
28
+ it "Shouldn't raise UniqueEntityID when saving Entity" do
29
+ @r.transaction{SimpleEntity.new("e")}.commit
30
+ @r.transaction{@r["e"].name = "e"}.commit # <= Error was here
31
+ end
32
+
33
+ it "Instead of UniqueOMID error raises some strange error" do
34
+ @r.transaction{SimpleEntity.new("e", "e")}.commit
35
+ lambda{
36
+ @r.transaction{SimpleEntity.new("e", "e")}.commit
37
+ }.should raise_error(/Not Unique :entity_id/)
38
+ end
39
+
40
+ it "Should fill name before :after_commit (from error)" do
41
+ @r.transaction{AfterCommitError.new("name")}.commit
42
+ # e = @r["name"]
43
+ # p e
44
+ end
45
+
46
+ it "Changing name doesn't affects cache" do
47
+ restore = ObjectModel::CONFIG[:cache]
48
+ ObjectModel::CONFIG[:cache] = "ObjectModel::Tools::InMemoryCache"
49
+ Repository.delete :test2
50
+ r = Repository.new :test2
51
+ begin
52
+
53
+ r.transaction{SimpleEntity.new("e")}.commit
54
+ r.transaction{r["e"].name = "e2"}.commit
55
+ r["e2"].name.should == "e2"
56
+
57
+ ensure
58
+ ObjectModel::CONFIG[:cache] = restore
59
+ r.close
60
+ Repository.delete :test2
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,173 @@
1
+ require 'ObjectModel/require'
2
+ require 'spec'
3
+
4
+ module ObjectModel
5
+ module EventsSpec
6
+ describe "Events" do
7
+ class MockListener
8
+ attr_reader :events, :arguments
9
+ def initialize
10
+ @events, @arguments = [], []
11
+ end
12
+
13
+ def method_missing m, *p, &b
14
+ @events << m
15
+ @arguments << p
16
+ end
17
+
18
+ def respond_to? symbol
19
+ true
20
+ end
21
+
22
+ def clear
23
+ @events.clear
24
+ end
25
+ end
26
+
27
+ before :each do
28
+ ObjectModel::CONFIG[:directory] = "#{File.dirname __FILE__}/data"
29
+
30
+ Repository.delete :test
31
+ @r = Repository.new :test
32
+ @l = MockListener.new
33
+ @r.entity_listeners << @l
34
+ end
35
+
36
+ after :each do
37
+ @r.close
38
+ Repository.delete :test
39
+ end
40
+
41
+ class EventEntity
42
+ inherit Entity
43
+ metadata do
44
+ attribute :attribute, :string
45
+ reference :reference
46
+ child :child
47
+ end
48
+ end
49
+
50
+ it "attribute_update" do
51
+ @r.transaction{EventEntity.new 'e'}.commit
52
+ @l.clear
53
+ tr = @r.transaction{@r['e'].attribute = "string"}.commit
54
+ @l.events.should == [
55
+ :before_attribute_update, :after_attribute_update,
56
+ :before_commit, :after_commit
57
+ ]
58
+ tr.copies.values[0].updated?.should be_true
59
+ end
60
+
61
+ it "new_reference, delete_reference and new_referrer, delete_referrer" do
62
+ @r.transaction{EventEntity.new 'e'}.commit
63
+ @l.clear
64
+ @r.transaction{@r['e'].reference = @r['e']}.commit
65
+ @l.events.should == [
66
+ :before_new_reference,
67
+ :before_new_referrer, :after_new_referrer,
68
+ :after_new_reference,
69
+ :before_commit, :after_commit
70
+ ]
71
+
72
+ @l.clear
73
+ tr = @r.transaction{@r['e'].reference = nil}.commit
74
+ @l.events.should == [
75
+ :before_delete_reference,
76
+ :before_delete_referrer, :after_delete_referrer,
77
+ :after_delete_reference,
78
+ :before_commit, :after_commit
79
+ ]
80
+ tr.copies.values[0].updated?.should be_true
81
+ end
82
+
83
+ it "new_child, delete_child and new_parent, delete_parent" do
84
+ @r.transaction{EventEntity.new 'e'; EventEntity.new 'child'}.commit
85
+ @l.clear
86
+ @r.transaction{@r['e'].child = @r['child']}.commit
87
+ @l.events.should == [
88
+ :before_new_child,
89
+ :before_new_parent, :after_new_parent,
90
+ :after_new_child,
91
+ :before_commit, :after_commit
92
+ ]
93
+
94
+ @l.clear
95
+ tr = @r.transaction{@r['e'].child = nil}.commit
96
+ @l.events.should == [:before_delete_child,
97
+ :before_delete_parent, :after_delete_parent,
98
+ :after_delete_child,
99
+ :before_commit, :after_commit
100
+ ]
101
+
102
+ updated = 0
103
+ tr.copies.size.should == 2
104
+ tr.copies.values.each do |copy|
105
+ updated += 1 if copy.updated?
106
+ end
107
+ updated.should == 2
108
+ end
109
+
110
+ it "new, delete" do
111
+ @l.clear
112
+ tr = @r.transaction{EventEntity.new 'e'}.commit
113
+ @l.events.should == [:before_new, :before_name_update, :after_name_update, :after_new, :before_commit, :after_commit]
114
+ tr.copies.values[0].new?.should be_true
115
+
116
+ @l.clear
117
+ @r.transaction{@r['e'].delete}.commit
118
+ @l.events.should == [:before_delete, :after_delete, :before_commit, :after_commit]
119
+ end
120
+
121
+ it "move" do
122
+ @r.transaction{
123
+ p1 = EventEntity.new 'p1'
124
+ EventEntity.new 'p2'
125
+ p1.child = EventEntity.new 'child'
126
+ }.commit
127
+
128
+ @l.clear
129
+ tr = @r.transaction{@r['p2'].child = @r['p1/child']}.commit
130
+ @l.events.should == [
131
+ :before_new_child,
132
+ :before_delete_child,
133
+ :before_delete_parent, :after_delete_parent,
134
+ :after_delete_child,
135
+ :before_move,
136
+ :before_new_parent, :after_new_parent,
137
+ :after_move,
138
+ :after_new_child,
139
+ :before_commit, :after_commit]
140
+
141
+ updated, moved = 0, 0
142
+ tr.copies.size.should == 3
143
+ tr.copies.values.each do |copy|
144
+ updated += 1 if copy.updated?
145
+ moved += 1 if copy.moved?
146
+ end
147
+ [updated, moved].should == [3, 1]
148
+ end
149
+
150
+ class OnEntity
151
+ inherit Entity
152
+ metadata do
153
+ attribute :before, :string
154
+ attribute :after, :string
155
+
156
+ before :new do
157
+ self.before += "before new"
158
+ end
159
+
160
+ after :new do
161
+ self.after += "after new"
162
+ end
163
+ end
164
+ end
165
+
166
+ it "Changes made to Entity during Events should be Commited." do
167
+ @r.transaction{OnEntity.new 'e'}.commit
168
+ @r['e'].before.should == "before new"
169
+ @r['e'].after.should == "after new"
170
+ end
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,171 @@
1
+ require 'ObjectModel/require'
2
+ require 'spec'
3
+
4
+ module ObjectModel
5
+ module ExtendedSpec
6
+ describe "Repository Extended" do
7
+ class SimpleEntity
8
+ inherit Entity
9
+
10
+ metadata do
11
+ attribute :label, :string
12
+ attribute :value
13
+ reference :reference
14
+ end
15
+ end
16
+
17
+ it "Asquisition should search in Parent's methods untill found not-nil value (from error)" do
18
+ @r.transaction{
19
+ p = UpNotNil.new 'p'
20
+ p.value = "Value"
21
+ UpNotNil.new 'c'
22
+ }.commit
23
+ @r['c'].up(:value).should == nil
24
+ @r.transaction{
25
+ @r['p'].child = @r['c']
26
+ }.commit
27
+ @r['p/c'].up(:value).should == "Value"
28
+ end
29
+
30
+ it "Clearing Repository" do
31
+ @r.transaction{SimpleEntity.new("se")}.commit
32
+ @r.should include('se')
33
+ @r.clear
34
+ @r.should_not include('se')
35
+ # Should function well
36
+ @r.transaction{SimpleEntity.new("se")}.commit
37
+ @r.should include('se')
38
+ end
39
+
40
+ it "Asquisition shouldn't raise 'Not found' if Parent hasn't method returning nil" do
41
+ @r.transaction{
42
+ p = UpParent.new 'p' # Hasn't :value method
43
+ c = UpNotNil.new 'c'
44
+ p.child = c
45
+ }.commit
46
+ @r['p/c'].up(:value).should == nil
47
+ end
48
+
49
+ it "Custom Initialization" do
50
+ @r.transaction{
51
+ CustomInitialization.new 'ci'
52
+ }.commit
53
+ e = @r['ci']
54
+ [e.string, e.number, e.boolean, e.object, e.data, e.date].should ==
55
+ ["ci", 1, true, 45, StreamID.new("sid"), DateTime.new(2009, 1, 1)]
56
+ end
57
+
58
+ it "Entities can be used as Hash keys (from error)" do
59
+ @r.transaction{SimpleEntity.new 'e'}.commit
60
+ @r['e'].should == @r['e']
61
+ {@r['e'] => 1}.should == {@r['e'] => 1}
62
+ [@r['e']].to_set.should == [@r['e']].to_set
63
+ end
64
+
65
+ it "Should correct restore entity_id, name and om_repository after loading" do
66
+ @r.transaction{SimpleEntity.new 'e', 'entity_id'}.commit
67
+ @r['e'].entity_id.should == "entity_id"
68
+ @r['e'].name.should == "e"
69
+ @r['e'].om_version.should_not be_nil
70
+ @r['e'].om_version.should_not == 0
71
+ @r['e'].om_repository.should == @r
72
+ end
73
+
74
+ it "Commit inside Transaction block" do
75
+ @r.transaction{|t|
76
+ SimpleEntity.new 'e'
77
+ t.commit
78
+ }
79
+ @r.should include('e')
80
+ end
81
+
82
+ it "Should correct save cycle references" do
83
+ @r.transaction{
84
+ a = SimpleEntity.new 'a'
85
+ b = SimpleEntity.new 'b'
86
+ b.reference = a
87
+ a.reference = b
88
+ }.commit
89
+
90
+ @r['a'].reference.should == @r['b']
91
+ @r['b'].reference.should == @r['a']
92
+ end
93
+
94
+ it "Should save special characters" do
95
+ @r.transaction{
96
+ e = SimpleEntity.new 'e'
97
+ e.label = "<test>\"'&"
98
+ }.commit
99
+
100
+ @r['e'].label.should == "<test>\"'&"
101
+ end
102
+
103
+ it "Shouldn't allow '/' symbol in name" do
104
+ lambda{
105
+ @r.transaction{
106
+ SimpleEntity.new 'ivalid/symbol'
107
+ }.commit
108
+ }.should raise_error(/'\/'/)
109
+ end
110
+
111
+ it %{
112
+ Tricky spec. Inside Transaction scope Entity Lookup
113
+ should use 'Transaction.resolve' not 'Repository.by_id'
114
+ } do
115
+ @r.transaction do
116
+ e1 = SimpleEntity.new
117
+ e2 = SimpleEntity.new.set :label => "e2"
118
+ e1.reference = e2
119
+ e1.reference.label.should == "e2" # <= Entity Lookup in this line shouldn't cause Error
120
+ end
121
+ end
122
+
123
+ it "Transaction should have default name" do
124
+ tr = @r.transaction{}
125
+ tr.name.should == "default"
126
+ end
127
+
128
+ it "Should also works with entities accessed outside Transaction scope" do
129
+ # We can use it without isolate, but we can't then guarantee integrity
130
+ # becouse if we use NoCache Cache it creates new entity each time.
131
+ # So if we first access Entity and remember it without :isolate another
132
+ # process can change this Entity.
133
+ @r.transaction{
134
+ SimpleEntity.new 'e'
135
+ }.commit
136
+ @r.isolate do
137
+ e = @r['e']
138
+ @r.transaction{
139
+ e.label = "new name"
140
+ }.commit
141
+ @r['e'].label.should == "new name"
142
+ # e.label.should == "new name" # but this will be not always true!
143
+ end
144
+ end
145
+
146
+ it "Shouldn't allow create Entity with empty name" do
147
+ @r.transaction{
148
+ lambda{SimpleEntity.new ""}.should raise_error(/shouldn't be Emtpy/)
149
+ }
150
+ end
151
+
152
+ it "Should be able to save some simple metadata" do
153
+ s = @r.storage
154
+ s.get("key").should be_nil
155
+ s.put("key", "value")
156
+ s.get("key").should == "value"
157
+ end
158
+
159
+ before :each do
160
+ CONFIG[:directory] = "#{File.dirname __FILE__}/data"
161
+ Repository.delete :test
162
+ @r = Repository.new :test
163
+ end
164
+
165
+ after :each do
166
+ @r.close
167
+ Repository.delete :test
168
+ end
169
+ end
170
+ end
171
+ end