much-rails 0.2.7 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a66a39e5898e5491c562aed8a32fb4036382a3d62485e71d45d8c946d18f622
4
- data.tar.gz: ff4307e38c7d7d8115823189bd5d39d7799b3f4bcedc0fd5f3e39320215dfffe
3
+ metadata.gz: ee8fc1ccf3484f2b015d6dc6f1911bcca2bddb9832809391dc48ef2aeac023bb
4
+ data.tar.gz: a0a9b4ba294d780e3a4002545e967505f8f32e15bb231e3fbd1e9d594ed4f9b1
5
5
  SHA512:
6
- metadata.gz: 40877d371bdefb9fb77e370c5847a61becc905658ccaf2504066ed2092a4e0f3343e9fcf37e6e334e90155c14a6f13cea4bf1e0faaf7f893554e9b333f235ff7
7
- data.tar.gz: 804743827c52ec702454bc5fed1999883ffaa8d7a0434c8266323f23d1fb231ed73bf2bec93b710d84797297c4cd58566209e0ba1fba09f7eb3a8cb9997a9417
6
+ metadata.gz: f47fe549b83381ec39c226cf52760d8b5ca2d386c66e3e4db3b37f22ce07d855dd665e499fe5db15e54e7263a5903f5759cbb2d9d60a175dffead64917388f79
7
+ data.tar.gz: 3c50dc018ab3d5e0d6bf98cc8725b99314e9527d400890500c5ffbc8bf1e9ed2772da689b00bd7ef4b8fdf4d256927a71e338401da57ec53879019ad5a4ae5f2
data/lib/much-rails.rb CHANGED
@@ -18,6 +18,7 @@ require "much-rails/destroy_action"
18
18
  require "much-rails/destroy_service"
19
19
  require "much-rails/has_slug"
20
20
  require "much-rails/input_value"
21
+ require "much-rails/invalid_error"
21
22
  require "much-rails/json"
22
23
  require "much-rails/layout"
23
24
  require "much-rails/not_given"
@@ -31,7 +31,7 @@ module MuchRails::Action
31
31
 
32
32
  add_config :much_rails_action
33
33
 
34
- attr_reader :params, :current_session, :request, :errors
34
+ attr_reader :params, :request, :errors
35
35
  end
36
36
 
37
37
  mixin_class_methods do
@@ -112,11 +112,10 @@ module MuchRails::Action
112
112
  end
113
113
 
114
114
  mixin_instance_methods do
115
- def initialize(params: nil, current_session: nil, request: nil)
115
+ def initialize(params: nil, request: nil)
116
116
  @params = params.to_h.with_indifferent_access
117
- @current_session = current_session
118
117
  @request = request
119
- @errors = Hash.new{ |hash, key| hash[key] = [] }
118
+ @errors = HashWithIndifferentAccess.new{ |hash, key| hash[key] = [] }
120
119
  end
121
120
 
122
121
  def on_call
@@ -150,8 +149,17 @@ module MuchRails::Action
150
149
  @much_rails_successful_action
151
150
  end
152
151
 
152
+ def controller_session=(value)
153
+ @controller_session = value
154
+ end
155
+
153
156
  private
154
157
 
158
+ def controller_session
159
+ @controller_session ||=
160
+ request&.env&.[]("action_controller.instance")&.session
161
+ end
162
+
155
163
  def default_action_success_result
156
164
  MuchRails::Action::HeadResult.new(:ok)
157
165
  end
@@ -9,30 +9,31 @@ module MuchRails::Action; end
9
9
  # MuchRails::Action::Controller defines the behaviors for controllers processing
10
10
  # MuchRails::Actions.
11
11
  module MuchRails::Action::Controller
12
- DEFAULT_ACTION_CLASS_FORMAT = :any
13
-
14
12
  include MuchRails::Mixin
15
13
 
14
+ def self.DEFAULT_ACTION_CLASS_FORMAT
15
+ :any
16
+ end
17
+
16
18
  mixin_included do
17
19
  attr_reader :much_rails_action_class
18
20
 
