shamu 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +26 -0
- data/.gitignore +2 -1
- data/.rubocop.yml +89 -30
- data/.yardopts +4 -5
- data/Gemfile +24 -12
- data/Guardfile +5 -0
- data/LABELS.md +22 -0
- data/README.md +41 -0
- data/Rakefile +12 -0
- data/circle.yml +7 -3
- data/config.ru +7 -0
- data/lib/shamu/active_record.rb +7 -0
- data/lib/shamu/attributes/assignment.rb +114 -0
- data/lib/shamu/attributes/equality.rb +40 -0
- data/lib/shamu/attributes/fluid_assignment.rb +49 -0
- data/lib/shamu/attributes/validation.rb +74 -0
- data/lib/shamu/attributes.rb +255 -0
- data/lib/shamu/auditing/README.md +0 -0
- data/lib/shamu/auditing/audit_record.rb +32 -0
- data/lib/shamu/auditing/auditing_service.rb +32 -0
- data/lib/shamu/auditing/list_scope.rb +22 -0
- data/lib/shamu/auditing/logging_auditing_service.rb +16 -0
- data/lib/shamu/auditing/support.rb +75 -0
- data/lib/shamu/auditing/transaction.rb +58 -0
- data/lib/shamu/auditing.rb +12 -0
- data/lib/shamu/entities/README.md +1 -0
- data/lib/shamu/entities/active_record.rb +123 -0
- data/lib/shamu/entities/active_record_soft_destroy.rb +91 -0
- data/lib/shamu/entities/entity.rb +196 -0
- data/lib/shamu/entities/entity_path.rb +87 -0
- data/lib/shamu/entities/identity_cache.rb +64 -0
- data/lib/shamu/entities/list.rb +54 -0
- data/lib/shamu/entities/list_scope/dates.rb +57 -0
- data/lib/shamu/entities/list_scope/paging.rb +51 -0
- data/lib/shamu/entities/list_scope/scoped_paging.rb +65 -0
- data/lib/shamu/entities/list_scope/sorting.rb +76 -0
- data/lib/shamu/entities/list_scope.rb +105 -0
- data/lib/shamu/entities/null_entity.rb +88 -0
- data/lib/shamu/entities.rb +11 -0
- data/lib/shamu/error.rb +23 -5
- data/lib/shamu/events/README.md +0 -0
- data/lib/shamu/events/active_record/channel.rb +36 -0
- data/lib/shamu/events/active_record/message.rb +52 -0
- data/lib/shamu/events/active_record/migration.rb +49 -0
- data/lib/shamu/events/active_record/runner.rb +28 -0
- data/lib/shamu/events/active_record/service.rb +174 -0
- data/lib/shamu/events/active_record.rb +13 -0
- data/lib/shamu/events/channel_stats.rb +23 -0
- data/lib/shamu/events/error.rb +24 -0
- data/lib/shamu/events/events_service.rb +136 -0
- data/lib/shamu/events/in_memory/async_service.rb +48 -0
- data/lib/shamu/events/in_memory/service.rb +97 -0
- data/lib/shamu/events/in_memory.rb +10 -0
- data/lib/shamu/events/message.rb +38 -0
- data/lib/shamu/events/support.rb +60 -0
- data/lib/shamu/events.rb +12 -0
- data/lib/shamu/features/README.md +0 -0
- data/lib/shamu/features/conditions/condition.rb +39 -0
- data/lib/shamu/features/conditions/env.rb +37 -0
- data/lib/shamu/features/conditions/hosts.rb +25 -0
- data/lib/shamu/features/conditions/matching.rb +16 -0
- data/lib/shamu/features/conditions/not_matching.rb +16 -0
- data/lib/shamu/features/conditions/percentage.rb +44 -0
- data/lib/shamu/features/conditions/proc.rb +54 -0
- data/lib/shamu/features/conditions/roles.rb +23 -0
- data/lib/shamu/features/conditions/schedule_at.rb +27 -0
- data/lib/shamu/features/conditions.rb +18 -0
- data/lib/shamu/features/config_service.rb +10 -0
- data/lib/shamu/features/context.rb +80 -0
- data/lib/shamu/features/env_store.rb +88 -0
- data/lib/shamu/features/errors.rb +29 -0
- data/lib/shamu/features/features_service.rb +168 -0
- data/lib/shamu/features/list_scope.rb +30 -0
- data/lib/shamu/features/selector.rb +50 -0
- data/lib/shamu/features/support.rb +51 -0
- data/lib/shamu/features/toggle.rb +149 -0
- data/lib/shamu/features/toggle_codec.rb +69 -0
- data/lib/shamu/features.rb +16 -0
- data/lib/shamu/locale/en.yml +22 -2
- data/lib/shamu/logger.rb +13 -0
- data/lib/shamu/rack/README.md +0 -0
- data/lib/shamu/rack/cookies.rb +115 -0
- data/lib/shamu/rack/cookies_middleware.rb +26 -0
- data/lib/shamu/rack/query_params.rb +41 -0
- data/lib/shamu/rack/query_params_middleware.rb +24 -0
- data/lib/shamu/rack.rb +12 -0
- data/lib/shamu/rails/controller.rb +131 -0
- data/lib/shamu/rails/entity.rb +168 -0
- data/lib/shamu/rails/features.rb +13 -0
- data/lib/shamu/rails/railtie.rb +30 -0
- data/lib/shamu/rails.rb +10 -0
- data/lib/shamu/rspec/matchers.rb +44 -0
- data/lib/shamu/rspec.rb +1 -0
- data/lib/shamu/security/README.md +0 -0
- data/lib/shamu/security/active_record_policy.rb +106 -0
- data/lib/shamu/security/error.rb +65 -0
- data/lib/shamu/security/hashed_value.rb +71 -0
- data/lib/shamu/security/no_policy.rb +15 -0
- data/lib/shamu/security/policy.rb +289 -0
- data/lib/shamu/security/policy_refinement.rb +50 -0
- data/lib/shamu/security/policy_rule.rb +59 -0
- data/lib/shamu/security/principal.rb +72 -0
- data/lib/shamu/security/roles.rb +62 -0
- data/lib/shamu/security/roles_service.rb +30 -0
- data/lib/shamu/security/support.rb +83 -0
- data/lib/shamu/security.rb +43 -0
- data/lib/shamu/services/README.md +2 -0
- data/lib/shamu/services/active_record.rb +58 -0
- data/lib/shamu/services/active_record_crud.rb +378 -0
- data/lib/shamu/services/error.rb +24 -0
- data/lib/shamu/services/lazy_association.rb +31 -0
- data/lib/shamu/services/lazy_transform.rb +97 -0
- data/lib/shamu/services/request.rb +122 -0
- data/lib/shamu/services/request_support.rb +124 -0
- data/lib/shamu/services/result.rb +75 -0
- data/lib/shamu/services/service.rb +355 -0
- data/lib/shamu/services.rb +12 -0
- data/lib/shamu/sessions/README.md +2 -0
- data/lib/shamu/sessions/cookie_store.rb +79 -0
- data/lib/shamu/sessions/session_store.rb +42 -0
- data/lib/shamu/sessions.rb +8 -0
- data/lib/shamu/to_bool_extension.rb +57 -0
- data/lib/shamu/to_model_id_extension.rb +50 -0
- data/lib/shamu/version.rb +10 -4
- data/lib/shamu.rb +18 -6
- data/shamu.gemspec +21 -10
- data/spec/internal/README.md +4 -0
- data/spec/internal/config/database.yml +3 -0
- data/spec/internal/config/routes.rb +3 -0
- data/spec/internal/db/schema.rb +3 -0
- data/spec/internal/log/.gitignore +1 -0
- data/spec/internal/public/favicon.ico +0 -0
- data/spec/lib/shamu/active_record_support.rb +32 -0
- data/spec/lib/shamu/attributes/assignment_spec.rb +129 -0
- data/spec/lib/shamu/attributes/equality_spec.rb +63 -0
- data/spec/lib/shamu/attributes/fluid_assignment_spec.rb +31 -0
- data/spec/lib/shamu/attributes/validation_spec.rb +53 -0
- data/spec/lib/shamu/attributes_spec.rb +331 -0
- data/spec/lib/shamu/auditing/logging_auditing_service_spec.rb +18 -0
- data/spec/lib/shamu/auditing/support_spec.rb +41 -0
- data/spec/lib/shamu/entities/active_record_soft_destroy_spec.rb +82 -0
- data/spec/lib/shamu/entities/active_record_spec.rb +66 -0
- data/spec/lib/shamu/entities/entity_path_spec.rb +40 -0
- data/spec/lib/shamu/entities/entity_spec.rb +56 -0
- data/spec/lib/shamu/entities/identity_cache_spec.rb +69 -0
- data/spec/lib/shamu/entities/list_scope/dates_spec.rb +47 -0
- data/spec/lib/shamu/entities/list_scope/paging_spec.rb +41 -0
- data/spec/lib/shamu/entities/list_scope/scoped_paging_spec.rb +40 -0
- data/spec/lib/shamu/entities/list_scope/sorting_spec.rb +59 -0
- data/spec/lib/shamu/entities/list_scope_spec.rb +127 -0
- data/spec/lib/shamu/entities/list_spec.rb +60 -0
- data/spec/lib/shamu/entities/null_entity_spec.rb +94 -0
- data/spec/lib/shamu/events/active_record/migration_spec.rb +11 -0
- data/spec/lib/shamu/events/active_record/service_spec.rb +139 -0
- data/spec/lib/shamu/events/events_service_spec.rb +57 -0
- data/spec/lib/shamu/events/in_memory/async_service_spec.rb +37 -0
- data/spec/lib/shamu/events/in_memory/service_spec.rb +36 -0
- data/spec/lib/shamu/events/message_spec.rb +7 -0
- data/spec/lib/shamu/events/support_spec.rb +44 -0
- data/spec/lib/shamu/features/conditions/condition_spec.rb +8 -0
- data/spec/lib/shamu/features/conditions/env_spec.rb +29 -0
- data/spec/lib/shamu/features/conditions/hosts_spec.rb +21 -0
- data/spec/lib/shamu/features/conditions/matching_spec.rb +23 -0
- data/spec/lib/shamu/features/conditions/percentage_spec.rb +71 -0
- data/spec/lib/shamu/features/conditions/proc_spec.rb +28 -0
- data/spec/lib/shamu/features/env_store_spec.rb +48 -0
- data/spec/lib/shamu/features/features.yml +34 -0
- data/spec/lib/shamu/features/features_service_spec.rb +109 -0
- data/spec/lib/shamu/features/secondary.yml +5 -0
- data/spec/lib/shamu/features/selector_spec.rb +17 -0
- data/spec/lib/shamu/features/support_spec.rb +45 -0
- data/spec/lib/shamu/features/toggle_codec_spec.rb +28 -0
- data/spec/lib/shamu/features/toggle_spec.rb +42 -0
- data/spec/lib/shamu/rack/cookies_middleware_spec.rb +33 -0
- data/spec/lib/shamu/rack/cookies_spec.rb +43 -0
- data/spec/lib/shamu/rack/query_params_middleware_spec.rb +33 -0
- data/spec/lib/shamu/rack/query_params_spec.rb +23 -0
- data/spec/lib/shamu/rails/controller_spec.rb +74 -0
- data/spec/lib/shamu/rails/entity_spec.rb +150 -0
- data/spec/lib/shamu/rails/features.yml +13 -0
- data/spec/lib/shamu/rails/features_spec.rb +45 -0
- data/spec/lib/shamu/security/active_record_policy_spec.rb +38 -0
- data/spec/lib/shamu/security/hashed_value_spec.rb +41 -0
- data/spec/lib/shamu/security/policy_refinement_spec.rb +61 -0
- data/spec/lib/shamu/security/policy_rule_spec.rb +60 -0
- data/spec/lib/shamu/security/policy_spec.rb +158 -0
- data/spec/lib/shamu/security/roles_spec.rb +46 -0
- data/spec/lib/shamu/services/active_record_crud_spec.rb +460 -0
- data/spec/lib/shamu/services/active_record_spec.rb +92 -0
- data/spec/lib/shamu/services/lazy_association_spec.rb +31 -0
- data/spec/lib/shamu/services/lazy_transform_spec.rb +96 -0
- data/spec/lib/shamu/services/request_spec.rb +58 -0
- data/spec/lib/shamu/services/request_support_spec.rb +129 -0
- data/spec/lib/shamu/services/result_spec.rb +37 -0
- data/spec/lib/shamu/services/service_spec.rb +307 -0
- data/spec/lib/shamu/sessions/cookie_store_spec.rb +44 -0
- data/spec/lib/shamu/to_bool_extension_spec.rb +67 -0
- data/spec/lib/shamu/to_model_id_extension_spec.rb +54 -0
- data/spec/rails_helper.rb +13 -0
- data/spec/spec_helper.rb +17 -12
- data/spec/support/active_record.rb +17 -0
- data/spec/support/database.rb +14 -0
- data/spec/support/logger.rb +0 -0
- metadata +383 -9
- data/spec/lib/shamu_spec.rb +0 -5
- /data/{spec/internal/log/test.log → lib/shamu/attributes/README.md} +0 -0
@@ -0,0 +1,92 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "shamu/services"
|
3
|
+
require "shamu/services/active_record"
|
4
|
+
|
5
|
+
describe Shamu::Services::ActiveRecord do
|
6
|
+
use_active_record
|
7
|
+
|
8
|
+
let( :klass ) do
|
9
|
+
Class.new( Shamu::Services::Service ) do
|
10
|
+
include Shamu::Services::ActiveRecord
|
11
|
+
public :wrap_not_found, :scope_relation, :with_transaction
|
12
|
+
end
|
13
|
+
end
|
14
|
+
let( :service ) { scorpion.new klass }
|
15
|
+
|
16
|
+
describe "#wrap_not_found" do
|
17
|
+
it "re-raises AR not found as shamu not found" do
|
18
|
+
expect do
|
19
|
+
service.wrap_not_found do
|
20
|
+
raise ActiveRecord::RecordNotFound
|
21
|
+
end
|
22
|
+
end.to raise_error Shamu::NotFoundError
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#scope_relation" do
|
27
|
+
|
28
|
+
it "short-circuits if no relation" do
|
29
|
+
expect( service.scope_relation( nil, nil ) ).to be_nil
|
30
|
+
end
|
31
|
+
|
32
|
+
it "invokes by_list_scope if available" do
|
33
|
+
scope = ActiveRecordSpec::FavoriteScope.new
|
34
|
+
relation = ActiveRecordSpec::Favorite.all
|
35
|
+
|
36
|
+
expect( relation ).to receive( :by_list_scope )
|
37
|
+
service.scope_relation( relation, scope )
|
38
|
+
end
|
39
|
+
|
40
|
+
it "it raises helpful error if relation isn't scopable" do
|
41
|
+
scope = ActiveRecordSpec::FavoriteScope.new
|
42
|
+
relation = ActiveRecordSpec::Favorite.all
|
43
|
+
|
44
|
+
expect( relation ).to receive( :respond_to? ).and_return false
|
45
|
+
|
46
|
+
expect do
|
47
|
+
service.scope_relation( relation, scope )
|
48
|
+
end.to raise_error /by_list_scope/
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#with_transaction" do
|
53
|
+
it "returns the result on success" do
|
54
|
+
result = service.with_transaction do
|
55
|
+
Shamu::Services::Result.new
|
56
|
+
end
|
57
|
+
|
58
|
+
expect( result ).to be_a Shamu::Services::Result
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
it "returns the result on failure" do
|
63
|
+
result = service.with_transaction do
|
64
|
+
Shamu::Services::Result.new.tap do |r|
|
65
|
+
r.errors.add :base, "Failure"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
expect( result ).to be_a Shamu::Services::Result
|
70
|
+
expect( result ).not_to be_valid
|
71
|
+
end
|
72
|
+
|
73
|
+
it "does not modify the database on failures" do
|
74
|
+
expect do
|
75
|
+
service.with_transaction do
|
76
|
+
ActiveRecordSpec::Favorite.create! name: "Example"
|
77
|
+
Shamu::Services::Result.new.tap do |r|
|
78
|
+
r.errors.add :base, "Failure"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end.not_to change( ActiveRecordSpec::Favorite, :count )
|
82
|
+
end
|
83
|
+
|
84
|
+
it "raises nested exceptions" do
|
85
|
+
expect do
|
86
|
+
service.with_transaction do
|
87
|
+
raise NotImplementedError
|
88
|
+
end
|
89
|
+
end.to raise_error NotImplementedError
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Shamu::Services::LazyAssociation do
|
4
|
+
it "calls block to look up association" do
|
5
|
+
assoc = double
|
6
|
+
expect( assoc ).to receive( :label )
|
7
|
+
lazy = Shamu::Services::LazyAssociation.new( 1 ) { assoc }
|
8
|
+
lazy.label
|
9
|
+
end
|
10
|
+
|
11
|
+
it "delegates ==" do
|
12
|
+
assoc = double
|
13
|
+
lazy = Shamu::Services::LazyAssociation.new( 1 ) { assoc }
|
14
|
+
expect( lazy ).to eq assoc
|
15
|
+
end
|
16
|
+
|
17
|
+
it "does not delegate id" do
|
18
|
+
assoc = double
|
19
|
+
expect( assoc ).not_to receive( :id )
|
20
|
+
lazy = Shamu::Services::LazyAssociation.new( 1 ) { assoc }
|
21
|
+
lazy.id
|
22
|
+
end
|
23
|
+
|
24
|
+
it "has the same class as original object" do
|
25
|
+
assoc = double
|
26
|
+
expect( assoc ).to receive( :to_entity ).and_return assoc
|
27
|
+
lazy = Shamu::Services::LazyAssociation.new( 1 ) { assoc }
|
28
|
+
|
29
|
+
expect( lazy.to_entity ).to be_kind_of assoc.class
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Shamu::Services::LazyTransform do
|
4
|
+
let( :source ) { [ 1, 2, 3 ] }
|
5
|
+
|
6
|
+
it "short-circuits count" do
|
7
|
+
expect do |block|
|
8
|
+
transformed = Shamu::Services::LazyTransform.new( source, &block )
|
9
|
+
expect( transformed.count ).to eq source.count
|
10
|
+
end.not_to yield_control
|
11
|
+
end
|
12
|
+
|
13
|
+
it "delegates when count has an arg" do
|
14
|
+
expect do |block|
|
15
|
+
transformed = Shamu::Services::LazyTransform.new( source, &block )
|
16
|
+
expect( transformed.count( 1000 ) ).to eq 0
|
17
|
+
end.to yield_control
|
18
|
+
end
|
19
|
+
|
20
|
+
it "delegates when count has a block given" do
|
21
|
+
expect do |block|
|
22
|
+
transformed = Shamu::Services::LazyTransform.new( source, &block )
|
23
|
+
expect( transformed.count { true } ).to eq source.count
|
24
|
+
end.to yield_control
|
25
|
+
end
|
26
|
+
|
27
|
+
it "short-circuits first" do
|
28
|
+
expect do |block|
|
29
|
+
transformed = Shamu::Services::LazyTransform.new( source, &block )
|
30
|
+
transformed.first
|
31
|
+
end.to yield_control.once
|
32
|
+
end
|
33
|
+
|
34
|
+
it "doesn't short-circuit first(n)" do
|
35
|
+
expect do |block|
|
36
|
+
transformed = Shamu::Services::LazyTransform.new( source, &block )
|
37
|
+
transformed.first( 2 )
|
38
|
+
end.to yield_control.exactly(3)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "short-circuits empty?" do
|
42
|
+
expect do |block|
|
43
|
+
transformed = Shamu::Services::LazyTransform.new( source, &block )
|
44
|
+
expect( transformed ).not_to be_empty
|
45
|
+
end.not_to yield_control
|
46
|
+
end
|
47
|
+
|
48
|
+
it "short-circuits present?" do
|
49
|
+
expect do |block|
|
50
|
+
transformed = Shamu::Services::LazyTransform.new( source, &block )
|
51
|
+
transformed.present?
|
52
|
+
end.not_to yield_control
|
53
|
+
end
|
54
|
+
|
55
|
+
it "transforms when enumerated" do
|
56
|
+
expect do |block|
|
57
|
+
transformed = Shamu::Services::LazyTransform.new( source, &block )
|
58
|
+
transformed.to_a
|
59
|
+
end.to yield_control.exactly( 3 )
|
60
|
+
end
|
61
|
+
|
62
|
+
it "yields transformed values" do
|
63
|
+
transformed = Shamu::Services::LazyTransform.new( source ) { |v| v * v }
|
64
|
+
expect( transformed.to_a ).to eq [ 1, 4, 9 ]
|
65
|
+
end
|
66
|
+
|
67
|
+
it "short-circuits drop" do
|
68
|
+
expect do |block|
|
69
|
+
transformed = Shamu::Services::LazyTransform.new( source, &block )
|
70
|
+
transformed.drop( 2 ).to_a
|
71
|
+
end.to yield_control.exactly( 1 )
|
72
|
+
end
|
73
|
+
|
74
|
+
it "uses existing transformed on drop if avaialable" do
|
75
|
+
expect do |block|
|
76
|
+
transformed = Shamu::Services::LazyTransform.new( source, &block )
|
77
|
+
transformed.to_a
|
78
|
+
transformed.drop( 2 ).to_a
|
79
|
+
end.to yield_control.exactly( 3 )
|
80
|
+
end
|
81
|
+
|
82
|
+
it "short-circuits take" do
|
83
|
+
expect do |block|
|
84
|
+
transformed = Shamu::Services::LazyTransform.new( source, &block )
|
85
|
+
transformed.take( 2 ).to_a
|
86
|
+
end.to yield_control.exactly( 2 )
|
87
|
+
end
|
88
|
+
|
89
|
+
it "users existing transformed on take if avaialable" do
|
90
|
+
expect do |block|
|
91
|
+
transformed = Shamu::Services::LazyTransform.new( source, &block )
|
92
|
+
transformed.to_a
|
93
|
+
transformed.take( 2 ).to_a
|
94
|
+
end.to yield_control.exactly( 3 )
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
|
4
|
+
describe Shamu::Services::Request do
|
5
|
+
describe ".model_name" do
|
6
|
+
{
|
7
|
+
"Users::UserRequest::Create" => "Users::User",
|
8
|
+
"Users::UserRequest::New" => "Users::User",
|
9
|
+
"Users::UserRequest::Change" => "Users::User",
|
10
|
+
"Users::UserRequest::Update" => "Users::User",
|
11
|
+
"Users::Request::Change" => "Users::User",
|
12
|
+
"Users::FavoritesUpdate" => "Users::Favorite",
|
13
|
+
"Users::FavoritesCreate" => "Users::Favorite",
|
14
|
+
"Users::FavoritesChange" => "Users::Favorite",
|
15
|
+
"Users::FavoritesNew" => "Users::Favorite",
|
16
|
+
"UserUpdateRequest" => "User"
|
17
|
+
}.each do |name, model_name|
|
18
|
+
it "formats '#{ name }' as '#{ model_name }'" do
|
19
|
+
klass = Class.new( Shamu::Services::Request )
|
20
|
+
klass.define_singleton_method :name do
|
21
|
+
name
|
22
|
+
end
|
23
|
+
|
24
|
+
expect( klass.model_name.name ).to eq model_name
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#apply_to" do
|
30
|
+
let( :klass ) do
|
31
|
+
Class.new( Shamu::Services::Request ) do
|
32
|
+
attribute :name
|
33
|
+
attribute :label
|
34
|
+
end
|
35
|
+
end
|
36
|
+
let( :request ) { klass.new name: "Example" }
|
37
|
+
|
38
|
+
it "returns the model" do
|
39
|
+
model = double
|
40
|
+
expect( Shamu::Services::Request.new.apply_to( model ) ).to be model
|
41
|
+
end
|
42
|
+
|
43
|
+
it "assigns attributes that have been set" do
|
44
|
+
model = double( name: "", label: "" )
|
45
|
+
expect( model ).to receive( :name= ).with( any_args )
|
46
|
+
|
47
|
+
request.apply_to( model )
|
48
|
+
end
|
49
|
+
|
50
|
+
it "skips attributes that haven't been set" do
|
51
|
+
model = double( name: "", label: "" )
|
52
|
+
expect( model ).not_to receive( :label= )
|
53
|
+
|
54
|
+
request.apply_to( model )
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "shamu/services"
|
3
|
+
|
4
|
+
module RequestSupportSpec
|
5
|
+
class Service < Shamu::Services::Service
|
6
|
+
include Shamu::Services::RequestSupport
|
7
|
+
|
8
|
+
def process( params )
|
9
|
+
with_request( params, Request::Change ) do |request|
|
10
|
+
request_hook
|
11
|
+
next error( :base, "nope" ) if request.level < 0
|
12
|
+
|
13
|
+
record = OpenStruct.new( request.to_attributes )
|
14
|
+
scorpion.fetch RequestSupportSpec::Entity, { record: record }, {}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def request_hook
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
module Request
|
24
|
+
class Change < Shamu::Services::Request
|
25
|
+
attribute :level
|
26
|
+
attribute :amount, presence: true
|
27
|
+
end
|
28
|
+
|
29
|
+
class Custom < Change
|
30
|
+
end
|
31
|
+
|
32
|
+
class Create < Change
|
33
|
+
end
|
34
|
+
|
35
|
+
class Update < Change
|
36
|
+
attribute :id
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class Entity < Shamu::Entities::Entity
|
41
|
+
model :record
|
42
|
+
attribute :id, on: :record
|
43
|
+
attribute :level, on: :record
|
44
|
+
attribute :amount, on: :record
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe Shamu::Services::RequestSupport do
|
49
|
+
|
50
|
+
let( :service ) { scorpion.new RequestSupportSpec::Service }
|
51
|
+
|
52
|
+
describe "#request_class" do
|
53
|
+
|
54
|
+
it "finds method specific class" do
|
55
|
+
expect( service.request_class( :custom ) ).to be RequestSupportSpec::Request::Custom
|
56
|
+
end
|
57
|
+
|
58
|
+
it "falls back to Change" do
|
59
|
+
expect( service.request_class( :open ) ).to be RequestSupportSpec::Request::Change
|
60
|
+
end
|
61
|
+
|
62
|
+
it "fails if no available class" do
|
63
|
+
expect do
|
64
|
+
Class.new( Shamu::Services::Service ) do
|
65
|
+
include Shamu::Services::RequestSupport
|
66
|
+
end.request_class( :change )
|
67
|
+
end.to raise_error Shamu::Services::IncompleteSetupError, /Request/
|
68
|
+
end
|
69
|
+
|
70
|
+
it "uses common alias fallback new -> create" do
|
71
|
+
expect( service.request_class( :new ) ).to be RequestSupportSpec::Request::Create
|
72
|
+
end
|
73
|
+
|
74
|
+
it "uses common alias fallback edit -> update" do
|
75
|
+
expect( service.request_class( :edit ) ).to be RequestSupportSpec::Request::Update
|
76
|
+
end
|
77
|
+
|
78
|
+
it "tries parent service namespace" do
|
79
|
+
klass = Class.new( RequestSupportSpec::Service )
|
80
|
+
expect( klass.request_class( :change ) ).to be RequestSupportSpec::Request::Change
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "#with_request" do
|
85
|
+
let( :request_params ) { { level: 1, amount: 5 } }
|
86
|
+
let( :service ) { scorpion.new RequestSupportSpec::Service }
|
87
|
+
|
88
|
+
it "returns a Result" do
|
89
|
+
expect( service.process( request_params ) ).to be_a Shamu::Services::Result
|
90
|
+
end
|
91
|
+
|
92
|
+
it "returns validation errors" do
|
93
|
+
request_params.delete :amount
|
94
|
+
expect( service.process( request_params ) ).not_to be_valid
|
95
|
+
end
|
96
|
+
|
97
|
+
it "is valid without errors" do
|
98
|
+
expect( service.process( request_params ) ).to be_valid
|
99
|
+
end
|
100
|
+
|
101
|
+
it "yield with valid params" do
|
102
|
+
expect( service ).to receive( :request_hook )
|
103
|
+
service.process( request_params )
|
104
|
+
end
|
105
|
+
|
106
|
+
it "doesn't yield if params are invalid" do
|
107
|
+
request_params.delete :amount
|
108
|
+
expect( service ).not_to receive( :request_hook )
|
109
|
+
service.process( request_params )
|
110
|
+
end
|
111
|
+
|
112
|
+
it "captures returned entity into result" do
|
113
|
+
result = service.process( request_params )
|
114
|
+
expect( result.entity ).to be_a RequestSupportSpec::Entity
|
115
|
+
end
|
116
|
+
|
117
|
+
it "captures request_params into result" do
|
118
|
+
result = service.process( request_params )
|
119
|
+
expect( result.request ).to be_a RequestSupportSpec::Request::Change
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe "#request_for" do
|
124
|
+
it "returns request" do
|
125
|
+
request = service.request_for( :create )
|
126
|
+
expect( request ).to be_a Shamu::Services::Request
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "shamu/services"
|
3
|
+
|
4
|
+
describe Shamu::Services::Result do
|
5
|
+
|
6
|
+
it "detects Request in sources" do
|
7
|
+
request = Shamu::Services::Request.new
|
8
|
+
result = Shamu::Services::Result.new request
|
9
|
+
|
10
|
+
expect( result.request ).to eq request
|
11
|
+
end
|
12
|
+
|
13
|
+
it "detects Entity in sources" do
|
14
|
+
entity = Shamu::Entities::Entity.new
|
15
|
+
result = Shamu::Services::Result.new entity
|
16
|
+
|
17
|
+
expect( result.entity ).to eq entity
|
18
|
+
end
|
19
|
+
|
20
|
+
it "copies errors from source" do
|
21
|
+
request = Shamu::Services::Request.new
|
22
|
+
request.errors.add :base, "something failed"
|
23
|
+
result = Shamu::Services::Result.new request
|
24
|
+
|
25
|
+
expect( result ).not_to be_valid
|
26
|
+
end
|
27
|
+
|
28
|
+
it "doesn't set request if not found" do
|
29
|
+
result = Shamu::Services::Result.new
|
30
|
+
expect( result.request ).to be_nil
|
31
|
+
end
|
32
|
+
|
33
|
+
it "doesn't set entity if not found" do
|
34
|
+
result = Shamu::Services::Result.new
|
35
|
+
expect( result.entity ).to be_nil
|
36
|
+
end
|
37
|
+
end
|