rails_ops 1.4.3 → 1.4.4
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 +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +7 -1
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/lib/generators/operation/operation_generator.rb +4 -4
- data/lib/rails_ops/hookup/dsl_validator.rb +1 -1
- data/lib/rails_ops/hookup.rb +1 -1
- data/lib/rails_ops/mixins/sub_ops.rb +2 -0
- data/lib/rails_ops/operation.rb +1 -1
- data/rails_ops.gemspec +6 -5
- data/test/dummy/app/controllers/group_controller.rb +28 -0
- data/test/dummy/app/models/ability.rb +7 -0
- data/test/dummy/app/models/animal.rb +5 -1
- data/test/dummy/app/models/bird.rb +3 -1
- data/test/dummy/app/models/phoenix.rb +3 -1
- data/test/dummy/config/environments/development.rb +2 -0
- data/test/dummy/config/environments/production.rb +2 -0
- data/test/dummy/config/hookup.rb +5 -0
- data/test/dummy/config/routes.rb +1 -0
- data/test/test_helper.rb +5 -0
- data/test/unit/rails_ops/hookup_test.rb +82 -0
- data/test/unit/rails_ops/mixins/controller_test.rb +21 -0
- data/test/unit/rails_ops/mixins/model/deep_nesting_test.rb +62 -2
- data/test/unit/rails_ops/mixins/model/marshalling_test.rb +36 -0
- data/test/unit/rails_ops/operation/auth_test.rb +120 -0
- data/test/unit/rails_ops/operation/model/destroy_test.rb +31 -0
- data/test/unit/rails_ops/operation/model/load_test.rb +9 -0
- data/test/unit/rails_ops/operation/model_test.rb +24 -0
- data/test/unit/rails_ops/operation_test.rb +121 -0
- data/test/unit/rails_ops/profiler_test.rb +11 -0
- metadata +35 -5
- data/test/unit/rails_ops/operation/update_auth_test.rb +0 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c18eddf15b9f713101e8cd2e783c01bffb0c664ea1e76b497c6a4ae0ff07eae
|
4
|
+
data.tar.gz: 4f4d8e61f2d3de18e6215417016de13251625c2fa238b78a37bf52c629cb2ede
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88f1d0f750f1bd794962984fa2d4e8fb37c71456e00ef8a7b795cc5fc08a748e57f1757b7bd61e8a7db9e2b76a42bae6e4ab3047568a36288a15c6cde2953aad
|
7
|
+
data.tar.gz: 11432ac0dd217407e7f3209b9201d7d408746db1d4c7d813dec706ce42b3c893551f5bfeda81e454dd8daaa459811ab01e71239e33af26c0bbfe5f6eedf022ad
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.4.4 (2023-07-10)
|
4
|
+
|
5
|
+
* Adapt method `sub_op` to catch `<op-class>.validation_errors` and re-throw
|
6
|
+
them as `RailsOps::Exceptions::SubOpValidationFailed`.
|
7
|
+
|
3
8
|
## 1.4.3 (2023-03-27)
|
4
9
|
|
5
10
|
* Extend the `operation` generator to accept additional flags to skip the
|
@@ -32,7 +37,8 @@
|
|
32
37
|
|
33
38
|
### Upgrading
|
34
39
|
|
35
|
-
Please see #33 for more information
|
40
|
+
Please see [#33](https://github.com/sitrox/rails_ops/issues/33) for more information
|
41
|
+
on this change. If all of your operations
|
36
42
|
follow the standard naming conventions (e.g. `Operations::User::Update` for
|
37
43
|
updating a model named `User`), no changes will be necessary. If you don't, you
|
38
44
|
may need to manually specify a `param_key` when using nested model operations
|
data/Rakefile
CHANGED
@@ -24,6 +24,7 @@ task :gemspec do
|
|
24
24
|
spec.add_development_dependency 'colorize'
|
25
25
|
spec.add_development_dependency 'rubocop', '1.45.1'
|
26
26
|
spec.add_development_dependency 'sprockets-rails'
|
27
|
+
spec.add_development_dependency 'simplecov'
|
27
28
|
spec.add_dependency 'active_type', '>= 1.3.0'
|
28
29
|
spec.add_dependency 'minitest'
|
29
30
|
spec.add_dependency 'rails'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.4.
|
1
|
+
1.4.4
|
@@ -52,16 +52,16 @@ class OperationGenerator < Rails::Generators::NamedBase
|
|
52
52
|
|
53
53
|
operations_path += @underscored_name.to_s
|
54
54
|
|
55
|
-
|
55
|
+
unless @excluded_actions.include?(:show)
|
56
56
|
template 'load.erb', "#{operations_path}/load.rb"
|
57
57
|
end
|
58
|
-
|
58
|
+
unless @excluded_actions.include?(:create)
|
59
59
|
template 'create.erb', "#{operations_path}/create.rb"
|
60
60
|
end
|
61
|
-
|
61
|
+
unless @excluded_actions.include?(:update)
|
62
62
|
template 'update.erb', "#{operations_path}/update.rb"
|
63
63
|
end
|
64
|
-
|
64
|
+
unless @excluded_actions.include?(:destroy)
|
65
65
|
template 'destroy.erb', "#{operations_path}/destroy.rb"
|
66
66
|
end
|
67
67
|
end
|
@@ -10,7 +10,7 @@ class RailsOps::Hookup::DSLValidator
|
|
10
10
|
def validate!
|
11
11
|
# Check infinity loop
|
12
12
|
if target_hooks.any? { |name, targets| recursion?(targets, name) }
|
13
|
-
fail
|
13
|
+
fail SystemStackError.new, "Infinite loop detected in hooks configuration: #{inspect_trace}."
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
data/lib/rails_ops/hookup.rb
CHANGED
@@ -23,7 +23,7 @@ class RailsOps::Hookup
|
|
23
23
|
unless @config_loaded
|
24
24
|
@config_loaded = true
|
25
25
|
|
26
|
-
if File.exist?(CONFIG_PATH)
|
26
|
+
if File.exist?(Rails.root.join(CONFIG_PATH))
|
27
27
|
load Rails.root.join(CONFIG_PATH)
|
28
28
|
else
|
29
29
|
Rails.logger.debug "RailsOps could not find hookup #{CONFIG_PATH}, using empty hookup configuration."
|
@@ -11,6 +11,8 @@ module RailsOps::Mixins::SubOps
|
|
11
11
|
def sub_op(op, params = {})
|
12
12
|
new_context = context.spawn(self)
|
13
13
|
return op.new(new_context, params)
|
14
|
+
rescue *op.validation_errors => e
|
15
|
+
fail RailsOps::Exceptions::SubOpValidationFailed, e
|
14
16
|
end
|
15
17
|
|
16
18
|
# Operation-equivalent of controller method 'run!': Instantiates and runs the
|
data/lib/rails_ops/operation.rb
CHANGED
@@ -149,7 +149,7 @@ class RailsOps::Operation
|
|
149
149
|
|
150
150
|
# Fails with an exception if the operation has not been performed yet.
|
151
151
|
def check_performed!
|
152
|
-
fail 'Operation has not yet been
|
152
|
+
fail 'Operation has not yet been performed.' unless performed?
|
153
153
|
end
|
154
154
|
|
155
155
|
protected
|
data/rails_ops.gemspec
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: rails_ops 1.4.
|
2
|
+
# stub: rails_ops 1.4.4 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "rails_ops".freeze
|
6
|
-
s.version = "1.4.
|
6
|
+
s.version = "1.4.4"
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib".freeze]
|
10
10
|
s.authors = ["Sitrox".freeze]
|
11
|
-
s.date = "2023-
|
12
|
-
s.files = [".github/workflows/rubocop.yml".freeze, ".github/workflows/ruby.yml".freeze, ".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, "Appraisals".freeze, "CHANGELOG.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "gemfiles/rails_6.0.gemfile".freeze, "gemfiles/rails_6.1.gemfile".freeze, "gemfiles/rails_7.0.gemfile".freeze, "lib/generators/operation/USAGE".freeze, "lib/generators/operation/operation_generator.rb".freeze, "lib/generators/operation/templates/controller.erb".freeze, "lib/generators/operation/templates/controller_wrapper.erb".freeze, "lib/generators/operation/templates/create.erb".freeze, "lib/generators/operation/templates/destroy.erb".freeze, "lib/generators/operation/templates/load.erb".freeze, "lib/generators/operation/templates/update.erb".freeze, "lib/generators/operation/templates/view.erb".freeze, "lib/rails_ops.rb".freeze, "lib/rails_ops/authorization_backend/abstract.rb".freeze, "lib/rails_ops/authorization_backend/can_can_can.rb".freeze, "lib/rails_ops/configuration.rb".freeze, "lib/rails_ops/context.rb".freeze, "lib/rails_ops/controller_mixin.rb".freeze, "lib/rails_ops/exceptions.rb".freeze, "lib/rails_ops/hooked_job.rb".freeze, "lib/rails_ops/hookup.rb".freeze, "lib/rails_ops/hookup/dsl.rb".freeze, "lib/rails_ops/hookup/dsl_validator.rb".freeze, "lib/rails_ops/hookup/hook.rb".freeze, "lib/rails_ops/log_subscriber.rb".freeze, "lib/rails_ops/mixins.rb".freeze, "lib/rails_ops/mixins/authorization.rb".freeze, "lib/rails_ops/mixins/log_settings.rb".freeze, "lib/rails_ops/mixins/model.rb".freeze, "lib/rails_ops/mixins/model/authorization.rb".freeze, "lib/rails_ops/mixins/model/nesting.rb".freeze, "lib/rails_ops/mixins/param_authorization.rb".freeze, "lib/rails_ops/mixins/policies.rb".freeze, "lib/rails_ops/mixins/require_context.rb".freeze, "lib/rails_ops/mixins/routes.rb".freeze, "lib/rails_ops/mixins/schema_validation.rb".freeze, "lib/rails_ops/mixins/sub_ops.rb".freeze, "lib/rails_ops/model_mixins.rb".freeze, "lib/rails_ops/model_mixins/ar_extension.rb".freeze, "lib/rails_ops/model_mixins/marshalling.rb".freeze, "lib/rails_ops/model_mixins/parent_op.rb".freeze, "lib/rails_ops/model_mixins/sti_fixes.rb".freeze, "lib/rails_ops/model_mixins/virtual_attributes.rb".freeze, "lib/rails_ops/model_mixins/virtual_attributes/virtual_column_wrapper.rb".freeze, "lib/rails_ops/model_mixins/virtual_has_one.rb".freeze, "lib/rails_ops/model_mixins/virtual_model_name.rb".freeze, "lib/rails_ops/operation.rb".freeze, "lib/rails_ops/operation/model.rb".freeze, "lib/rails_ops/operation/model/create.rb".freeze, "lib/rails_ops/operation/model/destroy.rb".freeze, "lib/rails_ops/operation/model/load.rb".freeze, "lib/rails_ops/operation/model/update.rb".freeze, "lib/rails_ops/profiler.rb".freeze, "lib/rails_ops/profiler/node.rb".freeze, "lib/rails_ops/railtie.rb".freeze, "lib/rails_ops/scoped_env.rb".freeze, "lib/rails_ops/virtual_model.rb".freeze, "rails_ops.gemspec".freeze, "test/db/models.rb".freeze, "test/db/schema.rb".freeze, "test/dummy/Rakefile".freeze, "test/dummy/app/assets/config/manifest.js".freeze, "test/dummy/app/assets/images/.keep".freeze, "test/dummy/app/assets/javascripts/application.js".freeze, "test/dummy/app/assets/javascripts/cable.js".freeze, "test/dummy/app/assets/javascripts/channels/.keep".freeze, "test/dummy/app/assets/stylesheets/application.css".freeze, "test/dummy/app/channels/application_cable/channel.rb".freeze, "test/dummy/app/channels/application_cable/connection.rb".freeze, "test/dummy/app/controllers/application_controller.rb".freeze, "test/dummy/app/controllers/concerns/.keep".freeze, "test/dummy/app/helpers/application_helper.rb".freeze, "test/dummy/app/jobs/application_job.rb".freeze, "test/dummy/app/mailers/application_mailer.rb".freeze, "test/dummy/app/models/animal.rb".freeze, "test/dummy/app/models/application_record.rb".freeze, "test/dummy/app/models/bird.rb".freeze, "test/dummy/app/models/cat.rb".freeze, "test/dummy/app/models/computer.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/cpu.rb".freeze, "test/dummy/app/models/dog.rb".freeze, "test/dummy/app/models/flower.rb".freeze, "test/dummy/app/models/group.rb".freeze, "test/dummy/app/models/mainboard.rb".freeze, "test/dummy/app/models/nightingale.rb".freeze, "test/dummy/app/models/phoenix.rb".freeze, "test/dummy/app/models/user.rb".freeze, "test/dummy/app/views/layouts/application.html.erb".freeze, "test/dummy/app/views/layouts/mailer.html.erb".freeze, "test/dummy/app/views/layouts/mailer.text.erb".freeze, "test/dummy/bin/bundle".freeze, "test/dummy/bin/rails".freeze, "test/dummy/bin/rake".freeze, "test/dummy/bin/setup".freeze, "test/dummy/bin/update".freeze, "test/dummy/bin/yarn".freeze, "test/dummy/config.ru".freeze, "test/dummy/config/application.rb".freeze, "test/dummy/config/boot.rb".freeze, "test/dummy/config/cable.yml".freeze, "test/dummy/config/database.yml".freeze, "test/dummy/config/environment.rb".freeze, "test/dummy/config/environments/development.rb".freeze, "test/dummy/config/environments/production.rb".freeze, "test/dummy/config/environments/test.rb".freeze, "test/dummy/config/initializers/application_controller_renderer.rb".freeze, "test/dummy/config/initializers/assets.rb".freeze, "test/dummy/config/initializers/backtrace_silencers.rb".freeze, "test/dummy/config/initializers/cookies_serializer.rb".freeze, "test/dummy/config/initializers/filter_parameter_logging.rb".freeze, "test/dummy/config/initializers/inflections.rb".freeze, "test/dummy/config/initializers/mime_types.rb".freeze, "test/dummy/config/initializers/rails_ops.rb".freeze, "test/dummy/config/initializers/wrap_parameters.rb".freeze, "test/dummy/config/locales/en.yml".freeze, "test/dummy/config/puma.rb".freeze, "test/dummy/config/routes.rb".freeze, "test/dummy/config/secrets.yml".freeze, "test/dummy/config/spring.rb".freeze, "test/dummy/db/schema.rb".freeze, "test/dummy/lib/assets/.keep".freeze, "test/dummy/log/.keep".freeze, "test/dummy/package.json".freeze, "test/dummy/public/404.html".freeze, "test/dummy/public/422.html".freeze, "test/dummy/public/500.html".freeze, "test/dummy/public/apple-touch-icon-precomposed.png".freeze, "test/dummy/public/apple-touch-icon.png".freeze, "test/dummy/public/favicon.ico".freeze, "test/dummy/tmp/.keep".freeze, "test/test_helper.rb".freeze, "test/unit/rails_ops/generators/operation_generator_test.rb".freeze, "test/unit/rails_ops/mixins/model/deep_nesting_test.rb".freeze, "test/unit/rails_ops/mixins/param_authorization_test.rb".freeze, "test/unit/rails_ops/mixins/policies_test.rb".freeze, "test/unit/rails_ops/operation/model/create_test.rb".freeze, "test/unit/rails_ops/operation/model/
|
11
|
+
s.date = "2023-07-10"
|
12
|
+
s.files = [".github/workflows/rubocop.yml".freeze, ".github/workflows/ruby.yml".freeze, ".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, "Appraisals".freeze, "CHANGELOG.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "gemfiles/rails_6.0.gemfile".freeze, "gemfiles/rails_6.1.gemfile".freeze, "gemfiles/rails_7.0.gemfile".freeze, "lib/generators/operation/USAGE".freeze, "lib/generators/operation/operation_generator.rb".freeze, "lib/generators/operation/templates/controller.erb".freeze, "lib/generators/operation/templates/controller_wrapper.erb".freeze, "lib/generators/operation/templates/create.erb".freeze, "lib/generators/operation/templates/destroy.erb".freeze, "lib/generators/operation/templates/load.erb".freeze, "lib/generators/operation/templates/update.erb".freeze, "lib/generators/operation/templates/view.erb".freeze, "lib/rails_ops.rb".freeze, "lib/rails_ops/authorization_backend/abstract.rb".freeze, "lib/rails_ops/authorization_backend/can_can_can.rb".freeze, "lib/rails_ops/configuration.rb".freeze, "lib/rails_ops/context.rb".freeze, "lib/rails_ops/controller_mixin.rb".freeze, "lib/rails_ops/exceptions.rb".freeze, "lib/rails_ops/hooked_job.rb".freeze, "lib/rails_ops/hookup.rb".freeze, "lib/rails_ops/hookup/dsl.rb".freeze, "lib/rails_ops/hookup/dsl_validator.rb".freeze, "lib/rails_ops/hookup/hook.rb".freeze, "lib/rails_ops/log_subscriber.rb".freeze, "lib/rails_ops/mixins.rb".freeze, "lib/rails_ops/mixins/authorization.rb".freeze, "lib/rails_ops/mixins/log_settings.rb".freeze, "lib/rails_ops/mixins/model.rb".freeze, "lib/rails_ops/mixins/model/authorization.rb".freeze, "lib/rails_ops/mixins/model/nesting.rb".freeze, "lib/rails_ops/mixins/param_authorization.rb".freeze, "lib/rails_ops/mixins/policies.rb".freeze, "lib/rails_ops/mixins/require_context.rb".freeze, "lib/rails_ops/mixins/routes.rb".freeze, "lib/rails_ops/mixins/schema_validation.rb".freeze, "lib/rails_ops/mixins/sub_ops.rb".freeze, "lib/rails_ops/model_mixins.rb".freeze, "lib/rails_ops/model_mixins/ar_extension.rb".freeze, "lib/rails_ops/model_mixins/marshalling.rb".freeze, "lib/rails_ops/model_mixins/parent_op.rb".freeze, "lib/rails_ops/model_mixins/sti_fixes.rb".freeze, "lib/rails_ops/model_mixins/virtual_attributes.rb".freeze, "lib/rails_ops/model_mixins/virtual_attributes/virtual_column_wrapper.rb".freeze, "lib/rails_ops/model_mixins/virtual_has_one.rb".freeze, "lib/rails_ops/model_mixins/virtual_model_name.rb".freeze, "lib/rails_ops/operation.rb".freeze, "lib/rails_ops/operation/model.rb".freeze, "lib/rails_ops/operation/model/create.rb".freeze, "lib/rails_ops/operation/model/destroy.rb".freeze, "lib/rails_ops/operation/model/load.rb".freeze, "lib/rails_ops/operation/model/update.rb".freeze, "lib/rails_ops/profiler.rb".freeze, "lib/rails_ops/profiler/node.rb".freeze, "lib/rails_ops/railtie.rb".freeze, "lib/rails_ops/scoped_env.rb".freeze, "lib/rails_ops/virtual_model.rb".freeze, "rails_ops.gemspec".freeze, "test/db/models.rb".freeze, "test/db/schema.rb".freeze, "test/dummy/Rakefile".freeze, "test/dummy/app/assets/config/manifest.js".freeze, "test/dummy/app/assets/images/.keep".freeze, "test/dummy/app/assets/javascripts/application.js".freeze, "test/dummy/app/assets/javascripts/cable.js".freeze, "test/dummy/app/assets/javascripts/channels/.keep".freeze, "test/dummy/app/assets/stylesheets/application.css".freeze, "test/dummy/app/channels/application_cable/channel.rb".freeze, "test/dummy/app/channels/application_cable/connection.rb".freeze, "test/dummy/app/controllers/application_controller.rb".freeze, "test/dummy/app/controllers/concerns/.keep".freeze, "test/dummy/app/controllers/group_controller.rb".freeze, "test/dummy/app/helpers/application_helper.rb".freeze, "test/dummy/app/jobs/application_job.rb".freeze, "test/dummy/app/mailers/application_mailer.rb".freeze, "test/dummy/app/models/ability.rb".freeze, "test/dummy/app/models/animal.rb".freeze, "test/dummy/app/models/application_record.rb".freeze, "test/dummy/app/models/bird.rb".freeze, "test/dummy/app/models/cat.rb".freeze, "test/dummy/app/models/computer.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/cpu.rb".freeze, "test/dummy/app/models/dog.rb".freeze, "test/dummy/app/models/flower.rb".freeze, "test/dummy/app/models/group.rb".freeze, "test/dummy/app/models/mainboard.rb".freeze, "test/dummy/app/models/nightingale.rb".freeze, "test/dummy/app/models/phoenix.rb".freeze, "test/dummy/app/models/user.rb".freeze, "test/dummy/app/views/layouts/application.html.erb".freeze, "test/dummy/app/views/layouts/mailer.html.erb".freeze, "test/dummy/app/views/layouts/mailer.text.erb".freeze, "test/dummy/bin/bundle".freeze, "test/dummy/bin/rails".freeze, "test/dummy/bin/rake".freeze, "test/dummy/bin/setup".freeze, "test/dummy/bin/update".freeze, "test/dummy/bin/yarn".freeze, "test/dummy/config.ru".freeze, "test/dummy/config/application.rb".freeze, "test/dummy/config/boot.rb".freeze, "test/dummy/config/cable.yml".freeze, "test/dummy/config/database.yml".freeze, "test/dummy/config/environment.rb".freeze, "test/dummy/config/environments/development.rb".freeze, "test/dummy/config/environments/production.rb".freeze, "test/dummy/config/environments/test.rb".freeze, "test/dummy/config/hookup.rb".freeze, "test/dummy/config/initializers/application_controller_renderer.rb".freeze, "test/dummy/config/initializers/assets.rb".freeze, "test/dummy/config/initializers/backtrace_silencers.rb".freeze, "test/dummy/config/initializers/cookies_serializer.rb".freeze, "test/dummy/config/initializers/filter_parameter_logging.rb".freeze, "test/dummy/config/initializers/inflections.rb".freeze, "test/dummy/config/initializers/mime_types.rb".freeze, "test/dummy/config/initializers/rails_ops.rb".freeze, "test/dummy/config/initializers/wrap_parameters.rb".freeze, "test/dummy/config/locales/en.yml".freeze, "test/dummy/config/puma.rb".freeze, "test/dummy/config/routes.rb".freeze, "test/dummy/config/secrets.yml".freeze, "test/dummy/config/spring.rb".freeze, "test/dummy/db/schema.rb".freeze, "test/dummy/lib/assets/.keep".freeze, "test/dummy/log/.keep".freeze, "test/dummy/package.json".freeze, "test/dummy/public/404.html".freeze, "test/dummy/public/422.html".freeze, "test/dummy/public/500.html".freeze, "test/dummy/public/apple-touch-icon-precomposed.png".freeze, "test/dummy/public/apple-touch-icon.png".freeze, "test/dummy/public/favicon.ico".freeze, "test/dummy/tmp/.keep".freeze, "test/test_helper.rb".freeze, "test/unit/rails_ops/generators/operation_generator_test.rb".freeze, "test/unit/rails_ops/hookup_test.rb".freeze, "test/unit/rails_ops/mixins/controller_test.rb".freeze, "test/unit/rails_ops/mixins/model/deep_nesting_test.rb".freeze, "test/unit/rails_ops/mixins/model/marshalling_test.rb".freeze, "test/unit/rails_ops/mixins/param_authorization_test.rb".freeze, "test/unit/rails_ops/mixins/policies_test.rb".freeze, "test/unit/rails_ops/operation/auth_test.rb".freeze, "test/unit/rails_ops/operation/model/create_test.rb".freeze, "test/unit/rails_ops/operation/model/destroy_test.rb".freeze, "test/unit/rails_ops/operation/model/load_test.rb".freeze, "test/unit/rails_ops/operation/model/sti_test.rb".freeze, "test/unit/rails_ops/operation/model/update_test.rb".freeze, "test/unit/rails_ops/operation/model_test.rb".freeze, "test/unit/rails_ops/operation/update_lazy_auth_test.rb".freeze, "test/unit/rails_ops/operation_test.rb".freeze, "test/unit/rails_ops/profiler_test.rb".freeze]
|
13
13
|
s.rubygems_version = "3.4.6".freeze
|
14
14
|
s.summary = "An operations service layer for rails projects.".freeze
|
15
|
-
s.test_files = ["test/db/models.rb".freeze, "test/db/schema.rb".freeze, "test/dummy/Rakefile".freeze, "test/dummy/app/assets/config/manifest.js".freeze, "test/dummy/app/assets/images/.keep".freeze, "test/dummy/app/assets/javascripts/application.js".freeze, "test/dummy/app/assets/javascripts/cable.js".freeze, "test/dummy/app/assets/javascripts/channels/.keep".freeze, "test/dummy/app/assets/stylesheets/application.css".freeze, "test/dummy/app/channels/application_cable/channel.rb".freeze, "test/dummy/app/channels/application_cable/connection.rb".freeze, "test/dummy/app/controllers/application_controller.rb".freeze, "test/dummy/app/controllers/concerns/.keep".freeze, "test/dummy/app/helpers/application_helper.rb".freeze, "test/dummy/app/jobs/application_job.rb".freeze, "test/dummy/app/mailers/application_mailer.rb".freeze, "test/dummy/app/models/animal.rb".freeze, "test/dummy/app/models/application_record.rb".freeze, "test/dummy/app/models/bird.rb".freeze, "test/dummy/app/models/cat.rb".freeze, "test/dummy/app/models/computer.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/cpu.rb".freeze, "test/dummy/app/models/dog.rb".freeze, "test/dummy/app/models/flower.rb".freeze, "test/dummy/app/models/group.rb".freeze, "test/dummy/app/models/mainboard.rb".freeze, "test/dummy/app/models/nightingale.rb".freeze, "test/dummy/app/models/phoenix.rb".freeze, "test/dummy/app/models/user.rb".freeze, "test/dummy/app/views/layouts/application.html.erb".freeze, "test/dummy/app/views/layouts/mailer.html.erb".freeze, "test/dummy/app/views/layouts/mailer.text.erb".freeze, "test/dummy/bin/bundle".freeze, "test/dummy/bin/rails".freeze, "test/dummy/bin/rake".freeze, "test/dummy/bin/setup".freeze, "test/dummy/bin/update".freeze, "test/dummy/bin/yarn".freeze, "test/dummy/config.ru".freeze, "test/dummy/config/application.rb".freeze, "test/dummy/config/boot.rb".freeze, "test/dummy/config/cable.yml".freeze, "test/dummy/config/database.yml".freeze, "test/dummy/config/environment.rb".freeze, "test/dummy/config/environments/development.rb".freeze, "test/dummy/config/environments/production.rb".freeze, "test/dummy/config/environments/test.rb".freeze, "test/dummy/config/initializers/application_controller_renderer.rb".freeze, "test/dummy/config/initializers/assets.rb".freeze, "test/dummy/config/initializers/backtrace_silencers.rb".freeze, "test/dummy/config/initializers/cookies_serializer.rb".freeze, "test/dummy/config/initializers/filter_parameter_logging.rb".freeze, "test/dummy/config/initializers/inflections.rb".freeze, "test/dummy/config/initializers/mime_types.rb".freeze, "test/dummy/config/initializers/rails_ops.rb".freeze, "test/dummy/config/initializers/wrap_parameters.rb".freeze, "test/dummy/config/locales/en.yml".freeze, "test/dummy/config/puma.rb".freeze, "test/dummy/config/routes.rb".freeze, "test/dummy/config/secrets.yml".freeze, "test/dummy/config/spring.rb".freeze, "test/dummy/db/schema.rb".freeze, "test/dummy/lib/assets/.keep".freeze, "test/dummy/log/.keep".freeze, "test/dummy/package.json".freeze, "test/dummy/public/404.html".freeze, "test/dummy/public/422.html".freeze, "test/dummy/public/500.html".freeze, "test/dummy/public/apple-touch-icon-precomposed.png".freeze, "test/dummy/public/apple-touch-icon.png".freeze, "test/dummy/public/favicon.ico".freeze, "test/dummy/tmp/.keep".freeze, "test/test_helper.rb".freeze, "test/unit/rails_ops/generators/operation_generator_test.rb".freeze, "test/unit/rails_ops/mixins/model/deep_nesting_test.rb".freeze, "test/unit/rails_ops/mixins/param_authorization_test.rb".freeze, "test/unit/rails_ops/mixins/policies_test.rb".freeze, "test/unit/rails_ops/operation/model/create_test.rb".freeze, "test/unit/rails_ops/operation/model/
|
15
|
+
s.test_files = ["test/db/models.rb".freeze, "test/db/schema.rb".freeze, "test/dummy/Rakefile".freeze, "test/dummy/app/assets/config/manifest.js".freeze, "test/dummy/app/assets/images/.keep".freeze, "test/dummy/app/assets/javascripts/application.js".freeze, "test/dummy/app/assets/javascripts/cable.js".freeze, "test/dummy/app/assets/javascripts/channels/.keep".freeze, "test/dummy/app/assets/stylesheets/application.css".freeze, "test/dummy/app/channels/application_cable/channel.rb".freeze, "test/dummy/app/channels/application_cable/connection.rb".freeze, "test/dummy/app/controllers/application_controller.rb".freeze, "test/dummy/app/controllers/concerns/.keep".freeze, "test/dummy/app/controllers/group_controller.rb".freeze, "test/dummy/app/helpers/application_helper.rb".freeze, "test/dummy/app/jobs/application_job.rb".freeze, "test/dummy/app/mailers/application_mailer.rb".freeze, "test/dummy/app/models/ability.rb".freeze, "test/dummy/app/models/animal.rb".freeze, "test/dummy/app/models/application_record.rb".freeze, "test/dummy/app/models/bird.rb".freeze, "test/dummy/app/models/cat.rb".freeze, "test/dummy/app/models/computer.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/cpu.rb".freeze, "test/dummy/app/models/dog.rb".freeze, "test/dummy/app/models/flower.rb".freeze, "test/dummy/app/models/group.rb".freeze, "test/dummy/app/models/mainboard.rb".freeze, "test/dummy/app/models/nightingale.rb".freeze, "test/dummy/app/models/phoenix.rb".freeze, "test/dummy/app/models/user.rb".freeze, "test/dummy/app/views/layouts/application.html.erb".freeze, "test/dummy/app/views/layouts/mailer.html.erb".freeze, "test/dummy/app/views/layouts/mailer.text.erb".freeze, "test/dummy/bin/bundle".freeze, "test/dummy/bin/rails".freeze, "test/dummy/bin/rake".freeze, "test/dummy/bin/setup".freeze, "test/dummy/bin/update".freeze, "test/dummy/bin/yarn".freeze, "test/dummy/config.ru".freeze, "test/dummy/config/application.rb".freeze, "test/dummy/config/boot.rb".freeze, "test/dummy/config/cable.yml".freeze, "test/dummy/config/database.yml".freeze, "test/dummy/config/environment.rb".freeze, "test/dummy/config/environments/development.rb".freeze, "test/dummy/config/environments/production.rb".freeze, "test/dummy/config/environments/test.rb".freeze, "test/dummy/config/hookup.rb".freeze, "test/dummy/config/initializers/application_controller_renderer.rb".freeze, "test/dummy/config/initializers/assets.rb".freeze, "test/dummy/config/initializers/backtrace_silencers.rb".freeze, "test/dummy/config/initializers/cookies_serializer.rb".freeze, "test/dummy/config/initializers/filter_parameter_logging.rb".freeze, "test/dummy/config/initializers/inflections.rb".freeze, "test/dummy/config/initializers/mime_types.rb".freeze, "test/dummy/config/initializers/rails_ops.rb".freeze, "test/dummy/config/initializers/wrap_parameters.rb".freeze, "test/dummy/config/locales/en.yml".freeze, "test/dummy/config/puma.rb".freeze, "test/dummy/config/routes.rb".freeze, "test/dummy/config/secrets.yml".freeze, "test/dummy/config/spring.rb".freeze, "test/dummy/db/schema.rb".freeze, "test/dummy/lib/assets/.keep".freeze, "test/dummy/log/.keep".freeze, "test/dummy/package.json".freeze, "test/dummy/public/404.html".freeze, "test/dummy/public/422.html".freeze, "test/dummy/public/500.html".freeze, "test/dummy/public/apple-touch-icon-precomposed.png".freeze, "test/dummy/public/apple-touch-icon.png".freeze, "test/dummy/public/favicon.ico".freeze, "test/dummy/tmp/.keep".freeze, "test/test_helper.rb".freeze, "test/unit/rails_ops/generators/operation_generator_test.rb".freeze, "test/unit/rails_ops/hookup_test.rb".freeze, "test/unit/rails_ops/mixins/controller_test.rb".freeze, "test/unit/rails_ops/mixins/model/deep_nesting_test.rb".freeze, "test/unit/rails_ops/mixins/model/marshalling_test.rb".freeze, "test/unit/rails_ops/mixins/param_authorization_test.rb".freeze, "test/unit/rails_ops/mixins/policies_test.rb".freeze, "test/unit/rails_ops/operation/auth_test.rb".freeze, "test/unit/rails_ops/operation/model/create_test.rb".freeze, "test/unit/rails_ops/operation/model/destroy_test.rb".freeze, "test/unit/rails_ops/operation/model/load_test.rb".freeze, "test/unit/rails_ops/operation/model/sti_test.rb".freeze, "test/unit/rails_ops/operation/model/update_test.rb".freeze, "test/unit/rails_ops/operation/model_test.rb".freeze, "test/unit/rails_ops/operation/update_lazy_auth_test.rb".freeze, "test/unit/rails_ops/operation_test.rb".freeze, "test/unit/rails_ops/profiler_test.rb".freeze]
|
16
16
|
|
17
17
|
s.specification_version = 4
|
18
18
|
|
@@ -25,6 +25,7 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.add_development_dependency(%q<colorize>.freeze, [">= 0"])
|
26
26
|
s.add_development_dependency(%q<rubocop>.freeze, ["= 1.45.1"])
|
27
27
|
s.add_development_dependency(%q<sprockets-rails>.freeze, [">= 0"])
|
28
|
+
s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
|
28
29
|
s.add_runtime_dependency(%q<active_type>.freeze, [">= 1.3.0"])
|
29
30
|
s.add_runtime_dependency(%q<minitest>.freeze, [">= 0"])
|
30
31
|
s.add_runtime_dependency(%q<rails>.freeze, [">= 0"])
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class GroupController < ApplicationController
|
2
|
+
attr_reader :current_user
|
3
|
+
skip_before_action :verify_authenticity_token
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
super
|
7
|
+
@current_user = Class.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def show
|
11
|
+
cls = Class.new(RailsOps::Operation::Model::Load) do
|
12
|
+
model Group
|
13
|
+
end
|
14
|
+
|
15
|
+
op cls, id: params[:id]
|
16
|
+
render json: model
|
17
|
+
end
|
18
|
+
|
19
|
+
def update
|
20
|
+
cls = Class.new(RailsOps::Operation::Model::Update) do
|
21
|
+
model Group
|
22
|
+
end
|
23
|
+
|
24
|
+
op cls, id: params[:id], group: {name: params[:name]}
|
25
|
+
run!
|
26
|
+
render json: model
|
27
|
+
end
|
28
|
+
end
|
@@ -51,4 +51,6 @@ Rails.application.configure do
|
|
51
51
|
# Use an evented file watcher to asynchronously detect changes in source code,
|
52
52
|
# routes, locales, etc. This feature depends on the listen gem.
|
53
53
|
# config.file_watcher = ActiveSupport::EventedFileUpdateChecker
|
54
|
+
|
55
|
+
config.hosts = ['www.example.com']
|
54
56
|
end
|
data/test/dummy/config/routes.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start do
|
3
|
+
add_filter '/test/'
|
4
|
+
end
|
5
|
+
|
1
6
|
require File.expand_path('../test/dummy/config/environment.rb', __dir__)
|
2
7
|
# ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)]
|
3
8
|
require 'rails/test_help'
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class RailsOps::HookupTest < ActiveSupport::TestCase
|
4
|
+
include TestHelper
|
5
|
+
|
6
|
+
class RailsOps::HookupTest::HookupStarter < RailsOps::Operation::Model::Create
|
7
|
+
model ::Group
|
8
|
+
end
|
9
|
+
|
10
|
+
class RailsOps::HookupTest::HookupTarget < RailsOps::Operation
|
11
|
+
def perform
|
12
|
+
Group.find_by(name: 'hookup_test_group').update({ color: 'blue' })
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_hooked_op
|
17
|
+
group = RailsOps::HookupTest::HookupStarter.run!(group: { name: 'hookup_test_group' }).model
|
18
|
+
group.reload
|
19
|
+
assert_equal 'blue', group.color
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_recursive_hookup_raises
|
23
|
+
RailsOps.hookup.instance_variable_set(:@drawn, false)
|
24
|
+
RailsOps.hookup.instance_variable_set(:@config_loaded, false)
|
25
|
+
assert_raises SystemStackError do
|
26
|
+
RailsOps.hookup.draw do
|
27
|
+
run 'RailsOps::HookupTest::HookupTarget' do
|
28
|
+
on 'RailsOps::HookupTest::HookupStarter'
|
29
|
+
end
|
30
|
+
|
31
|
+
run 'RailsOps::HookupTest::HookupStarter' do
|
32
|
+
on 'RailsOps::HookupTest::HookupTarget'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
RailsOps.hookup.load_config
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_dont_draw_twice
|
40
|
+
assert_raises_with_message RuntimeError, "Hooks can't be drawn twice." do
|
41
|
+
RailsOps.hookup.draw do
|
42
|
+
run 'RailsOps::HookupTest::HookupTarget' do
|
43
|
+
on 'RailsOps::HookupTest::HookupStarter'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_missing_hookup_op
|
50
|
+
RailsOps.hookup.load_config
|
51
|
+
RailsOps.hookup.instance_variable_set(:@drawn, false)
|
52
|
+
RailsOps.hookup.draw do
|
53
|
+
run 'RailsOps::HookupTest::HookupIllusiveTarget' do
|
54
|
+
on 'RailsOps::HookupTest::HookupStarter'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
assert_raises_with_message RuntimeError, 'Could not find hook target operation RailsOps::HookupTest::HookupIllusiveTarget.' do
|
59
|
+
RailsOps::HookupTest::HookupStarter.run!(group: { name: 'group' })
|
60
|
+
end
|
61
|
+
|
62
|
+
RailsOps.hookup.instance_variable_set(:@drawn, false)
|
63
|
+
RailsOps.hookup.instance_variable_set(:@config_loaded, false)
|
64
|
+
RailsOps.hookup.load_config
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_missing_config_file
|
68
|
+
orig_path = RailsOps::Hookup::CONFIG_PATH
|
69
|
+
RailsOps::Hookup.const_set(:CONFIG_PATH, '/def/doesnt/exist')
|
70
|
+
RailsOps.hookup.instance_variable_set(:@drawn, false)
|
71
|
+
RailsOps.hookup.instance_variable_set(:@config_loaded, false)
|
72
|
+
assert_nothing_raised do
|
73
|
+
RailsOps.hookup.load_config
|
74
|
+
end
|
75
|
+
assert_equal({}, RailsOps.hookup.hooks)
|
76
|
+
|
77
|
+
RailsOps::Hookup.const_set(:CONFIG_PATH, orig_path)
|
78
|
+
RailsOps.hookup.instance_variable_set(:@drawn, false)
|
79
|
+
RailsOps.hookup.instance_variable_set(:@config_loaded, false)
|
80
|
+
RailsOps.hookup.load_config
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'cancancan'
|
3
|
+
|
4
|
+
class RailsOps::Mixins::ControllerTest < ActionDispatch::IntegrationTest
|
5
|
+
include TestHelper
|
6
|
+
|
7
|
+
def test_controller_op
|
8
|
+
group = Group.create(name: 'group')
|
9
|
+
get group_url(group), as: :json
|
10
|
+
assert_equal 'group', JSON.parse(@response.body)['name']
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_controller_op_run
|
14
|
+
group = Group.create(name: 'group')
|
15
|
+
patch group_url(group), params: { name: 'group2' }, as: :json
|
16
|
+
assert_equal 'group2', JSON.parse(@response.body)['name']
|
17
|
+
|
18
|
+
group.reload
|
19
|
+
assert_equal 'group2', group.name
|
20
|
+
end
|
21
|
+
end
|
@@ -92,6 +92,67 @@ class RailsOps::Mixins::Model::DeepNestingTest < ActiveSupport::TestCase
|
|
92
92
|
assert_equal 'CPU', model.mainboard.cpu.name
|
93
93
|
end
|
94
94
|
|
95
|
+
def test_without_asoc
|
96
|
+
assert_raises_with_message RuntimeError, 'Association cat could not be found for Animal.' do
|
97
|
+
Class.new(RailsOps::Operation::Model::Create) do
|
98
|
+
model Animal
|
99
|
+
|
100
|
+
nest_model_op :cat, Class.new(RailsOps::Operation::Model::Create) do
|
101
|
+
model Cat
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_wrong_asoc_type
|
108
|
+
assert_raises_with_message RuntimeError,
|
109
|
+
'Method nest_model_op only supports :belongs_to associations, but association dogs of model Animal is a has_many association.' do
|
110
|
+
Class.new(RailsOps::Operation::Model::Create) do
|
111
|
+
model Animal
|
112
|
+
|
113
|
+
nest_model_op :dogs, Class.new(RailsOps::Operation::Model::Create) do
|
114
|
+
model Dog
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_autosave_on
|
121
|
+
assert_raises_with_message RuntimeError, 'Association bird of Animal has :autosave turned on. This is not supported by nest_model_op.' do
|
122
|
+
Class.new(RailsOps::Operation::Model::Create) do
|
123
|
+
model Animal
|
124
|
+
|
125
|
+
nest_model_op :bird, Class.new(RailsOps::Operation::Model::Create) do
|
126
|
+
model Bird
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_validation_off
|
133
|
+
assert_raises_with_message RuntimeError, 'Association phoenix of Animal has :validate turned off. This is not supported by nest_model_op.' do
|
134
|
+
Class.new(RailsOps::Operation::Model::Create) do
|
135
|
+
model Animal
|
136
|
+
|
137
|
+
nest_model_op :phoenix, Class.new(RailsOps::Operation::Model::Create) do
|
138
|
+
model Phoenix
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_inverse_autosave_on
|
145
|
+
assert_raises_with_message RuntimeError, 'Association phoenix of Bird has :autosave turned on. This is not supported by nest_model_op.' do
|
146
|
+
Class.new(RailsOps::Operation::Model::Create) do
|
147
|
+
model Phoenix
|
148
|
+
|
149
|
+
nest_model_op :bird, Class.new(RailsOps::Operation::Model::Create) do
|
150
|
+
model Bird
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
95
156
|
def test_create_computer_level_1_validation_error
|
96
157
|
op = COMPUTER_CREATION_OP.new(
|
97
158
|
computer: {
|
@@ -197,7 +258,6 @@ class RailsOps::Mixins::Model::DeepNestingTest < ActiveSupport::TestCase
|
|
197
258
|
)
|
198
259
|
|
199
260
|
refute update_op.run
|
200
|
-
|
201
|
-
assert_equal :blank, update_op.model.mainboard.errors.first.type
|
261
|
+
assert update_op.model.mainboard.errors.added?(:name, :blank)
|
202
262
|
end
|
203
263
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class RailsOps::Mixins::Model::MarshallingTest < ActiveSupport::TestCase
|
4
|
+
include TestHelper
|
5
|
+
|
6
|
+
class RailsOps::Mixins::Model::MarshallingTest::ParentOp < RailsOps::Operation::Model::Create
|
7
|
+
model Group
|
8
|
+
attr_reader :loaded_child_class
|
9
|
+
attr_reader :loaded_child_parent_op
|
10
|
+
|
11
|
+
def perform
|
12
|
+
sub_op = run_sub! RailsOps::Mixins::Model::MarshallingTest::ChildOp
|
13
|
+
|
14
|
+
dump_res = Marshal.dump(sub_op)
|
15
|
+
# rubocop:disable Security/MarshalLoad
|
16
|
+
load_res = Marshal.load(dump_res)
|
17
|
+
# rubocop:enable Security/MarshalLoad
|
18
|
+
|
19
|
+
@loaded_child_class = load_res.class
|
20
|
+
@loaded_child_parent_op = load_res.model.parent_op
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class RailsOps::Mixins::Model::MarshallingTest::ChildOp < RailsOps::Operation::Model::Create
|
25
|
+
model Group
|
26
|
+
def perform; end
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_marshal_dump_and_load
|
30
|
+
assert_nothing_raised do
|
31
|
+
op_res = RailsOps::Mixins::Model::MarshallingTest::ParentOp.run!
|
32
|
+
assert_equal RailsOps::Mixins::Model::MarshallingTest::ChildOp, op_res.loaded_child_class
|
33
|
+
assert_nil op_res.loaded_child_parent_op
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'rails_ops/authorization_backend/can_can_can'
|
3
|
+
require 'cancancan'
|
4
|
+
|
5
|
+
class RailsOps::Operation::AuthTest < ActiveSupport::TestCase
|
6
|
+
include TestHelper
|
7
|
+
|
8
|
+
LOAD_OP = Class.new(RailsOps::Operation::Model::Load) do
|
9
|
+
model ::Group
|
10
|
+
end
|
11
|
+
|
12
|
+
LOAD_OP_WITHOUT_AUTH = Class.new(RailsOps::Operation::Model::Load) do
|
13
|
+
model ::Group
|
14
|
+
without_authorization
|
15
|
+
end
|
16
|
+
|
17
|
+
UPDATE_OP = Class.new(RailsOps::Operation::Model::Update) do
|
18
|
+
model ::Group
|
19
|
+
end
|
20
|
+
|
21
|
+
CREATE_OP = Class.new(RailsOps::Operation::Model::Create) do
|
22
|
+
model ::Group
|
23
|
+
end
|
24
|
+
|
25
|
+
DESTROY_OP = Class.new(RailsOps::Operation::Model::Destroy) do
|
26
|
+
model ::Group
|
27
|
+
end
|
28
|
+
|
29
|
+
ABILITY = Class.new do
|
30
|
+
include CanCan::Ability
|
31
|
+
|
32
|
+
def initialize(read: false, update: false, create: false, destroy: false)
|
33
|
+
super()
|
34
|
+
|
35
|
+
can :read, Group if read
|
36
|
+
can :update, Group if update
|
37
|
+
can :create, Group if create
|
38
|
+
can :destroy, Group if destroy
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
setup do
|
43
|
+
Group.create!(id: 1, name: 'Group')
|
44
|
+
RailsOps.config.authorization_backend = 'RailsOps::AuthorizationBackend::CanCanCan'
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_unpermitted_read
|
48
|
+
ctx = RailsOps::Context.new(ability: ABILITY.new)
|
49
|
+
assert_raises CanCan::AccessDenied do
|
50
|
+
LOAD_OP.new(ctx, id: 1)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_unpermitted_read_without_auth
|
55
|
+
ctx = RailsOps::Context.new(ability: ABILITY.new)
|
56
|
+
assert_nothing_raised do
|
57
|
+
LOAD_OP_WITHOUT_AUTH.new(ctx, id: 1)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_permitted_read
|
62
|
+
ctx = RailsOps::Context.new(ability: ABILITY.new(read: true))
|
63
|
+
assert_nothing_raised do
|
64
|
+
res = LOAD_OP.new(ctx, id: 1)
|
65
|
+
assert_equal 'Group', res.model.name
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_unpermitted_update
|
70
|
+
ctx = RailsOps::Context.new(ability: ABILITY.new(read: true))
|
71
|
+
assert_raises CanCan::AccessDenied do
|
72
|
+
op = UPDATE_OP.new(ctx, id: 1, group: { name: 'Group2' })
|
73
|
+
res = op.run!
|
74
|
+
assert_equal 'Group', res.model.name
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_permitted_update
|
79
|
+
ctx = RailsOps::Context.new(ability: ABILITY.new(read: true, update: true))
|
80
|
+
assert_nothing_raised do
|
81
|
+
op = UPDATE_OP.new(ctx, id: 1, group: { name: 'Group2' })
|
82
|
+
res = op.run!
|
83
|
+
assert_equal 'Group2', res.model.name
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_unpermitted_create
|
88
|
+
ctx = RailsOps::Context.new(ability: ABILITY.new(read: true))
|
89
|
+
assert_raises CanCan::AccessDenied do
|
90
|
+
op = CREATE_OP.new(ctx, id: 2, group: { name: 'Group2' })
|
91
|
+
op.run!
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_permitted_create
|
96
|
+
ctx = RailsOps::Context.new(ability: ABILITY.new(read: true, create: true))
|
97
|
+
assert_nothing_raised do
|
98
|
+
op = CREATE_OP.new(ctx, id: 2, group: { name: 'Group2' })
|
99
|
+
op.run!
|
100
|
+
res = LOAD_OP.new(id: 2)
|
101
|
+
assert_equal 'Group2', res.model.name
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_unpermitted_destroy
|
106
|
+
ctx = RailsOps::Context.new(ability: ABILITY.new(read: true))
|
107
|
+
assert_raises CanCan::AccessDenied do
|
108
|
+
op = DESTROY_OP.new(ctx, id: 1)
|
109
|
+
op.run!
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_permitted_destroy
|
114
|
+
ctx = RailsOps::Context.new(ability: ABILITY.new(read: true, destroy: true))
|
115
|
+
assert_nothing_raised do
|
116
|
+
op = DESTROY_OP.new(ctx, id: 1)
|
117
|
+
op.run!
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class RailsOps::Operation::Model::DestroyTest < ActiveSupport::TestCase
|
2
|
+
include TestHelper
|
3
|
+
|
4
|
+
BASIC_OP = Class.new(RailsOps::Operation::Model::Destroy) do
|
5
|
+
model Group
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_basic
|
9
|
+
g = Group.create
|
10
|
+
op = BASIC_OP.new(id: g.id)
|
11
|
+
assert_equal g, op.model
|
12
|
+
assert_equal Group, op.model.class
|
13
|
+
op.run!
|
14
|
+
assert op.model.destroyed?
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_not_deletable
|
18
|
+
g = Group.create
|
19
|
+
cls = Class.new(RailsOps::Operation::Model::Destroy) do
|
20
|
+
model Group, 'NotDeletableGroup' do
|
21
|
+
def deleteable?
|
22
|
+
false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
op = cls.new(id: g.id)
|
27
|
+
assert_raises RailsOps::Exceptions::ModelNotDeleteable do
|
28
|
+
op.run!
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -51,4 +51,13 @@ class RailsOps::Operation::Model::LoadTest < ActiveSupport::TestCase
|
|
51
51
|
g = Group.create(name: 'g1')
|
52
52
|
assert_equal g, cls.new(name: 'g1').model
|
53
53
|
end
|
54
|
+
|
55
|
+
def test_too_many_authorization_actions
|
56
|
+
assert_raises_with_message ArgumentError, 'Too many arguments' do
|
57
|
+
Class.new(RailsOps::Operation::Model::Load) do
|
58
|
+
model Group
|
59
|
+
model_authorization_action :read, :update
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
54
63
|
end
|
@@ -47,6 +47,21 @@ class RailsOps::Operation::ModelTest < ActiveSupport::TestCase
|
|
47
47
|
assert_equal 'Example', cls.model.virtual_model_name
|
48
48
|
end
|
49
49
|
|
50
|
+
def test_virtual_model_write_attribute
|
51
|
+
cls = Class.new(RailsOps::Operation::Model) do
|
52
|
+
model RailsOps::VirtualModel, 'Example' do
|
53
|
+
attribute :name, default: 'name'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
assert_equal 'name', cls.model.new.read_attribute(:name)
|
58
|
+
assert_nothing_raised do
|
59
|
+
obj = cls.model.new
|
60
|
+
obj.write_attribute(:name, 'name2')
|
61
|
+
assert_equal 'name2', obj.read_attribute(:name)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
50
65
|
def test_default_model_class
|
51
66
|
cls = Class.new(RailsOps::Operation::Model) do
|
52
67
|
model do
|
@@ -64,4 +79,13 @@ class RailsOps::Operation::ModelTest < ActiveSupport::TestCase
|
|
64
79
|
end
|
65
80
|
end
|
66
81
|
end
|
82
|
+
|
83
|
+
def test_lazy_model
|
84
|
+
cls = Class.new(RailsOps::Operation::Model::Create) do
|
85
|
+
lazy_model 'Group'
|
86
|
+
end
|
87
|
+
|
88
|
+
assert_not cls.model.class < Group
|
89
|
+
assert cls.new.model.class < Group
|
90
|
+
end
|
67
91
|
end
|
@@ -40,6 +40,16 @@ class RailsOps::OperationTest < ActiveSupport::TestCase
|
|
40
40
|
assert BASIC_OP.new.run!.done
|
41
41
|
end
|
42
42
|
|
43
|
+
def test_run_without_perform
|
44
|
+
cls = Class.new(RailsOps::Operation)
|
45
|
+
assert_nothing_raised do
|
46
|
+
cls.new
|
47
|
+
end
|
48
|
+
assert_raises NotImplementedError do
|
49
|
+
cls.run!
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
43
53
|
def test_non_validation_error
|
44
54
|
assert_raises_with_message RuntimeError, 'Standard exception' do
|
45
55
|
BASIC_OP.run(exception: 'Standard exception')
|
@@ -146,6 +156,17 @@ class RailsOps::OperationTest < ActiveSupport::TestCase
|
|
146
156
|
assert op.performed?
|
147
157
|
end
|
148
158
|
|
159
|
+
def test_check_performed
|
160
|
+
op = BASIC_OP.new
|
161
|
+
assert_raises_with_message RuntimeError, 'Operation has not yet been performed.' do
|
162
|
+
op.check_performed!
|
163
|
+
end
|
164
|
+
op.run!
|
165
|
+
assert_nothing_raised do
|
166
|
+
op.check_performed!
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
149
170
|
def test_inspect
|
150
171
|
assert_equal 'RailsOps::OperationTest::BASIC_OP ({"foo"=>:bar})',
|
151
172
|
BASIC_OP.new(foo: :bar).inspect
|
@@ -155,4 +176,104 @@ class RailsOps::OperationTest < ActiveSupport::TestCase
|
|
155
176
|
assert_equal 'RailsOps::OperationTest::BASIC_OP ({1=>2})',
|
156
177
|
BASIC_OP.new(1 => 2).inspect
|
157
178
|
end
|
179
|
+
|
180
|
+
def test_with_rollback_on_exception
|
181
|
+
op = Class.new(RailsOps::Operation) do
|
182
|
+
def perform
|
183
|
+
with_rollback_on_exception do
|
184
|
+
fail 'Rollback please'
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end.new
|
188
|
+
assert_raises RailsOps::Exceptions::RollbackRequired do
|
189
|
+
op.run
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def test_op_with_schema3(use_default: false)
|
194
|
+
op = Class.new(RailsOps::Operation) do
|
195
|
+
schema_block = proc do
|
196
|
+
int! :id
|
197
|
+
hsh! :hash do
|
198
|
+
int? :number
|
199
|
+
int! :required_number
|
200
|
+
end
|
201
|
+
end
|
202
|
+
if use_default
|
203
|
+
schema(&schema_block)
|
204
|
+
else
|
205
|
+
schema3(&schema_block)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
assert_nothing_raised do
|
210
|
+
op.new(id: 1, hash: { required_number: 1 })
|
211
|
+
end
|
212
|
+
assert_raises Schemacop::Exceptions::ValidationError do
|
213
|
+
op.new(id: 1, hash: {})
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
def test_op_with_schema2(use_default: false)
|
218
|
+
op = Class.new(RailsOps::Operation) do
|
219
|
+
schema_block = proc do
|
220
|
+
req :id, :integer
|
221
|
+
req :hash, :hash do
|
222
|
+
opt :number, :integer
|
223
|
+
req :required_number, :integer
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
if use_default
|
228
|
+
schema(&schema_block)
|
229
|
+
else
|
230
|
+
schema2(&schema_block)
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
assert_nothing_raised do
|
235
|
+
op.new(id: 1, hash: { required_number: 1 })
|
236
|
+
end
|
237
|
+
assert_raises Schemacop::Exceptions::ValidationError do
|
238
|
+
op.new(id: 1, hash: {})
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
def test_op_with_schema_default
|
243
|
+
RailsOps.config.default_schemacop_version = 3
|
244
|
+
test_op_with_schema3(use_default: true)
|
245
|
+
|
246
|
+
RailsOps.config.default_schemacop_version = 2
|
247
|
+
test_op_with_schema2(use_default: true)
|
248
|
+
|
249
|
+
RailsOps.config.default_schemacop_version = -50
|
250
|
+
assert_raises_with_message RuntimeError, 'Schemacop schema versions supported are 2 and 3.' do
|
251
|
+
test_op_with_schema3(use_default: true)
|
252
|
+
end
|
253
|
+
RailsOps.config.default_schemacop_version = 3
|
254
|
+
end
|
255
|
+
|
256
|
+
def test_require_context
|
257
|
+
op = Class.new(RailsOps::Operation) do
|
258
|
+
require_context :user, :session
|
259
|
+
end
|
260
|
+
|
261
|
+
ctx = RailsOps::Context.new(user: Class.new, session: Class.new)
|
262
|
+
assert_raises_with_message RailsOps::Exceptions::MissingContextAttribute, 'This operation requires the context attribute :user to be present.' do
|
263
|
+
op.new
|
264
|
+
end
|
265
|
+
assert_nothing_raised do
|
266
|
+
op.new(ctx, foo: :bar)
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
def test_run_through_context
|
271
|
+
op = Class.new(RailsOps::Operation) do
|
272
|
+
def perform; end
|
273
|
+
end
|
274
|
+
ctx = RailsOps::Context.new(user: Class.new, session: Class.new)
|
275
|
+
assert_nothing_raised do
|
276
|
+
ctx.run! op, foo: :bar
|
277
|
+
end
|
278
|
+
end
|
158
279
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_ops
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sitrox
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-07-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: appraisal
|
@@ -136,6 +136,20 @@ dependencies:
|
|
136
136
|
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: simplecov
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: active_type
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -301,9 +315,11 @@ files:
|
|
301
315
|
- test/dummy/app/channels/application_cable/connection.rb
|
302
316
|
- test/dummy/app/controllers/application_controller.rb
|
303
317
|
- test/dummy/app/controllers/concerns/.keep
|
318
|
+
- test/dummy/app/controllers/group_controller.rb
|
304
319
|
- test/dummy/app/helpers/application_helper.rb
|
305
320
|
- test/dummy/app/jobs/application_job.rb
|
306
321
|
- test/dummy/app/mailers/application_mailer.rb
|
322
|
+
- test/dummy/app/models/ability.rb
|
307
323
|
- test/dummy/app/models/animal.rb
|
308
324
|
- test/dummy/app/models/application_record.rb
|
309
325
|
- test/dummy/app/models/bird.rb
|
@@ -336,6 +352,7 @@ files:
|
|
336
352
|
- test/dummy/config/environments/development.rb
|
337
353
|
- test/dummy/config/environments/production.rb
|
338
354
|
- test/dummy/config/environments/test.rb
|
355
|
+
- test/dummy/config/hookup.rb
|
339
356
|
- test/dummy/config/initializers/application_controller_renderer.rb
|
340
357
|
- test/dummy/config/initializers/assets.rb
|
341
358
|
- test/dummy/config/initializers/backtrace_silencers.rb
|
@@ -363,17 +380,22 @@ files:
|
|
363
380
|
- test/dummy/tmp/.keep
|
364
381
|
- test/test_helper.rb
|
365
382
|
- test/unit/rails_ops/generators/operation_generator_test.rb
|
383
|
+
- test/unit/rails_ops/hookup_test.rb
|
384
|
+
- test/unit/rails_ops/mixins/controller_test.rb
|
366
385
|
- test/unit/rails_ops/mixins/model/deep_nesting_test.rb
|
386
|
+
- test/unit/rails_ops/mixins/model/marshalling_test.rb
|
367
387
|
- test/unit/rails_ops/mixins/param_authorization_test.rb
|
368
388
|
- test/unit/rails_ops/mixins/policies_test.rb
|
389
|
+
- test/unit/rails_ops/operation/auth_test.rb
|
369
390
|
- test/unit/rails_ops/operation/model/create_test.rb
|
391
|
+
- test/unit/rails_ops/operation/model/destroy_test.rb
|
370
392
|
- test/unit/rails_ops/operation/model/load_test.rb
|
371
393
|
- test/unit/rails_ops/operation/model/sti_test.rb
|
372
394
|
- test/unit/rails_ops/operation/model/update_test.rb
|
373
395
|
- test/unit/rails_ops/operation/model_test.rb
|
374
|
-
- test/unit/rails_ops/operation/update_auth_test.rb
|
375
396
|
- test/unit/rails_ops/operation/update_lazy_auth_test.rb
|
376
397
|
- test/unit/rails_ops/operation_test.rb
|
398
|
+
- test/unit/rails_ops/profiler_test.rb
|
377
399
|
homepage:
|
378
400
|
licenses: []
|
379
401
|
metadata: {}
|
@@ -392,7 +414,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
392
414
|
- !ruby/object:Gem::Version
|
393
415
|
version: '0'
|
394
416
|
requirements: []
|
395
|
-
rubygems_version: 3.4.
|
417
|
+
rubygems_version: 3.4.10
|
396
418
|
signing_key:
|
397
419
|
specification_version: 4
|
398
420
|
summary: An operations service layer for rails projects.
|
@@ -410,9 +432,11 @@ test_files:
|
|
410
432
|
- test/dummy/app/channels/application_cable/connection.rb
|
411
433
|
- test/dummy/app/controllers/application_controller.rb
|
412
434
|
- test/dummy/app/controllers/concerns/.keep
|
435
|
+
- test/dummy/app/controllers/group_controller.rb
|
413
436
|
- test/dummy/app/helpers/application_helper.rb
|
414
437
|
- test/dummy/app/jobs/application_job.rb
|
415
438
|
- test/dummy/app/mailers/application_mailer.rb
|
439
|
+
- test/dummy/app/models/ability.rb
|
416
440
|
- test/dummy/app/models/animal.rb
|
417
441
|
- test/dummy/app/models/application_record.rb
|
418
442
|
- test/dummy/app/models/bird.rb
|
@@ -445,6 +469,7 @@ test_files:
|
|
445
469
|
- test/dummy/config/environments/development.rb
|
446
470
|
- test/dummy/config/environments/production.rb
|
447
471
|
- test/dummy/config/environments/test.rb
|
472
|
+
- test/dummy/config/hookup.rb
|
448
473
|
- test/dummy/config/initializers/application_controller_renderer.rb
|
449
474
|
- test/dummy/config/initializers/assets.rb
|
450
475
|
- test/dummy/config/initializers/backtrace_silencers.rb
|
@@ -472,14 +497,19 @@ test_files:
|
|
472
497
|
- test/dummy/tmp/.keep
|
473
498
|
- test/test_helper.rb
|
474
499
|
- test/unit/rails_ops/generators/operation_generator_test.rb
|
500
|
+
- test/unit/rails_ops/hookup_test.rb
|
501
|
+
- test/unit/rails_ops/mixins/controller_test.rb
|
475
502
|
- test/unit/rails_ops/mixins/model/deep_nesting_test.rb
|
503
|
+
- test/unit/rails_ops/mixins/model/marshalling_test.rb
|
476
504
|
- test/unit/rails_ops/mixins/param_authorization_test.rb
|
477
505
|
- test/unit/rails_ops/mixins/policies_test.rb
|
506
|
+
- test/unit/rails_ops/operation/auth_test.rb
|
478
507
|
- test/unit/rails_ops/operation/model/create_test.rb
|
508
|
+
- test/unit/rails_ops/operation/model/destroy_test.rb
|
479
509
|
- test/unit/rails_ops/operation/model/load_test.rb
|
480
510
|
- test/unit/rails_ops/operation/model/sti_test.rb
|
481
511
|
- test/unit/rails_ops/operation/model/update_test.rb
|
482
512
|
- test/unit/rails_ops/operation/model_test.rb
|
483
|
-
- test/unit/rails_ops/operation/update_auth_test.rb
|
484
513
|
- test/unit/rails_ops/operation/update_lazy_auth_test.rb
|
485
514
|
- test/unit/rails_ops/operation_test.rb
|
515
|
+
- test/unit/rails_ops/profiler_test.rb
|
@@ -1,64 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require 'rails_ops/authorization_backend/can_can_can'
|
3
|
-
require 'cancancan'
|
4
|
-
|
5
|
-
class RailsOps::Operation::UpdateLazyAuthTest < ActiveSupport::TestCase
|
6
|
-
include TestHelper
|
7
|
-
|
8
|
-
BASIC_OP = Class.new(RailsOps::Operation::Model::Update) do
|
9
|
-
model ::Group
|
10
|
-
|
11
|
-
model_authorization_action :update
|
12
|
-
|
13
|
-
def perform
|
14
|
-
fail osparams.exception if osparams.exception
|
15
|
-
@done = true
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
ABILITY = Class.new do
|
20
|
-
include CanCan::Ability
|
21
|
-
|
22
|
-
def initialize(read: false, update: false)
|
23
|
-
super()
|
24
|
-
|
25
|
-
can :read, Group if read
|
26
|
-
can :update, Group if update
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
setup do
|
31
|
-
Group.create!(id: 1, name: 'Group')
|
32
|
-
RailsOps.config.authorization_backend = 'RailsOps::AuthorizationBackend::CanCanCan'
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_unpermitted_read
|
36
|
-
ctx = RailsOps::Context.new(ability: ABILITY.new(read: true))
|
37
|
-
assert_raises CanCan::AccessDenied do
|
38
|
-
BASIC_OP.new(ctx, id: 1)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_permitted_read
|
43
|
-
ctx = RailsOps::Context.new(ability: ABILITY.new(read: true))
|
44
|
-
assert_nothing_raised do
|
45
|
-
BASIC_OP.new(ctx, id: 1)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_unpermitted_update
|
50
|
-
ctx = RailsOps::Context.new(ability: ABILITY.new(read: true))
|
51
|
-
op = BASIC_OP.new(ctx, id: 1)
|
52
|
-
assert_raises CanCan::AccessDenied do
|
53
|
-
op.run!
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_permitted_update
|
58
|
-
ctx = RailsOps::Context.new(ability: ABILITY.new(read: true, update: true))
|
59
|
-
op = BASIC_OP.new(ctx, id: 1)
|
60
|
-
assert_nothing_raised do
|
61
|
-
op.run!
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|