mr 0.35.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.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/Gemfile +13 -0
- data/LICENSE +22 -0
- data/README.md +29 -0
- data/bench/all.rb +4 -0
- data/bench/factory.rb +68 -0
- data/bench/fake_record.rb +174 -0
- data/bench/model.rb +201 -0
- data/bench/read_model.rb +191 -0
- data/bench/results/factory.txt +21 -0
- data/bench/results/fake_record.txt +37 -0
- data/bench/results/model.txt +44 -0
- data/bench/results/read_model.txt +46 -0
- data/bench/setup.rb +132 -0
- data/lib/mr.rb +11 -0
- data/lib/mr/after_commit.rb +49 -0
- data/lib/mr/after_commit/fake_record.rb +39 -0
- data/lib/mr/after_commit/record.rb +48 -0
- data/lib/mr/after_commit/record_procs_methods.rb +82 -0
- data/lib/mr/factory.rb +82 -0
- data/lib/mr/factory/config.rb +240 -0
- data/lib/mr/factory/model_factory.rb +103 -0
- data/lib/mr/factory/model_stack.rb +28 -0
- data/lib/mr/factory/read_model_factory.rb +104 -0
- data/lib/mr/factory/record_factory.rb +130 -0
- data/lib/mr/factory/record_stack.rb +219 -0
- data/lib/mr/fake_query.rb +53 -0
- data/lib/mr/fake_record.rb +58 -0
- data/lib/mr/fake_record/associations.rb +257 -0
- data/lib/mr/fake_record/attributes.rb +168 -0
- data/lib/mr/fake_record/persistence.rb +116 -0
- data/lib/mr/json_field.rb +180 -0
- data/lib/mr/json_field/fake_record.rb +31 -0
- data/lib/mr/json_field/record.rb +38 -0
- data/lib/mr/model.rb +67 -0
- data/lib/mr/model/associations.rb +161 -0
- data/lib/mr/model/configuration.rb +67 -0
- data/lib/mr/model/fields.rb +177 -0
- data/lib/mr/model/persistence.rb +79 -0
- data/lib/mr/query.rb +126 -0
- data/lib/mr/read_model.rb +83 -0
- data/lib/mr/read_model/data.rb +38 -0
- data/lib/mr/read_model/fields.rb +218 -0
- data/lib/mr/read_model/query_expression.rb +188 -0
- data/lib/mr/read_model/querying.rb +214 -0
- data/lib/mr/read_model/set_querying.rb +82 -0
- data/lib/mr/read_model/subquery.rb +98 -0
- data/lib/mr/record.rb +35 -0
- data/lib/mr/test_helpers.rb +229 -0
- data/lib/mr/type_converter.rb +85 -0
- data/lib/mr/version.rb +3 -0
- data/log/.gitkeep +0 -0
- data/mr.gemspec +29 -0
- data/test/helper.rb +21 -0
- data/test/support/db.rb +10 -0
- data/test/support/factory.rb +13 -0
- data/test/support/factory/area.rb +6 -0
- data/test/support/factory/comment.rb +14 -0
- data/test/support/factory/image.rb +6 -0
- data/test/support/factory/user.rb +6 -0
- data/test/support/models/area.rb +58 -0
- data/test/support/models/comment.rb +60 -0
- data/test/support/models/image.rb +53 -0
- data/test/support/models/user.rb +96 -0
- data/test/support/read_model/querying.rb +150 -0
- data/test/support/read_models/comment_with_user_data.rb +27 -0
- data/test/support/read_models/set_data.rb +49 -0
- data/test/support/read_models/subquery_data.rb +41 -0
- data/test/support/read_models/user_with_area_data.rb +15 -0
- data/test/support/schema.rb +39 -0
- data/test/support/setup_test_db.rb +10 -0
- data/test/system/factory/model_factory_tests.rb +87 -0
- data/test/system/factory/model_stack_tests.rb +30 -0
- data/test/system/factory/record_factory_tests.rb +84 -0
- data/test/system/factory/record_stack_tests.rb +51 -0
- data/test/system/factory_tests.rb +32 -0
- data/test/system/read_model_tests.rb +199 -0
- data/test/system/with_model_tests.rb +275 -0
- data/test/unit/after_commit/fake_record_tests.rb +110 -0
- data/test/unit/after_commit/record_procs_methods_tests.rb +177 -0
- data/test/unit/after_commit/record_tests.rb +134 -0
- data/test/unit/after_commit_tests.rb +113 -0
- data/test/unit/factory/config_tests.rb +651 -0
- data/test/unit/factory/model_factory_tests.rb +473 -0
- data/test/unit/factory/model_stack_tests.rb +97 -0
- data/test/unit/factory/read_model_factory_tests.rb +195 -0
- data/test/unit/factory/record_factory_tests.rb +446 -0
- data/test/unit/factory/record_stack_tests.rb +549 -0
- data/test/unit/factory_tests.rb +213 -0
- data/test/unit/fake_query_tests.rb +137 -0
- data/test/unit/fake_record/associations_tests.rb +585 -0
- data/test/unit/fake_record/attributes_tests.rb +265 -0
- data/test/unit/fake_record/persistence_tests.rb +239 -0
- data/test/unit/fake_record_tests.rb +106 -0
- data/test/unit/json_field/fake_record_tests.rb +75 -0
- data/test/unit/json_field/record_tests.rb +80 -0
- data/test/unit/json_field_tests.rb +302 -0
- data/test/unit/model/associations_tests.rb +346 -0
- data/test/unit/model/configuration_tests.rb +92 -0
- data/test/unit/model/fields_tests.rb +278 -0
- data/test/unit/model/persistence_tests.rb +114 -0
- data/test/unit/model_tests.rb +137 -0
- data/test/unit/query_tests.rb +300 -0
- data/test/unit/read_model/data_tests.rb +56 -0
- data/test/unit/read_model/fields_tests.rb +416 -0
- data/test/unit/read_model/query_expression_tests.rb +381 -0
- data/test/unit/read_model/querying_tests.rb +613 -0
- data/test/unit/read_model/set_querying_tests.rb +149 -0
- data/test/unit/read_model/subquery_tests.rb +242 -0
- data/test/unit/read_model_tests.rb +187 -0
- data/test/unit/record_tests.rb +45 -0
- data/test/unit/test_helpers_tests.rb +431 -0
- data/test/unit/type_converter_tests.rb +207 -0
- metadata +285 -0
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'mr/factory/model_stack'
|
3
|
+
|
4
|
+
require 'mr/fake_record'
|
5
|
+
require 'mr/model'
|
6
|
+
require 'mr/factory/model_factory'
|
7
|
+
require 'mr/factory/record_stack'
|
8
|
+
|
9
|
+
class MR::Factory::ModelStack
|
10
|
+
|
11
|
+
class UnitTests < Assert::Context
|
12
|
+
desc "MR::Factory::ModelStack"
|
13
|
+
setup do
|
14
|
+
@record_stack_spy = nil
|
15
|
+
Assert.stub(MR::Factory::RecordStack, :for_record) do |*args|
|
16
|
+
@record_stack_spy = RecordStackSpy.new(*args)
|
17
|
+
end
|
18
|
+
|
19
|
+
@record_class = Class.new{ include MR::FakeRecord }
|
20
|
+
@model_class = Class.new{ include MR::Model }
|
21
|
+
@model_class.record_class(@record_class)
|
22
|
+
|
23
|
+
@model = @model_class.new
|
24
|
+
@factory_config = MR::Factory::ModelFactory::Config.new(@record_class)
|
25
|
+
|
26
|
+
@stack_class = MR::Factory::ModelStack
|
27
|
+
@stack = @stack_class.new(@model, @factory_config)
|
28
|
+
end
|
29
|
+
subject{ @stack }
|
30
|
+
|
31
|
+
should have_readers :model
|
32
|
+
should have_imeths :factory_config
|
33
|
+
should have_imeths :create, :destroy
|
34
|
+
should have_imeths :create_dependencies, :create_deps
|
35
|
+
should have_imeths :destroy_dependencies, :destroy_deps
|
36
|
+
|
37
|
+
should "know its model and factory config" do
|
38
|
+
assert_equal @model, subject.model
|
39
|
+
assert_equal @factory_config, subject.factory_config
|
40
|
+
end
|
41
|
+
|
42
|
+
should "build a record stack" do
|
43
|
+
assert_not_nil @record_stack_spy
|
44
|
+
assert_equal @model.record, @record_stack_spy.record
|
45
|
+
assert_equal @factory_config, @record_stack_spy.factory_config
|
46
|
+
end
|
47
|
+
|
48
|
+
should "demeter its record stack" do
|
49
|
+
assert_false @record_stack_spy.create_called
|
50
|
+
subject.create
|
51
|
+
assert_true @record_stack_spy.create_called
|
52
|
+
|
53
|
+
assert_false @record_stack_spy.destroy_called
|
54
|
+
subject.destroy
|
55
|
+
assert_true @record_stack_spy.destroy_called
|
56
|
+
|
57
|
+
assert_false @record_stack_spy.create_dependencies_called
|
58
|
+
subject.create_dependencies
|
59
|
+
assert_true @record_stack_spy.create_dependencies_called
|
60
|
+
|
61
|
+
@record_stack_spy.create_dependencies_called = false
|
62
|
+
subject.create_deps
|
63
|
+
assert_true @record_stack_spy.create_dependencies_called
|
64
|
+
|
65
|
+
assert_false @record_stack_spy.destroy_dependencies_called
|
66
|
+
subject.destroy_dependencies
|
67
|
+
assert_true @record_stack_spy.destroy_dependencies_called
|
68
|
+
|
69
|
+
@record_stack_spy.destroy_dependencies_called = false
|
70
|
+
subject.destroy_dependencies
|
71
|
+
assert_true @record_stack_spy.destroy_dependencies_called
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
class RecordStackSpy
|
77
|
+
attr_reader :record, :factory_config
|
78
|
+
attr_accessor :create_called, :destroy_called
|
79
|
+
attr_accessor :create_dependencies_called, :destroy_dependencies_called
|
80
|
+
|
81
|
+
def initialize(record, factory_config)
|
82
|
+
@record = record
|
83
|
+
@factory_config = factory_config
|
84
|
+
@create_called = false
|
85
|
+
@destroy_called = false
|
86
|
+
@create_dependencies_called = false
|
87
|
+
@destroy_dependencies_called = false
|
88
|
+
end
|
89
|
+
|
90
|
+
def create; @create_called = true; end
|
91
|
+
def destroy; @destroy_called = true; end
|
92
|
+
|
93
|
+
def create_dependencies; @create_dependencies_called = true; end
|
94
|
+
def destroy_dependencies; @destroy_dependencies_called = true; end
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
@@ -0,0 +1,195 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'mr/factory/read_model_factory'
|
3
|
+
|
4
|
+
require 'mr/json_field'
|
5
|
+
require 'mr/read_model'
|
6
|
+
|
7
|
+
class MR::Factory::ReadModelFactory
|
8
|
+
|
9
|
+
class UnitTests < Assert::Context
|
10
|
+
desc "MR::Factory::ReadModelFactory"
|
11
|
+
setup do
|
12
|
+
@factory_class = MR::Factory::ReadModelFactory
|
13
|
+
end
|
14
|
+
subject{ @factory_class }
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
class InitTests < UnitTests
|
19
|
+
desc "when init"
|
20
|
+
setup do
|
21
|
+
@read_model_class = TestReadModel
|
22
|
+
@factory = @factory_class.new(@read_model_class)
|
23
|
+
end
|
24
|
+
subject{ @factory }
|
25
|
+
|
26
|
+
should have_readers :read_model_class, :config
|
27
|
+
should have_imeths :read_model_data, :read_model, :instance
|
28
|
+
|
29
|
+
should "instance eval any block it's initialized with" do
|
30
|
+
yielded = nil
|
31
|
+
factory = @factory_class.new(@read_model_class){ yielded = self }
|
32
|
+
assert_equal factory, yielded
|
33
|
+
end
|
34
|
+
|
35
|
+
should "raise an argument error if init without a read model or read model struct" do
|
36
|
+
assert_nothing_raised{ @factory_class.new(@read_model_class) }
|
37
|
+
assert_nothing_raised{ @factory_class.new(@read_model_class::StructReadModel) }
|
38
|
+
|
39
|
+
assert_raises(ArgumentError){ @factory_class.new(Factory.string) }
|
40
|
+
end
|
41
|
+
|
42
|
+
should "know its read model class and config" do
|
43
|
+
assert_equal @read_model_class, subject.read_model_class
|
44
|
+
|
45
|
+
assert_instance_of Config, subject.config
|
46
|
+
assert_equal subject.read_model_class, subject.config.read_model_class
|
47
|
+
end
|
48
|
+
|
49
|
+
should "allow configuring default args" do
|
50
|
+
name = Factory.string
|
51
|
+
default_args_proc = proc{ set(:name, name) }
|
52
|
+
factory = @factory_class.new(@read_model_class)
|
53
|
+
|
54
|
+
set_default_args_called_with = nil
|
55
|
+
Assert.stub(factory.config, :set_default_args) do |&block|
|
56
|
+
set_default_args_called_with = block
|
57
|
+
Assert.stub_send(factory.config, :set_default_args, &block)
|
58
|
+
end
|
59
|
+
|
60
|
+
factory.instance_eval{ default_args(&default_args_proc) }
|
61
|
+
assert_equal default_args_proc, set_default_args_called_with
|
62
|
+
|
63
|
+
read_model = factory.read_model
|
64
|
+
assert_equal name, read_model.name
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
class ReadModelDataTests < InitTests
|
70
|
+
desc "read_model_data"
|
71
|
+
|
72
|
+
should "build a read model data object" do
|
73
|
+
read_model_data = subject.read_model_data
|
74
|
+
assert_instance_of Data, read_model_data
|
75
|
+
assert_kind_of String, read_model_data['name']
|
76
|
+
end
|
77
|
+
|
78
|
+
should "apply passed args to the read model data" do
|
79
|
+
name = Factory.string
|
80
|
+
read_model_data = subject.read_model_data(:name => name)
|
81
|
+
assert_equal name, read_model_data['name']
|
82
|
+
end
|
83
|
+
|
84
|
+
should "apply default args to the record" do
|
85
|
+
name = Factory.string
|
86
|
+
subject.config.set_default_args{ set(:name, name) }
|
87
|
+
read_model_data = subject.read_model_data
|
88
|
+
assert_equal name, read_model_data['name']
|
89
|
+
end
|
90
|
+
|
91
|
+
should "apply passed args over default args to the read model data" do
|
92
|
+
name = Factory.string
|
93
|
+
subject.config.set_default_args{ set(:name, name) }
|
94
|
+
new_name = Factory.string
|
95
|
+
read_model_data = subject.read_model_data(:name => new_name)
|
96
|
+
assert_equal new_name, read_model_data['name']
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
class ReadModelMethodTests < InitTests
|
102
|
+
desc "read_model"
|
103
|
+
setup do
|
104
|
+
@read_model_data_called_with = nil
|
105
|
+
@built_read_model_data = nil
|
106
|
+
Assert.stub(subject, :read_model_data) do |*args|
|
107
|
+
@read_model_data_called_with = args
|
108
|
+
@built_read_model_data = Assert.stub_send(subject, :read_model_data, *args)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
should "build an instance of the read model clast" do
|
113
|
+
read_model = subject.read_model
|
114
|
+
assert_instance_of @read_model_class, read_model
|
115
|
+
assert_same @built_read_model_data, read_model.instance_eval{ read_model_data }
|
116
|
+
end
|
117
|
+
|
118
|
+
should "be aliased" do
|
119
|
+
read_model = subject.instance
|
120
|
+
assert_instance_of @read_model_class, read_model
|
121
|
+
assert_same @built_read_model_data, read_model.instance_eval{ read_model_data }
|
122
|
+
end
|
123
|
+
|
124
|
+
should "allow passing args when building a read model" do
|
125
|
+
args = { :name => Factory.string }
|
126
|
+
saved_record = subject.read_model(args)
|
127
|
+
assert_equal [args], @read_model_data_called_with
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
class ConfigTests < UnitTests
|
133
|
+
desc "Config"
|
134
|
+
setup do
|
135
|
+
@config_class = Config
|
136
|
+
end
|
137
|
+
subject{ @config_class }
|
138
|
+
|
139
|
+
should "be a factory config" do
|
140
|
+
assert_includes MR::Factory::Config, subject
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
144
|
+
|
145
|
+
class ConfigInitTests < ConfigTests
|
146
|
+
desc "when init"
|
147
|
+
setup do
|
148
|
+
@read_model_class = TestReadModel
|
149
|
+
@config = @config_class.new(@read_model_class)
|
150
|
+
end
|
151
|
+
subject{ @config }
|
152
|
+
|
153
|
+
should have_imeths :read_model_class
|
154
|
+
|
155
|
+
should "know its read model class" do
|
156
|
+
assert_equal @read_model_class, subject.read_model_class
|
157
|
+
end
|
158
|
+
|
159
|
+
should "know how to apply field default args to a read model data" do
|
160
|
+
read_model_data = @factory_class::Data.new
|
161
|
+
subject.apply_args(read_model_data, {})
|
162
|
+
|
163
|
+
assert_kind_of String, read_model_data['name']
|
164
|
+
|
165
|
+
assert_instance_of Array, read_model_data['struct_list']
|
166
|
+
assert_includes read_model_data['struct_list'].size, [1, 2, 3]
|
167
|
+
|
168
|
+
read_model_data['struct_list'].each do |struct_list_data|
|
169
|
+
assert_instance_of Data, struct_list_data
|
170
|
+
assert_kind_of String, struct_list_data['name']
|
171
|
+
end
|
172
|
+
|
173
|
+
assert_instance_of Data, read_model_data['struct_obj']
|
174
|
+
assert_kind_of String, read_model_data['struct_obj']['name']
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
class TestReadModel
|
180
|
+
include MR::ReadModel
|
181
|
+
|
182
|
+
field :name, :string
|
183
|
+
|
184
|
+
json_struct_obj :struct_obj, 'StructReadModel'
|
185
|
+
|
186
|
+
json_struct_list :struct_list, 'StructReadModel'
|
187
|
+
|
188
|
+
class StructReadModel
|
189
|
+
include MR::ReadModelStruct
|
190
|
+
|
191
|
+
field :name, :string
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
end
|
@@ -0,0 +1,446 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'mr/factory/record_factory'
|
3
|
+
|
4
|
+
require 'mr/factory/config'
|
5
|
+
require 'mr/fake_record'
|
6
|
+
require 'mr/record'
|
7
|
+
|
8
|
+
class MR::Factory::RecordFactory
|
9
|
+
|
10
|
+
class UnitTests < Assert::Context
|
11
|
+
desc "MR::Factory::RecordFactory"
|
12
|
+
setup do
|
13
|
+
@factory_class = MR::Factory::RecordFactory
|
14
|
+
end
|
15
|
+
subject{ @factory_class }
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
class InitTests < UnitTests
|
20
|
+
desc "when init"
|
21
|
+
setup do
|
22
|
+
@record_class = FakeTwoRecord
|
23
|
+
@factory = @factory_class.new(@record_class)
|
24
|
+
end
|
25
|
+
subject{ @factory }
|
26
|
+
|
27
|
+
should have_readers :record_class, :config
|
28
|
+
should have_imeths :record, :instance
|
29
|
+
should have_imeths :saved_record, :saved_instance
|
30
|
+
should have_imeths :stack, :instance_stack
|
31
|
+
should have_imeths :stack_record, :saved_stack, :saved_stack_record
|
32
|
+
should have_imeths :saved_dependencies_stack, :saved_deps_stack
|
33
|
+
should have_imeths :saved_dependencies_stack_record, :saved_deps_stack_record
|
34
|
+
|
35
|
+
should "instance eval any block it's initialized with" do
|
36
|
+
yielded = nil
|
37
|
+
factory = @factory_class.new(@record_class){ yielded = self }
|
38
|
+
assert_equal factory, yielded
|
39
|
+
end
|
40
|
+
|
41
|
+
should "know its record class and config" do
|
42
|
+
assert_equal @record_class, subject.record_class
|
43
|
+
|
44
|
+
assert_instance_of Config, subject.config
|
45
|
+
assert_equal subject.record_class, subject.config.record_class
|
46
|
+
end
|
47
|
+
|
48
|
+
should "allow configuring a default association" do
|
49
|
+
association_name = Factory.boolean ? :fake_one : :fake_poly
|
50
|
+
assoc_record_class = FakeOneRecord
|
51
|
+
associated_factory = @factory_class.new(assoc_record_class)
|
52
|
+
factory = @factory_class.new(@record_class) do
|
53
|
+
default_association(association_name, associated_factory, {
|
54
|
+
:force_in_stack => true
|
55
|
+
})
|
56
|
+
end
|
57
|
+
|
58
|
+
associated_record = associated_factory.record
|
59
|
+
Assert.stub(associated_factory, :record){ associated_record }
|
60
|
+
|
61
|
+
assert_same associated_record, factory.config.build_associated_record(
|
62
|
+
association_name,
|
63
|
+
assoc_record_class
|
64
|
+
)
|
65
|
+
|
66
|
+
assert_includes association_name, factory.config.force_in_stack_association_names
|
67
|
+
end
|
68
|
+
|
69
|
+
should "allow configuring default args" do
|
70
|
+
name = Factory.string
|
71
|
+
default_args_proc = proc{ set(:name, name) }
|
72
|
+
factory = @factory_class.new(@record_class)
|
73
|
+
|
74
|
+
set_default_args_called_with = nil
|
75
|
+
Assert.stub(factory.config, :set_default_args) do |&block|
|
76
|
+
set_default_args_called_with = block
|
77
|
+
Assert.stub_send(factory.config, :set_default_args, &block)
|
78
|
+
end
|
79
|
+
|
80
|
+
factory.instance_eval{ default_args(&default_args_proc) }
|
81
|
+
assert_equal default_args_proc, set_default_args_called_with
|
82
|
+
|
83
|
+
record = factory.record
|
84
|
+
assert_equal name, record.name
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
class RecordMethodTests < InitTests
|
90
|
+
desc "record"
|
91
|
+
setup do
|
92
|
+
@built_record = nil
|
93
|
+
Assert.stub(@record_class, :new) do |*args|
|
94
|
+
@built_record = Assert.stub_send(@record_class, :new, *args)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
should "return an instance of the record class" do
|
99
|
+
record = subject.record
|
100
|
+
assert_same @built_record, record
|
101
|
+
assert_instance_of String, record.name
|
102
|
+
end
|
103
|
+
|
104
|
+
should "be aliased" do
|
105
|
+
record = subject.instance
|
106
|
+
assert_same @built_record, record
|
107
|
+
assert_instance_of String, record.name
|
108
|
+
end
|
109
|
+
|
110
|
+
should "apply passed args to the record" do
|
111
|
+
name = Factory.string
|
112
|
+
record = subject.record(:name => name)
|
113
|
+
assert_equal name, record.name
|
114
|
+
end
|
115
|
+
|
116
|
+
should "apply default args to the record" do
|
117
|
+
name = Factory.string
|
118
|
+
subject.config.set_default_args{ set(:name, name) }
|
119
|
+
record = subject.record
|
120
|
+
assert_equal name, record.name
|
121
|
+
end
|
122
|
+
|
123
|
+
should "apply passed args over default args to the record" do
|
124
|
+
name = Factory.string
|
125
|
+
subject.config.set_default_args{ set(:name, name) }
|
126
|
+
new_name = Factory.string
|
127
|
+
record = subject.record(:name => new_name)
|
128
|
+
assert_equal new_name, record.name
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
class SavedRecordMethodTests < InitTests
|
134
|
+
desc "saved_record"
|
135
|
+
setup do
|
136
|
+
@record_called_with = nil
|
137
|
+
@built_record = nil
|
138
|
+
Assert.stub(subject, :record) do |*args|
|
139
|
+
@record_called_with = args
|
140
|
+
@built_record = Assert.stub_send(subject, :record, *args)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
should "build an instance of the record class and save it" do
|
145
|
+
saved_record = subject.saved_record
|
146
|
+
assert_same @built_record, saved_record
|
147
|
+
assert_false saved_record.new_record?
|
148
|
+
end
|
149
|
+
|
150
|
+
should "be aliased" do
|
151
|
+
saved_record = subject.saved_instance
|
152
|
+
assert_same @built_record, saved_record
|
153
|
+
assert_false saved_record.new_record?
|
154
|
+
end
|
155
|
+
|
156
|
+
should "allow passing args when building a saved record" do
|
157
|
+
args = { :name => Factory.string }
|
158
|
+
saved_record = subject.saved_record(args)
|
159
|
+
assert_equal [args], @record_called_with
|
160
|
+
end
|
161
|
+
|
162
|
+
should "reset the fake records save called flag" do
|
163
|
+
assert_false subject.saved_record.save_called
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
class StackMethodTests < InitTests
|
169
|
+
desc "stack"
|
170
|
+
setup do
|
171
|
+
@record_called_with = nil
|
172
|
+
@built_record = nil
|
173
|
+
Assert.stub(subject, :record) do |*args|
|
174
|
+
@record_called_with = args
|
175
|
+
@built_record = Assert.stub_send(subject, :record, *args)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
should "build a record stack" do
|
180
|
+
stack = subject.stack
|
181
|
+
assert_instance_of MR::Factory::RecordStack, stack
|
182
|
+
assert_equal [nil], @record_called_with
|
183
|
+
assert_same @built_record, stack.record
|
184
|
+
assert_same subject.config, stack.factory_config
|
185
|
+
end
|
186
|
+
|
187
|
+
should "be aliased" do
|
188
|
+
stack = subject.instance_stack
|
189
|
+
assert_instance_of MR::Factory::RecordStack, stack
|
190
|
+
assert_equal [nil], @record_called_with
|
191
|
+
assert_same @built_record, stack.record
|
192
|
+
assert_same subject.config, stack.factory_config
|
193
|
+
end
|
194
|
+
|
195
|
+
should "allow passing args when building a stack" do
|
196
|
+
args = { :name => Factory.string }
|
197
|
+
stack = subject.stack(args)
|
198
|
+
assert_equal [args], @record_called_with
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|
202
|
+
|
203
|
+
class StackRecordMethodTests < InitTests
|
204
|
+
desc "stack_record"
|
205
|
+
setup do
|
206
|
+
@stack_called_with = nil
|
207
|
+
@built_stack = nil
|
208
|
+
Assert.stub(subject, :stack) do |*args|
|
209
|
+
@stack_called_with = args
|
210
|
+
@built_stack = Assert.stub_send(subject, :stack, *args)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
should "build a stack record" do
|
215
|
+
record = subject.stack_record
|
216
|
+
assert_equal [nil], @stack_called_with
|
217
|
+
assert_same @built_stack.record, record
|
218
|
+
end
|
219
|
+
|
220
|
+
should "allow passing args when building a stack record" do
|
221
|
+
args = { :name => Factory.string }
|
222
|
+
record = subject.stack_record(args)
|
223
|
+
assert_equal [args], @stack_called_with
|
224
|
+
end
|
225
|
+
|
226
|
+
end
|
227
|
+
|
228
|
+
class SavedStackMethodTests < InitTests
|
229
|
+
desc "saved_stack"
|
230
|
+
setup do
|
231
|
+
@stack_called_with = nil
|
232
|
+
@built_stack = nil
|
233
|
+
@stack_create_called = false
|
234
|
+
Assert.stub(subject, :stack) do |*args|
|
235
|
+
@stack_called_with = args
|
236
|
+
@built_stack = Assert.stub_send(subject, :stack, *args)
|
237
|
+
Assert.stub(@built_stack, :create) do
|
238
|
+
@stack_create_called = true
|
239
|
+
Assert.stub_send(@built_stack, :create)
|
240
|
+
end
|
241
|
+
@built_stack
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
should "build a saved stack" do
|
246
|
+
saved_stack = subject.saved_stack
|
247
|
+
assert_equal [nil], @stack_called_with
|
248
|
+
assert_same @built_stack, saved_stack
|
249
|
+
assert_true @stack_create_called
|
250
|
+
end
|
251
|
+
|
252
|
+
should "allow passing args when building a saved stack record" do
|
253
|
+
args = { :name => Factory.string }
|
254
|
+
saved_stack = subject.saved_stack(args)
|
255
|
+
assert_equal [args], @stack_called_with
|
256
|
+
end
|
257
|
+
|
258
|
+
end
|
259
|
+
|
260
|
+
class SavedStackModelMethodTests < InitTests
|
261
|
+
desc "saved_stack_record"
|
262
|
+
setup do
|
263
|
+
@saved_stack_called_with = nil
|
264
|
+
@built_saved_stack = nil
|
265
|
+
Assert.stub(subject, :saved_stack) do |*args|
|
266
|
+
@saved_stack_called_with = args
|
267
|
+
@built_saved_stack = Assert.stub_send(subject, :saved_stack, *args)
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
should "build a saved stack record" do
|
272
|
+
saved_record = subject.saved_stack_record
|
273
|
+
assert_equal [nil], @saved_stack_called_with
|
274
|
+
assert_same @built_saved_stack.record, saved_record
|
275
|
+
end
|
276
|
+
|
277
|
+
should "allow passing args when building a saved stack record" do
|
278
|
+
args = { :name => Factory.string }
|
279
|
+
saved_record = subject.saved_stack_record(args)
|
280
|
+
assert_equal [args], @saved_stack_called_with
|
281
|
+
end
|
282
|
+
|
283
|
+
end
|
284
|
+
|
285
|
+
class SavedDepsStackMethodTests < InitTests
|
286
|
+
desc "saved_dependencies_stack"
|
287
|
+
setup do
|
288
|
+
@stack_called_with = nil
|
289
|
+
@built_stack = nil
|
290
|
+
@stack_create_deps_called = false
|
291
|
+
Assert.stub(subject, :stack) do |*args|
|
292
|
+
@stack_called_with = args
|
293
|
+
@built_stack = Assert.stub_send(subject, :stack, *args)
|
294
|
+
Assert.stub(@built_stack, :create_deps) do
|
295
|
+
@stack_create_deps_called = true
|
296
|
+
Assert.stub_send(@built_stack, :create_deps)
|
297
|
+
end
|
298
|
+
@built_stack
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
should "build a saved dependencies stack" do
|
303
|
+
saved_deps_stack = subject.saved_dependencies_stack
|
304
|
+
assert_equal [nil], @stack_called_with
|
305
|
+
assert_same @built_stack, saved_deps_stack
|
306
|
+
assert_true @stack_create_deps_called
|
307
|
+
end
|
308
|
+
|
309
|
+
should "be aliased" do
|
310
|
+
saved_deps_stack = subject.saved_deps_stack
|
311
|
+
assert_equal [nil], @stack_called_with
|
312
|
+
assert_same @built_stack, saved_deps_stack
|
313
|
+
assert_true @stack_create_deps_called
|
314
|
+
end
|
315
|
+
|
316
|
+
should "allow passing args when building a saved dependencies stack" do
|
317
|
+
args = { :name => Factory.string }
|
318
|
+
saved_deps_stack = subject.saved_dependencies_stack(args)
|
319
|
+
assert_equal [args], @stack_called_with
|
320
|
+
end
|
321
|
+
|
322
|
+
end
|
323
|
+
|
324
|
+
class SavedDepsStackModelTests < InitTests
|
325
|
+
desc "saved_dependencies_stack_record"
|
326
|
+
setup do
|
327
|
+
@saved_deps_stack_called_with = nil
|
328
|
+
@built_saved_deps_stack = nil
|
329
|
+
Assert.stub(subject, :saved_deps_stack) do |*args|
|
330
|
+
@saved_deps_stack_called_with = args
|
331
|
+
@built_saved_deps_stack = Assert.stub_send(subject, :saved_deps_stack, *args)
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
should "know how to build a saved dependencies stack record" do
|
336
|
+
saved_deps_record = subject.saved_dependencies_stack_record
|
337
|
+
assert_equal [nil], @saved_deps_stack_called_with
|
338
|
+
assert_same @built_saved_deps_stack.record, saved_deps_record
|
339
|
+
end
|
340
|
+
|
341
|
+
should "be aliased" do
|
342
|
+
saved_deps_record = subject.saved_deps_stack_record
|
343
|
+
assert_equal [nil], @saved_deps_stack_called_with
|
344
|
+
assert_same @built_saved_deps_stack.record, saved_deps_record
|
345
|
+
end
|
346
|
+
|
347
|
+
should "allow passing args when building a saved dependencies stack record" do
|
348
|
+
args = { :name => Factory.string }
|
349
|
+
saved_deps_record = subject.saved_dependencies_stack_record(args)
|
350
|
+
assert_equal [args], @saved_deps_stack_called_with
|
351
|
+
assert_same @built_saved_deps_stack.record, saved_deps_record
|
352
|
+
end
|
353
|
+
|
354
|
+
end
|
355
|
+
|
356
|
+
class ConfigTests < UnitTests
|
357
|
+
desc "Config"
|
358
|
+
setup do
|
359
|
+
@config_class = Config
|
360
|
+
end
|
361
|
+
subject{ @config_class }
|
362
|
+
|
363
|
+
should "be a with-associations factory config" do
|
364
|
+
assert_includes MR::Factory::WithAssociationsConfig, subject
|
365
|
+
end
|
366
|
+
|
367
|
+
end
|
368
|
+
|
369
|
+
class ConfigInitTests < ConfigTests
|
370
|
+
desc "when init"
|
371
|
+
setup do
|
372
|
+
@record_class = FakeTwoRecord
|
373
|
+
@config = @config_class.new(@record_class)
|
374
|
+
end
|
375
|
+
subject{ @config }
|
376
|
+
|
377
|
+
should have_imeths :build_associated_record, :ar_association_for
|
378
|
+
|
379
|
+
should "know how to build an associated record" do
|
380
|
+
factory_for_called_with = []
|
381
|
+
built_factory = nil
|
382
|
+
record = nil
|
383
|
+
Assert.stub(subject, :factory_for) do |*args|
|
384
|
+
factory_for_called_with = args
|
385
|
+
built_factory = Assert.stub_send(subject, :factory_for, *args)
|
386
|
+
record = built_factory.record
|
387
|
+
Assert.stub(built_factory, :record){ record }
|
388
|
+
built_factory
|
389
|
+
end
|
390
|
+
|
391
|
+
association_name = Factory.boolean ? :fake_one : :fake_poly
|
392
|
+
assoc_record_class = FakeOneRecord
|
393
|
+
result = subject.build_associated_record(
|
394
|
+
association_name,
|
395
|
+
assoc_record_class
|
396
|
+
)
|
397
|
+
|
398
|
+
assert_equal [association_name, assoc_record_class], factory_for_called_with
|
399
|
+
assert_instance_of MR::Factory::RecordFactory, built_factory
|
400
|
+
assert_equal assoc_record_class, built_factory.record_class
|
401
|
+
|
402
|
+
assert_same record, result
|
403
|
+
end
|
404
|
+
|
405
|
+
should "know how to get an activerecord association for a record" do
|
406
|
+
record = @record_class.new
|
407
|
+
|
408
|
+
exp = record.association(:fake_one)
|
409
|
+
assert_equal exp, subject.ar_association_for(record, :fake_one)
|
410
|
+
|
411
|
+
assert_nil subject.ar_association_for(record, Factory.string)
|
412
|
+
end
|
413
|
+
|
414
|
+
should "know how to apply column default args to a record" do
|
415
|
+
record = @record_class.new
|
416
|
+
subject.apply_args(record, {})
|
417
|
+
|
418
|
+
assert_instance_of String, record.name
|
419
|
+
assert_nil record.id
|
420
|
+
assert_nil record.fake_poly_type
|
421
|
+
assert_nil record.fake_poly_id
|
422
|
+
assert_nil record.fake_one_id
|
423
|
+
assert_nil record.bad_column
|
424
|
+
end
|
425
|
+
|
426
|
+
end
|
427
|
+
|
428
|
+
class FakeOneRecord
|
429
|
+
include MR::FakeRecord
|
430
|
+
end
|
431
|
+
|
432
|
+
class FakeTwoRecord
|
433
|
+
include MR::FakeRecord
|
434
|
+
|
435
|
+
attribute :name, :string
|
436
|
+
attribute :fake_poly_type, :string
|
437
|
+
attribute :fake_poly_id, :integer
|
438
|
+
attribute :fake_one_id, :integer
|
439
|
+
|
440
|
+
attribute :bad_column, :invalid_type
|
441
|
+
|
442
|
+
belongs_to :fake_poly, :polymorphic => true
|
443
|
+
belongs_to :fake_one, :class_name => FakeOneRecord.to_s
|
444
|
+
end
|
445
|
+
|
446
|
+
end
|