aldous 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (212) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.irbrc +3 -0
  4. data/.rspec +3 -0
  5. data/.ruby-version +1 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +591 -0
  9. data/Rakefile +1 -0
  10. data/aldous.gemspec +24 -0
  11. data/examples/basic_todo/.foreman +1 -0
  12. data/examples/basic_todo/.gitignore +16 -0
  13. data/examples/basic_todo/.rspec +3 -0
  14. data/examples/basic_todo/.ruby-version +2 -0
  15. data/examples/basic_todo/Gemfile +52 -0
  16. data/examples/basic_todo/Procfile +1 -0
  17. data/examples/basic_todo/README.rdoc +28 -0
  18. data/examples/basic_todo/Rakefile +6 -0
  19. data/examples/basic_todo/app/assets/images/.keep +0 -0
  20. data/examples/basic_todo/app/assets/javascripts/application.js +13 -0
  21. data/examples/basic_todo/app/assets/stylesheets/application.css +15 -0
  22. data/examples/basic_todo/app/controller_actions/base_action.rb +24 -0
  23. data/examples/basic_todo/app/controller_actions/base_precondition.rb +2 -0
  24. data/examples/basic_todo/app/controller_actions/home_controller/show.rb +8 -0
  25. data/examples/basic_todo/app/controller_actions/shared/ensure_user_not_disabled_precondition.rb +9 -0
  26. data/examples/basic_todo/app/controller_actions/sign_ins_controller/create.rb +24 -0
  27. data/examples/basic_todo/app/controller_actions/sign_ins_controller/destroy.rb +9 -0
  28. data/examples/basic_todo/app/controller_actions/sign_ins_controller/new.rb +7 -0
  29. data/examples/basic_todo/app/controller_actions/sign_ins_controller/user_params.rb +9 -0
  30. data/examples/basic_todo/app/controller_actions/sign_ups_controller/create.rb +23 -0
  31. data/examples/basic_todo/app/controller_actions/sign_ups_controller/new.rb +7 -0
  32. data/examples/basic_todo/app/controller_actions/sign_ups_controller/user_params.rb +9 -0
  33. data/examples/basic_todo/app/controller_actions/todos/all_completed_controller/destroy.rb +17 -0
  34. data/examples/basic_todo/app/controller_actions/todos/completed_controller/create.rb +29 -0
  35. data/examples/basic_todo/app/controller_actions/todos_controller/create.rb +26 -0
  36. data/examples/basic_todo/app/controller_actions/todos_controller/destroy.rb +21 -0
  37. data/examples/basic_todo/app/controller_actions/todos_controller/edit.rb +19 -0
  38. data/examples/basic_todo/app/controller_actions/todos_controller/index.rb +19 -0
  39. data/examples/basic_todo/app/controller_actions/todos_controller/new.rb +17 -0
  40. data/examples/basic_todo/app/controller_actions/todos_controller/todo_params.rb +9 -0
  41. data/examples/basic_todo/app/controller_actions/todos_controller/update.rb +28 -0
  42. data/examples/basic_todo/app/controller_actions/users_controller/index.rb +19 -0
  43. data/examples/basic_todo/app/controllers/application_controller.rb +9 -0
  44. data/examples/basic_todo/app/controllers/home_controller.rb +5 -0
  45. data/examples/basic_todo/app/controllers/sign_ins_controller.rb +5 -0
  46. data/examples/basic_todo/app/controllers/sign_ups_controller.rb +5 -0
  47. data/examples/basic_todo/app/controllers/todos/all_completed_controller.rb +5 -0
  48. data/examples/basic_todo/app/controllers/todos/completed_controller.rb +5 -0
  49. data/examples/basic_todo/app/controllers/todos_controller.rb +5 -0
  50. data/examples/basic_todo/app/controllers/users_controller.rb +5 -0
  51. data/examples/basic_todo/app/helpers/application_helper.rb +2 -0
  52. data/examples/basic_todo/app/mailers/.keep +0 -0
  53. data/examples/basic_todo/app/models/ability.rb +27 -0
  54. data/examples/basic_todo/app/models/role.rb +5 -0
  55. data/examples/basic_todo/app/models/todo.rb +5 -0
  56. data/examples/basic_todo/app/models/user.rb +12 -0
  57. data/examples/basic_todo/app/models/user_role.rb +5 -0
  58. data/examples/basic_todo/app/services/create_user_service.rb +26 -0
  59. data/examples/basic_todo/app/services/find_current_user_service.rb +29 -0
  60. data/examples/basic_todo/app/services/sign_in_service.rb +13 -0
  61. data/examples/basic_todo/app/services/sign_out_service.rb +12 -0
  62. data/examples/basic_todo/app/views/base_view.rb +18 -0
  63. data/examples/basic_todo/app/views/defaults/bad_request.html.slim +12 -0
  64. data/examples/basic_todo/app/views/defaults/bad_request_view.rb +15 -0
  65. data/examples/basic_todo/app/views/defaults/forbidden.html.slim +6 -0
  66. data/examples/basic_todo/app/views/defaults/forbidden_view.rb +14 -0
  67. data/examples/basic_todo/app/views/defaults/server_error.html.slim +12 -0
  68. data/examples/basic_todo/app/views/defaults/server_error_view.rb +14 -0
  69. data/examples/basic_todo/app/views/home/show.html.slim +5 -0
  70. data/examples/basic_todo/app/views/home/show_redirect.rb +5 -0
  71. data/examples/basic_todo/app/views/home/show_view.rb +7 -0
  72. data/examples/basic_todo/app/views/layouts/application.html.slim +18 -0
  73. data/examples/basic_todo/app/views/modules/_header.html.slim +13 -0
  74. data/examples/basic_todo/app/views/modules/header_view.rb +7 -0
  75. data/examples/basic_todo/app/views/sign_ins/new.html.slim +14 -0
  76. data/examples/basic_todo/app/views/sign_ins/new_view.rb +10 -0
  77. data/examples/basic_todo/app/views/sign_ups/new.html.slim +13 -0
  78. data/examples/basic_todo/app/views/sign_ups/new_view.rb +10 -0
  79. data/examples/basic_todo/app/views/todos/edit.html.slim +14 -0
  80. data/examples/basic_todo/app/views/todos/edit_view.rb +10 -0
  81. data/examples/basic_todo/app/views/todos/index.html.slim +12 -0
  82. data/examples/basic_todo/app/views/todos/index_redirect.rb +5 -0
  83. data/examples/basic_todo/app/views/todos/index_view/_todo.html.slim +8 -0
  84. data/examples/basic_todo/app/views/todos/index_view/todo_view.rb +28 -0
  85. data/examples/basic_todo/app/views/todos/index_view.rb +26 -0
  86. data/examples/basic_todo/app/views/todos/new.html.slim +14 -0
  87. data/examples/basic_todo/app/views/todos/new_view.rb +10 -0
  88. data/examples/basic_todo/app/views/todos/not_found.html.slim +6 -0
  89. data/examples/basic_todo/app/views/todos/not_found_view.rb +15 -0
  90. data/examples/basic_todo/app/views/users/index.html.slim +7 -0
  91. data/examples/basic_todo/app/views/users/index_redirect.rb +5 -0
  92. data/examples/basic_todo/app/views/users/index_view/_user.html.slim +2 -0
  93. data/examples/basic_todo/app/views/users/index_view/user_view.rb +22 -0
  94. data/examples/basic_todo/app/views/users/index_view.rb +26 -0
  95. data/examples/basic_todo/bin/bundle +3 -0
  96. data/examples/basic_todo/bin/rails +8 -0
  97. data/examples/basic_todo/bin/rake +8 -0
  98. data/examples/basic_todo/bin/rspec +7 -0
  99. data/examples/basic_todo/bin/spring +15 -0
  100. data/examples/basic_todo/config/application.rb +41 -0
  101. data/examples/basic_todo/config/boot.rb +4 -0
  102. data/examples/basic_todo/config/database.yml +25 -0
  103. data/examples/basic_todo/config/environment.rb +5 -0
  104. data/examples/basic_todo/config/environments/development.rb +37 -0
  105. data/examples/basic_todo/config/environments/production.rb +78 -0
  106. data/examples/basic_todo/config/environments/test.rb +39 -0
  107. data/examples/basic_todo/config/initializers/aldous.rb +3 -0
  108. data/examples/basic_todo/config/initializers/assets.rb +8 -0
  109. data/examples/basic_todo/config/initializers/backtrace_silencers.rb +7 -0
  110. data/examples/basic_todo/config/initializers/cookies_serializer.rb +3 -0
  111. data/examples/basic_todo/config/initializers/filter_parameter_logging.rb +4 -0
  112. data/examples/basic_todo/config/initializers/inflections.rb +16 -0
  113. data/examples/basic_todo/config/initializers/mime_types.rb +4 -0
  114. data/examples/basic_todo/config/initializers/session_store.rb +3 -0
  115. data/examples/basic_todo/config/initializers/wrap_parameters.rb +14 -0
  116. data/examples/basic_todo/config/locales/en.yml +23 -0
  117. data/examples/basic_todo/config/routes.rb +18 -0
  118. data/examples/basic_todo/config/secrets.yml +22 -0
  119. data/examples/basic_todo/config.ru +4 -0
  120. data/examples/basic_todo/db/migrate/20150226035524_create_user.rb +10 -0
  121. data/examples/basic_todo/db/migrate/20150227004411_create_todo.rb +11 -0
  122. data/examples/basic_todo/db/migrate/20150301110126_roles.rb +22 -0
  123. data/examples/basic_todo/db/migrate/20150301121923_add_user_disabled_column.rb +5 -0
  124. data/examples/basic_todo/db/schema.rb +45 -0
  125. data/examples/basic_todo/db/seeds.rb +7 -0
  126. data/examples/basic_todo/lib/assets/.keep +0 -0
  127. data/examples/basic_todo/lib/tasks/.keep +0 -0
  128. data/examples/basic_todo/log/.keep +0 -0
  129. data/examples/basic_todo/public/404.html +67 -0
  130. data/examples/basic_todo/public/422.html +67 -0
  131. data/examples/basic_todo/public/500.html +66 -0
  132. data/examples/basic_todo/public/favicon.ico +0 -0
  133. data/examples/basic_todo/public/robots.txt +5 -0
  134. data/examples/basic_todo/test/controllers/.keep +0 -0
  135. data/examples/basic_todo/test/fixtures/.keep +0 -0
  136. data/examples/basic_todo/test/helpers/.keep +0 -0
  137. data/examples/basic_todo/test/integration/.keep +0 -0
  138. data/examples/basic_todo/test/mailers/.keep +0 -0
  139. data/examples/basic_todo/test/models/.keep +0 -0
  140. data/examples/basic_todo/test/test_helper.rb +10 -0
  141. data/examples/basic_todo/vendor/assets/javascripts/.keep +0 -0
  142. data/examples/basic_todo/vendor/assets/stylesheets/.keep +0 -0
  143. data/lib/aldous/build_respondable_service.rb +23 -0
  144. data/lib/aldous/configuration.rb +18 -0
  145. data/lib/aldous/controller/action/precondition/wrapper.rb +32 -0
  146. data/lib/aldous/controller/action/precondition.rb +52 -0
  147. data/lib/aldous/controller/action/result_execution_service.rb +27 -0
  148. data/lib/aldous/controller/action/wrapper.rb +34 -0
  149. data/lib/aldous/controller/action_execution_service.rb +42 -0
  150. data/lib/aldous/controller/preconditions_execution_service.rb +32 -0
  151. data/lib/aldous/controller.rb +21 -0
  152. data/lib/aldous/controller_action.rb +63 -0
  153. data/lib/aldous/dummy_error_reporter.rb +9 -0
  154. data/lib/aldous/dummy_logger.rb +8 -0
  155. data/lib/aldous/errors/user_error.rb +6 -0
  156. data/lib/aldous/logging_wrapper.rb +16 -0
  157. data/lib/aldous/params.rb +34 -0
  158. data/lib/aldous/respondable/base.rb +32 -0
  159. data/lib/aldous/respondable/headable.rb +30 -0
  160. data/lib/aldous/respondable/redirectable.rb +38 -0
  161. data/lib/aldous/respondable/renderable.rb +50 -0
  162. data/lib/aldous/respondable/request_http_basic_authentication.rb +23 -0
  163. data/lib/aldous/respondable/send_data.rb +36 -0
  164. data/lib/aldous/respondable/shared/flash.rb +24 -0
  165. data/lib/aldous/service/result/base/predicate_methods_for_inheritance.rb +44 -0
  166. data/lib/aldous/service/result/base.rb +13 -0
  167. data/lib/aldous/service/result/failure.rb +11 -0
  168. data/lib/aldous/service/result/success.rb +11 -0
  169. data/lib/aldous/service/wrapper.rb +48 -0
  170. data/lib/aldous/service.rb +34 -0
  171. data/lib/aldous/simple_dto.rb +47 -0
  172. data/lib/aldous/stdout_logger.rb +9 -0
  173. data/lib/aldous/version.rb +3 -0
  174. data/lib/aldous/view/blank/atom_view.rb +12 -0
  175. data/lib/aldous/view/blank/html_view.rb +16 -0
  176. data/lib/aldous/view/blank/json_view.rb +16 -0
  177. data/lib/aldous.rb +40 -0
  178. data/spec/aldous/build_respondable_service_spec.rb +48 -0
  179. data/spec/aldous/configuration_spec.rb +15 -0
  180. data/spec/aldous/controller/action/precondition/wrapper_spec.rb +48 -0
  181. data/spec/aldous/controller/action/precondition_spec.rb +81 -0
  182. data/spec/aldous/controller/action/result_execution_service_spec.rb +43 -0
  183. data/spec/aldous/controller/action/wrapper_spec.rb +46 -0
  184. data/spec/aldous/controller/action_execution_service_spec.rb +79 -0
  185. data/spec/aldous/controller/preconditions_execution_service_spec.rb +45 -0
  186. data/spec/aldous/controller_action_spec.rb +97 -0
  187. data/spec/aldous/controller_spec.rb +25 -0
  188. data/spec/aldous/dummy_error_reporter_spec.rb +10 -0
  189. data/spec/aldous/dummy_logger_spec.rb +7 -0
  190. data/spec/aldous/logging_wrapper_spec.rb +55 -0
  191. data/spec/aldous/params_spec.rb +39 -0
  192. data/spec/aldous/respondable/base_spec.rb +11 -0
  193. data/spec/aldous/respondable/headable/head_action_spec.rb +17 -0
  194. data/spec/aldous/respondable/headable_spec.rb +20 -0
  195. data/spec/aldous/respondable/redirectable/redirect_action_spec.rb +34 -0
  196. data/spec/aldous/respondable/redirectable_spec.rb +26 -0
  197. data/spec/aldous/respondable/renderable/render_action_spec.rb +34 -0
  198. data/spec/aldous/respondable/renderable_spec.rb +46 -0
  199. data/spec/aldous/respondable/request_http_basic_authentication_spec.rb +0 -0
  200. data/spec/aldous/respondable/send_data/send_data_action_spec.rb +15 -0
  201. data/spec/aldous/respondable/send_data_spec.rb +30 -0
  202. data/spec/aldous/respondable/shared/flash_spec.rb +30 -0
  203. data/spec/aldous/service/result/failure_spec.rb +11 -0
  204. data/spec/aldous/service/result/success_spec.rb +11 -0
  205. data/spec/aldous/service/wrapper_spec.rb +110 -0
  206. data/spec/aldous/service_spec.rb +101 -0
  207. data/spec/aldous/simple_dto_spec.rb +40 -0
  208. data/spec/aldous/view/blank/atom_view_spec.rb +15 -0
  209. data/spec/aldous/view/blank/html_view_spec.rb +15 -0
  210. data/spec/aldous/view/blank/json_view_spec.rb +15 -0
  211. data/spec/spec_helper.rb +26 -0
  212. metadata +330 -0
