righter 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 (104) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +28 -0
  4. data/app/models/righter_right.rb +75 -0
  5. data/app/models/righter_rights_righter_role.rb +4 -0
  6. data/app/models/righter_role.rb +82 -0
  7. data/app/models/righter_role_grant.rb +7 -0
  8. data/app/models/righter_roles_user.rb +2 -0
  9. data/db/migrate/20150910000000_create_righter_rights.rb +21 -0
  10. data/db/migrate/20150910000001_create_righter_roles.rb +20 -0
  11. data/db/migrate/20150910000002_righter_roles_righter_access_rights.rb +14 -0
  12. data/db/migrate/20150910000003_create_righter_roles_users.rb +14 -0
  13. data/lib/init.rb +1 -0
  14. data/lib/injections/righter_for_application_controller.rb +31 -0
  15. data/lib/injections/righter_for_resource.rb +110 -0
  16. data/lib/injections/righter_for_user.rb +186 -0
  17. data/lib/righter.rb +9 -0
  18. data/lib/righter/version.rb +3 -0
  19. data/lib/righter_error.rb +8 -0
  20. data/lib/tasks/righter_tasks.rake +4 -0
  21. data/test/dummy/README.rdoc +28 -0
  22. data/test/dummy/Rakefile +11 -0
  23. data/test/dummy/app/assets/javascripts/application.js +13 -0
  24. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  25. data/test/dummy/app/controllers/application_controller.rb +6 -0
  26. data/test/dummy/app/controllers/doors_controller.rb +23 -0
  27. data/test/dummy/app/helpers/application_helper.rb +2 -0
  28. data/test/dummy/app/models/door.rb +10 -0
  29. data/test/dummy/app/models/house.rb +7 -0
  30. data/test/dummy/app/models/player.rb +7 -0
  31. data/test/dummy/app/models/righter_roles_player.rb +2 -0
  32. data/test/dummy/app/models/user.rb +4 -0
  33. data/test/dummy/app/views/doors/show.html.erb +1 -0
  34. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  35. data/test/dummy/bin/bundle +3 -0
  36. data/test/dummy/bin/rails +4 -0
  37. data/test/dummy/bin/rake +4 -0
  38. data/test/dummy/bin/setup +29 -0
  39. data/test/dummy/config.ru +4 -0
  40. data/test/dummy/config/application.rb +25 -0
  41. data/test/dummy/config/boot.rb +5 -0
  42. data/test/dummy/config/database.yml +25 -0
  43. data/test/dummy/config/environment.rb +5 -0
  44. data/test/dummy/config/environments/development.rb +41 -0
  45. data/test/dummy/config/environments/production.rb +79 -0
  46. data/test/dummy/config/environments/test.rb +42 -0
  47. data/test/dummy/config/initializers/assets.rb +11 -0
  48. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  49. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  50. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  51. data/test/dummy/config/initializers/inflections.rb +16 -0
  52. data/test/dummy/config/initializers/mime_types.rb +4 -0
  53. data/test/dummy/config/initializers/session_store.rb +3 -0
  54. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  55. data/test/dummy/config/locales/en.yml +23 -0
  56. data/test/dummy/config/routes.rb +8 -0
  57. data/test/dummy/config/secrets.yml +22 -0
  58. data/test/dummy/db/migrate/20150911000000_create_players.rb +18 -0
  59. data/test/dummy/db/migrate/20150911000002_create_users_table.rb +15 -0
  60. data/test/dummy/db/migrate/20150911000003_create_doors.rb +14 -0
  61. data/test/dummy/db/migrate/20150911000004_create_houses.rb +13 -0
  62. data/test/dummy/db/migrate/20150911000005_add_house_reference_to_doors.rb +9 -0
  63. data/test/dummy/db/schema.rb +90 -0
  64. data/test/dummy/db/test.sqlite3 +0 -0
  65. data/test/dummy/log/development.log +35 -0
  66. data/test/dummy/log/test.log +117973 -0
  67. data/test/dummy/public/404.html +67 -0
  68. data/test/dummy/public/422.html +67 -0
  69. data/test/dummy/public/500.html +66 -0
  70. data/test/dummy/public/favicon.ico +0 -0
  71. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/0-mgT1BVDUIUlj7bJxvh7Ud3uSbC1DJf0Ok7Ehgieds.cache +1 -0
  72. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/5Lly_CA8DZvPhQV2jDQx-Y6P_y3Ygra9t5jfSlGhHDA.cache +2 -0
  73. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/9jPCqzZvmeFf31Rz8y3OEo8OQXEHVcwmLgkx0tXs-o8.cache +1 -0
  74. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/OI6uxGcnsKavdWTtwDAasU3wPx8QXhzBgV0X2n1KjMQ.cache +3 -0
  75. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/VTeG_7OBrkPzWFSh3MrTa0NSl2wOuJfTJ-XP7JqBG2w.cache +0 -0
  76. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/a2CYO1s9hME5T1pntwZMB7J6dYjS0zCmDxw_7zX1T14.cache +0 -0
  77. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/d71F8V8hdfF1jAttqkXKdizYR9PcM_zuKn_Lj_73gfE.cache +1 -0
  78. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/hCBjLjjeqhUCs4tdwCYlGcFA4xohMwurjmZx6OY1a7g.cache +0 -0
  79. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/hZi1k6tpxxCGYxRe7zY74ItcOI8gZrREOpGuA8JSpGg.cache +3 -0
  80. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/ifgPguUzTOUeqB0zW0GV8DL6HEvPpakIWAzNPVuCGW0.cache +1 -0
  81. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/j8yaH5wiyIN5a2xePYA_lQm39RgOQh27UiF5A7i6b28.cache +0 -0
  82. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/o2kqwqoUQ3gkgncZO1IWdVRzFD0wCSQ-HyL62cINFOU.cache +1 -0
  83. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/pEhaat2KBd5SrT7szC_8R1_6hK17FTpvoRFkmCRSD3M.cache +2 -0
  84. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/pIwp2wi1sfaJlhiwzzvyyV0hKOihhYkP6709hRtpHxg.cache +0 -0
  85. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/pQIgTfLmEPykNamzxdqBww21SMT7YlZlZGy6hgQ6eVE.cache +1 -0
  86. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/td9wUl9SLRnSSgE2ZK_VqCzLxTkFiCW50KkOhE916Wo.cache +1 -0
  87. data/test/factories/doors.rb +10 -0
  88. data/test/factories/houses.rb +7 -0
  89. data/test/factories/players.rb +6 -0
  90. data/test/factories/righter_rights.rb +11 -0
  91. data/test/factories/righter_roles.rb +9 -0
  92. data/test/factories/users.rb +9 -0
  93. data/test/fixtures/players.yml +6 -0
  94. data/test/fixtures/righter_rights.yml +21 -0
  95. data/test/fixtures/righter_roles.yml +29 -0
  96. data/test/fixtures/users.yml +27 -0
  97. data/test/functional/doors_controller_test.rb +71 -0
  98. data/test/righter_test.rb +9 -0
  99. data/test/test_helper.rb +54 -0
  100. data/test/unit/righter_for_resource_test.rb +137 -0
  101. data/test/unit/righter_right_test.rb +74 -0
  102. data/test/unit/righter_role_test.rb +197 -0
  103. data/test/unit/righter_user_test.rb +271 -0
  104. metadata +271 -0
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+
3
+ class RighterTest < ActiveSupport::TestCase
4
+ test 'truth' do
5
+ assert_kind_of Module, Righter
6
+ assert_kind_of Class, RighterError
7
+ assert_kind_of Class, RighterNoUserError
8
+ end
9
+ end
@@ -0,0 +1,54 @@
1
+ require 'codeclimate-test-reporter'
2
+ require 'coveralls'
3
+
4
+ CodeClimate::TestReporter.start
5
+
6
+ Coveralls.wear!
7
+ # Configure Rails Environment
8
+ ENV['RAILS_ENV'] = 'test'
9
+
10
+ require File.expand_path('../../test/dummy/config/environment.rb', __FILE__)
11
+ ActiveRecord::Migrator.migrations_paths = [File.expand_path('../../test/dummy/db/migrate', __FILE__)]
12
+
13
+ ActiveRecord::Migrator.migrate File.expand_path('../../db/migrate/', __FILE__)
14
+ ActiveRecord::Migrator.migrate File.expand_path('../dummy/db/migrate/', __FILE__)
15
+
16
+ require 'rails/test_help'
17
+ require 'factory_girl_rails'
18
+
19
+ FactoryGirl.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
20
+ FactoryGirl.find_definitions
21
+ # Filter out Minitest backtrace while allowing backtrace from other libraries
22
+ # to be shown.
23
+
24
+ Minitest.backtrace_filter = Minitest::BacktraceFilter.new
25
+
26
+ # Load support files
27
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
28
+
29
+ # Load fixtures from the engine
30
+ if ActiveSupport::TestCase.respond_to?(:fixture_path=)
31
+ ActiveSupport::TestCase.fixture_path = File.expand_path('../fixtures', __FILE__)
32
+ ActionDispatch::IntegrationTest.fixture_path = ActiveSupport::TestCase.fixture_path
33
+ ActiveSupport::TestCase.fixtures :all
34
+ end
35
+
36
+ def sign_in(user)
37
+ User.current_user = user
38
+ end
39
+
40
+ def sign_out
41
+ User.current_user = nil
42
+ end
43
+
44
+ def count_queries(&block)
45
+ count = 0
46
+
47
+ counter_f = ->(_name, _started, _finished, _unique_id, payload) {
48
+ count += 1 unless payload[:name].in? %w( CACHE SCHEMA )
49
+ }
50
+
51
+ ActiveSupport::Notifications.subscribed(counter_f, 'sql.active_record', &block)
52
+
53
+ count
54
+ end
@@ -0,0 +1,137 @@
1
+ require 'test_helper'
2
+
3
+ class RighterForResourceTest < ActiveSupport::TestCase
4
+ class TestNonARResource
5
+ include RighterForResource
6
+
7
+ def initialize(id)
8
+ @id = id
9
+ end
10
+
11
+ def righter_right_resource_id
12
+ @id
13
+ end
14
+ end
15
+
16
+ test 'methods are defined' do
17
+ instance = TestNonARResource.new(1)
18
+ door = Door.new
19
+
20
+ assert TestNonARResource.respond_to?(:create_righter_right)
21
+ assert TestNonARResource.respond_to?(:destroy_righter_right)
22
+ assert TestNonARResource.respond_to?(:righter_right)
23
+ assert !TestNonARResource.respond_to?(:auto_manage_righter_right)
24
+
25
+ assert instance.respond_to?(:create_righter_right)
26
+ assert instance.respond_to?(:destroy_righter_right)
27
+ assert instance.respond_to?(:righter_right)
28
+ assert !instance.respond_to?(:auto_manage_righter_right)
29
+
30
+ assert Door.respond_to?(:create_righter_right)
31
+ assert Door.respond_to?(:destroy_righter_right)
32
+ assert Door.respond_to?(:righter_right)
33
+ assert Door.respond_to?(:auto_manage_righter_right)
34
+
35
+ assert door.respond_to?(:create_righter_right)
36
+ assert door.respond_to?(:destroy_righter_right)
37
+ assert door.respond_to?(:righter_right)
38
+ assert !door.respond_to?(:auto_manage_righter_right)
39
+ end
40
+
41
+ test 'role creation with non AR object' do
42
+ role = FactoryGirl.create(:righter_role, name: 'admin')
43
+
44
+ assert_no_difference('RighterRight.count') do
45
+ TestNonARResource.new(1)
46
+ end
47
+
48
+ assert_difference('RighterRight.count', 1) do
49
+ assert_no_difference('RighterRightsRighterRole.count') do
50
+ right = TestNonARResource.new(1).create_righter_right :manage
51
+ assert_equal 'manage_RighterForResourceTest::TestNonARResource_1', right.name
52
+ assert_equal 'RighterForResourceTest::TestNonARResource', right.resource_class
53
+ assert_equal 1, right.resource_id
54
+ end
55
+ end
56
+
57
+ assert_difference('RighterRight.count', -1) do
58
+ TestNonARResource.new(1).destroy_righter_right :manage
59
+ end
60
+
61
+ assert_difference('RighterRight.count', 1) do
62
+ assert_difference('RighterRightsRighterRole.count', 1) do
63
+ assert_equal 0, role.reload.righter_rights.size
64
+ right = TestNonARResource.new(1).create_righter_right :manage, auto_associate_roles: [:admin]
65
+ assert_equal 1, role.reload.righter_rights.size
66
+ end
67
+ end
68
+
69
+ assert_difference('RighterRight.count', -1) do
70
+ assert_difference('RighterRightsRighterRole.count', -1) do
71
+ TestNonARResource.new(1).destroy_righter_right :manage
72
+ end
73
+ end
74
+ end
75
+
76
+ test 'role creation with automanaged AR object' do
77
+ admin_role = FactoryGirl.create(:righter_role, name: 'admin')
78
+ user_role = FactoryGirl.create(:righter_role, name: 'user')
79
+
80
+ assert_no_difference('RighterRight.count') do
81
+ FactoryGirl.create(:player)
82
+ end
83
+
84
+ door = nil
85
+ assert_difference('RighterRight.count', 5) do
86
+ assert_difference('RighterRightsRighterRole.count', 3) do
87
+ assert RighterRight.where('name like ?', 'paint_Door_%').empty?
88
+ assert RighterRight.where('name like ?', 'change_Door_%').empty?
89
+ assert RighterRight.where('name like ?', 'open_Door_%').empty?
90
+ assert_equal 0, admin_role.righter_rights.count
91
+ assert_equal 0, user_role.righter_rights.count
92
+ door = FactoryGirl.create(:door)
93
+ assert RighterRight.find_by_name("paint_Door_#{door.id}").present?
94
+ assert RighterRight.find_by_name("change_Door_#{door.id}").present?
95
+ assert RighterRight.find_by_name("open_Door_#{door.id}").present?
96
+ puts admin_role.id
97
+ puts
98
+ RighterRightsRighterRole.all.each do |r|
99
+ puts r.inspect
100
+ end
101
+ # assert_equal 2, admin_role.righter_rights.size
102
+ assert_equal 1, user_role.righter_rights.size
103
+ end
104
+ end
105
+
106
+ assert_difference('RighterRight.count', -4) do
107
+ assert_difference('RighterRightsRighterRole.count', -3) do
108
+ door.destroy
109
+ end
110
+ end
111
+ end
112
+
113
+ test 'class methods do create class rights' do
114
+ r = Door.create_righter_right(:manage)
115
+ assert_equal 'manage_Door', r.name
116
+ assert_equal 'Door', r.resource_class
117
+ assert_nil r.resource_id
118
+
119
+ assert_equal r, Door.righter_right(:manage)
120
+ end
121
+
122
+ test '.auto_manage_righter_right accepts proc as parent right option' do
123
+ FactoryGirl.create(:righter_role, name: 'admin')
124
+ FactoryGirl.create(:righter_role, name: 'user')
125
+
126
+ house = FactoryGirl.create :house
127
+ door = FactoryGirl.create :door, house: house
128
+
129
+ assert house.righter_right(:build).present?
130
+ assert door.righter_right(:close).present?
131
+ assert_equal house.righter_right(:build), door.righter_right(:close).parent
132
+
133
+ door.destroy
134
+
135
+ refute door.righter_right(:close).present?
136
+ end
137
+ end
@@ -0,0 +1,74 @@
1
+ require 'test_helper'
2
+
3
+ class RighterRightTest < ActiveSupport::TestCase
4
+ fixtures :righter_rights
5
+
6
+ test 'add_access_to controller/actions raises error if actions is not array or controller is nil' do
7
+ r = righter_rights :kill
8
+ assert_raise RighterError do
9
+ r.add_access_to actions: :smth
10
+ end
11
+
12
+ assert_raise RighterError do
13
+ r.add_access_to actions: [:smth]
14
+ end
15
+
16
+ assert_raise RighterError do
17
+ r.add_access_to {}
18
+ end
19
+
20
+ assert_nothing_raised do
21
+ r.add_access_to controller: :james, actions: [:bond]
22
+ r2 = RighterRight.find_by_name :kill
23
+ assert_equal :james, r2.controller.to_sym
24
+ assert_equal [:bond], r2.actions
25
+ end
26
+ end
27
+
28
+ test 'hierarchical browsing is based in parent_id' do
29
+ r1 = RighterRight.create! name: '1'
30
+ r11 = RighterRight.create! name: '11', parent_id: r1.id
31
+ r12 = RighterRight.create! name: '12', parent_id: r1.id
32
+ r121 = RighterRight.create! name: '121', parent_id: r12.id
33
+
34
+ r2 = RighterRight.create! name: '2'
35
+
36
+ r3 = RighterRight.create! name: '3'
37
+ RighterRight.create! name: '31', parent_id: r3.id
38
+ r32 = RighterRight.create! name: '32', parent_id: r3.id
39
+ RighterRight.create! name: '321', parent_id: r32.id
40
+
41
+ assert_equal [], ([r12, r11] - r1.children)
42
+ assert_equal [], r11.children
43
+ assert_equal [r121], r12.children
44
+ assert_equal [], r121.children
45
+
46
+ assert_equal [], r2.children
47
+ end
48
+
49
+ test 'raise ActiveRecord::RecordInvalid on attempt to create cycle in hierarchy of righter rights' do
50
+ r1 = RighterRight.create! name: '1'
51
+ r2 = RighterRight.create! name: '2', parent_id: r1.id
52
+ r3 = RighterRight.create! name: '3', parent_id: r2.id
53
+
54
+ assert_raise ActiveRecord::RecordInvalid do
55
+ r1.parent_id = r3.id
56
+ r1.save!
57
+ end
58
+ end
59
+
60
+ test 'cached_find_by_name load the data only once' do
61
+ RighterRight.clear_cache
62
+ count_sql = count_queries do
63
+ RighterRight.cached_find_by_name :kill
64
+ end
65
+
66
+ assert 1, count_sql
67
+
68
+ count_no_sql = count_queries do
69
+ RighterRight.cached_find_by_name :kill
70
+ end
71
+
72
+ assert 0, count_no_sql
73
+ end
74
+ end
@@ -0,0 +1,197 @@
1
+ require 'test_helper'
2
+
3
+ class RighterRoleTest < ActiveSupport::TestCase
4
+ fixtures :righter_rights, :righter_roles
5
+
6
+ def setup
7
+ RighterRightsRighterRole.delete_all
8
+ RighterRoleGrant.delete_all
9
+ end
10
+
11
+ test 'add_right to role creates new entry in RighterRolesRighterRights table' do
12
+ r = righter_rights :kill
13
+ r1 = righter_roles :secret_agent
14
+ assert_difference 'r1.reload.righter_rights.size', 1 do
15
+ r1.add_right r
16
+ end
17
+
18
+ assert_no_difference 'r1.righter_rights.size' do
19
+ r1.add_right r
20
+ end
21
+ end
22
+
23
+ test 'add_self_and_children_rights to role creates according entries in RighterRolesRighterRights table' do
24
+ role = FactoryGirl.create :righter_role
25
+ r1 = FactoryGirl.create :righter_right, name: 'Parent right'
26
+ FactoryGirl.create :righter_right, name: 'Child right one', parent_id: r1.id
27
+ FactoryGirl.create :righter_right, name: 'Child right two', parent_id: r1.id
28
+
29
+ assert_difference 'role.reload.righter_rights.size', 3 do
30
+ role.add_self_and_child_rights r1
31
+ end
32
+ end
33
+
34
+ test 'remove_right removes association between role and right but keep the right itself' do
35
+ ro1 = righter_roles :secret_agent
36
+ r1 = righter_rights :kill
37
+
38
+ ro1.add_right r1
39
+ assert ro1.righter_rights.include?(r1)
40
+
41
+ ro1.remove_right r1
42
+ assert !ro1.reload.righter_rights.include?(r1)
43
+
44
+ assert r1.reload
45
+ end
46
+
47
+ test 'unique role name is enforced' do
48
+ ro1 = righter_roles :secret_agent
49
+ assert_raise ActiveRecord::RecordInvalid do
50
+ RighterRole.create! name: :secret_agent
51
+ end
52
+ end
53
+
54
+ test 'add_right and remove_right will raise error for bad input' do
55
+ ro1 = righter_roles :secret_agent
56
+ assert_raise RighterError do
57
+ ro1.add_right 'smth'
58
+ end
59
+ assert_raise RighterError do
60
+ ro1.remove_right 'smth2'
61
+ end
62
+ end
63
+
64
+ test 'right-role association is removed when right is deleted' do
65
+ ro1 = righter_roles :secret_agent
66
+ r1 = righter_rights :kill
67
+ assert !RighterRightsRighterRole.exists?(righter_role_id: ro1.id, righter_right_id: r1.id)
68
+
69
+ assert_difference 'RighterRightsRighterRole.count', 1 do
70
+ ro1.add_right r1
71
+ end
72
+ assert_difference 'RighterRightsRighterRole.count', -1 do
73
+ r1.destroy
74
+ end
75
+ end
76
+
77
+ test 'right-role association is removed when role is deleted' do
78
+ ro1 = righter_roles :secret_agent
79
+ r1 = righter_rights :kill
80
+ assert !RighterRightsRighterRole.exists?(righter_role_id: ro1.id, righter_right_id: r1.id)
81
+ ro1.add_right r1
82
+
83
+ assert_difference 'RighterRightsRighterRole.count', -1 do
84
+ ro1.destroy
85
+ end
86
+ end
87
+
88
+ test 'parent right is assigned automatically if any of children rights is assigned to role' do
89
+ r1 = RighterRight.create! name: '1'
90
+ r11 = RighterRight.create! name: '11', parent_id: r1.id
91
+
92
+ roleA = RighterRole.create! name: 'A', human_name: 'hmmm'
93
+ assert !roleA.righter_rights.include?(r1)
94
+ roleA.add_right r11
95
+ assert roleA.reload.righter_rights.include?(r1)
96
+ end
97
+
98
+ test 'all children rights are deassigned if parent right is deassigned from role' do
99
+ r1 = RighterRight.create! name: '1'
100
+ r11 = RighterRight.create! name: '11', parent_id: r1.id
101
+ r12 = RighterRight.create! name: '12', parent_id: r1.id
102
+ r121 = RighterRight.create! name: '121', parent_id: r12.id
103
+
104
+ roleA = RighterRole.create! name: 'A', human_name: 'b'
105
+ roleA.add_right r1
106
+ roleA.add_right r11
107
+ roleA.add_right r121
108
+
109
+ assert roleA.reload.righter_rights.include?(r1)
110
+ assert roleA.reload.righter_rights.include?(r11)
111
+ assert roleA.reload.righter_rights.include?(r121)
112
+
113
+ roleA.remove_right r1
114
+
115
+ assert !roleA.reload.righter_rights.include?(r1)
116
+ assert !roleA.reload.righter_rights.include?(r11)
117
+ assert !roleA.reload.righter_rights.include?(r121)
118
+ end
119
+
120
+ test 'righter_role.allow_to_grant_role will add only unique entry to RighterRoleGrant' do
121
+ r1 = righter_roles :one
122
+ r2 = righter_roles :two
123
+
124
+ assert_difference 'RighterRoleGrant.count', 1 do
125
+ r1.allow_to_grant_role r2
126
+ end
127
+ assert_no_difference 'RighterRoleGrant.count' do
128
+ r1.allow_to_grant_role r2
129
+ end
130
+ assert_difference 'RighterRoleGrant.count', -1 do
131
+ r1.destroy
132
+ end
133
+ assert_difference 'RighterRoleGrant.count', 4 do # FIXME: no difference shall be here
134
+ RighterRoleGrant.create(righter_role_id: r1.id, grantable_righter_role_id: r2.id)
135
+ RighterRoleGrant.create(righter_role_id: r1.id, grantable_righter_role_id: r2.id)
136
+ RighterRoleGrant.create(righter_role_id: r1.id, grantable_righter_role_id: r2.id)
137
+ RighterRoleGrant.create(righter_role_id: r1.id, grantable_righter_role_id: r2.id)
138
+ end
139
+ end
140
+
141
+ test 'righter_role.disallow_to_grant_role is silent when removing ungranted role' do
142
+ r1 = righter_roles :one
143
+ r2 = righter_roles :two
144
+
145
+ r1.allow_to_grant_role r2
146
+
147
+ assert_difference 'RighterRoleGrant.count', -1 do
148
+ r1.disallow_to_grant_role r2
149
+ end
150
+
151
+ assert_no_difference 'RighterRoleGrant.count', 0 do
152
+ r1.disallow_to_grant_role r2
153
+ end
154
+ end
155
+
156
+ test 'righter_role.grantable_roles reflects the state in RighterRoleGrant table' do
157
+ r1 = righter_roles :one
158
+ r2 = righter_roles :two
159
+ assert !r1.grantable_roles.include?(r2)
160
+ r1.allow_to_grant_role r2
161
+ assert r1.reload.grantable_roles.include?(r2)
162
+ r1.disallow_to_grant_role r2
163
+ assert !r1.grantable_roles.include?(r2)
164
+ assert !r1.reload.grantable_roles.include?(r2)
165
+ end
166
+
167
+ test 'disallow_all_granted_roles removes all granted roles associated to role' do
168
+ r1 = righter_roles :one
169
+ r2 = righter_roles :two
170
+ r1.allow_to_grant_role r2
171
+ assert r1.grantable_roles.include?(r2), 'grantable role added'
172
+ assert r1.reload.grantable_roles.include?(r2), 'grantable role added and saved'
173
+ r1.disallow_all_granted_roles
174
+ assert !r1.reload.grantable_roles.include?(r2), 'and it is saved'
175
+ end
176
+
177
+ test 'all associated entries in role_grants are deleted on role destroy' do
178
+ r1 = righter_roles :one
179
+ r2 = righter_roles :two
180
+ r3 = righter_roles :three
181
+ r1.allow_to_grant_role r2
182
+ r2.allow_to_grant_role r3
183
+
184
+ assert_difference 'RighterRoleGrant.count', -2 do
185
+ r2.destroy
186
+ end
187
+ end
188
+
189
+ test 'unique names' do
190
+ r1 = righter_roles :one
191
+ ri = righter_rights :kill
192
+
193
+ assert_difference 'RighterRightsRighterRole.count' do
194
+ r1.add_right ri
195
+ end
196
+ end
197
+ end