19
- before_action(
21
+ prepend_before_action(
20
22
  :require_much_rails_action_class,
21
- only: MuchRails::Action::Router::CONTROLLER_CALL_ACTION_METHOD_NAME,
23
+ only: MuchRails::Action::Router.CONTROLLER_CALL_ACTION_METHOD_NAME,
22
24
  )
23
25
  before_action :permit_all_much_rails_action_params
24
26
  end
25
27
 
26
28
  mixin_instance_methods do
27
29
  define_method(
28
- MuchRails::Action::Router::CONTROLLER_CALL_ACTION_METHOD_NAME,
30
+ MuchRails::Action::Router.CONTROLLER_CALL_ACTION_METHOD_NAME,
29
31
  ) do
30
32
  respond_to do |format|
31
33
  format.public_send(much_rails_action_class_format) do
32
34
  result =
33
35
  much_rails_action_class.call(
34
36
  params: much_rails_action_params,
35
- current_session: current_session,
36
37
  request: request,
37
38
  )
38
39
  instance_exec(result, &result.execute_block)
@@ -41,7 +42,7 @@ module MuchRails::Action::Controller
41
42
  end
42
43
 
43
44
  define_method(
44
- MuchRails::Action::Router::CONTROLLER_NOT_FOUND_METHOD_NAME,
45
+ MuchRails::Action::Router.CONTROLLER_NOT_FOUND_METHOD_NAME,
45
46
  ) do
46
47
  respond_to do |format|
47
48
  format.html do
@@ -51,11 +52,12 @@ module MuchRails::Action::Controller
51
52
  end
52
53
 
53
54
  def much_rails_action_class_name
54
- "::#{params[MuchRails::Action::Router::ACTION_CLASS_PARAM_NAME]}"
55
+ "::#{params[MuchRails::Action::Router.ACTION_CLASS_PARAM_NAME]}"
55
56
  end
56
57
 
57
58
  def much_rails_action_class_format
58
- much_rails_action_class.format || DEFAULT_ACTION_CLASS_FORMAT
59
+ much_rails_action_class.format ||
60
+ MuchRails::Action::Controller.DEFAULT_ACTION_CLASS_FORMAT
59
61
  end
60
62
 
61
63
  def much_rails_action_params
@@ -67,7 +69,7 @@ module MuchRails::Action::Controller
67
69
  params
68
70
  .to_h
69
71
  .except(
70
- MuchRails::Action::Router::ACTION_CLASS_PARAM_NAME,
72
+ MuchRails::Action::Router.ACTION_CLASS_PARAM_NAME,
71
73
  :controller,
72
74
  :action,
73
75
  ),
@@ -6,10 +6,21 @@ module MuchRails; end
6
6
  module MuchRails::Action; end
7
7
 
8
8
  class MuchRails::Action::Router < MuchRails::Action::BaseRouter
9
- DEFAULT_CONTROLLER_NAME = "application"
10
- CONTROLLER_CALL_ACTION_METHOD_NAME = :much_rails_call_action
11
- CONTROLLER_NOT_FOUND_METHOD_NAME = :much_rails_not_found
12
- ACTION_CLASS_PARAM_NAME = :much_rails_action_class_name
9
+ def self.DEFAULT_CONTROLLER_NAME
10
+ "application"
11
+ end
12
+
13
+ def self.CONTROLLER_CALL_ACTION_METHOD_NAME
14
+ :much_rails_call_action
15
+ end
16
+
17
+ def self.CONTROLLER_NOT_FOUND_METHOD_NAME
18
+ :much_rails_not_found
19
+ end
20
+
21
+ def self.ACTION_CLASS_PARAM_NAME
22
+ :much_rails_action_class_name
23
+ end
13
24
 
14
25
  def self.url_class
15
26
  MuchRails::Action::Router::URL
@@ -28,7 +39,10 @@ class MuchRails::Action::Router < MuchRails::Action::BaseRouter
28
39
  raise ArgumentError, "routes file `#{file_path.inspect}` does not exist."
29
40
  end
30
41
 
31
- new(routes_file_name, controller_name: controller_name) do
42
+ new(
43
+ routes_file_name.to_s.split(File::SEPARATOR).join("_"),
44
+ controller_name: controller_name,
45
+ ) do
32
46
  instance_eval(File.read(file_path), file_path.to_s, 1)
33
47
  end
34
48
  end
@@ -38,7 +52,7 @@ class MuchRails::Action::Router < MuchRails::Action::BaseRouter
38
52
  def initialize(name = nil, controller_name: nil, &block)
39
53
  super(name, &block)
40
54
 
41
- @controller_name = controller_name || DEFAULT_CONTROLLER_NAME
55
+ @controller_name = controller_name || self.class.DEFAULT_CONTROLLER_NAME
42
56
  end
43
57
 
44
58
  # Example:
@@ -49,8 +63,10 @@ class MuchRails::Action::Router < MuchRails::Action::BaseRouter
49
63
  # end
50
64
  def apply_to(application_routes_draw_scope)
51
65
  validate!
52
- draw_url_to = "#{controller_name}##{CONTROLLER_NOT_FOUND_METHOD_NAME}"
53
- draw_route_to = "#{controller_name}##{CONTROLLER_CALL_ACTION_METHOD_NAME}"
66
+ draw_url_to =
67
+ "#{controller_name}##{self.class.CONTROLLER_NOT_FOUND_METHOD_NAME}"
68
+ draw_route_to =
69
+ "#{controller_name}##{self.class.CONTROLLER_CALL_ACTION_METHOD_NAME}"
54
70
 
55
71
  definition_names = Set.new
56
72
 
@@ -63,7 +79,8 @@ class MuchRails::Action::Router < MuchRails::Action::BaseRouter
63
79
  as: (definition.name if definition_names.add?(definition.name)),
64
80
  defaults:
65
81
  definition.default_params.merge({
66
- ACTION_CLASS_PARAM_NAME => request_type_action.class_name,
82
+ self.class.ACTION_CLASS_PARAM_NAME =>
83
+ request_type_action.class_name,
67
84
  "format" => request_type_action.format,
68
85
  }),
69
86
  constraints: request_type_action.constraints_lambda,
@@ -79,7 +96,8 @@ class MuchRails::Action::Router < MuchRails::Action::BaseRouter
79
96
  as: (definition.name if definition_names.add?(definition.name)),
80
97
  defaults:
81
98
  definition.default_params.merge({
82
- ACTION_CLASS_PARAM_NAME => definition.default_action_class_name,
99
+ self.class.ACTION_CLASS_PARAM_NAME =>
100
+ definition.default_action_class_name,
83
101
  "format" => definition.default_action_format,
84
102
  }),
85
103
  )
@@ -97,14 +115,14 @@ class MuchRails::Action::Router < MuchRails::Action::BaseRouter
97
115
  def path_for(**kargs)
98
116
  MuchRails::RailsRoutes.instance.public_send(
99
117
  "#{name}_path",
100
- **kargs.symbolize_keys,
118
+ **kargs.symbolize_keys.except(:format),
101
119
  )
