activity_permission_engine 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +167 -0
  6. data/Rakefile +6 -0
  7. data/activity_permission_engine.gemspec +25 -0
  8. data/lib/activity_permission_engine.rb +47 -0
  9. data/lib/activity_permission_engine/activities_registry.rb +20 -0
  10. data/lib/activity_permission_engine/activity_permissions_registry.rb +59 -0
  11. data/lib/activity_permission_engine/adapters/activity_permissions_registry/memory.rb +39 -0
  12. data/lib/activity_permission_engine/allow_activity.rb +38 -0
  13. data/lib/activity_permission_engine/check_authorization.rb +47 -0
  14. data/lib/activity_permission_engine/disallow_activity.rb +38 -0
  15. data/lib/activity_permission_engine/framework/request.rb +16 -0
  16. data/lib/activity_permission_engine/interface_helpers.rb +31 -0
  17. data/lib/activity_permission_engine/list_activities.rb +27 -0
  18. data/lib/activity_permission_engine/list_activities_permissions.rb +28 -0
  19. data/lib/activity_permission_engine/register_activity.rb +38 -0
  20. data/lib/activity_permission_engine/test_helpers/activity_permissions_registry_test.rb +31 -0
  21. data/lib/activity_permission_engine/unregister_activity.rb +38 -0
  22. data/lib/activity_permission_engine/version.rb +3 -0
  23. data/test/adapters/activities_registry/memory_test.rb +68 -0
  24. data/test/functionnals/activity_permission_engine_test.rb +74 -0
  25. data/test/interface_specifications/allow_activity_test.rb +35 -0
  26. data/test/interface_specifications/check_authorization_test.rb +47 -0
  27. data/test/interface_specifications/disallow_activity_test.rb +33 -0
  28. data/test/interface_specifications/list_activities_permissions_test.rb +26 -0
  29. data/test/interface_specifications/list_activities_test.rb +24 -0
  30. data/test/interface_specifications/register_activity_test.rb +39 -0
  31. data/test/interface_specifications/unregister_activity_test.rb +42 -0
  32. data/test/test_helper.rb +8 -0
  33. metadata +143 -0