@@ -0,0 +1,45 @@
1
+ RSpec.describe Aldous::Controller::PreconditionsExecutionService do
2
+ let(:preconditions_execution_service) {described_class.new(action_wrapper, controller)}
3
+
4
+ let(:controller) {double "controller"}
5
+ let(:action_wrapper) {double 'action wrapper', preconditions: preconditions, controller_action: action}
6
+ let(:action) {double 'action'}
7
+
8
+ let(:preconditions) { [] }
9
+
10
+ describe "#perform" do
11
+ subject(:perform) {preconditions_execution_service.perform}
12
+
13
+ context "when no preconditions defined" do
14
+ it "returns an array of nils" do
15
+ expect(perform).to eq [nil, nil]
16
+ end
17
+ end
18
+
19
+ context "when preconditions defined" do
20
+ let(:preconditions) { [precondition_class] }
21
+ let(:precondition_class) {double 'precondition_class', build: precondition}
22
+ let(:precondition) {double "precondition", perform: nil}
23
+
24
+ it "builds the precondition with the controller_aciont" do
25
+ expect(precondition_class).to receive(:build).with(action)
26
+ perform
27
+ end
28
+
29
+ context "but they don't short-circuit execution" do
30
+ it "returns an array of nils" do
31
+ expect(perform).to eq [nil, nil]
32
+ end
33
+ end
34
+
35
+ context "and they short-circuit execution" do
36
+ let(:precondition) {double "precondition", perform: precondition_result}
37
+ let(:precondition_result) {Aldous::Respondable::Renderable.new(nil, nil, nil)}
38
+
39
+ it "returns an array of precondition and precondition result" do
40
+ expect(perform).to eq [precondition, precondition_result]
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,97 @@
1
+ RSpec.describe Aldous::ControllerAction do
2
+ before do
3
+ class ExampleControllerAction < Aldous::ControllerAction
4
+ end
5
+ end
6
+
7
+ after do
8
+ Object.send :remove_const, 'ExampleControllerAction'
9
+ end
10
+
11
+ let(:action) {ExampleControllerAction.new(controller)}
12
+
13
+ let(:controller) {double 'controller', view_context: view_context}
14
+ let(:view_context) {double "view_context"}
15
+
16
+ describe "::build" do
17
+ before do
18
+ allow(ExampleControllerAction).to receive(:new).and_return(action)
19
+ allow(Aldous::Controller::Action::Wrapper).to receive(:new)
20
+ end
21
+
22
+ it "wraps a controller action instance" do
23
+ expect(Aldous::Controller::Action::Wrapper).to receive(:new).with(action)
24
+ ExampleControllerAction.build(controller)
25
+ end
26
+ end
27
+
28
+ describe "::perform" do
29
+ let(:wrapper) {double "wrapper", perform: nil}
30
+
31
+ before do
32
+ allow(ExampleControllerAction).to receive(:new).and_return(action)
33
+ allow(Aldous::Controller::Action::Wrapper).to receive(:new).and_return(wrapper)
34
+ end
35
+
36
+ it "calls perform on the wrapper" do
37
+ expect(wrapper).to receive(:perform)
38
+ ExampleControllerAction.perform(controller)
39
+ end
40
+ end
41
+
42
+ describe "::inherited" do
43
+ context "a controller action instance" do
44
+ Aldous.configuration.controller_methods_exposed_to_action.each do |method_name|
45
+ it "responds to #{method_name}" do
46
+ expect(action).to respond_to method_name
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ describe "#perform" do
53
+ it "raises an error since it should be overridden" do
54
+ expect{action.perform}.to raise_error
55
+ end
56
+ end
57
+
58
+ describe "#default_view_data" do
59
+ it "is a blank hash by default" do
60
+ expect(action.default_view_data).to eq Hash.new
61
+ end
62
+ end
63
+
64
+ describe "#preconditions" do
65
+ it "is a blank array by default" do
66
+ expect(action.preconditions).to eq []
67
+ end
68
+ end
69
+
70
+ describe "#default_error_respondable" do
71
+ it "is a blank html view by default" do
72
+ expect(action.default_error_respondable).to eq Aldous::View::Blank::HtmlView
73
+ end
74
+ end
75
+
76
+ describe "#build_view" do
77
+ before do
78
+ allow(Aldous::BuildRespondableService).to receive(:new).with(
79
+ view_context: view_context,
80
+ default_view_data: Hash.new,
81
+ respondable_class: respondable_class,
82
+ status: nil,
83
+ extra_data: extra_data
84
+ ).and_return(build_respondable_service)
85
+ end
86
+
87
+ let(:respondable_class) {double "respondable_class"}
88
+ let(:extra_data) { {hello: 1} }
89
+
90
+ let(:build_respondable_service) {double "build_respondable_service", perform: nil}
91
+
92
+ it "executes the BuildRespondableService" do
93
+ expect(build_respondable_service).to receive(:perform)
94
+ action.build_view(respondable_class, extra_data)
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,25 @@
1
+ RSpec.describe Aldous::Controller do
2
+ before do
3
+ class ExampleController
4
+ include Aldous::Controller
5
+ end
6
+ end
7
+
8
+ describe "::controller_actions" do
9
+ before do
10
+ ExampleController.controller_actions(:hello, :world)
11
+ end
12
+
13
+ context "a controller instance" do
14
+ let(:controller) {ExampleController.new}
15
+
16
+ it "responds to :hello" do
17
+ expect(controller).to respond_to :hello
18
+ end
19
+
20
+ it "responds to :world" do
21
+ expect(controller).to respond_to :world
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,10 @@
1
+ RSpec.describe Aldous::DummyErrorReporter do
2
+ describe "::report" do
3
+ let(:error) {RuntimeError.new('blah')}
4
+ let(:data) { Hash.new }
5
+
6
+ it "responds to the report method correctly" do
7
+ expect(described_class.report(error, data)).to eq nil
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ RSpec.describe Aldous::DummyLogger do
2
+ describe "::info" do
3
+ it "responds to the info method correctly" do
4
+ expect(described_class.info('blah')).to eq nil
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,55 @@
1
+ RSpec.describe Aldous::LoggingWrapper do
2
+ describe "::log" do
3
+ subject(:log) {described_class.log(error)}
4
+ let(:error) {"hello world"}
5
+
6
+ let(:aldous_config) {
7
+ double "aldous_config", error_reporter: error_reporter, logger: logger
8
+ }
9
+ let(:error_reporter) {double "error_reporter", report: nil}
10
+ let(:logger) {double "logger", info: nil}
11
+
12
+ before do
13
+ allow(Aldous).to receive(:config).and_return(aldous_config)
14
+ end
15
+
16
+ context "when error is a string" do
17
+ let(:error) {"hello world"}
18
+
19
+ it "reports the error" do
20
+ expect(error_reporter).to receive(:report).with(error)
21
+ log
22
+ end
23
+
24
+ it "logs the error" do
25
+ expect(logger).to receive(:info).with(error)
26
+ log
27
+ end
28
+ end
29
+
30
+ context "when error is an error object" do
31
+ let(:error) {RuntimeError.new(message)}
32
+ let(:message) {"hello"}
33
+ let(:backtrace) {"foobar"}
34
+
35
+ before do
36
+ error.set_backtrace(backtrace)
37
+ end
38
+
39
+ it "reports the error message" do
40
+ expect(error_reporter).to receive(:report).with(error)
41
+ log
42
+ end
43
+
44
+ it "logs the error message" do
45
+ expect(logger).to receive(:info).with(message)
46
+ log
47
+ end
48
+
49
+ it "logs the error backtrace" do
50
+ expect(logger).to receive(:info).with(backtrace)
51
+ log
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,39 @@
1
+ RSpec.describe Aldous::Params do
2
+ describe "::build" do
3
+ it "instantiates a new params object" do
4
+ expect(described_class).to receive(:new)
5
+ described_class.build({})
6
+ end
7
+ end
8
+
9
+ describe "#fetch" do
10
+ let(:params_object) {described_class.new(params)}
11
+ let(:params) { {} }
12
+
13
+ context "when error occurs" do
14
+ before do
15
+ allow(params_object).to receive(:permitted_params).and_raise(RuntimeError.new)
16
+ allow(Aldous::LoggingWrapper).to receive(:log)
17
+ end
18
+
19
+ it "logs the error" do
20
+ expect(Aldous::LoggingWrapper).to receive(:log)
21
+ params_object.fetch
22
+ end
23
+
24
+ it "returns nil" do
25
+ expect(params_object.fetch).to be_nil
26
+ end
27
+ end
28
+
29
+ context "when no error occurs" do
30
+ before do
31
+ allow(params_object).to receive(:permitted_params).and_return('hello')
32
+ end
33
+
34
+ it "returns the permitted_params" do
35
+ expect(params_object.fetch).to eq 'hello'
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,11 @@
1
+ RSpec.describe Aldous::Respondable::Base do
2
+ let(:status) {:foo}
3
+ let(:view_data) {double("view_data")}
4
+ let(:view_context) {double("view context")}
5
+
6
+ describe "::new" do
7
+ it "object can be instantiated with the right params" do
8
+ expect{described_class.new(status, view_data, view_context)}.to_not raise_error
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ RSpec.describe Aldous::Respondable::Headable::HeadAction do
2
+ subject(:respondable) {described_class.new(controller, status)}
3
+
4
+ let(:controller) {double 'controller'}
5
+ let(:status) {'hello'}
6
+
7
+ before do
8
+ allow(controller).to receive(:head).with(status)
9
+ end
10
+
11
+ describe "#execute" do
12
+ it "calls head on controller with status" do
13
+ expect(controller).to receive(:head).with(status)
14
+ respondable.execute
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ RSpec.describe Aldous::Respondable::Headable do
2
+ subject(:headable) {described_class.new(status, view_data, view_context)}
3
+
4
+ let(:status) {:foo}
5
+ let(:view_data) {double("view_data")}
6
+ let(:view_context) {double("view context")}
7
+
8
+ describe "::action" do
9
+ let(:controller) {double("controller")}
10
+
11
+ it "returns a head response action object" do
12
+ expect(headable.action(controller)).to be_kind_of Aldous::Respondable::Headable::HeadAction
13
+ end
14
+
15
+ it 'creates a head response action with the relevant parameters' do
16
+ expect(Aldous::Respondable::Headable::HeadAction).to receive(:new).with(controller, status)
17
+ headable.action(controller)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,34 @@
1
+ RSpec.describe Aldous::Respondable::Redirectable::RedirectAction do
2
+ subject(:respondable) {described_class.new(location, controller, view_data, status)}
3
+
4
+ let(:location) {"hello"}
5
+ let(:controller) {double 'controller', redirect_to: nil, flash: flash }
6
+ let(:view_data) {"blah"}
7
+ let(:response_status) {'world'}
8
+ let(:status) { :found }
9
+
10
+ let(:flash) { double("flash") }
11
+ let(:flash_object) { instance_double Aldous::Respondable::Shared::Flash, set_error: nil }
12
+
13
+
14
+ describe "#execute" do
15
+ before do
16
+ allow(Aldous::Respondable::Shared::Flash).to receive(:new){ flash_object }
17
+ end
18
+
19
+ it "calls redirect_to on controller with the relevant options" do
20
+ expect(controller).to receive(:redirect_to).with(location, {status: status})
21
+ respondable.execute
22
+ end
23
+
24
+ it "tries to set flash" do
25
+ expect(Aldous::Respondable::Shared::Flash).to receive(:new).with(view_data, flash)
26
+ respondable.execute
27
+ end
28
+
29
+ it "calls set_error on flash object" do
30
+ expect(flash_object).to receive(:set_error)
31
+ respondable.execute
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,26 @@
1
+ RSpec.describe Aldous::Respondable::Redirectable do
2
+ class Aldous::Respondable::Redirectable::Dummy < described_class
3
+ def location
4
+ 'hello'
5
+ end
6
+ end
7
+
8
+ subject(:redirectable) {Aldous::Respondable::Redirectable::Dummy.new(status, view_data, view_context)}
9
+
10
+ let(:status) {:foo}
11
+ let(:view_data) {double("view_data")}
12
+ let(:view_context) {double("view context")}
13
+
14
+ describe "::action" do
15
+ let(:controller) {double("controller")}
16
+
17
+ it "returns a redirect response action object" do
18
+ expect(redirectable.action(controller)).to be_kind_of Aldous::Respondable::Redirectable::RedirectAction
19
+ end
20
+
21
+ it 'creates a redirect response action with the relevant parameters' do
22
+ expect(Aldous::Respondable::Redirectable::RedirectAction).to receive(:new).with(redirectable.location, controller, view_data, status)
23
+ redirectable.action(controller)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,34 @@
1
+ RSpec.describe Aldous::Respondable::Renderable::RenderAction do
2
+ subject(:respondable) {described_class.new(template, status, controller, view_data)}
3
+
4
+ let(:status) {:foo}
5
+ let(:template) { {hello: 'world'} }
6
+ let(:controller) {double 'controller', render: nil, flash: flash }
7
+ let(:view_data) {"blah"}
8
+ let(:response_status) {'world'}
9
+
10
+ let(:flash) { double("flash", now: flash_now) }
11
+ let(:flash_now) { double("flash_now") }
12
+ let(:flash_object) { instance_double Aldous::Respondable::Shared::Flash, set_error: nil }
13
+
14
+ describe "#execute" do
15
+ before do
16
+ allow(Aldous::Respondable::Shared::Flash).to receive(:new){ flash_object }
17
+ end
18
+
19
+ it "calls render on controller with the relevant options" do
20
+ expect(controller).to receive(:render).with(template.merge(status: status))
21
+ respondable.execute
22
+ end
23
+
24
+ it "tries to set flash" do
25
+ expect(Aldous::Respondable::Shared::Flash).to receive(:new).with(view_data, flash_now)
26
+ respondable.execute
27
+ end
28
+
29
+ it "calls set_error on flash object" do
30
+ expect(flash_object).to receive(:set_error)
31
+ respondable.execute
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,46 @@
1
+ RSpec.describe Aldous::Respondable::Renderable do
2
+ class Aldous::Respondable::Renderable::Dummy < described_class
3
+ def template_data
4
+ {
5
+ locals: {hello: 1}
6
+ }
7
+ end
8
+
9
+ def default_template_locals
10
+ {
11
+ hello: 2
12
+ }
13
+ end
14
+ end
15
+
16
+ subject(:renderable) {Aldous::Respondable::Renderable::Dummy.new(status, view_data, view_context)}
17
+
18
+ let(:status) {:foo}
19
+ let(:view_data) {double("view_data")}
20
+ let(:view_context) {double("view context")}
21
+
22
+ describe "#action" do
23
+ let(:controller) {double("controller")}
24
+
25
+ it "returns a render response action object" do
26
+ expect(renderable.action(controller)).to be_kind_of Aldous::Respondable::Renderable::RenderAction
27
+ end
28
+
29
+ it 'creates a redirect response action with the relevant parameters' do
30
+ expect(Aldous::Respondable::Renderable::RenderAction).to receive(:new).with(renderable.template, status, controller, view_data)
31
+ renderable.action(controller)
32
+ end
33
+ end
34
+
35
+ describe "#template" do
36
+ subject(:renderable) {Aldous::Respondable::Renderable::Dummy.new(status, view_data, view_context)}
37
+
38
+ it "overrides the default locals with the template locals" do
39
+ expect(renderable.template).to eq({locals: {hello: 1}})
40
+ end
41
+
42
+ it "overrides the template locals with the provided locals" do
43
+ expect(renderable.template(hello: 3)).to eq({locals: {hello: 3}})
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,15 @@
1
+ RSpec.describe Aldous::Respondable::SendData::SendDataAction do
2
+ subject(:respondable) {described_class.new(data, options, controller, result)}
3
+
4
+ let(:data) { 'hello' }
5
+ let(:options) {'world'}
6
+ let(:controller) {double 'controller', render: nil}
7
+ let(:result) {"blah"}
8
+
9
+ describe "#execute" do
10
+ it "calls render on controller with the relevant options" do
11
+ expect(controller).to receive(:send_data).with(data, options)
12
+ respondable.execute
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,30 @@
1
+ RSpec.describe Aldous::Respondable::SendData do
2
+ class Aldous::Respondable::SendData::Dummy < described_class
3
+ def data
4
+ 'hello'
5
+ end
6
+
7
+ def options
8
+ 'world'
9
+ end
10
+ end
11
+
12
+ subject(:send_data) {Aldous::Respondable::SendData::Dummy.new(status, view_data, view_context)}
13
+
14
+ let(:status) {:foo}
15
+ let(:view_data) {double("view_data")}
16
+ let(:view_context) {double("view context")}
17
+
18
+ describe "::action" do
19
+ let(:controller) {double("controller")}
20
+
21
+ it "returns a send_data response action object" do
22
+ expect(send_data.action(controller)).to be_kind_of Aldous::Respondable::SendData::SendDataAction
23
+ end
24
+
25
+ it 'creates a send_data response action with the relevant parameters' do
26
+ expect(Aldous::Respondable::SendData::SendDataAction).to receive(:new).with(send_data.data, send_data.options, controller, view_data)
27
+ send_data.action(controller)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ RSpec.describe Aldous::Respondable::Shared::Flash do
2
+ let(:flash) {described_class.new(result, flash_container)}
3
+
4
+ let(:controller) {double 'controller', flash: flash_container}
5
+ let(:result) {double 'result', errors: errors}
6
+ let(:errors) {['1', '2']}
7
+ let(:flash_container) {double 'flash container', now: flash_now}
8
+ let(:flash_now) { {} }
9
+
10
+ describe "#set_error" do
11
+ context "when errors exist" do
12
+ let(:flash_container) { {} }
13
+
14
+ it "sets the error on the flash container" do
15
+ flash.set_error
16
+ expect(flash_container[:error]).to eq '1'
17
+ end
18
+ end
19
+
20
+ context "when errors don't exist" do
21
+ let(:errors) {[]}
22
+ let(:flash_container) { {} }
23
+
24
+ it "doesn't set the error on the flash container" do
25
+ flash.set_error
26
+ expect(flash_container[:error]).to eq nil
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,11 @@
1
+ RSpec.describe Aldous::Service::Result::Failure do
2
+ subject(:result) {described_class.new}
3
+
4
+ describe "#failure?" do
5
+ it {expect(result.failure?).to eq true}
6
+ end
7
+
8
+ describe "#success?" do
9
+ it {expect(result.success?).to eq false}
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ RSpec.describe Aldous::Service::Result::Success do
2
+ subject(:result) {described_class.new}
3
+
4
+ describe "#failure?" do
5
+ it {expect(result.failure?).to eq false}
6
+ end
7
+
8
+ describe "#success?" do
9
+ it {expect(result.success?).to eq true}
10
+ end
11
+ end