102
120
  end
103
121
 
104
122
  def url_for(**kargs)
105
123
  MuchRails::RailsRoutes.instance.public_send(
106
124
  "#{name}_url",
107
- **kargs.symbolize_keys,
125
+ **kargs.symbolize_keys.except(:format),
108
126
  )
109
127
  end
110
128
  end
@@ -27,12 +27,15 @@ class MuchRails::ChangeActionResult
27
27
 
28
28
  @service_result = save_service_result
29
29
 
30
- @service_result.validation_errors ||= {}
30
+ @service_result.validation_errors ||= HashWithIndifferentAccess.new
31
31
  end
32
32
 
33
33
  def validation_errors
34
34
  @validation_errors ||=
35
- service_result.get_for_all_results(:validation_errors).to_h
35
+ service_result
36
+ .get_for_all_results(:validation_errors)
37
+ .to_h
38
+ .with_indifferent_access
36
39
  end
37
40
 
38
41
  def validation_error_messages
@@ -40,7 +43,7 @@ class MuchRails::ChangeActionResult
40
43
  end
41
44
 
42
45
  def extract_validation_error(field_name)
43
- validation_errors.delete(field_name)
46
+ Array.wrap(validation_errors.delete(field_name)).compact
44
47
  end
45
48
 
46
49
  def any_unextracted_validation_errors?
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "much-rails/invalid_error"
3
4
  require "much-rails/mixin"
4
5
  require "much-rails/records"
5
6
  require "much-rails/records/validate_destroy"
6
7
  require "much-rails/result"
7
8
  require "much-rails/service"
9
+ require "much-rails/service_validation_errors"
8
10
 
9
11
  module MuchRails; end
10
12
 
@@ -51,6 +53,13 @@ module MuchRails::DestroyService
51
53
  validation_error_messages: ex.error_full_messages.to_a,
52
54
  )
53
55
  end
56
+ e.add(MuchRails::InvalidError) do |ex|
57
+ MuchRails::SaveService::FailureResult.new(
58
+ exception: ex,
59
+ validation_errors: ex.errors,
60
+ validation_error_messages: ex.error_messages,
61
+ )
62
+ end
54
63
  end
55
64
  end
56
65
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MuchRails; end
4
+
5
+ # MuchRails::InvalidError allows for raising and auto-rescueing general
6
+ # validation errors outside the scope of e.g. an ActiveRecord save.
7
+ class MuchRails::InvalidError < StandardError
8
+ attr_reader :errors
9
+
10
+ def initialize(backtrace: nil, **errors)
11
+ @errors = errors
12
+
13
+ super(@errors.inspect)
14
+ set_backtrace(backtrace) if backtrace
15
+ end
16
+
17
+ def error_messages
18
+ @errors.to_a.map do |(field_name, message)|
19
+ "#{field_name}: #{Array.wrap(message).to_sentence}"
20
+ end
21
+ end
22
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_record"
4
+ require "much-rails/invalid_error"
4
5
  require "much-rails/mixin"
5
6
  require "much-rails/result"
6
7
  require "much-rails/service"
@@ -52,6 +53,13 @@ module MuchRails::SaveService
52
53
  ex.record&.errors&.full_messages.to_a,
53
54
  )
54
55
  end
56
+ e.add(MuchRails::InvalidError) do |ex|
57
+ MuchRails::SaveService::FailureResult.new(
58
+ exception: ex,
59
+ validation_errors: ex.errors,
60
+ validation_error_messages: ex.error_messages,
61
+ )
62
+ end
55
63
  end
56
64
  end
57
65
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MuchRails
4
- VERSION = "0.2.7"
4
+ VERSION = "0.4.2"
5
5
  end
data/much-rails.gemspec CHANGED
@@ -29,7 +29,7 @@ Gem::Specification.new do |gem|
29
29
 
30
30
  gem.add_dependency("activerecord", ["> 5.0", "< 7.0"])
31
31
  gem.add_dependency("activesupport", ["> 5.0", "< 7.0"])
32
- gem.add_dependency("dassets", ["~> 0.15.2"])
32
+ gem.add_dependency("dassets", ["~> 0.15.3"])
33
33
  gem.add_dependency("dassets-erubi", ["~> 0.1.1"])
34
34
  gem.add_dependency("dassets-sass", ["~> 0.5.1"])
35
35
  gem.add_dependency("much-boolean", ["~> 0.2.1"])
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ url :root, "/subrouter"
@@ -13,20 +13,31 @@ module FakeActionController
13
13
  end
14
14
 
15
15
  mixin_class_methods do
16
- def before_action(method_name, **)
17
- before_actions << method_name
16
+ def before_action(*args, &block)
17
+ before_action_calls << Assert::StubCall.new(*args, &block)
18
18
  end
19
19
 
20
- def before_actions
21
- @before_actions ||= []
20
+ def prepend_before_action(*args, &block)
21
+ prepend_before_action_calls << Assert::StubCall.new(*args, &block)
22
+ end
23
+
24
+ def before_action_calls
25
+ @before_action_calls ||= []
26
+ end
27
+
28
+ def prepend_before_action_calls
29
+ @prepend_before_action_calls ||= []
22
30
  end
23
31
  end
24
32
 
25
33
  mixin_instance_methods do
26
34
  def initialize(params)
27
35
  @params = FakeParams.new(params)