@@ -0,0 +1,47 @@
1
+ module ActivityPermissionEngine
2
+ class CheckAuthorization
3
+ def initialize(request, activities_registry = ActivityPermissionEngine.configuration.activity_permissions_registry)
4
+ @request = request
5
+ @activities_registry = activities_registry
6
+ end
7
+
8
+ def call
9
+ Response.new(authorized?)
10
+ end
11
+
12
+ private
13
+ attr_reader(:request, :activities_registry)
14
+
15
+ def activity
16
+ @activity ||= activities_registry.find_by_activity_ref(request.activity_ref)
17
+ end
18
+
19
+ def authorized?
20
+ activity && (activity.role_refs & request.role_refs).length > 0
21
+ end
22
+
23
+ class Request
24
+ include Framework::Request
25
+
26
+ def initialize(activity_ref, role_refs)
27
+ @activity_ref = activity_ref
28
+ @role_refs = role_refs
29
+ end
30
+
31
+ attr_reader(:activity_ref, :role_refs)
32
+ end
33
+
34
+ class Response
35
+ def initialize(authorized)
36
+ @authorized = authorized
37
+ end
38
+
39
+ def authorized?
40
+ authorized
41
+ end
42
+
43
+ attr_reader(:authorized)
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,38 @@
1
+ module ActivityPermissionEngine
2
+ class DisallowActivity
3
+ def initialize(request, activities_registry = ActivityPermissionEngine.configuration.activity_permissions_registry)
4
+ @request = request
5
+ @activities_registry = activities_registry
6
+ end
7
+
8
+ def call
9
+ Response.new(activities_registry.remove_role(request.activity_ref, request.role_ref))
10
+ end
11
+
12
+ private
13
+ attr_reader(:request, :activities_registry)
14
+
15
+ class Request
16
+ include Framework::Request
17
+
18
+ def initialize(activity_ref, role_ref)
19
+ @activity_ref = activity_ref
20
+ @role_ref = role_ref
21
+ end
22
+
23
+ attr_reader(:activity_ref, :role_ref)
24
+ end
25
+
26
+ class Response
27
+ def initialize(success)
28
+ @success = success
29
+ end
30
+
31
+ def success?
32
+ success
33
+ end
34
+ private
35
+ attr_reader(:success)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,16 @@
1
+ module ActivityPermissionEngine
2
+ module Framework
3
+ module Request
4
+ def response
5
+ perform
6
+ end
7
+
8
+ private
9
+ def perform
10
+ self.class.name.split('::').reverse.drop(1).reverse.inject(Object) do |nesting, name|
11
+ nesting.const_get(name)
12
+ end.new(self).call
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,31 @@
1
+ module ActivityPermissionEngine
2
+ module InterfaceHelpers
3
+ def register_activity(activity_ref)
4
+ RegisterActivity::Request.new(activity_ref).response
5
+ end
6
+
7
+ def list_activities
8
+ ListActivities::Request.new.response
9
+ end
10
+
11
+ def unregister_activity(activity_ref)
12
+ UnregisterActivity::Request.new(activity_ref).response
13
+ end
14
+
15
+ def allow_activity(activity_ref, role_ref)
16
+ AllowActivity::Request.new(activity_ref, role_ref).response
17
+ end
18
+
19
+ def disallow_activity(activity_ref, role_ref)
20
+ DisallowActivity::Request.new(activity_ref, role_ref).response
21
+ end
22
+
23
+ def check_authorization(activity_ref, role_refs)
24
+ CheckAuthorization::Request.new(activity_ref, role_refs).response
25
+ end
26
+
27
+ def list_activities_permissions
28
+ ListActivitiesPermissions::Request.new.response
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ module ActivityPermissionEngine
2
+ class ListActivities
3
+ def initialize(request, activities_registry = ActivityPermissionEngine.configuration.activities_registry)
4
+ @request = request
5
+ @activities_registry = activities_registry
6
+ end
7
+
8
+ def call
9
+ Response.new(activities_registry.all)
10
+ end
11
+
12
+ private
13
+ attr_reader(:activities_registry)
14
+
15
+ class Request
16
+ include Framework::Request
17
+ end
18
+
19
+ class Response
20
+ def initialize(activity_refs)
21
+ @activity_refs = activity_refs
22
+ end
23
+
24
+ attr_reader(:activity_refs)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,28 @@
1
+ module ActivityPermissionEngine
2
+ class ListActivitiesPermissions
3
+ def initialize(request, activity_permissions_registry = ActivityPermissionEngine.configuration.activity_permissions_registry)
4
+ @activity_permissions_registry = activity_permissions_registry
5
+ @request = request
6
+ end
7
+
8
+
9
+ def call
10
+ Response.new(activity_permissions_registry.all)
11
+ end
12
+
13
+ private
14
+ attr_reader(:activity_permissions_registry)
15
+
16
+ class Request
17
+ include Framework::Request
18
+ end
19
+
20
+ class Response
21
+ def initialize(activities_permissions)
22
+ @activities_permissions = activities_permissions
23
+ end
24
+
25
+ attr_reader :activities_permissions
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,38 @@
1
+ module ActivityPermissionEngine
2
+ class RegisterActivity
3
+ def initialize(request, activity_registry = ActivityPermissionEngine.configuration.activities_registry)
4
+ @request = request
5
+ @activity_registry = activity_registry
6
+ end
7
+
8
+ def call
9
+ Response.new(activity_registry.add(request.activity_ref))
10
+ end
11
+
12
+ private
13
+ attr_reader(:request, :activity_registry)
14
+
15
+ class Request
16
+ include Framework::Request
17
+
18
+ def initialize(activity_ref)
19
+ @activity_ref = activity_ref
20
+ end
21
+
22
+ attr_reader(:activity_ref)
23
+ end
24
+
25
+ class Response
26
+ def initialize(success)
27
+ @success = success
28
+ end
29
+
30
+ def success?
31
+ success
32
+ end
33
+
34
+ private
35
+ attr_reader :success
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,31 @@
1
+ module ActivityPermissionEngine
2
+ module TestHelpers
3
+ # Include this module in your adapter's test
4
+ # it will ensure that it quacks like a duck
5
+ module ActivityPermissionsRegistryTest
6
+ def self.included(base)
7
+ base.class_eval do
8
+ it 'respond_to add' do
9
+ subject.must_respond_to(:add)
10
+ end
11
+
12
+ it 'respond_to all' do
13
+ subject.must_respond_to(:all)
14
+ end
15
+
16
+ it 'respond_to del' do
17
+ subject.must_respond_to(:del)
18
+ end
19
+
20
+ it 'respond_to add_role' do
21
+ subject.must_respond_to(:add_role)
22
+ end
23
+
24
+ it 'respond_to find_by_activity_ref' do
25
+ subject.must_respond_to(:find_by_activity_ref)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,38 @@
1
+ module ActivityPermissionEngine
2
+ class UnregisterActivity
3
+ def initialize(request, activities_registry = ActivityPermissionEngine.configuration.activity_permissions_registry)
4
+ @request = request
5
+ @activities_registry = activities_registry
6
+ end
7
+
8
+ def call
9
+ Response.new(activities_registry.del(request.activity_ref))
10
+ end
11
+
12
+ private
13
+ attr_reader(:request, :activities_registry)
14
+
15
+ class Request
16
+ include Framework::Request
17
+
18
+ def initialize(activity_ref)
19
+ @activity_ref = activity_ref
20
+ end
21
+
22
+ attr_reader(:activity_ref)
23
+ end
24
+
25
+ class Response
26
+ def initialize(success)
27
+ @success = success
28
+ end
29
+
30
+ def success?
31
+ success
32
+ end
33
+
34
+ private
35
+ attr_reader(:success)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,3 @@
1
+ module ActivityPermissionEngine
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,68 @@
1
+ require_relative '../../test_helper'
2
+ require_relative '../../../lib/activity_permission_engine/adapters/activity_permissions_registry/memory'
3
+ require_relative '../../../lib/activity_permission_engine/test_helpers/activity_permissions_registry_test'
4
+
5
+ module ActivityPermissionEngine
6
+ describe Adapters::ActivityPermissionsRegistry::Memory do
7
+
8
+ let(:activity_ref) { 'example:activity_ref' }
9
+ let(:role_refs) { %w(foo bar) }
10
+ let(:store) { { activity_ref => role_refs} }
11
+ let(:registry) { Adapters::ActivityPermissionsRegistry::Memory.new(store) }
12
+
13
+ describe 'implement the activity permission registry interface' do
14
+ subject { registry }
15
+ include ActivityPermissionEngine::TestHelpers::ActivityPermissionsRegistryTest
16
+ end
17
+
18
+ describe '#all' do
19
+ subject{ registry.all }
20
+
21
+ it 'returns a list of activities' do
22
+ subject.must_be_kind_of Array
23
+ subject.first.must_be_kind_of ActivityPermissionsRegistry::ActivityPermission
24
+ end
25
+ end
26
+
27
+ describe '#find_by_activity_ref' do
28
+ subject { registry.find_by_activity_ref(activity_ref) }
29
+ describe 'using an existing activity_ref' do
30
+ it 'return an Activity' do
31
+ subject.must_be_kind_of ActivityPermissionsRegistry::ActivityPermission
32
+ end
33
+
34
+ it 'returns the corresponding Activity' do
35
+ subject.activity_ref.must_equal activity_ref
36
+ end
37
+ end
38
+
39
+ describe 'when activity_ref does not exists' do
40
+ let(:store) { {'foo' => []} }
41
+
42
+ it 'returns false' do
43
+ subject.must_equal false
44
+ end
45
+ end
46
+ end
47
+
48
+ describe '#del' do
49
+ let(:existing_activity) { 'activity' }
50
+ subject { registry.del(activity_ref) }
51
+
52
+ it 'remove the activity from registry' do
53
+ subject
54
+ registry.find_by_activity_ref(activity_ref).must_equal false
55
+ end
56
+ end
57
+
58
+ describe '#add_role' do
59
+ let(:new_role_ref) { 'new_role_ref' }
60
+ subject { registry.add_role(activity_ref, new_role_ref) }
61
+
62
+ it 'add role to the role_refs' do
63
+ subject
64
+ registry.find_by_activity_ref(activity_ref).role_refs.must_include new_role_ref
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,74 @@
1
+ require_relative '../test_helper'
2
+
3
+ describe 'configured with a registry and a list of activities' do
4
+ let(:provided_activities) { %w(allow_role disallow_role) }
5
+
6
+ before(:each) do
7
+ ActivityPermissionEngine.configuration = ActivityPermissionEngine::Configuration.new(activities: provided_activities)
8
+ end
9
+
10
+ describe 'I can list activities' do
11
+ subject { ActivityPermissionEngine.list_activities }
12
+
13
+ it 'return activity references list' do
14
+ subject.activity_refs.must_equal provided_activities
15
+ end
16
+
17
+ describe 'when i add activity at runtime' do
18
+ let(:new_activity) { 'new_activity' }
19
+
20
+ before(:each) do
21
+ ActivityPermissionEngine.register_activity(new_activity)
22
+ end
23
+ it 'return the added activity' do
24
+ subject.activity_refs.must_include new_activity
25
+ end
26
+ end
27
+ end
28
+
29
+ describe 'When I allow an entity ( like role ) to perform an activity' do
30
+ let(:my_role) { 'roles manager' }
31
+ let(:activity) { 'allow_role' }
32
+ let(:allow_activity_request) { ActivityPermissionEngine::AllowActivity::Request.new(activity, my_role) }
33
+
34
+ before(:each) { ActivityPermissionEngine.allow_activity(activity, my_role) }
35
+
36
+ describe 'checking for authorization' do
37
+ it 'allows the role to perform activity' do
38
+ ActivityPermissionEngine.check_authorization(activity, [my_role]).authorized?.must_equal true
39
+ end
40
+
41
+ describe 'the permission list' do
42
+ subject { ActivityPermissionEngine.list_activities_permissions.activities_permissions }
43
+ it 'includes the new permission' do
44
+ subject.select do
45
+ |ap|
46
+ ap.activity_ref == activity
47
+ end.first.role_refs.must_include my_role
48
+ end
49
+ end
50
+
51
+
52
+ describe 'I can disallow an entity to perform activity' do
53
+ let(:my_role) { 'roles manager' }
54
+ let(:activity) { 'allow_role' }
55
+ let(:disallow_activity_request) { ActivityPermissionEngine::DisallowActivity::Request.new(activity, [my_role]) }
56
+ let(:check_authorization_request) { ActivityPermissionEngine::CheckAuthorization::Request.new(activity, [my_role]) }
57
+
58
+ before(:each) do
59
+ ActivityPermissionEngine.configuration = ActivityPermissionEngine::Configuration.new(
60
+ activity_permission_registry: ActivityPermissionEngine::Adapters::ActivityPermissionsRegistry::Memory.new(
61
+ {activity => [my_role]}
62
+ )
63
+ )
64
+ end
65
+
66
+ it 'disallow the role to perform activity' do
67
+ ActivityPermissionEngine.disallow_activity(my_role, activity)
68
+ ActivityPermissionEngine.check_authorization(activity, [my_role]).authorized?.must_equal false
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+