cockroach 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/.rvmrc +1 -0
  2. data/Gemfile +28 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +124 -0
  5. data/Rakefile +37 -0
  6. data/VERSION +1 -0
  7. data/cockroach.gemspec +96 -0
  8. data/lib/cockroach.rb +43 -0
  9. data/lib/cockroach/base/load_nodes.rb +38 -0
  10. data/lib/cockroach/base/node.rb +192 -0
  11. data/lib/cockroach/base/node_structure.rb +11 -0
  12. data/lib/cockroach/config.rb +54 -0
  13. data/lib/cockroach/config/loader.rb +35 -0
  14. data/lib/cockroach/fixtures/factory_girl.rb +4 -0
  15. data/lib/cockroach/fixtures/factory_girl/loader.rb +43 -0
  16. data/lib/cockroach/fixtures/factory_girl/node.rb +51 -0
  17. data/lib/cockroach/fixtures/factory_girl/profiler.rb +34 -0
  18. data/lib/cockroach/railtie.rb +7 -0
  19. data/lib/cockroach/source.rb +40 -0
  20. data/lib/cockroach/source/model.rb +33 -0
  21. data/lib/cockroach/source/node.rb +27 -0
  22. data/lib/cockroach/version.rb +3 -0
  23. data/lib/generators/cockroach/install_generator.rb +20 -0
  24. data/lib/generators/cockroach/templates/cockroach.rb +8 -0
  25. data/lib/generators/cockroach/templates/faker.yml +16 -0
  26. data/lib/tasks/faker.rake +35 -0
  27. data/test/config/config_test.rb +129 -0
  28. data/test/config/loader_test.rb +42 -0
  29. data/test/fixturers/factory_girl/aliasing_test.rb +151 -0
  30. data/test/fixturers/factory_girl/loading_test.rb +45 -0
  31. data/test/fixturers/factory_girl/node_test.rb +386 -0
  32. data/test/fixturers/factory_girl/profiler_test.rb +124 -0
  33. data/test/fixturers/source_test.rb +153 -0
  34. data/test/generators/install_generator_test.rb +14 -0
  35. data/test/support/active_record.rb +11 -0
  36. data/test/support/data/correct_with_option.yml +13 -0
  37. data/test/support/data/correct_without_option.yml +10 -0
  38. data/test/support/data/dummy_structure/config/faker.yml +13 -0
  39. data/test/support/data/dummy_structure/config/user_only.yml +1 -0
  40. data/test/support/data/dummy_structure/config/witness.yml +6 -0
  41. data/test/support/data/dummy_structure/test/factories/user_factory.rb +16 -0
  42. data/test/support/database_cleaner.rb +13 -0
  43. data/test/support/factory_girl_mocked.rb +32 -0
  44. data/test/support/models/user.rb +23 -0
  45. data/test/test_helper.rb +26 -0
  46. metadata +151 -0