28
- self.class.before_actions.each do |before_action|
29
- public_send(before_action)
36
+ self.class.prepend_before_action_calls.each do |before_action_call|
37
+ public_send(before_action_call.args.first)
38
+ end
39
+ self.class.before_action_calls.each do |before_action_call|
40
+ public_send(before_action_call.args.first)
30
41
  end
31
42
  end
32
43
 
@@ -17,8 +17,8 @@ module MuchRails::Action::Controller
17
17
  assert_that(subject).includes(MuchRails::Mixin)
18
18
  end
19
19
 
20
- should "know its constants" do
21
- assert_that(subject::DEFAULT_ACTION_CLASS_FORMAT).equals(:any)
20
+ should "know its attributes" do
21
+ assert_that(subject.DEFAULT_ACTION_CLASS_FORMAT).equals(:any)
22
22
  end
23
23
  end
24
24
 
@@ -29,6 +29,19 @@ module MuchRails::Action::Controller
29
29
  let(:receiver_class) do
30
30
  Class.new{ include FakeActionController }
31
31
  end
32
+
33
+ should "be configured as expected" do
34
+ assert_that(subject.prepend_before_action_calls.size).equals(1)
35
+ assert_that(subject.prepend_before_action_calls.last.args)
36
+ .equals([
37
+ :require_much_rails_action_class,
38
+ only: MuchRails::Action::Router.CONTROLLER_CALL_ACTION_METHOD_NAME,
39
+ ])
40
+
41
+ assert_that(subject.before_action_calls.size).equals(1)
42
+ assert_that(subject.before_action_calls.last.args)
43
+ .equals([:permit_all_much_rails_action_params])
44
+ end
32
45
  end
33
46
 
34
47
  class ReceiverInitTests < ReceiverTests
@@ -41,7 +54,7 @@ module MuchRails::Action::Controller
41
54
 
42
55
  let(:params1) do
