much-rails 0.0.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -1
  3. data/lib/much-rails.rb +85 -0
  4. data/lib/much-rails/action.rb +415 -0
  5. data/lib/much-rails/action/base_command_result.rb +22 -0
  6. data/lib/much-rails/action/base_result.rb +14 -0
  7. data/lib/much-rails/action/base_router.rb +474 -0
  8. data/lib/much-rails/action/controller.rb +100 -0
  9. data/lib/much-rails/action/head_result.rb +18 -0
  10. data/lib/much-rails/action/redirect_to_result.rb +18 -0
  11. data/lib/much-rails/action/render_result.rb +25 -0
  12. data/lib/much-rails/action/router.rb +101 -0
  13. data/lib/much-rails/action/send_data_result.rb +18 -0
  14. data/lib/much-rails/action/send_file_result.rb +18 -0
  15. data/lib/much-rails/action/unprocessable_entity_result.rb +37 -0
  16. data/lib/much-rails/assets.rb +54 -0
  17. data/lib/much-rails/boolean.rb +7 -0
  18. data/lib/much-rails/call_method.rb +27 -0
  19. data/lib/much-rails/call_method_callbacks.rb +122 -0
  20. data/lib/much-rails/change_action.rb +83 -0
  21. data/lib/much-rails/change_action_result.rb +59 -0
  22. data/lib/much-rails/config.rb +55 -0
  23. data/lib/much-rails/date.rb +50 -0
  24. data/lib/much-rails/decimal.rb +7 -0
  25. data/lib/much-rails/destroy_action.rb +32 -0
  26. data/lib/much-rails/destroy_service.rb +67 -0
  27. data/lib/much-rails/has_slug.rb +7 -0
  28. data/lib/much-rails/input_value.rb +19 -0
  29. data/lib/much-rails/json.rb +29 -0
  30. data/lib/much-rails/layout.rb +142 -0
  31. data/lib/much-rails/layout/helper.rb +25 -0
  32. data/lib/much-rails/mixin.rb +7 -0
  33. data/lib/much-rails/not_given.rb +7 -0
  34. data/lib/much-rails/rails_routes.rb +29 -0
  35. data/lib/much-rails/railtie.rb +39 -0
  36. data/lib/much-rails/records.rb +5 -0
  37. data/lib/much-rails/records/always_destroyable.rb +30 -0
  38. data/lib/much-rails/records/not_destroyable.rb +30 -0
  39. data/lib/much-rails/records/validate_destroy.rb +92 -0
  40. data/lib/much-rails/result.rb +7 -0
  41. data/lib/much-rails/save_action.rb +32 -0
  42. data/lib/much-rails/save_service.rb +68 -0
  43. data/lib/much-rails/service.rb +18 -0
  44. data/lib/much-rails/service_validation_errors.rb +41 -0
  45. data/lib/much-rails/time.rb +28 -0
  46. data/lib/much-rails/version.rb +3 -1
  47. data/lib/much-rails/view_models.rb +3 -0
  48. data/lib/much-rails/view_models/breadcrumb.rb +11 -0
  49. data/lib/much-rails/wrap_and_call_method.rb +41 -0
  50. data/lib/much-rails/wrap_method.rb +45 -0
  51. data/much-rails.gemspec +20 -4
  52. data/test/helper.rb +20 -2
  53. data/test/support/actions/show.rb +11 -0
  54. data/test/support/config/routes/test.rb +3 -0
  55. data/test/support/factory.rb +2 -0
  56. data/test/support/fake_action_controller.rb +63 -0
  57. data/test/unit/action/base_command_result_tests.rb +43 -0
  58. data/test/unit/action/base_result_tests.rb +22 -0
  59. data/test/unit/action/base_router_tests.rb +530 -0
  60. data/test/unit/action/controller_tests.rb +110 -0
  61. data/test/unit/action/head_result_tests.rb +24 -0
  62. data/test/unit/action/redirect_to_result_tests.rb +24 -0
  63. data/test/unit/action/render_result_tests.rb +43 -0
  64. data/test/unit/action/router_tests.rb +252 -0
  65. data/test/unit/action/send_data_result_tests.rb +24 -0
  66. data/test/unit/action/send_file_result_tests.rb +24 -0
  67. data/test/unit/action/unprocessable_entity_result_tests.rb +51 -0
  68. data/test/unit/action_tests.rb +400 -0
  69. data/test/unit/assets_tests.rb +127 -0
  70. data/test/unit/boolean_tests.rb +17 -0
  71. data/test/unit/call_method_callbacks_tests.rb +176 -0
  72. data/test/unit/call_method_tests.rb +62 -0
  73. data/test/unit/change_action_result_tests.rb +113 -0
  74. data/test/unit/change_action_tests.rb +260 -0
  75. data/test/unit/config_tests.rb +68 -0
  76. data/test/unit/date_tests.rb +55 -0
  77. data/test/unit/decimal_tests.rb +17 -0
  78. data/test/unit/destroy_action_tests.rb +83 -0
  79. data/test/unit/destroy_service_tests.rb +238 -0
  80. data/test/unit/has_slug_tests.rb +17 -0
  81. data/test/unit/input_value_tests.rb +34 -0
  82. data/test/unit/json_tests.rb +55 -0
  83. data/test/unit/layout_tests.rb +155 -0
  84. data/test/unit/mixin_tests.rb +17 -0
  85. data/test/unit/much-rails_tests.rb +82 -4
  86. data/test/unit/not_given_tests.rb +17 -0
  87. data/test/unit/rails_routes_tests.rb +28 -0
  88. data/test/unit/records/always_destroyable_tests.rb +43 -0
  89. data/test/unit/records/not_destroyable_tests.rb +40 -0
  90. data/test/unit/records/validate_destroy_tests.rb +252 -0
  91. data/test/unit/result_tests.rb +17 -0
  92. data/test/unit/save_action_tests.rb +83 -0
  93. data/test/unit/save_service_tests.rb +264 -0
  94. data/test/unit/service_tests.rb +33 -0
  95. data/test/unit/service_validation_errors_tests.rb +107 -0
  96. data/test/unit/time_tests.rb +58 -0
  97. data/test/unit/view_models/breadcrumb_tests.rb +53 -0
  98. data/test/unit/wrap_and_call_method_tests.rb +163 -0
  99. data/test/unit/wrap_method_tests.rb +112 -0
  100. metadata +356 -7
  101. data/test/unit/.keep +0 -0
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "assert"
4
+ require "much-rails/assets"
5
+
6
+ module MuchRails::Assets
7
+ class UnitTests < Assert::Context
8
+ desc "MuchRails::Assets"
9
+ subject{ unit_class }
10
+
11
+ let(:unit_class){ MuchRails::Assets }
12
+
13
+ should have_imeths :configure_for_rails
14
+
15
+ should "be Dassets" do
16
+ assert_that(unit_class).is(Dassets)
17
+ end
18
+ end
19
+
20
+ class ConfigureTests < UnitTests
21
+ desc "when configured"
22
+
23
+ setup do
24
+ subject.reset
25
+
26
+ in_development_env = Factory.boolean
27
+ Assert.stub(FakeRails.env, :development?){ in_development_env }
28
+ Assert.stub(FakeRails.env, :test?){ !in_development_env }
29
+
30
+ Assert.stub_on_call(subject, :init) do |call|
31
+ @init_call = call
32
+ end
33
+
34
+ subject.configure_for_rails(FakeRails)
35
+ end
36
+
37
+ should "configure the fingerprint cache to use a memory cache" do
38
+ assert_that(subject.config.fingerprint_cache)
39
+ .is_instance_of(subject::MemCache)
40
+ end
41
+
42
+ should "configure the content cache to use a memory cache" do
43
+ assert_that(subject.config.content_cache)
44
+ .is_instance_of(subject::MemCache)
45
+ end
46
+
47
+ should "not configure a file store" do
48
+ assert_that(subject.config.file_store.root)
49
+ .is_not_equal_to(FakeRails.root.join("public"))
50
+ end
51
+
52
+ should "configure the app's app/assets folder as a source" do
53
+ source =
54
+ subject.config.sources.detect do |source|
55
+ source.path == FakeRails.root.join("app", "assets").to_s
56
+ end
57
+
58
+ assert_that(source).is_not_nil
59
+ assert_that(source.engines["js"].size).equals(1)
60
+ assert_that(source.engines["js"].first)
61
+ .is_instance_of(subject::Erubi::Engine)
62
+ assert_that(source.engines["scss"].size).equals(2)
63
+ assert_that(source.engines["scss"].first)
64
+ .is_instance_of(subject::Erubi::Engine)
65
+ assert_that(source.engines["scss"].last)
66
+ .is_instance_of(subject::Sass::Engine)
67
+ end
68
+
69
+ should "initialize itself" do
70
+ assert_that(@init_call).is_not_nil
71
+ end
72
+ end
73
+
74
+ class ConfigureNotInDevelopmentOrTestEnvsTests < UnitTests
75
+ desc "when configured not in development or test environments"
76
+
77
+ setup do
78
+ subject.reset
79
+
80
+ Assert.stub_on_call(subject, :init) do |call|
81
+ @init_call = call
82
+ end
83
+
84
+ subject.configure_for_rails(FakeRails)
85
+ end
86
+
87
+ should "configure the content cache to use no cache" do
88
+ assert_that(subject.config.content_cache)
89
+ .is_instance_of(subject::NoCache)
90
+ end
91
+
92
+ should "configure a file store for the app's public folder" do
93
+ assert_that(subject.config.file_store.root)
94
+ .equals(FakeRails.root.join("public"))
95
+ end
96
+ end
97
+
98
+ module FakeRails
99
+ def self.env
100
+ @env ||= FakeRailsEnv.new
101
+ end
102
+
103
+ def self.root
104
+ @root ||= FakeRailsRoot.new
105
+ end
106
+ end
107
+
108
+ class FakeRailsEnv
109
+ def development?
110
+ false
111
+ end
112
+
113
+ def test?
114
+ false
115
+ end
116
+ end
117
+
118
+ class FakeRailsRoot
119
+ def initialize
120
+ @root_path = Pathname.new(Factory.path)
121
+ end
122
+
123
+ def join(*args)
124
+ @root_path.join(File.join(*args))
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "assert"
4
+ require "much-rails/boolean"
5
+
6
+ class MuchRails::Boolean
7
+ class UnitTests < Assert::Context
8
+ desc "MuchRails::Boolean"
9
+ subject{ unit_class }
10
+
11
+ let(:unit_class){ MuchRails::Boolean }
12
+
13
+ should "be MuchBoolean" do
14
+ assert_that(unit_class).is(MuchBoolean)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,176 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "assert"
4
+ require "much-rails/call_method_callbacks"
5
+
6
+ module MuchRails::CallMethodCallbacks
7
+ class UnitTests < Assert::Context
8
+ desc "MuchRails::SaveService"
9
+ subject{ unit_class }
10
+
11
+ let(:unit_class){ MuchRails::CallMethodCallbacks }
12
+
13
+ should "include MuchRails::Mixin" do
14
+ assert_that(subject).includes(MuchRails::Mixin)
15
+ end
16
+ end
17
+
18
+ class ReceiverTests < UnitTests
19
+ desc "receiver"
20
+ subject{ receiver_class }
21
+
22
+ let(:receiver_class) do
23
+ Class.new do
24
+ include MuchRails::CallMethodCallbacks
25
+
26
+ attr_reader :values
27
+
28
+ def initialize
29
+ @values = []
30
+ end
31
+ end
32
+ end
33
+
34
+ let(:proc1){ ->{} }
35
+ let(:proc2){ ->{} }
36
+ let(:proc3){ ->{} }
37
+
38
+ should have_imeths :before_call, :prepend_before_call, :after_call
39
+ should have_imeths :prepend_after_call, :around_call, :prepend_around_call
40
+ should have_imeths :call
41
+
42
+ should "be configured as expected" do
43
+ assert_that(subject).includes(MuchRails::CallMethod)
44
+ assert_that(subject).includes(MuchRails::Config)
45
+ end
46
+
47
+ should "know its attributes" do
48
+ # before_callbacks
49
+ subject.before_call(&proc1)
50
+
51
+ assert_that{ subject.before_call(&proc2) }
52
+ .changes(
53
+ "subject.much_rails_call_callbacks_config.before_callbacks.dup",
54
+ from: [proc1],
55
+ to: [proc1, proc2],
56
+ )
57
+
58
+ assert_that{ subject.prepend_before_call(&proc3) }
59
+ .changes(
60
+ "subject.much_rails_call_callbacks_config.before_callbacks.dup",
61
+ from: [proc1, proc2],
62
+ to: [proc3, proc1, proc2],
63
+ )
64
+
65
+ # after_callbacks
66
+ subject.after_call(&proc1)
67
+
68
+ assert_that{ subject.after_call(&proc2) }
69
+ .changes(
70
+ "subject.much_rails_call_callbacks_config.after_callbacks.dup",
71
+ from: [proc1],
72
+ to: [proc1, proc2],
73
+ )
74
+
75
+ assert_that{ subject.prepend_after_call(&proc3) }
76
+ .changes(
77
+ "subject.much_rails_call_callbacks_config.after_callbacks.dup",
78
+ from: [proc1, proc2],
79
+ to: [proc3, proc1, proc2],
80
+ )
81
+
82
+ # around_callbacks
83
+ subject.around_call(&proc1)
84
+
85
+ assert_that{ subject.around_call(&proc2) }
86
+ .changes(
87
+ "subject.much_rails_call_callbacks_config.around_callbacks.dup",
88
+ from: [proc1],
89
+ to: [proc1, proc2],
90
+ )
91
+
92
+ assert_that{ subject.prepend_around_call(&proc3) }
93
+ .changes(
94
+ "subject.much_rails_call_callbacks_config.around_callbacks.dup",
95
+ from: [proc1, proc2],
96
+ to: [proc3, proc1, proc2],
97
+ )
98
+ end
99
+ end
100
+
101
+ class CallMethodTests < ReceiverTests
102
+ desc "#call"
103
+ subject{ receiver_class }
104
+
105
+ setup do
106
+ subject.before_call do
107
+ @values << "before 2"
108
+ true
109
+ end
110
+ subject.prepend_before_call do
111
+ @values << "before 1"
112
+ true
113
+ end
114
+ subject.around_call do |receiver|
115
+ @values << "start around 2"
116
+ receiver.call
117
+ @values << "end around 2"
118
+ true
119
+ end
120
+ subject.prepend_around_call do |receiver|
121
+ @values << "start around 1"
122
+ receiver.call
123
+ @values << "end around 1"
124
+ true
125
+ end
126
+ subject.after_call do
127
+ @values << "after 2"
128
+ true
129
+ end
130
+ subject.prepend_after_call do
131
+ @values << "after 1"
132
+ true
133
+ end
134
+
135
+ subject.class_eval do
136
+ def on_call
137
+ @values << "on call"
138
+ self
139
+ end
140
+ end
141
+ end
142
+
143
+ should "execute its callbacks" do
144
+ return_value = subject.call
145
+
146
+ assert_that(return_value).is_instance_of(receiver_class)
147
+ assert_that(return_value.values)
148
+ .equals([
149
+ "before 1",
150
+ "before 2",
151
+ "start around 1",
152
+ "start around 2",
153
+ "on call",
154
+ "end around 2",
155
+ "end around 1",
156
+ "after 1",
157
+ "after 2",
158
+ ])
159
+ end
160
+ end
161
+
162
+ class MuchRailsCallCallbacksConfigTests < UnitTests
163
+ desc "unit_class::MuchRailsCallCallbacksConfig"
164
+ subject{ config_class.new }
165
+
166
+ let(:config_class){ unit_class::MuchRailsCallCallbacksConfig }
167
+
168
+ should have_accessors :before_callbacks, :after_callbacks, :around_callbacks
169
+
170
+ should "know its attribute values" do
171
+ assert_that(subject.before_callbacks).equals([])
172
+ assert_that(subject.after_callbacks).equals([])
173
+ assert_that(subject.around_callbacks).equals([])
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "assert"
4
+ require "much-rails/call_method"
5
+
6
+ module MuchRails::CallMethodTest
7
+ class UnitTests < Assert::Context
8
+ desc "MuchRails::CallMethod"
9
+ subject{ unit_class }
10
+
11
+ let(:unit_class){ MuchRails::CallMethod }
12
+
13
+ should "include MuchRails::Mixin" do
14
+ assert_that(subject).includes(MuchRails::Mixin)
15
+ end
16
+ end
17
+
18
+ class ReceiverTests < UnitTests
19
+ desc "receiver"
20
+ subject{ receiver_class }
21
+
22
+ setup do
23
+ Assert.stub_tap(subject, :new) do |new_object|
24
+ @new_class_method_called = true
25
+
26
+ Assert.stub(new_object, :on_call) do
27
+ @on_call_instance_method_called = true
28
+ end
29
+ end
30
+ end
31
+
32
+ let(:receiver_class) do
33
+ Class.new do
34
+ include MuchRails::CallMethod
35
+ end
36
+ end
37
+
38
+ should have_imeths :call
39
+
40
+ should "call #new and #call" do
41
+ subject.call
42
+
43
+ assert_that(@new_class_method_called).is_true
44
+ assert_that(@on_call_instance_method_called).is_true
45
+ end
46
+ end
47
+
48
+ class ReceiverWithOnCallNotImplemented < UnitTests
49
+ desc "with the #on_call method not implemented"
50
+ subject{ receiver_class }
51
+
52
+ let(:receiver_class) do
53
+ Class.new do
54
+ include MuchRails::CallMethod
55
+ end
56
+ end
57
+
58
+ should "not implement its #call method" do
59
+ assert_that(->{ subject.call }).raises(NotImplementedError)
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "assert"
4
+ require "much-rails/change_action_result"
5
+
6
+ class MuchRails::ChangeActionResult
7
+ class UnitTests < Assert::Context
8
+ desc "MuchRails::ChangeActionResult"
9
+ subject{ unit_class }
10
+
11
+ let(:unit_class){ MuchRails::ChangeActionResult }
12
+
13
+ let(:value1){ "VALUE1" }
14
+
15
+ should have_imeths :success, :failure
16
+
17
+ should "know its attributes" do
18
+ result = unit_class.success(value: value1)
19
+
20
+ assert_that(result.success?).is_true
21
+ assert_that(result.failure?).is_false
22
+ assert_that(result.value).equals(value1)
23
+
24
+ result = unit_class.failure(value: value1)
25
+
26
+ assert_that(result.success?).is_false
27
+ assert_that(result.failure?).is_true
28
+ assert_that(result.value).equals(value1)
29
+ end
30
+ end
31
+
32
+ class InitTests < UnitTests
33
+ desc "when init"
34
+ subject{ unit_class.success(value: value1) }
35
+
36
+ let(:save_service_result) do
37
+ [
38
+ MuchRails::Result.success,
39
+ MuchRails::Result.failure,
40
+ ].sample
41
+ end
42
+
43
+ should have_readers :service_result
44
+
45
+ should have_imeths :validation_errors, :validation_error_messages
46
+ should have_imeths :extract_validation_error
47
+ should have_imeths :any_unextracted_validation_errors?
48
+
49
+ should "know its service_result" do
50
+ service_result = subject.service_result
51
+
52
+ assert_that(service_result).is_instance_of(MuchRails::Result)
53
+ assert_that(service_result.success?).is_true
54
+ assert_that(service_result.value).equals(value1)
55
+ assert_that(service_result.validation_errors).equals({})
56
+ end
57
+
58
+ should "raise a TypeError when given a non-MuchRails::Result" do
59
+ assert_that{ unit_class.new(["INVALID TYPE", nil, -9].sample) }
60
+ .raises(TypeError)
61
+ end
62
+ end
63
+
64
+ class ValidationMethodsTests < UnitTests
65
+ desc "validation methods"
66
+ subject do
67
+ unit_class.failure(validation_errors: {
68
+ name: ["NAME ERROR"],
69
+ other: ["OTHER ERROR"],
70
+ })
71
+ end
72
+
73
+ should "know its attributes" do
74
+ # validation_errors
75
+ assert_that(subject.validation_errors)
76
+ .equals({
77
+ name: ["NAME ERROR"],
78
+ other: ["OTHER ERROR"],
79
+ })
80
+
81
+ # validation_error_messages
82
+ assert_that(subject.validation_error_messages)
83
+ .equals([
84
+ "NAME ERROR",
85
+ "OTHER ERROR",
86
+ ])
87
+
88
+ # extract_validation_error
89
+ assert_that(subject.extract_validation_error(:name))
90
+ .equals(["NAME ERROR"])
91
+ assert_that(subject.extract_validation_error(:other))
92
+ .equals(["OTHER ERROR"])
93
+ assert_that(subject.validation_errors).is_empty
94
+
95
+ # any_unextracted_validation_errors?
96
+ Assert.stub(subject, :failure?){ true }
97
+ Assert.stub(subject, :validation_errors){ { name: "NAME ERROR" } }
98
+ assert_that(subject.any_unextracted_validation_errors?).is_true
99
+
100
+ Assert.stub(subject, :failure?){ true }
101
+ Assert.stub(subject, :validation_errors){ {} }
102
+ assert_that(subject.any_unextracted_validation_errors?).is_false
103
+
104
+ Assert.stub(subject, :failure?){ false }
105
+ Assert.stub(subject, :validation_errors){ { name: "NAME ERROR" } }
106
+ assert_that(subject.any_unextracted_validation_errors?).is_false
107
+
108
+ Assert.stub(subject, :failure?){ false }
109
+ Assert.stub(subject, :validation_errors){ {} }
110
+ assert_that(subject.any_unextracted_validation_errors?).is_false
111
+ end
112
+ end
113
+ end