@@ -0,0 +1,42 @@
1
+ require "test_helper"
2
+
3
+ module Cockroach
4
+ class Config::LoaderTest < Test::Unit::TestCase
5
+ context "Parser" do
6
+ context "and Unexisting config" do
7
+ should "raise an error for empty string" do
8
+ assert_raise Cockroach::Config::ConfigNotExistsError do
9
+ Cockroach::Config::Loader.parse ""
10
+ end
11
+ end
12
+
13
+ should "raise an error for inexisting file" do
14
+ assert_raise Cockroach::Config::ConfigNotExistsError do
15
+ Cockroach::Config::Loader.parse "/no_file.yml"
16
+ end
17
+ end
18
+ end
19
+
20
+ context "and Correct config" do
21
+ should "return array" do
22
+ config = Cockroach::Config::Loader.parse File.expand_path("../support/data/correct_without_option.yml", File.dirname(__FILE__))
23
+
24
+ assert config.is_a? Array
25
+ assert config.first.is_a? Hash
26
+ assert config.last.is_a? NilClass
27
+ assert_equal 2, config.size
28
+ end
29
+
30
+ should "return array with options" do
31
+ config = Cockroach::Config::Loader.parse File.expand_path("../support/data/correct_with_option.yml", File.dirname(__FILE__))
32
+
33
+ assert config.is_a? Array
34
+ assert config.first.is_a? Hash
35
+ assert config.last.is_a? Hash
36
+ assert_equal 2, config.size
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+
@@ -0,0 +1,151 @@
1
+ require "test_helper"
2
+ require "user"
3
+
4
+ module Cockroach
5
+ class FactoryGirlAliasingTest < Test::Unit::TestCase
6
+ setup do
7
+ before_setup
8
+ mock_factory_girl
9
+ end
10
+
11
+ teardown do
12
+ after_teardown
13
+ end
14
+
15
+ context "Complex aliase" do
16
+ context "Heritage" do
17
+ setup do
18
+ @users_node = Cockroach::FactoryGirl::Node.new('users' => {
19
+ 'amount' => '5',
20
+ 'as' => 'person',
21
+ 'places' => {
22
+ 'amount' => '10',
23
+ 'owner_as' => 'person'
24
+ }})
25
+ end
26
+
27
+ should "send load! call to subnodes" do
28
+ mocks = ((1..5).to_a.collect {|i| stub('user', :id => i) })
29
+
30
+ ::FactoryGirl.stubs("create").with("user").returns( *mocks )
31
+
32
+ subnode = @users_node.nodes['place']
33
+ subnode.expects(:load!).with({"person" => mocks[0]})
34
+ subnode.expects(:load!).with({"person" => mocks[1]})
35
+ subnode.expects(:load!).with({"person" => mocks[2]})
36
+ subnode.expects(:load!).with({"person" => mocks[3]})
37
+ subnode.expects(:load!).with({"person" => mocks[4]})
38
+
39
+ @users_node.__send__(:load!)
40
+ end
41
+
42
+ should "initiate child records exact times" do
43
+ mocks = ((1..5).to_a.collect {|i| stub('user', :id => i) })
44
+ place_mock = stub('place', :id => 0)
45
+
46
+ ::FactoryGirl.stubs("create").with("user").returns( *mocks )
47
+
48
+ ::FactoryGirl.expects(:create).with("place", {"owner" => mocks[0]}).times(10).returns(place_mock)
49
+ ::FactoryGirl.expects(:create).with("place", {"owner" => mocks[1]}).times(10).returns(place_mock)
50
+ ::FactoryGirl.expects(:create).with("place", {"owner" => mocks[2]}).times(10).returns(place_mock)
51
+ ::FactoryGirl.expects(:create).with("place", {"owner" => mocks[3]}).times(10).returns(place_mock)
52
+ ::FactoryGirl.expects(:create).with("place", {"owner" => mocks[4]}).times(10).returns(place_mock)
53
+
54
+ @users_node.nodes.each_value {|node| node.stubs(:allowed_options).returns(['owner']) }
55
+
56
+ @users_node.__send__(:load!)
57
+ end
58
+ end
59
+ end
60
+
61
+ context "Simple alias" do
62
+ setup do
63
+ @users_node = Cockroach::FactoryGirl::Node.new('users' => {
64
+ 'amount' => '5',
65
+ 'places' => {
66
+ 'amount' => '10',
67
+ 'owner_as' => 'user'
68
+ }})
69
+ end
70
+
71
+ context "Heritage" do
72
+ should "send load! call to subnodes" do
73
+ mocks = ((1..5).to_a.collect {|i| stub('user', :id => i) })
74
+
75
+ ::FactoryGirl.stubs("create").with("user").returns( *mocks )
76
+
77
+ subnode = @users_node.nodes['place']
78
+ subnode.expects(:load!).with({"user" => mocks[0]})
79
+ subnode.expects(:load!).with({"user" => mocks[1]})
80
+ subnode.expects(:load!).with({"user" => mocks[2]})
81
+ subnode.expects(:load!).with({"user" => mocks[3]})
82
+ subnode.expects(:load!).with({"user" => mocks[4]})
83
+
84
+ @users_node.__send__(:load!)
85
+ end
86
+
87
+ should "initiate child records exact times" do
88
+ mocks = ((1..5).to_a.collect {|i| stub('user', :id => i) })
89
+ place_mock = stub('place', :id => 0)
90
+
91
+ ::FactoryGirl.stubs("create").with("user").returns( *mocks )
92
+
93
+ ::FactoryGirl.expects(:create).with("place", {"owner" => mocks[0]}).times(10).returns(place_mock)
94
+ ::FactoryGirl.expects(:create).with("place", {"owner" => mocks[1]}).times(10).returns(place_mock)
95
+ ::FactoryGirl.expects(:create).with("place", {"owner" => mocks[2]}).times(10).returns(place_mock)
96
+ ::FactoryGirl.expects(:create).with("place", {"owner" => mocks[3]}).times(10).returns(place_mock)
97
+ ::FactoryGirl.expects(:create).with("place", {"owner" => mocks[4]}).times(10).returns(place_mock)
98
+
99
+ @users_node.nodes.each_value {|node| node.stubs(:allowed_options).returns(['owner']) }
100
+
101
+ @users_node.__send__(:load!)
102
+ end
103
+ end
104
+ end
105
+
106
+ context "Node alias" do
107
+ setup do
108
+ @users_node = Cockroach::FactoryGirl::Node.new(
109
+ 'users' => {
110
+ 'amount' => '5',
111
+ 'as' => 'person',
112
+ 'places_amount' => '10'
113
+ })
114
+ end
115
+
116
+ context "Heritage" do
117
+ should "send load! call to subnodes" do
118
+ mocks = ((1..5).to_a.collect {|i| stub('user', :id => i) })
119
+
120
+ ::FactoryGirl.stubs("create").with("user").returns( *mocks )
121
+
122
+ subnode = @users_node.nodes['place']
123
+ subnode.expects(:load!).with({"person" => mocks[0]})
124
+ subnode.expects(:load!).with({"person" => mocks[1]})
125
+ subnode.expects(:load!).with({"person" => mocks[2]})
126
+ subnode.expects(:load!).with({"person" => mocks[3]})
127
+ subnode.expects(:load!).with({"person" => mocks[4]})
128
+
129
+ @users_node.__send__(:load!)
130
+ end
131
+
132
+ should "initiate child records exact times" do
133
+ mocks = ((1..5).to_a.collect {|i| stub('user', :id => i) })
134
+ place_mock = stub('place', :id => 0)
135
+
136
+ ::FactoryGirl.stubs("create").with("user").returns( *mocks )
137
+
138
+ ::FactoryGirl.expects(:create).with("place", {"person" => mocks[0]}).times(10).returns(place_mock)
139
+ ::FactoryGirl.expects(:create).with("place", {"person" => mocks[1]}).times(10).returns(place_mock)
140
+ ::FactoryGirl.expects(:create).with("place", {"person" => mocks[2]}).times(10).returns(place_mock)
141
+ ::FactoryGirl.expects(:create).with("place", {"person" => mocks[3]}).times(10).returns(place_mock)
142
+ ::FactoryGirl.expects(:create).with("place", {"person" => mocks[4]}).times(10).returns(place_mock)
143
+
144
+ @users_node.nodes.each_value {|node| node.stubs(:allowed_options).returns(['person']) }
145
+
146
+ @users_node.__send__(:load!)
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,45 @@
1
+ require "test_helper"
2
+ require "user"
3
+
4
+ module Cockroach
5
+ class FactoryGirlLoadingTest < Test::Unit::TestCase
6
+ context "Fixture loading" do
7
+ setup do
8
+ mock_factory_girl
9
+ @old = Cockroach::Config.dup
10
+
11
+ Cockroach.setup do |c|
12
+ c.root = File.expand_path("../../../support/data/dummy_structure", __FILE__)
13
+ c.config_path = "./config/user_only.yml"
14
+ end
15
+ end
16
+
17
+ teardown do
18
+ silence_warnings { Cockroach.const_set('Config', @old) }
19
+ end
20
+
21
+ should "register fixtures" do
22
+ ::FactoryGirl.expects(:find_definitions)
23
+
24
+ Cockroach::FactoryGirl::Loader.load
25
+ end
26
+
27
+ context "Factories path is different" do
28
+ setup do
29
+ Cockroach.config.instance_variable_set(:@fixtures_path, "/path/to/fixtures")
30
+ end
31
+
32
+ teardown do
33
+ Cockroach.config.instance_variable_set(:@fixtures_path, nil)
34
+ end
35
+ should "register fixtures" do
36
+ ::FactoryGirl.expects(:definition_file_paths=).with(["/path/to/fixtures"])
37
+ ::File.expects(:directory?).returns(true)
38
+ ::FactoryGirl.expects(:definition_file_paths=).with(['factories', 'test/factories', 'spec/factories'])
39
+
40
+ Cockroach::FactoryGirl::Loader.load
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,386 @@
1
+ require "test_helper"
2
+ require "user"
3
+
4
+ module Cockroach
5
+ class FactoryGirlNodeTest < Test::Unit::TestCase
6
+ setup do
7
+ before_setup
8
+ mock_factory_girl
9
+ end
10
+
11
+ teardown do
12
+ after_teardown
13
+ end
14
+
15
+ context "Node" do
16
+ context "Structure Validation" do
17
+ should "raise error for empty hash" do
18
+ assert_raise Cockroach::InvalideStructureError do
19
+ Cockroach::FactoryGirl::Node.new({})
20
+ end
21
+ end
22
+
23
+ should "raise error for two-keys hash" do
24
+ assert_raise Cockroach::InvalideStructureError do
25
+ Cockroach::FactoryGirl::Node.new({"one" => "1", "two" => "2"})
26
+ end
27
+ end
28
+
29
+ should "raise error for not a hash" do
30
+ [[], nil, 1, ""].each do |invalid_object|
31
+ assert_raise Cockroach::InvalideStructureError do
32
+ Cockroach::FactoryGirl::Node.new(invalid_object)
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ context "Initialization" do
39
+ should "should accept hash" do
40
+ user_node = nil
41
+
42
+ assert_nothing_thrown do
43
+ user_node = Cockroach::FactoryGirl::Node.new({ "users" => { 'amount' => '100', 'places_amount' => '10' }})
44
+ end
45
+
46
+ assert_equal({'amount' => '100'}, user_node.instance_variable_get(:@options))
47
+ assert_equal({'places_amount' => '10'}, user_node.instance_variable_get(:@structure))
48
+ end
49
+
50
+ should "should accept params" do
51
+ user_node = nil
52
+
53
+ assert_nothing_thrown do
54
+ user_node = Cockroach::FactoryGirl::Node.new "users", { 'amount' => '100', 'places_amount' => '10' }
55
+ end
56
+
57
+ assert_equal({'amount' => '100'}, user_node.instance_variable_get(:@options))
58
+ assert_equal({'places_amount' => '10'}, user_node.instance_variable_get(:@structure))
59
+ end
60
+ end
61
+
62
+ context "Name definition" do
63
+ context "Info extracting" do
64
+ should "get options" do
65
+ structure = { "users" => { 'amount' => '100', 'places_amount' => '10' }}
66
+
67
+ user_node = Cockroach::FactoryGirl::Node.new structure
68
+
69
+ assert_equal({'amount' => '100'}, user_node.instance_variable_get(:@options))
70
+ assert_equal({'places_amount' => '10'}, user_node.instance_variable_get(:@structure))
71
+ end
72
+
73
+ should "get user name without approach" do
74
+ assert_equal ["user",nil], Cockroach::FactoryGirl::Node.extract_info("users")
75
+ end
76
+
77
+ should "get user name with approach: amount" do
78
+ assert_equal ["user", "amount"], Cockroach::FactoryGirl::Node.extract_info("users_amount")
79
+ end
80
+
81
+ should "get user name with approach: ratio" do
82
+ assert_equal ["user", "ratio"], Cockroach::FactoryGirl::Node.extract_info("users_ratio")
83
+ end
84
+ end
85
+
86
+ should "define name from simple structure" do
87
+ users_node = Cockroach::FactoryGirl::Node.new('users_amount' => '100')
88
+ assert_equal 'user', users_node.name
89
+ assert_equal 100, users_node.amount
90
+
91
+
92
+ users_node = Cockroach::FactoryGirl::Node.new('users_ratio' => '100')
93
+ assert_equal 'user', users_node.name
94
+ assert users_node.amount.kind_of? Numeric
95
+ end
96
+
97
+ should "define name from subsequntil structure" do
98
+ users_node = Cockroach::FactoryGirl::Node.new('users' => { 'amount' => '100'})
99
+ assert_equal 'user', users_node.name
100
+ assert_equal 100, users_node.amount
101
+
102
+ users_node = Cockroach::FactoryGirl::Node.new('users' => { 'ratio' => '100'})
103
+ assert_equal 'user', users_node.name
104
+ assert users_node.amount.kind_of? Numeric
105
+
106
+ users_node = Cockroach::FactoryGirl::Node.new('users' => { 'ratio' => { 'lower_limit' => '50', 'upper_limit' => '300'}})
107
+ assert_equal 'user', users_node.name
108
+ assert users_node.amount.kind_of? Numeric
109
+ end
110
+
111
+ should "raise error if factory missing" do
112
+ assert_raise ArgumentError do
113
+ users_node = Cockroach::FactoryGirl::Node.new("test_amount" => '100')
114
+ end
115
+ end
116
+
117
+ should "raise error if approach missing" do
118
+ assert_raise Cockroach::InvalideStructureError do
119
+ users_node = Cockroach::FactoryGirl::Node.new("users" => {})
120
+ end
121
+ end
122
+ end
123
+
124
+ context "Amount generated" do
125
+ should "simple amount" do
126
+ users_node = Cockroach::FactoryGirl::Node.new('users_amount' => '100')
127
+ assert_equal 100, users_node.amount
128
+ end
129
+
130
+ should "simple relation" do
131
+ users_node = Cockroach::FactoryGirl::Node.new('users_ratio' => '100')
132
+ users_node.expects(:get_limits).returns([50, 200])
133
+ assert users_node.amount.is_a?(Integer)
134
+ end
135
+
136
+ should "simple relation is not persistent" do
137
+ users_node = Cockroach::FactoryGirl::Node.new('users_ratio' => '100')
138
+ users_node.stubs(:get_limits).returns([50, 200])
139
+
140
+ assert_not_equal users_node.amount, users_node.amount
141
+ end
142
+
143
+ should "subsequent amount" do
144
+ users_node = Cockroach::FactoryGirl::Node.new('users' => {'amount' => '100'})
145
+ assert_equal 100, users_node.amount
146
+ end
147
+
148
+ should "subsequent relation" do
149
+ users_node = Cockroach::FactoryGirl::Node.new('users' => {'ratio' => '100'})
150
+ users_node.expects(:get_limits).returns([50, 200])
151
+ assert users_node.amount.is_a?(Integer)
152
+ end
153
+
154
+ should "subsequent relation with limits" do
155
+ users_node = Cockroach::FactoryGirl::Node.new('users' => {'ratio' => {'lower_limit' => 50, 'upper_limit' => 300}})
156
+ users_node.expects(:get_limits).returns([50, 300])
157
+ assert users_node.amount.is_a?(Integer)
158
+ end
159
+ end
160
+ end
161
+
162
+ context "Source" do
163
+ setup do
164
+ @lands_node = Cockroach::FactoryGirl::Node.new(
165
+ 'places' => {
166
+ 'as' => 'lands',
167
+ 'amount' => '10'
168
+ })
169
+ end
170
+
171
+ # should "keep all top level names" do
172
+ # assert_equal @lands_node, Cockroach::FactoryGirl::Node['lands']
173
+ # end
174
+
175
+ should "keeps all ids" do
176
+ mocks = ((1..10).to_a.collect {|i| stub('place', :id => i) })
177
+
178
+ ::FactoryGirl.stubs("create").with("place").returns( *mocks )
179
+ @lands_node.__send__(:load!)
180
+
181
+ assert_equal (1..10).to_a, @lands_node.ids
182
+ end
183
+
184
+ should "define return class from factory" do
185
+ place_stub = stub('place_instance')
186
+
187
+ factory = @lands_node.instance_variable_get(:@factory)
188
+ factory.stubs(:send).with(:class_name).returns(place_stub)
189
+
190
+ assert_equal place_stub, @lands_node.__send__(:orm_class)
191
+ end
192
+
193
+ should "define_source" do
194
+ profiler = stub('profiler')
195
+ some_node = stub('some')
196
+ fancy_node = stub('fancy')
197
+ path_node = stub('path')
198
+ fancy_node.stubs(:[]).with('path').returns(path_node)
199
+ some_node.stubs(:[]).with('fancy').returns(fancy_node)
200
+ profiler.stubs(:[]).with('some').returns(some_node)
201
+ ::Cockroach.stubs(:profiler).returns(profiler)
202
+
203
+ users_node = Cockroach::FactoryGirl::Node.new(
204
+ 'users' => {
205
+ 'amount' => '5',
206
+ 'places' => {
207
+ 'amount' => '10',
208
+ 'source' => {
209
+ 'some' => {
210
+ 'fancy' => 'path'
211
+ }
212
+ }
213
+ }
214
+ })
215
+
216
+ places_node = users_node['place']
217
+
218
+ source = places_node.instance_variable_get(:@source)
219
+
220
+ assert_instance_of Cockroach::Source::Node, source
221
+ assert_equal path_node, source.node
222
+ end
223
+
224
+ context "Database" do
225
+ setup do
226
+ profiler = stub('profiler')
227
+ @lands_node = stub('lands')
228
+ profiler.stubs(:[]).with('lands').returns(@lands_node)
229
+ ::Cockroach.stubs(:profiler).returns(profiler)
230
+
231
+ @old_const = Object.const_get(:Place) if Object.const_defined?(:Place)
232
+ silence_warnings { Object.const_set(:Place, stub('Place')) }
233
+
234
+ @users_node = Cockroach::FactoryGirl::Node.new(
235
+ 'users' => {
236
+ 'amount' => '5',
237
+ 'places' => {
238
+ 'amount' => '10',
239
+ 'source' => {
240
+ 'model' => 'Place'
241
+ }
242
+ }
243
+ })
244
+ end
245
+
246
+ teardown do
247
+ if @old_const
248
+ silence_warnings { Object.const_set('Place', @old_const) }
249
+ end
250
+ end
251
+
252
+ should "define_source" do
253
+ places_node = @users_node['place']
254
+
255
+ source = places_node.instance_variable_get(:@source)
256
+
257
+ assert_instance_of Cockroach::Source::Model, source
258
+ assert_equal 'Place'.constantize, source.model
259
+ end
260
+
261
+ should "assign record to parrent if source defined" do
262
+ places_node = @users_node['place']
263
+ places_node.stubs(:allowed_options).returns(["user"])
264
+
265
+ places = ((1..10).to_a.collect {|i| stub('place_instance', :id => i) })
266
+ source = places_node.instance_variable_get(:@source)
267
+ source.stubs(:sample).returns(p = places[4])
268
+
269
+ p.expects(:update_attributes).with({"user" => @users_node}).times(10)
270
+
271
+ places_node.__send__(:load!, {"user" => @users_node})
272
+ end
273
+ end
274
+
275
+ context "Other node" do
276
+ setup do
277
+ profiler = stub('profiler')
278
+ @lands_node = stub('lands')
279
+ profiler.stubs(:[]).with('lands').returns(@lands_node)
280
+ ::Cockroach.stubs(:profiler).returns(profiler)
281
+
282
+ @users_node = Cockroach::FactoryGirl::Node.new(
283
+ 'users' => {
284
+ 'amount' => '5',
285
+ 'places' => {
286
+ 'amount' => '10',
287
+ 'source' => 'lands'
288
+ }
289
+ })
290
+ end
291
+
292
+ should "define_source" do
293
+ places_node = @users_node['place']
294
+
295
+ source = places_node.instance_variable_get(:@source)
296
+
297
+ assert_instance_of Cockroach::Source::Node, source
298
+ assert_equal @lands_node, source.node
299
+ end
300
+
301
+ should "assign record to parrent if source defined" do
302
+ places_node = @users_node['place']
303
+ places_node.stubs(:allowed_options).returns(["user"])
304
+
305
+ places = ((1..10).to_a.collect {|i| stub('place_instance', :id => i) })
306
+ source = places_node.instance_variable_get(:@source)
307
+ source.stubs(:sample).returns(p = places[4])
308
+
309
+ p.expects(:update_attributes).with({"user" => @users_node}).times(10)
310
+
311
+ places_node.__send__(:load!, {"user" => @users_node})
312
+ end
313
+ end
314
+ end
315
+
316
+ context "Subnode" do
317
+ setup do
318
+ @users_node = Cockroach::FactoryGirl::Node.new('users' => {'amount' => '5', 'places_amount' => '10'})
319
+ end
320
+
321
+ should "create subnode" do
322
+ assert_equal 1, @users_node.nodes.size
323
+
324
+ subnode = @users_node.nodes['place']
325
+
326
+ assert_instance_of Cockroach::FactoryGirl::Node, subnode
327
+ assert_equal 'place', subnode.name
328
+ assert_equal 'amount', subnode.approach
329
+ assert_equal 10, subnode.amount
330
+ end
331
+
332
+ should "recive .load! call from supnode" do
333
+ subnode = @users_node.nodes['place']
334
+ subnode.expects(:load!)
335
+
336
+ @users_node.__send__(:load_nodes!)
337
+ end
338
+
339
+ context "Heritage" do
340
+ should "send load! call to subnodes" do
341
+ mocks = ((1..5).to_a.collect {|i| stub('user', :id => i) })
342
+
343
+ ::FactoryGirl.stubs("create").with("user").returns( *mocks )
344
+
345
+ subnode = @users_node.nodes['place']
346
+ subnode.expects(:load!).with({"user" => mocks[0]})
347
+ subnode.expects(:load!).with({"user" => mocks[1]})
348
+ subnode.expects(:load!).with({"user" => mocks[2]})
349
+ subnode.expects(:load!).with({"user" => mocks[3]})
350
+ subnode.expects(:load!).with({"user" => mocks[4]})
351
+
352
+ @users_node.__send__(:load!)
353
+ end
354
+
355
+ should "initiate parrent record exact times" do
356
+ mocks = ((1..5).to_a.collect {|i| stub('user', :id => i) })
357
+ place_mock = stub('place', :id => 0)
358
+
359
+ ::FactoryGirl.expects(:create).with("user").times(5).returns( *mocks )
360
+ ::FactoryGirl.stubs(:create).with("place", any_parameters).returns(place_mock)
361
+
362
+ @users_node.nodes.each_value {|node| node.stubs(:allowed_options).returns(['user']) }
363
+
364
+ @users_node.__send__(:load!)
365
+ end
366
+
367
+ should "initiate child records exact times" do
368
+ mocks = ((1..5).to_a.collect {|i| stub('user', :id => i) })
369
+ place_mock = stub('place', :id => 0)
370
+
371
+ ::FactoryGirl.stubs("create").with("user").returns( *mocks )
372
+
373
+ ::FactoryGirl.expects(:create).with("place", {"user" => mocks[0]}).times(10).returns(place_mock)
374
+ ::FactoryGirl.expects(:create).with("place", {"user" => mocks[1]}).times(10).returns(place_mock)
375
+ ::FactoryGirl.expects(:create).with("place", {"user" => mocks[2]}).times(10).returns(place_mock)
376
+ ::FactoryGirl.expects(:create).with("place", {"user" => mocks[3]}).times(10).returns(place_mock)
377
+ ::FactoryGirl.expects(:create).with("place", {"user" => mocks[4]}).times(10).returns(place_mock)
378
+
379
+ @users_node.nodes.each_value {|node| node.stubs(:allowed_options).returns(['user']) }
380
+
381
+ @users_node.__send__(:load!)
382
+ end
383
+ end
384
+ end
385
+ end
386
+ end