43
56
  {
44
- MuchRails::Action::Router::ACTION_CLASS_PARAM_NAME => "Actions::Show",
57
+ MuchRails::Action::Router.ACTION_CLASS_PARAM_NAME => "Actions::Show",
45
58
  controller: "actions",
46
59
  action: "show",
47
60
  nested: {
@@ -53,10 +66,10 @@ module MuchRails::Action::Controller
53
66
  should have_readers :much_rails_action_class
54
67
 
55
68
  should have_imeths(
56
- MuchRails::Action::Router::CONTROLLER_CALL_ACTION_METHOD_NAME,
69
+ MuchRails::Action::Router.CONTROLLER_CALL_ACTION_METHOD_NAME,
57
70
  )
58
71
  should have_imeths(
59
- MuchRails::Action::Router::CONTROLLER_NOT_FOUND_METHOD_NAME,
72
+ MuchRails::Action::Router.CONTROLLER_NOT_FOUND_METHOD_NAME,
60
73
  )
61
74
  should have_imeths :much_rails_action_class_name
62
75
  should have_imeths :much_rails_action_class_format
@@ -69,7 +82,7 @@ module MuchRails::Action::Controller
69
82
  .equals("::Actions::Show")
70
83
 
71
84
  assert_that(subject.much_rails_action_class_format)
72
- .equals(unit_module::DEFAULT_ACTION_CLASS_FORMAT)
85
+ .equals(unit_module.DEFAULT_ACTION_CLASS_FORMAT)
73
86
 
74
87
  assert_that(subject.much_rails_action_params)
75
88
  .equals(
@@ -91,7 +104,7 @@ module MuchRails::Action::Controller
91
104
 
92
105
  let(:params1) do
93
106
  {
94
- MuchRails::Action::Router::ACTION_CLASS_PARAM_NAME =>
107
+ MuchRails::Action::Router.ACTION_CLASS_PARAM_NAME =>
95
108
  "Actions::Unknown",
96
109
  }
97
110
  end
@@ -16,17 +16,17 @@ class MuchRails::Action::Router
16
16
 
17
17
  should have_imeths :url_class
18
18
 
19
- should "be a BaseRouter" do
19
+ should "be configured as expected" do
20
20
  assert_that(subject < MuchRails::Action::BaseRouter).is_true
21
21
  end
22
22
 
23
- should "know its constants" do
24
- assert_that(subject::DEFAULT_CONTROLLER_NAME).equals("application")
25
- assert_that(subject::CONTROLLER_CALL_ACTION_METHOD_NAME)
23
+ should "know its attributes" do
24
+ assert_that(subject.DEFAULT_CONTROLLER_NAME).equals("application")
25
+ assert_that(subject.CONTROLLER_CALL_ACTION_METHOD_NAME)
26
26
  .equals(:much_rails_call_action)
27
- assert_that(subject::CONTROLLER_NOT_FOUND_METHOD_NAME)
27
+ assert_that(subject.CONTROLLER_NOT_FOUND_METHOD_NAME)
28
28
  .equals(:much_rails_not_found)
29
- assert_that(subject::ACTION_CLASS_PARAM_NAME)
29
+ assert_that(subject.ACTION_CLASS_PARAM_NAME)
30
30
  .equals(:much_rails_action_class_name)
31
31
  assert_that(subject.url_class).equals(unit_class::URL)
32
32
  end
@@ -45,6 +45,12 @@ class MuchRails::Action::Router
45
45
  assert_that(router.url_set.fetch(:root).path).equals("/")
46
46
  end
47
47
 
48
+ should "eval the nested named routes file" do
49
+ router = unit_class.load("test/subrouter")
50
+ assert_that(router.url_set).is_not_empty
51
+ assert_that(router.url_set.fetch(:root).path).equals("/subrouter")
52
+ end
53
+
48
54
  should "complain if no file name given" do
49
55
  assert_that{ unit_class.load([nil, "", " "]) }.raises(ArgumentError)
50
56
  end
@@ -64,7 +70,7 @@ class MuchRails::Action::Router
64
70
 
65
71
  should "know its attributes" do
66
72
  assert_that(subject.controller_name)
67
- .equals(unit_class::DEFAULT_CONTROLLER_NAME)
73
+ .equals(unit_class.DEFAULT_CONTROLLER_NAME)
68
74
 
69
75
  router = unit_class.new(controller_name: controller_name1)
70
76
  assert_that(router.controller_name).equals(controller_name1)
@@ -99,13 +105,13 @@ class MuchRails::Action::Router
99
105
 
100
106
  expected_draw_url_to =
101
107
  "#{subject.controller_name}"\
102
- "##{unit_class::CONTROLLER_NOT_FOUND_METHOD_NAME}"
108
+ "##{unit_class.CONTROLLER_NOT_FOUND_METHOD_NAME}"
103
109
  expected_draw_route_to =
104
110
  "#{subject.controller_name}"\
105
- "##{unit_class::CONTROLLER_CALL_ACTION_METHOD_NAME}"
111
+ "##{unit_class.CONTROLLER_CALL_ACTION_METHOD_NAME}"
106
112
  expected_default_defaults =
107
113
  {
108
- unit_class::ACTION_CLASS_PARAM_NAME => default_class_name,
114
+ unit_class.ACTION_CLASS_PARAM_NAME => default_class_name,
109
115
  "format" => :html,
110
116
  }
111
117
 
@@ -117,7 +123,7 @@ class MuchRails::Action::Router
117
123
  as: url_name,
118
124
  defaults:
119
125
  {
120
- unit_class::ACTION_CLASS_PARAM_NAME => request_type_class_name,
126
+ unit_class.ACTION_CLASS_PARAM_NAME => request_type_class_name,
121
127
  "format" => :html,
122
128
  },
123
129
  constraints: request_type_proc,
@@ -212,12 +218,12 @@ class MuchRails::Action::Router
212
218
  should have_imeths :path_for, :url_for
213
219
 
214
220
  should "know its attributes" do
215
- path_string = subject.path_for(test: "args")
221
+ path_string = subject.path_for(test: "args", format: "html")
216
222
  assert_that(path_string).equals("TEST PATH OR URL STRING")
217
223
  assert_that(@rails_routes_method_missing_call.args)
218
224
  .equals(["#{url_name1}_path".to_sym, { test: "args" }])
219
225
 
220
- url_string = subject.url_for(test: "args")
226
+ url_string = subject.url_for(test: "args", format: "xml")
221
227
  assert_that(url_string).equals("TEST PATH OR URL STRING")
222
228
  assert_that(@rails_routes_method_missing_call.args)
223
229
  .equals(["#{url_name1}_url".to_sym, { test: "args" }])
@@ -20,7 +20,7 @@ class MuchRails::Action::UnprocessableEntityResult
20
20
  let(:controller1){ FakeController.new(params1) }
21
21
  let(:params1) do
22
22
  {
23
- MuchRails::Action::Router::ACTION_CLASS_PARAM_NAME => "Actions::Show",
23
+ MuchRails::Action::Router.ACTION_CLASS_PARAM_NAME => "Actions::Show",
24
24
  }
25
25
  end
26
26
  let(:errors1) do
@@ -176,11 +176,7 @@ module MuchRails::Action
176
176
  class InitTests < ReceiverTests
177
177
  desc "when init"
178
178
  subject do
179
- receiver_class.new(
180
- params: params1,
181
- current_session: current_session1,
182
- request: request1,
183
- )
179
+ receiver_class.new(params: params1, request: request1)
184
180
  end
185
181
 
186
182
  let(:receiver_class) do
@@ -203,7 +199,7 @@ module MuchRails::Action
203
199
  end
204
200
 
205
201
  if params[:fail_custom_validation]
206
- errors[:custom_validation] << "ERROR1"
202
+ errors["custom_validation"] << "ERROR1"
207
203
  end
208
204
  end
209
205
 
@@ -218,6 +214,10 @@ module MuchRails::Action
218
214
  on_after_call do
219
215
  @after_call_called = true
220
216
  end
217
+
218
+ def action_controller_session
219
+ controller_session
220
+ end
221
221
  end
222
222
  end
223
223
 
@@ -234,16 +234,41 @@ module MuchRails::Action
234
234
  active: "true",
235
235
  }
236
236
  end
237
- let(:current_session1){ "CURRENT SESSION 1" }
238
- let(:request1){ "REQUEST 1" }
237
+ let(:request1){ FakeRequest.new }
239
238
 
240
- should have_readers :params, :current_session, :request, :errors
239
+ should have_readers :params, :request, :errors
240
+ should have_writers :controller_session
241
241
  should have_imeths :on_call, :valid_action?, :successful_action?
242
242
 
243
243
  should "know its attributes" do
244
244
  assert_that(subject.params).equals(params1.with_indifferent_access)
245
- assert_that(subject.current_session).equals(current_session1)
246
245
  assert_that(subject.request).equals(request1)
246
+ assert_that(subject.action_controller_session).is_a(FakeSession)
247
+
248
+ receiver = receiver_class.new(params: params1)
249
+ assert_that(receiver.action_controller_session).is_nil
250
+
251
+ controller_session = FakeRequest.new
252
+ receiver.controller_session = controller_session
253
+ assert_that(receiver.action_controller_session).is(controller_session)
254
+
255
+ receiver =
256
+ receiver_class.new(params: params1, request: FakeRequestWithNoEnv.new)
257
+ assert_that(receiver.action_controller_session).is_nil
258
+
259
+ receiver =
260
+ receiver_class.new(
261
+ params: params1,
262
+ request: FakeRequestWithNoControllerInstance.new,
263
+ )
264
+ assert_that(receiver.action_controller_session).is_nil
265
+
266
+ receiver =
267
+ receiver_class.new(
268
+ params: params1,
269
+ request: FakeRequestWithNoControllerInstance.new,
270
+ )
271
+ assert_that(receiver.action_controller_session).is_nil
247
272
  end
248
273
 
249
274
  should "return the expected Result" do
@@ -409,4 +434,31 @@ module MuchRails::Action
409
434
  assert_that(result.errors[:custom_validation]).includes("ERROR1")
410
435
  end
411
436
  end
437
+
438
+ class FakeController
439
+ def session
440
+ FakeSession.new
441
+ end
442
+ end
443
+
444
+ class FakeSession
445
+ end
446
+
447
+ class FakeRequest
448
+ def env
449
+ { "action_controller.instance" => FakeController.new }
450
+ end
451
+ end
452
+
453
+ class FakeRequestWithNoControllerInstance
454
+ def env
455
+ { "action_controller.instance" => nil }
456
+ end
457
+ end
458
+
459
+ class FakeRequestWithNoEnv
460
+ def env
461
+ nil
462
+ end
463
+ end
412
464
  end
@@ -64,19 +64,27 @@ class MuchRails::ChangeActionResult
64
64
  class ValidationMethodsTests < UnitTests
65
65
  desc "validation methods"
66
66
  subject do
67
- unit_class.failure(validation_errors: {
68
- name: ["NAME ERROR"],
69
- other: ["OTHER ERROR"],
70
- })
67
+ unit_class.failure(
68
+ validation_errors: {
69
+ name: ["NAME ERROR"],
70
+ other: ["OTHER ERROR"],
71
+ empty: [],
72
+ none: nil,
73
+ },
74
+ )
71
75
  end
72
76
 
73
77
  should "know its attributes" do
74
78
  # validation_errors
75
79
  assert_that(subject.validation_errors)
76
80
  .equals({
77
- name: ["NAME ERROR"],
78
- other: ["OTHER ERROR"],
81
+ "name" => ["NAME ERROR"],
82
+ "other" => ["OTHER ERROR"],
83
+ "empty" => [],
84
+ "none" => [nil],
79
85
  })
86
+ assert_that(subject.validation_errors[:name]).equals(["NAME ERROR"])
87
+ assert_that(subject.validation_errors["name"]).equals(["NAME ERROR"])
80
88
 
81
89
  # validation_error_messages
82
90
  assert_that(subject.validation_error_messages)
@@ -88,8 +96,14 @@ class MuchRails::ChangeActionResult
88
96
  # extract_validation_error
89
97
  assert_that(subject.extract_validation_error(:name))
90
98
  .equals(["NAME ERROR"])
91
- assert_that(subject.extract_validation_error(:other))
99
+ assert_that(subject.extract_validation_error("other"))
92
100
  .equals(["OTHER ERROR"])
101
+ assert_that(subject.extract_validation_error(:empty))
102
+ .equals([])
103
+ assert_that(subject.extract_validation_error("none"))
104
+ .equals([])
105
+ assert_that(subject.extract_validation_error(:unknown))
106
+ .equals([])
93
107
  assert_that(subject.validation_errors).is_empty
94
108
 
95
109
  # any_unextracted_validation_errors?
@@ -57,14 +57,7 @@ module MuchRails::ChangeAction
57
57
 
58
58
  class InitTests < ReceiverTests
59
59
  desc "when init"
60
- subject{ receiver_class.new(params: {}) }
61
- subject do
62
- receiver_class.new(
63
- params: {},
64
- current_session: nil,
65
- request: nil,
66
- )
67
- end
60
+ subject{ receiver_class.new(params: {}, request: nil) }
68
61
 
69
62
  setup do
70
63
  Assert.stub(subject, :any_unextracted_change_result_validation_errors?) do
@@ -84,13 +77,7 @@ module MuchRails::ChangeAction
84
77
 
85
78
  class RecordErrorsWithResultExceptionTests < InitTests
86
79
  desc "with record errors and a result exception"
87
- subject do
88
- receiver_class.new(
89
- params: {},
90
- current_session: nil,
91
- request: nil,
92
- )
93
- end
80
+ subject{ receiver_class.new(params: {}, request: nil) }
94
81
 
95
82
  setup do
96
83
  Assert.stub(subject, :any_unextracted_change_result_validation_errors?) do
@@ -118,13 +105,7 @@ module MuchRails::ChangeAction
118
105
 
119
106
  class RecordErrorsWithNoResultExceptionTests < InitTests
120
107
  desc "with record errors and no result exception"
121
- subject do
122
- receiver_class.new(
123
- params: {},
124
- current_session: nil,
125
- request: nil,
126
- )
127
- end
108
+ subject{ receiver_class.new(params: {}, request: nil) }
128
109
 
129
110
  setup do
130
111
  Assert.stub(subject, :any_unextracted_change_result_validation_errors?) do
@@ -149,13 +130,7 @@ module MuchRails::ChangeAction
149
130
 
150
131
  class ChangeResultMethodTests < InitTests
151
132
  desc "#change_result method"
152
- subject do
153
- receiver_class.new(
154
- params: {},
155
- current_session: nil,
156
- request: nil,
157
- )
158
- end
133
+ subject{ receiver_class.new(params: {}, request: nil) }
159
134
 
160
135
  should "memoize and return the expected Result" do
161
136
  result = subject.change_result
@@ -178,13 +153,7 @@ module MuchRails::ChangeAction
178
153
 
179
154
  class AnyUnextractedChangeResultValidationErrorsMethodTests < ReceiverTests
180
155
  desc "#any_unextracted_change_result_validation_errors? method"
181
- subject do
182
- receiver_class.new(
183
- params: {},
184
- current_session: nil,
185
- request: nil,
186
- )
187
- end
156
+ subject{ receiver_class.new(params: {}, request: nil) }
188
157
 
189
158
  let(:receiver_class) do
190
159
  Class.new do
@@ -205,13 +174,7 @@ module MuchRails::ChangeAction
205
174
  class NoValidationErrorsTests <
206
175
  AnyUnextractedChangeResultValidationErrorsMethodTests
207
176
  desc "with no validation errors"
208
- subject do
209
- receiver_class.new(
210
- params: {},
211
- current_session: nil,
212
- request: nil,
213
- )
214
- end
177
+ subject{ receiver_class.new(params: {}, request: nil) }
215
178
 
216
179
  let(:receiver_class) do
217
180
  Class.new do
@@ -232,13 +195,7 @@ module MuchRails::ChangeAction
232
195
  class ValidationErrorsTests <
233
196
  AnyUnextractedChangeResultValidationErrorsMethodTests
234
197
  desc "with validation errors"
235
- subject do
236
- receiver_class.new(
237
- params: {},
238
- current_session: nil,
239
- request: nil,
240
- )
241
- end
198
+ subject{ receiver_class.new(params: {}, request: nil) }
242
199
 
243
200
  let(:receiver_class) do
244
201
  Class.new do
@@ -50,13 +50,7 @@ module MuchRails::DestroyAction
50
50
 
51
51
  class InitTests < ReceiverTests
52
52
  desc "when init"
53
- subject do
54
- receiver_class.new(
55
- params: {},
56
- current_session: nil,
57
- request: nil,
58
- )
59
- end
53
+ subject{ receiver_class.new(params: {}, request: nil) }
60
54
 
61
55
  should have_imeths :destroy_result
62
56
 
@@ -73,6 +73,7 @@ module MuchRails::DestroyService
73
73
  RuntimeError.new(Factory.string),
74
74
  ArgumentError.new(Factory.string),
75
75
  MuchRails::Records::DestructionInvalid.new(FakeRecord.new),
76
+ MuchRails::InvalidError.new,
76
77
  ]
77
78
  end
78
79
  let(:exception_classes){ exceptions.map(&:class) }
@@ -102,6 +103,8 @@ module MuchRails::DestroyService
102
103
  .is_an_instance_of(MuchRails::ServiceValidationErrors)
103
104
  assert_that(subject.service_validation_errors.exception_classes)
104
105
  .includes(MuchRails::Records::DestructionInvalid)
106
+ assert_that(subject.service_validation_errors.exception_classes)
107
+ .includes(MuchRails::InvalidError)
105
108
  end
106
109
  end
107
110
 
@@ -185,6 +188,22 @@ module MuchRails::DestroyService
185
188
  end
186
189
  end
187
190
 
191
+ class ValidationErrorsResultForInvalidErrorTests < ValidationErrorsTests
192
+ desc "when .result_for is passed an MuchRails::InvalidError"
193
+
194
+ let(:exception){ MuchRails::InvalidError.new }
195
+
196
+ should "return a failure result with the record and validation errors" do
197
+ result = subject.result_for(exception)
198
+
199
+ assert_that(result.failure?).is_true
200
+ assert_that(result.exception).equals(exception)
201
+ assert_that(result.validation_errors).equals(exception.errors)
202
+ assert_that(result.validation_error_messages)
203
+ .equals(exception.error_messages)
204
+ end
205
+ end
206
+
188
207
  class FailureResultTests < UnitTests
189
208
  desc "FailureResult"
190
209
  subject{ unit_class::FailureResult }
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "assert"
4
+ require "much-rails/invalid_error"
5
+
6
+ class MuchRails::InvalidError
7
+ class UnitTests < Assert::Context
8
+ desc "MuchRails::InvalidError"
9
+ subject{ unit_class }
10
+
11
+ let(:unit_class){ MuchRails::InvalidError }
12
+
13
+ should "be configured as expected" do
14
+ assert_that(subject < StandardError).is_true
15
+ end
16
+ end
17
+
18
+ class InitSetupTests < UnitTests
19
+ desc "when init"
20
+ subject{ unit_class.new }
21
+
22
+ should have_readers :errors
23
+ should have_imeths :error_messages
24
+
25
+ should "know its attributes" do
26
+ assert_that(subject.backtrace).is_nil
27
+ assert_that(subject.errors).equals({})
28
+ assert_that(subject.message).equals(subject.errors.inspect)
29
+ assert_that(subject.error_messages).equals([])
30
+
31
+ backtrace = Array.new(Factory.integer(3)){ Factory.path }
32
+ errors =
33
+ {
34
+ field1: ["ERROR 1A", "ERROR 2B"],
35
+ field2: "ERROR 2A",
36
+ }
37
+ exception = unit_class.new(backtrace: backtrace, **errors)
38
+ assert_that(exception.backtrace).equals(backtrace)
39
+ assert_that(exception.errors).equals(errors)
40
+ assert_that(exception.message).equals(exception.errors.inspect)
41
+ assert_that(exception.error_messages)
42
+ .equals(["field1: ERROR 1A and ERROR 2B", "field2: ERROR 2A"])
43
+ end
44
+ end
45
+ end
@@ -50,13 +50,7 @@ module MuchRails::SaveAction
50
50
 
51
51
  class InitTests < ReceiverTests
52
52
  desc "when init"
53
- subject do
54
- receiver_class.new(
55
- params: {},
56
- current_session: nil,
57
- request: nil,
58
- )
59
- end
53
+ subject{ receiver_class.new(params: {}, request: nil) }
60
54
 
61
55
  should have_imeths :save_result
62
56
 
@@ -73,6 +73,7 @@ module MuchRails::SaveService
73
73
  RuntimeError.new(Factory.string),
74
74
  ArgumentError.new(Factory.string),
75
75
  ActiveRecord::RecordInvalid.new(FakeRecord.new),
76
+ MuchRails::InvalidError.new,
76
77
  ]
