subroutine 0.10.0.beta → 0.10.0.beta2
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 +5 -5
- data/.ruby-version +1 -1
- data/Gemfile +4 -2
- data/lib/subroutine/association_fields/component_configuration.rb +19 -0
- data/lib/subroutine/association_fields/configuration.rb +74 -0
- data/lib/subroutine/association_fields.rb +158 -0
- data/lib/subroutine/auth.rb +21 -16
- data/lib/subroutine/fields/configuration.rb +90 -0
- data/lib/subroutine/fields/mass_assignment_error.rb +13 -0
- data/lib/subroutine/fields.rb +146 -82
- data/lib/subroutine/op.rb +14 -38
- data/lib/subroutine/outputs/configuration.rb +39 -0
- data/lib/subroutine/outputs/output_not_set_error.rb +13 -0
- data/lib/subroutine/outputs/unknown_output_error.rb +13 -0
- data/lib/subroutine/outputs.rb +66 -0
- data/lib/subroutine/version.rb +4 -2
- data/test/subroutine/association_test.rb +18 -17
- data/test/subroutine/auth_test.rb +11 -4
- data/test/subroutine/base_test.rb +70 -58
- data/test/subroutine/fields_test.rb +49 -12
- data/test/support/ops.rb +113 -16
- metadata +12 -7
- data/lib/subroutine/association.rb +0 -131
- data/lib/subroutine/output_not_set_error.rb +0 -9
- data/lib/subroutine/unknown_output_error.rb +0 -9
data/lib/subroutine/fields.rb
CHANGED
@@ -6,7 +6,8 @@ require "active_support/core_ext/hash/indifferent_access"
|
|
6
6
|
require "active_support/core_ext/object/deep_dup"
|
7
7
|
|
8
8
|
require "subroutine/type_caster"
|
9
|
-
require "subroutine/
|
9
|
+
require "subroutine/fields/configuration"
|
10
|
+
require "subroutine/fields/mass_assignment_error"
|
10
11
|
|
11
12
|
module Subroutine
|
12
13
|
module Fields
|
@@ -14,24 +15,41 @@ module Subroutine
|
|
14
15
|
extend ActiveSupport::Concern
|
15
16
|
|
16
17
|
included do
|
17
|
-
class_attribute :
|
18
|
-
self.
|
19
|
-
attr_reader :original_params
|
20
|
-
attr_reader :params, :defaults
|
18
|
+
class_attribute :field_configurations
|
19
|
+
self.field_configurations = {}
|
21
20
|
end
|
22
21
|
|
23
22
|
module ClassMethods
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
23
|
+
|
24
|
+
def field(field_name, options = {})
|
25
|
+
config = ::Subroutine::Fields::Configuration.from(field_name, options)
|
26
|
+
config.validate!
|
27
|
+
|
28
|
+
config.groups.each do |group_name|
|
29
|
+
_group(group_name)
|
30
|
+
end
|
31
|
+
|
32
|
+
self.field_configurations = field_configurations.merge(field_name.to_sym => config)
|
33
|
+
|
34
|
+
if config.field_writer?
|
35
|
+
class_eval <<-EV, __FILE__, __LINE__ + 1
|
36
|
+
try(:silence_redefinition_of_method, :#{field_name}=)
|
37
|
+
def #{field_name}=(v)
|
38
|
+
set_field(:#{field_name}, v)
|
39
|
+
end
|
40
|
+
EV
|
41
|
+
end
|
42
|
+
|
43
|
+
if config.field_reader?
|
44
|
+
class_eval <<-EV, __FILE__, __LINE__ + 1
|
45
|
+
try(:silence_redefinition_of_method, :#{field_name})
|
46
|
+
def #{field_name}
|
47
|
+
get_field(:#{field_name})
|
48
|
+
end
|
49
|
+
EV
|
32
50
|
end
|
33
51
|
end
|
34
|
-
|
52
|
+
alias input field
|
35
53
|
|
36
54
|
def inputs_from(*things)
|
37
55
|
options = things.extract_options!
|
@@ -39,20 +57,31 @@ module Subroutine
|
|
39
57
|
onlys = options.key?(:only) ? Array(options.delete(:only)) : nil
|
40
58
|
|
41
59
|
things.each do |thing|
|
42
|
-
thing.
|
43
|
-
next if excepts
|
60
|
+
thing.field_configurations.each_pair do |field_name, config|
|
61
|
+
next if excepts&.include?(field_name)
|
44
62
|
next if onlys && !onlys.include?(field_name)
|
45
63
|
|
46
|
-
|
47
|
-
include
|
48
|
-
association(field_name, opts)
|
49
|
-
else
|
50
|
-
field(field_name, opts)
|
64
|
+
config.required_modules.each do |mod|
|
65
|
+
include mod unless included_modules.include?(mod)
|
51
66
|
end
|
67
|
+
|
68
|
+
field(field_name, config)
|
52
69
|
end
|
53
70
|
end
|
54
71
|
end
|
55
|
-
|
72
|
+
alias fields_from inputs_from
|
73
|
+
|
74
|
+
def fields_in_group(group_name)
|
75
|
+
field_configurations.each_with_object({}) do |(field_name, config), h|
|
76
|
+
next unless config.in_group?(group_name)
|
77
|
+
|
78
|
+
h[field_name] = config
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def get_field_config(field_name)
|
83
|
+
field_configurations[field_name.to_sym]
|
84
|
+
end
|
56
85
|
|
57
86
|
def respond_to_missing?(method_name, *args, &block)
|
58
87
|
::Subroutine::TypeCaster.casters.key?(method_name.to_sym) || super
|
@@ -61,10 +90,10 @@ module Subroutine
|
|
61
90
|
def method_missing(method_name, *args, &block)
|
62
91
|
caster = ::Subroutine::TypeCaster.casters[method_name.to_sym]
|
63
92
|
if caster
|
64
|
-
options = args
|
93
|
+
field_name, options = args
|
94
|
+
options ||= {}
|
65
95
|
options[:type] = method_name.to_sym
|
66
|
-
|
67
|
-
field(*args, &block)
|
96
|
+
field(field_name, options)
|
68
97
|
else
|
69
98
|
super
|
70
99
|
end
|
@@ -72,84 +101,106 @@ module Subroutine
|
|
72
101
|
|
73
102
|
protected
|
74
103
|
|
75
|
-
def
|
76
|
-
self._fields = _fields.merge(field_name.to_sym => options)
|
77
|
-
|
78
|
-
if field_writer
|
79
|
-
class_eval <<-EV, __FILE__, __LINE__ + 1
|
80
|
-
try(:silence_redefinition_of_method, :#{field_name}=)
|
81
|
-
def #{field_name}=(v)
|
82
|
-
config = #{field_name}_config
|
83
|
-
@fields_provided["#{field_name}"] = true
|
84
|
-
@params["#{field_name}"] = attempt_cast(v, config) do |e|
|
85
|
-
"Error during assignment of field `#{field_name}`: \#{e}"
|
86
|
-
end
|
87
|
-
end
|
88
|
-
EV
|
89
|
-
end
|
90
|
-
|
91
|
-
if field_reader
|
92
|
-
class_eval <<-EV, __FILE__, __LINE__ + 1
|
93
|
-
try(:silence_redefinition_of_method, :#{field_name})
|
94
|
-
def #{field_name}
|
95
|
-
@params["#{field_name}"]
|
96
|
-
end
|
97
|
-
EV
|
98
|
-
end
|
99
|
-
|
104
|
+
def _group(group_name)
|
100
105
|
class_eval <<-EV, __FILE__, __LINE__ + 1
|
101
|
-
try(:silence_redefinition_of_method, :#{
|
102
|
-
def #{
|
103
|
-
|
106
|
+
try(:silence_redefinition_of_method, :#{group_name}_params)
|
107
|
+
def #{group_name}_params
|
108
|
+
param_groups[:#{group_name}]
|
109
|
+
end
|
110
|
+
|
111
|
+
try(:silence_redefinition_of_method, :without_#{group_name}_params)
|
112
|
+
def without_#{group_name}_params
|
113
|
+
all_params.except(*#{group_name}_params.keys)
|
104
114
|
end
|
105
115
|
EV
|
106
116
|
end
|
117
|
+
|
107
118
|
end
|
108
119
|
|
109
120
|
def setup_fields(inputs = {})
|
110
|
-
@
|
111
|
-
|
112
|
-
|
113
|
-
|
121
|
+
@provided_fields = {}.with_indifferent_access
|
122
|
+
param_groups[:original] = inputs.with_indifferent_access
|
123
|
+
param_groups[:default] = build_defaults
|
124
|
+
mass_assign_initial_params
|
125
|
+
end
|
126
|
+
|
127
|
+
def param_groups
|
128
|
+
@param_groups ||= Hash.new { |h, k| h[k] = {}.with_indifferent_access }
|
129
|
+
end
|
130
|
+
|
131
|
+
def get_param_group(name)
|
132
|
+
param_groups[name.to_sym]
|
133
|
+
end
|
134
|
+
|
135
|
+
def original_params
|
136
|
+
get_param_group(:original)
|
137
|
+
end
|
138
|
+
|
139
|
+
def ungrouped_params
|
140
|
+
get_param_group(:ungrouped)
|
141
|
+
end
|
142
|
+
alias params ungrouped_params
|
143
|
+
|
144
|
+
def all_params
|
145
|
+
get_param_group(:all)
|
146
|
+
end
|
147
|
+
|
148
|
+
def defaults
|
149
|
+
get_param_group(:default)
|
150
|
+
end
|
151
|
+
alias default_params defaults
|
152
|
+
|
153
|
+
def get_field_config(field_name)
|
154
|
+
self.class.get_field_config(field_name)
|
114
155
|
end
|
115
156
|
|
116
157
|
# check if a specific field was provided
|
117
158
|
def field_provided?(key)
|
118
|
-
|
159
|
+
!!@provided_fields[key]
|
160
|
+
end
|
119
161
|
|
120
|
-
|
162
|
+
def get_field(name)
|
163
|
+
all_params[name]
|
121
164
|
end
|
122
165
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
166
|
+
def set_field(name, value, track_provided: true)
|
167
|
+
config = get_field_config(name)
|
168
|
+
@provided_fields[name] = true if track_provided
|
169
|
+
value = attempt_cast(value, config) do |e|
|
170
|
+
"Error during assignment of field `#{name}`: #{e}"
|
171
|
+
end
|
172
|
+
each_param_group_for_field(name) do |h|
|
173
|
+
h[name] = value
|
174
|
+
end
|
175
|
+
value
|
176
|
+
end
|
127
177
|
|
128
|
-
|
178
|
+
def clear_field(name)
|
179
|
+
each_param_group_for_field(name) do |h|
|
180
|
+
h.delete(name)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
protected
|
129
185
|
|
130
|
-
|
131
|
-
|
186
|
+
def mass_assign_initial_params
|
187
|
+
field_configurations.each_pair do |field_name, config|
|
188
|
+
if !config.mass_assignable? && original_params.key?(field_name)
|
189
|
+
raise ::Subroutine::Fields::MassAssignmentError, field_name
|
132
190
|
end
|
133
191
|
|
134
|
-
if
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
end
|
139
|
-
elsif defaults.key?(field)
|
140
|
-
out[field] = defaults[field]
|
141
|
-
else
|
142
|
-
next
|
192
|
+
if original_params.key?(field_name)
|
193
|
+
set_field(field_name, original_params[field_name])
|
194
|
+
elsif defaults.key?(field_name)
|
195
|
+
set_field(field_name, defaults[field_name], track_provided: false)
|
143
196
|
end
|
144
197
|
end
|
145
|
-
|
146
|
-
out
|
147
198
|
end
|
148
199
|
|
149
200
|
def build_defaults
|
150
|
-
|
201
|
+
out = {}.with_indifferent_access
|
151
202
|
|
152
|
-
|
203
|
+
field_configurations.each_pair do |field, config|
|
153
204
|
next unless config.key?(:default)
|
154
205
|
|
155
206
|
deflt = config[:default]
|
@@ -161,20 +212,33 @@ module Subroutine
|
|
161
212
|
deflt = deflt.deep_dup # from active_support
|
162
213
|
end
|
163
214
|
|
164
|
-
|
215
|
+
out[field.to_s] = attempt_cast(deflt, config) do |e|
|
165
216
|
"Error for default `#{field}`: #{e}"
|
166
217
|
end
|
167
218
|
end
|
168
219
|
|
169
|
-
|
220
|
+
out
|
170
221
|
end
|
171
222
|
|
172
223
|
def attempt_cast(value, config)
|
173
224
|
::Subroutine::TypeCaster.cast(value, config)
|
174
|
-
|
225
|
+
rescue ::Subroutine::TypeCaster::TypeCastError => e
|
175
226
|
message = block_given? ? yield(e) : e.to_s
|
176
227
|
raise ::Subroutine::TypeCaster::TypeCastError, message, e.backtrace
|
177
228
|
end
|
178
229
|
|
230
|
+
def each_param_group_for_field(name)
|
231
|
+
config = get_field_config(name)
|
232
|
+
yield all_params
|
233
|
+
|
234
|
+
if config.groups.empty?
|
235
|
+
yield ungrouped_params
|
236
|
+
else
|
237
|
+
config.groups.each do |group_name|
|
238
|
+
yield param_groups[group_name]
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
179
243
|
end
|
180
244
|
end
|
data/lib/subroutine/op.rb
CHANGED
@@ -2,10 +2,9 @@
|
|
2
2
|
|
3
3
|
require "active_model"
|
4
4
|
|
5
|
-
require "subroutine/fields"
|
6
5
|
require "subroutine/failure"
|
7
|
-
require "subroutine/
|
8
|
-
require "subroutine/
|
6
|
+
require "subroutine/fields"
|
7
|
+
require "subroutine/outputs"
|
9
8
|
|
10
9
|
module Subroutine
|
11
10
|
class Op
|
@@ -13,28 +12,17 @@ module Subroutine
|
|
13
12
|
include ::ActiveModel::Validations
|
14
13
|
include ::ActiveModel::Validations::Callbacks
|
15
14
|
include ::Subroutine::Fields
|
16
|
-
|
17
|
-
DEFAULT_OUTPUT_OPTIONS = {
|
18
|
-
required: true,
|
19
|
-
}.freeze
|
15
|
+
include ::Subroutine::Outputs
|
20
16
|
|
21
17
|
class << self
|
22
18
|
|
23
|
-
def
|
24
|
-
|
25
|
-
names.each do |name|
|
26
|
-
self._outputs = _outputs.merge(name.to_sym => DEFAULT_OUTPUT_OPTIONS.merge(options))
|
27
|
-
|
28
|
-
class_eval <<-EV, __FILE__, __LINE__ + 1
|
29
|
-
def #{name}
|
30
|
-
@outputs[:#{name}]
|
31
|
-
end
|
32
|
-
EV
|
33
|
-
end
|
19
|
+
def failure_class(klass)
|
20
|
+
self._failure_class = klass
|
34
21
|
end
|
35
22
|
|
36
23
|
def submit!(*args)
|
37
24
|
raise ArgumentError, "Blocks cannot be provided to `submit!`" if block_given?
|
25
|
+
|
38
26
|
op = new(*args)
|
39
27
|
op.submit!
|
40
28
|
|
@@ -43,6 +31,7 @@ module Subroutine
|
|
43
31
|
|
44
32
|
def submit(*args)
|
45
33
|
raise ArgumentError, "Blocks cannot be provided to `submit`." if block_given?
|
34
|
+
|
46
35
|
op = new(*args)
|
47
36
|
op.submit
|
48
37
|
op
|
@@ -50,7 +39,7 @@ module Subroutine
|
|
50
39
|
|
51
40
|
protected
|
52
41
|
|
53
|
-
def
|
42
|
+
def field(field_name, options = {})
|
54
43
|
result = super(field_name, options)
|
55
44
|
|
56
45
|
if options[:aka]
|
@@ -64,26 +53,18 @@ module Subroutine
|
|
64
53
|
|
65
54
|
end
|
66
55
|
|
67
|
-
class_attribute :
|
68
|
-
self.
|
56
|
+
class_attribute :_failure_class
|
57
|
+
self._failure_class = Subroutine::Failure
|
69
58
|
|
70
59
|
class_attribute :_error_map
|
71
60
|
self._error_map = {}
|
72
61
|
|
73
62
|
def initialize(inputs = {})
|
74
63
|
setup_fields(inputs)
|
75
|
-
|
64
|
+
setup_outputs
|
76
65
|
yield self if block_given?
|
77
66
|
end
|
78
67
|
|
79
|
-
def output(name, value)
|
80
|
-
unless _outputs.key?(name.to_sym)
|
81
|
-
raise ::Subroutine::UnknownOutputError, name
|
82
|
-
end
|
83
|
-
|
84
|
-
@outputs[name.to_sym] = value
|
85
|
-
end
|
86
|
-
|
87
68
|
def submit!
|
88
69
|
begin
|
89
70
|
observe_submission do
|
@@ -92,7 +73,7 @@ module Subroutine
|
|
92
73
|
rescue Exception => e
|
93
74
|
if e.respond_to?(:record)
|
94
75
|
inherit_errors(e.record) unless e.record == self
|
95
|
-
new_e =
|
76
|
+
new_e = _failure_class.new(self)
|
96
77
|
raise new_e, new_e.message, e.backtrace
|
97
78
|
else
|
98
79
|
raise
|
@@ -100,15 +81,10 @@ module Subroutine
|
|
100
81
|
end
|
101
82
|
|
102
83
|
if errors.empty?
|
103
|
-
|
104
|
-
if config[:required] && !@outputs.key?(name)
|
105
|
-
raise ::Subroutine::OutputNotSetError, name
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
84
|
+
validate_outputs!
|
109
85
|
true
|
110
86
|
else
|
111
|
-
raise
|
87
|
+
raise _failure_class, self
|
112
88
|
end
|
113
89
|
end
|
114
90
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "delegate"
|
4
|
+
|
5
|
+
module Subroutine
|
6
|
+
module Outputs
|
7
|
+
class Configuration < ::SimpleDelegator
|
8
|
+
|
9
|
+
def self.from(field_name, options)
|
10
|
+
case options
|
11
|
+
when Subroutine::Outputs::Configuration
|
12
|
+
options.class.new(field_name, options)
|
13
|
+
else
|
14
|
+
new(field_name, options)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
DEFAULT_OPTIONS = { required: true }.freeze
|
19
|
+
|
20
|
+
attr_reader :output_name
|
21
|
+
|
22
|
+
def initialize(output_name, config)
|
23
|
+
@output_name = output_name
|
24
|
+
super(DEFAULT_OPTIONS.merge(config))
|
25
|
+
end
|
26
|
+
|
27
|
+
alias config __getobj__
|
28
|
+
|
29
|
+
def required?
|
30
|
+
!!config[:required]
|
31
|
+
end
|
32
|
+
|
33
|
+
def inspect
|
34
|
+
"#<#{self.class}:#{object_id} name=#{output_name} config=#{config.inspect}>"
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/concern"
|
4
|
+
require "subroutine/outputs/configuration"
|
5
|
+
require "subroutine/outputs/output_not_set_error"
|
6
|
+
require "subroutine/outputs/unknown_output_error"
|
7
|
+
|
8
|
+
module Subroutine
|
9
|
+
module Outputs
|
10
|
+
|
11
|
+
extend ActiveSupport::Concern
|
12
|
+
|
13
|
+
included do
|
14
|
+
class_attribute :output_configurations
|
15
|
+
self.output_configurations = {}
|
16
|
+
|
17
|
+
attr_reader :outputs
|
18
|
+
end
|
19
|
+
|
20
|
+
module ClassMethods
|
21
|
+
|
22
|
+
def outputs(*names)
|
23
|
+
options = names.extract_options!
|
24
|
+
names.each do |name|
|
25
|
+
config = ::Subroutine::Outputs::Configuration.new(name, options)
|
26
|
+
self.output_configurations = output_configurations.merge(name.to_sym => config)
|
27
|
+
|
28
|
+
class_eval <<-EV, __FILE__, __LINE__ + 1
|
29
|
+
def #{name}
|
30
|
+
get_output(:#{name})
|
31
|
+
end
|
32
|
+
EV
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
def setup_outputs
|
39
|
+
@outputs = {}.with_indifferent_access
|
40
|
+
end
|
41
|
+
|
42
|
+
def output(name, value)
|
43
|
+
unless output_configurations.key?(name.to_sym)
|
44
|
+
raise ::Subroutine::Outputs::UnknownOutputError, name
|
45
|
+
end
|
46
|
+
|
47
|
+
outputs[name.to_sym] = value
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_output(name)
|
51
|
+
name = name.to_sym
|
52
|
+
raise ::Subroutine::Outputs::UnknownOutputError, name unless output_configurations.key?(name)
|
53
|
+
|
54
|
+
outputs[name]
|
55
|
+
end
|
56
|
+
|
57
|
+
def validate_outputs!
|
58
|
+
output_configurations.each_pair do |name, config|
|
59
|
+
if config.required? && !outputs.key?(name)
|
60
|
+
raise ::Subroutine::Outputs::OutputNotSetError, name
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
data/lib/subroutine/version.rb
CHANGED
@@ -1,20 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "test_helper"
|
4
4
|
|
5
5
|
module Subroutine
|
6
|
-
class
|
6
|
+
class AssociationTest < TestCase
|
7
|
+
|
7
8
|
def doug
|
8
|
-
@doug ||= ::User.new(id: 1, email_address:
|
9
|
+
@doug ||= ::User.new(id: 1, email_address: "doug@example.com")
|
9
10
|
end
|
10
11
|
|
11
12
|
def fred
|
12
|
-
@fred ||= ::User.new(id: 2, email_address:
|
13
|
+
@fred ||= ::User.new(id: 2, email_address: "fred@example.com")
|
13
14
|
end
|
14
15
|
|
15
16
|
def test_it_sets_accessors_on_init
|
16
17
|
op = SimpleAssociationOp.new user: doug
|
17
|
-
assert_equal
|
18
|
+
assert_equal "User", op.user_type
|
18
19
|
assert_equal doug.id, op.user_id
|
19
20
|
end
|
20
21
|
|
@@ -24,7 +25,7 @@ module Subroutine
|
|
24
25
|
::User.expects(:all).returns(all_mock)
|
25
26
|
all_mock.expects(:find).with(1).returns(doug)
|
26
27
|
|
27
|
-
op = SimpleAssociationOp.new user_type:
|
28
|
+
op = SimpleAssociationOp.new user_type: "User", user_id: doug.id
|
28
29
|
assert_equal doug, op.user
|
29
30
|
end
|
30
31
|
|
@@ -34,7 +35,7 @@ module Subroutine
|
|
34
35
|
::User.expects(:all).returns(all_mock)
|
35
36
|
all_mock.expects(:find).with(1).returns(doug)
|
36
37
|
|
37
|
-
op = SimpleAssociationOp.new
|
38
|
+
op = SimpleAssociationOp.new user_id: doug.id
|
38
39
|
assert_equal doug, op.user
|
39
40
|
end
|
40
41
|
|
@@ -46,7 +47,7 @@ module Subroutine
|
|
46
47
|
all_mock.expects(:unscoped).returns(unscoped_mock)
|
47
48
|
unscoped_mock.expects(:find).with(1).returns(doug)
|
48
49
|
|
49
|
-
op = UnscopedSimpleAssociationOp.new
|
50
|
+
op = UnscopedSimpleAssociationOp.new user_id: doug.id
|
50
51
|
assert_equal doug, op.user
|
51
52
|
end
|
52
53
|
|
@@ -56,13 +57,13 @@ module Subroutine
|
|
56
57
|
::AdminUser.expects(:all).returns(all_mock)
|
57
58
|
all_mock.expects(:find).with(1).returns(doug)
|
58
59
|
|
59
|
-
op = PolymorphicAssociationOp.new(admin_type:
|
60
|
+
op = PolymorphicAssociationOp.new(admin_type: "AdminUser", admin_id: doug.id)
|
60
61
|
assert_equal doug, op.admin
|
61
62
|
end
|
62
63
|
|
63
64
|
def test_it_allows_the_class_to_be_set
|
64
65
|
op = ::AssociationWithClassOp.new(admin: doug)
|
65
|
-
assert_equal
|
66
|
+
assert_equal "AdminUser", op.admin_type
|
66
67
|
end
|
67
68
|
|
68
69
|
def test_it_inherits_associations_via_inputs_from
|
@@ -71,9 +72,9 @@ module Subroutine
|
|
71
72
|
::User.expects(:all).returns(all_mock)
|
72
73
|
all_mock.expects(:find).with(1).returns(doug)
|
73
74
|
|
74
|
-
op = ::InheritedSimpleAssociation.new(user_type:
|
75
|
+
op = ::InheritedSimpleAssociation.new(user_type: "User", user_id: doug.id)
|
75
76
|
assert_equal doug, op.user
|
76
|
-
assert_equal
|
77
|
+
assert_equal "User", op.user_type
|
77
78
|
assert_equal doug.id, op.user_id
|
78
79
|
end
|
79
80
|
|
@@ -85,9 +86,9 @@ module Subroutine
|
|
85
86
|
all_mock.expects(:unscoped).returns(unscoped_mock)
|
86
87
|
unscoped_mock.expects(:find).with(1).returns(doug)
|
87
88
|
|
88
|
-
op = ::InheritedUnscopedAssociation.new(user_type:
|
89
|
+
op = ::InheritedUnscopedAssociation.new(user_type: "User", user_id: doug.id)
|
89
90
|
assert_equal doug, op.user
|
90
|
-
assert_equal
|
91
|
+
assert_equal "User", op.user_type
|
91
92
|
assert_equal doug.id, op.user_id
|
92
93
|
end
|
93
94
|
|
@@ -97,9 +98,9 @@ module Subroutine
|
|
97
98
|
::AdminUser.expects(:all).returns(all_mock)
|
98
99
|
all_mock.expects(:find).with(1).returns(doug)
|
99
100
|
|
100
|
-
op = ::InheritedPolymorphicAssociationOp.new(admin_type:
|
101
|
+
op = ::InheritedPolymorphicAssociationOp.new(admin_type: "AdminUser", admin_id: doug.id)
|
101
102
|
assert_equal doug, op.admin
|
102
|
-
assert_equal
|
103
|
+
assert_equal "AdminUser", op.admin_type
|
103
104
|
assert_equal doug.id, op.admin_id
|
104
105
|
end
|
105
106
|
|
@@ -140,7 +141,7 @@ module Subroutine
|
|
140
141
|
assert_equal false, op.field_provided?(:admin)
|
141
142
|
assert_equal false, op.field_provided?(:admin_id)
|
142
143
|
assert_equal false, op.field_provided?(:admin_type)
|
143
|
-
|
144
144
|
end
|
145
|
+
|
145
146
|
end
|
146
147
|
end
|