righter 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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