77
78
  end
78
79
  let(:exception_classes){ exceptions.map(&:class) }
@@ -102,6 +103,8 @@ module MuchRails::SaveService
102
103
  .is_an_instance_of(MuchRails::ServiceValidationErrors)
103
104
  assert_that(subject.service_validation_errors.exception_classes)
104
105
  .includes(ActiveRecord::RecordInvalid)
106
+ assert_that(subject.service_validation_errors.exception_classes)
107
+ .includes(MuchRails::InvalidError)
105
108
  end
106
109
  end
107
110
 
@@ -197,6 +200,22 @@ module MuchRails::SaveService
197
200
  end
198
201
  end
199
202
 
203
+ class ValidationErrorsResultForInvalidErrorTests < ValidationErrorsTests
204
+ desc "when .result_for is passed an MuchRails::InvalidError"
205
+
206
+ let(:exception){ MuchRails::InvalidError.new }
207
+
208
+ should "return a failure result with the record and validation errors" do
209
+ result = subject.result_for(exception)
210
+
211
+ assert_that(result.failure?).is_true
212
+ assert_that(result.exception).equals(exception)
213
+ assert_that(result.validation_errors).equals(exception.errors)
214
+ assert_that(result.validation_error_messages)
215
+ .equals(exception.error_messages)
216
+ end
217
+ end
218
+
200
219
  class FailureResultTests < UnitTests
201
220
  desc "FailureResult"
202
221
  subject{ unit_class::FailureResult }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: much-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.7
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kelly Redding
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-04-12 00:00:00.000000000 Z
12
+ date: 2021-06-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: much-style-guide
@@ -105,14 +105,14 @@ dependencies:
105
105
  requirements:
106
106
  - - "~>"
107
107
  - !ruby/object:Gem::Version
108
- version: 0.15.2
108
+ version: 0.15.3
109
109
  type: :runtime
110
110
  prerelease: false
111
111
  version_requirements: !ruby/object:Gem::Requirement
112
112
  requirements:
113
113
  - - "~>"
114
114
  - !ruby/object:Gem::Version
115
- version: 0.15.2
115
+ version: 0.15.3
116
116
  - !ruby/object:Gem::Dependency
117
117
  name: dassets-erubi
118
118
  requirement: !ruby/object:Gem::Requirement
@@ -277,6 +277,7 @@ files:
277
277
  - lib/much-rails/destroy_service.rb
278
278
  - lib/much-rails/has_slug.rb
279
279
  - lib/much-rails/input_value.rb
280
+ - lib/much-rails/invalid_error.rb
280
281
  - lib/much-rails/json.rb
281
282
  - lib/much-rails/layout.rb
282
283
  - lib/much-rails/layout/helper.rb
@@ -304,6 +305,7 @@ files:
304
305
  - test/helper.rb
305
306
  - test/support/actions/show.rb
306
307
  - test/support/config/routes/test.rb
308
+ - test/support/config/routes/test/subrouter.rb
307
309
  - test/support/factory.rb
308
310
  - test/support/fake_action_controller.rb
309
311
  - test/system/.keep
@@ -333,6 +335,7 @@ files:
333
335
  - test/unit/destroy_service_tests.rb
334
336
  - test/unit/has_slug_tests.rb
335
337
  - test/unit/input_value_tests.rb
338
+ - test/unit/invalid_error_tests.rb
336
339
  - test/unit/json_tests.rb
337
340
  - test/unit/layout_tests.rb
338
341
  - test/unit/mixin_tests.rb
@@ -379,6 +382,7 @@ test_files:
379
382
  - test/helper.rb
380
383
  - test/support/actions/show.rb
381
384
  - test/support/config/routes/test.rb
385
+ - test/support/config/routes/test/subrouter.rb
382
386
  - test/support/factory.rb
383
387
  - test/support/fake_action_controller.rb
384
388
  - test/system/.keep
@@ -408,6 +412,7 @@ test_files:
408
412
  - test/unit/destroy_service_tests.rb
409
413
  - test/unit/has_slug_tests.rb
410
414
  - test/unit/input_value_tests.rb
415
+ - test/unit/invalid_error_tests.rb
411
416
  - test/unit/json_tests.rb
412
417
  - test/unit/layout_tests.rb
413
418
  - test/unit/mixin_tests.rb