admission 0.4.5 → 0.4.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/admission.gemspec +7 -7
- data/lib/admission/version.rb +1 -1
- metadata +5 -48
- data/.gitignore +0 -40
- data/.rspec +0 -2
- data/.ruby-version +0 -1
- data/Gemfile +0 -7
- data/LICENSE +0 -674
- data/README.md +0 -24
- data/bin/build +0 -10
- data/bin/rspec +0 -8
- data/spec/integration/action_arbitrating_spec.rb +0 -119
- data/spec/integration/resource_arbitrating_spec.rb +0 -276
- data/spec/rspec_config.rb +0 -103
- data/spec/spec_helper.rb +0 -28
- data/spec/test_context/country.rb +0 -24
- data/spec/test_context/index.rb +0 -5
- data/spec/test_context/person.rb +0 -31
- data/spec/test_context/persons_fixtures.rb +0 -43
- data/spec/test_context/privileges_and_rules.rb +0 -119
- data/spec/unit/arbitration_spec.rb +0 -33
- data/spec/unit/index_spec.rb +0 -144
- data/spec/unit/privilege/order_definer_spec.rb +0 -184
- data/spec/unit/privilege_spec.rb +0 -178
- data/spec/unit/rails/action_admission_spec.rb +0 -188
- data/spec/unit/rails/controller_addon_spec.rb +0 -68
- data/spec/unit/rails/scope_resolver_spec.rb +0 -72
- data/spec/unit/resource_arbitration_spec.rb +0 -76
- data/spec/unit/status_spec.rb +0 -79
- data/visualisation/.babelrc +0 -7
- data/visualisation/actions/index.js +0 -0
- data/visualisation/components/app_container.jsx +0 -78
- data/visualisation/components/input_with_select.jsx +0 -177
- data/visualisation/components/nested_list_row.jsx +0 -48
- data/visualisation/components/privilege_select.jsx +0 -70
- data/visualisation/components/privileges_panel.jsx +0 -73
- data/visualisation/components/rules_panel.jsx +0 -124
- data/visualisation/dist/.gitkeep +0 -0
- data/visualisation/helpers.js +0 -69
- data/visualisation/index.jsx +0 -89
- data/visualisation/package.json +0 -27
- data/visualisation/reducers/index.js +0 -35
- data/visualisation/server.rb +0 -23
- data/visualisation/style.scss +0 -248
- data/visualisation/webpack.config.js +0 -47
- data/visualisation/yarn.lock +0 -3354
data/spec/spec_helper.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require_relative 'rspec_config'
|
2
|
-
|
3
|
-
require 'byebug'
|
4
|
-
|
5
|
-
def with_bug
|
6
|
-
$bug = true
|
7
|
-
yield
|
8
|
-
ensure
|
9
|
-
$bug = false
|
10
|
-
end
|
11
|
-
|
12
|
-
RSpec::Matchers.define :have_inst_vars do |expected|
|
13
|
-
match do |object|
|
14
|
-
expected.to_a.all? do |var_name, value|
|
15
|
-
var = object.instance_variable_get "@#{var_name}"
|
16
|
-
var == value
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
require 'simplecov'
|
22
|
-
SimpleCov.start do
|
23
|
-
add_filter %r~^(?!/lib/)~
|
24
|
-
end
|
25
|
-
|
26
|
-
require_relative '../lib/admission'
|
27
|
-
require_relative '../lib/admission/rails'
|
28
|
-
require_relative './test_context/index'
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# COUNTRIES = [
|
2
|
-
# :czech,
|
3
|
-
# :deutschland,
|
4
|
-
# :taiwan,
|
5
|
-
# :russia,
|
6
|
-
# :australia,
|
7
|
-
# :moon
|
8
|
-
# ]
|
9
|
-
#
|
10
|
-
# class << COUNTRIES
|
11
|
-
#
|
12
|
-
# def europe? country
|
13
|
-
# %i[czech deutschland russia].include? country
|
14
|
-
# end
|
15
|
-
#
|
16
|
-
# def safe? country
|
17
|
-
# %i[czech deutschland taiwan].include? country
|
18
|
-
# end
|
19
|
-
#
|
20
|
-
# def are_you_dispensable? person
|
21
|
-
# not (%i[russia] & person.countries).empty?
|
22
|
-
# end
|
23
|
-
#
|
24
|
-
# end
|
data/spec/test_context/index.rb
DELETED
data/spec/test_context/person.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
|
2
|
-
class Person
|
3
|
-
|
4
|
-
attr_reader :name, :sex, :countries
|
5
|
-
attr_reader :privileges, :rules
|
6
|
-
|
7
|
-
FEMALE = 0
|
8
|
-
MALE = 1
|
9
|
-
APACHE_HELICOPTER = 2
|
10
|
-
|
11
|
-
def initialize name, sex, countries
|
12
|
-
@name = name
|
13
|
-
@sex = sex
|
14
|
-
@countries = countries
|
15
|
-
end
|
16
|
-
|
17
|
-
|
18
|
-
# privileges per country
|
19
|
-
|
20
|
-
def not_woman?
|
21
|
-
@sex != FEMALE
|
22
|
-
end
|
23
|
-
|
24
|
-
def person
|
25
|
-
self
|
26
|
-
end
|
27
|
-
|
28
|
-
# def self.reduce_privileges **per_country
|
29
|
-
# end
|
30
|
-
|
31
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
|
2
|
-
fixtures = {
|
3
|
-
|
4
|
-
peasant_girl: [
|
5
|
-
Person::FEMALE,
|
6
|
-
[]
|
7
|
-
],
|
8
|
-
|
9
|
-
napoleon: [
|
10
|
-
Person::MALE,
|
11
|
-
[]
|
12
|
-
# {all: 'harambe'}
|
13
|
-
],
|
14
|
-
|
15
|
-
franz_joseph: [
|
16
|
-
Person::MALE,
|
17
|
-
[:czech, :australia]
|
18
|
-
# {czech: 'supernatural-primordial', taiwan: 'supernatural-god'}
|
19
|
-
]
|
20
|
-
|
21
|
-
}
|
22
|
-
|
23
|
-
privileges_data_reducer = -> (privileges_data) {
|
24
|
-
privileges_data.to_a.reduce [] do |list, per_country_definition|
|
25
|
-
country, privileges_names = per_country_definition
|
26
|
-
raise "bad country #{country}" unless COUNTRIES.include? country
|
27
|
-
privileges_names = [privileges_names] unless privileges_names.is_a? Array
|
28
|
-
|
29
|
-
privileges = privileges_names.map do |name|
|
30
|
-
privilege = Admission::Privilege.get_from_order PRIVILEGES_ORDER, *name.split('-')
|
31
|
-
privilege.dup_with_context country
|
32
|
-
end
|
33
|
-
|
34
|
-
list + privileges
|
35
|
-
end
|
36
|
-
}
|
37
|
-
|
38
|
-
Person::FIXTURES = ->(name) {
|
39
|
-
*attrs, privileges = fixtures[name]
|
40
|
-
person = Person.new name, *attrs
|
41
|
-
person.instance_variable_set :@privileges, privileges_data_reducer.(privileges)
|
42
|
-
person
|
43
|
-
}
|
@@ -1,119 +0,0 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
PRIVILEGES_ORDER = Admission::Privilege.define_order do
|
4
|
-
privilege :vassal, levels: %i[lord]
|
5
|
-
privilege :human, levels: %i[count king]
|
6
|
-
privilege :emperor, inherits: %i[vassal human]
|
7
|
-
end
|
8
|
-
|
9
|
-
|
10
|
-
ACTIONS_RULES = Admission::Arbitration.define_rules PRIVILEGES_ORDER do
|
11
|
-
|
12
|
-
privilege :human do
|
13
|
-
allow_all{ not_woman? }
|
14
|
-
forbid :raise_taxes
|
15
|
-
forbid :impose_corvee
|
16
|
-
|
17
|
-
forbid :impose_draft
|
18
|
-
forbid :act_as_god
|
19
|
-
end
|
20
|
-
|
21
|
-
privilege :human, :count do
|
22
|
-
allow_all do |country|
|
23
|
-
countries.include? country
|
24
|
-
end
|
25
|
-
allow :impose_corvee do |country|
|
26
|
-
countries.include? country
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
privilege :human, :king do
|
31
|
-
allow_all
|
32
|
-
allow :raise_taxes
|
33
|
-
end
|
34
|
-
|
35
|
-
privilege :vassal, :lord do
|
36
|
-
allow :impose_draft
|
37
|
-
end
|
38
|
-
|
39
|
-
privilege :emperor do
|
40
|
-
allow :act_as_god
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
|
46
|
-
RESOURCE_RULES = Admission::ResourceArbitration.define_rules PRIVILEGES_ORDER do
|
47
|
-
|
48
|
-
# `allow_all` & inheriting `:forbidden`
|
49
|
-
|
50
|
-
privilege :human do
|
51
|
-
allow_all(:actions){ not_woman? }
|
52
|
-
forbid :actions, :raise_taxes
|
53
|
-
forbid :actions, :impose_corvee
|
54
|
-
|
55
|
-
forbid :actions, :impose_draft
|
56
|
-
forbid :actions, :act_as_god
|
57
|
-
end
|
58
|
-
|
59
|
-
privilege :human, :count do
|
60
|
-
allow_all :actions do |country|
|
61
|
-
countries.include? country
|
62
|
-
end
|
63
|
-
allow :actions, :impose_corvee do |country|
|
64
|
-
countries.include? country
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
privilege :human, :king do
|
69
|
-
allow_all :actions
|
70
|
-
allow :actions, :raise_taxes
|
71
|
-
end
|
72
|
-
|
73
|
-
privilege :vassal, :lord do
|
74
|
-
allow :actions, :impose_draft
|
75
|
-
end
|
76
|
-
|
77
|
-
privilege :emperor do
|
78
|
-
allow :actions, :act_as_god
|
79
|
-
end
|
80
|
-
|
81
|
-
# `allow_resource` scoping & inheritance
|
82
|
-
|
83
|
-
privilege :vassal do
|
84
|
-
|
85
|
-
allow_resource Person, :show do |person, *|
|
86
|
-
raise 'person is nil' unless person
|
87
|
-
self == person
|
88
|
-
end
|
89
|
-
|
90
|
-
allow :persons, :index do |country|
|
91
|
-
countries.include? country
|
92
|
-
end
|
93
|
-
|
94
|
-
end
|
95
|
-
|
96
|
-
privilege :vassal, :lord do
|
97
|
-
|
98
|
-
allow_resource(Person, :show){ true }
|
99
|
-
|
100
|
-
allow_resource Person, %i[index update] do |person, country|
|
101
|
-
allowance = countries.include? country
|
102
|
-
next allowance unless person
|
103
|
-
|
104
|
-
allowance && person.countries.include?(country)
|
105
|
-
end
|
106
|
-
|
107
|
-
allow_resource Person, :destroy do |person, country|
|
108
|
-
person.countries.include?(country) &&
|
109
|
-
person.sex != Person::APACHE_HELICOPTER
|
110
|
-
end
|
111
|
-
|
112
|
-
allow Admission::ResourceArbitration.nested_scope(Person, :possessions), :index
|
113
|
-
allow_resource [Person, :possessions], :update do |person, country|
|
114
|
-
person.countries.include?(country)
|
115
|
-
end
|
116
|
-
|
117
|
-
end
|
118
|
-
|
119
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require_relative '../spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe Admission::Arbitration do
|
4
|
-
|
5
|
-
describe 'RulesBuilder' do
|
6
|
-
|
7
|
-
describe 'fails when given reserved action name' do
|
8
|
-
|
9
|
-
let(:builder){
|
10
|
-
builder = Admission::Arbitration::RulesBuilder.new nil
|
11
|
-
builder.instance_variable_set '@privilege', 'privilege'
|
12
|
-
builder
|
13
|
-
}
|
14
|
-
|
15
|
-
it '#allow' do
|
16
|
-
expect{ builder.allow '', :allow }.not_to raise_exception
|
17
|
-
expect{ builder.allow '', Admission::ALL_ACTION }.to(
|
18
|
-
raise_exception("reserved action name #{Admission::ALL_ACTION}")
|
19
|
-
)
|
20
|
-
end
|
21
|
-
|
22
|
-
it '#forbid' do
|
23
|
-
expect{ builder.forbid '', :forbid }.not_to raise_exception
|
24
|
-
expect{ builder.forbid '', Admission::ALL_ACTION }.to(
|
25
|
-
raise_exception("reserved action name #{Admission::ALL_ACTION}")
|
26
|
-
)
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
data/spec/unit/index_spec.rb
DELETED
@@ -1,144 +0,0 @@
|
|
1
|
-
require_relative '../spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe Admission::Index do
|
4
|
-
|
5
|
-
let(:index){ Admission::Index.new }
|
6
|
-
|
7
|
-
def instance_with items=[], children={}
|
8
|
-
index = Admission::Index.new
|
9
|
-
index.instance_variable_set '@items', items
|
10
|
-
index.instance_variable_set '@children', children
|
11
|
-
index
|
12
|
-
end
|
13
|
-
|
14
|
-
describe '#to_a' do
|
15
|
-
|
16
|
-
it 'empty' do
|
17
|
-
expect(instance_with.to_a).to eq([])
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'non-nested' do
|
21
|
-
index = instance_with [:item1, :item2]
|
22
|
-
expect(index.to_a).to eq(
|
23
|
-
[:item1, :item2]
|
24
|
-
)
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'nested one level' do
|
28
|
-
index = instance_with [:item1, :item2], {nested: instance_with([:n1])}
|
29
|
-
expect(index.to_a).to eq(
|
30
|
-
[:item1, :item2, {nested: [:n1]}]
|
31
|
-
)
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'nested two levels' do
|
35
|
-
index = instance_with [:item1, :item2],
|
36
|
-
{
|
37
|
-
nested1a: instance_with([:n1a]),
|
38
|
-
nested1b: instance_with([:n1b, {nested2a: instance_with([:n2a, :n2b])}])
|
39
|
-
}
|
40
|
-
expect(index.to_a).to eq(
|
41
|
-
[:item1, :item2, {nested1a: [:n1a], nested1b: [:n1b, {nested2a: [:n2a, :n2b]}]}]
|
42
|
-
)
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
describe '#==' do
|
48
|
-
|
49
|
-
it 'compares two instances' do
|
50
|
-
instance1 = instance_with
|
51
|
-
expect(instance1).not_to receive(:to_a)
|
52
|
-
instance2 = instance_with
|
53
|
-
expect(instance2).not_to receive(:to_a)
|
54
|
-
|
55
|
-
expect(instance1 == instance2).not_to be_truthy
|
56
|
-
expect(instance2 == instance1).not_to be_truthy
|
57
|
-
expect(instance1 == instance1).to be_truthy
|
58
|
-
expect(instance2 == instance2).to be_truthy
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'compares with an array using conversion' do
|
62
|
-
instance1 = instance_with [:item1]
|
63
|
-
expect(instance1).to receive(:to_a).and_call_original
|
64
|
-
expect(instance1 == [:item1]).to be_truthy
|
65
|
-
end
|
66
|
-
|
67
|
-
it 'tests rspec eq() delegates to #eql?, i.e. #==' do
|
68
|
-
instance1 = instance_with [:item1]
|
69
|
-
expect(instance1).to receive(:==).and_call_original
|
70
|
-
expect(instance1).to eq([:item1])
|
71
|
-
end
|
72
|
-
|
73
|
-
end
|
74
|
-
|
75
|
-
describe '#allow' do
|
76
|
-
|
77
|
-
it 'single' do
|
78
|
-
index.allow :single
|
79
|
-
expect(index).to eq([:single])
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'passed as args' do
|
83
|
-
index.allow :single, :double
|
84
|
-
expect(index).to eq([:single, :double])
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'passed as arrays' do
|
88
|
-
index.allow :single, [:a1, :a2], :double, [:b1, :b2]
|
89
|
-
expect(index).to eq([:single, :a1, :a2, :double, :b1, :b2])
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'convert args to symbols' do
|
93
|
-
index.allow 'single', ['a1', 'a2'], 'double', ['b1', 'b2']
|
94
|
-
expect(index).to eq([:single, :a1, :a2, :double, :b1, :b2])
|
95
|
-
end
|
96
|
-
|
97
|
-
it 'passed as keyword args, nested item' do
|
98
|
-
index.allow :single, nested: :a1
|
99
|
-
expect(index).to eq([:single, {nested: [:a1]}])
|
100
|
-
end
|
101
|
-
|
102
|
-
it 'passed as last position hash' do
|
103
|
-
index.allow :single, {nested: :a1}
|
104
|
-
expect(index).to eq([:single, {nested: [:a1]}])
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'passed as keyword args, nested item list' do
|
108
|
-
index.allow :single, nested: [:a1]
|
109
|
-
expect(index).to eq([:single, {nested: [:a1]}])
|
110
|
-
end
|
111
|
-
|
112
|
-
it 'passed as keyword args, deep nested' do
|
113
|
-
index.allow :single, nested: [:a1, {deep_nested: :b1}]
|
114
|
-
expect(index).to eq([:single, {nested: [:a1, {deep_nested: [:b1]}]}])
|
115
|
-
end
|
116
|
-
|
117
|
-
end
|
118
|
-
|
119
|
-
describe '#allowed?' do
|
120
|
-
|
121
|
-
it 'looks for an item' do
|
122
|
-
index = instance_with [:item1]
|
123
|
-
expect(index.allowed? :item1).to eq(true)
|
124
|
-
expect(index.allowed? :item2).to eq(false)
|
125
|
-
end
|
126
|
-
|
127
|
-
it 'looks for a nested item' do
|
128
|
-
index = instance_with [], {nested: instance_with([:item2])}
|
129
|
-
expect(index.allowed? :item1).to eq(false)
|
130
|
-
expect(index.allowed? :item2).to eq(false)
|
131
|
-
expect(index.allowed? :nested, :item1).to eq(false)
|
132
|
-
expect(index.allowed? :nested, :item2).to eq(true)
|
133
|
-
expect(index.allowed? :non_nested, :item1).to eq(false)
|
134
|
-
end
|
135
|
-
|
136
|
-
it 'converts arguments' do
|
137
|
-
index = instance_with [:item1], {nested: instance_with([:item2])}
|
138
|
-
expect(index.allowed? 'item1').to eq(true)
|
139
|
-
expect(index.allowed? 'nested', 'item2').to eq(true)
|
140
|
-
end
|
141
|
-
|
142
|
-
end
|
143
|
-
|
144
|
-
end
|
@@ -1,184 +0,0 @@
|
|
1
|
-
require_relative '../../spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe Admission::Privilege::OrderDefiner do
|
4
|
-
|
5
|
-
def define_privileges &block
|
6
|
-
Admission::Privilege::OrderDefiner.define &block
|
7
|
-
end
|
8
|
-
|
9
|
-
def privilege *args, inherits: nil
|
10
|
-
p = Admission::Privilege.new *args
|
11
|
-
p.inherits_from inherits if inherits
|
12
|
-
p
|
13
|
-
end
|
14
|
-
|
15
|
-
let(:definer){ Admission::Privilege::OrderDefiner.new }
|
16
|
-
|
17
|
-
|
18
|
-
describe '.define' do
|
19
|
-
|
20
|
-
it 'builds empty index' do
|
21
|
-
index = define_privileges{}
|
22
|
-
expect(index).to be_a(Hash)
|
23
|
-
expect(index).to be_empty
|
24
|
-
expect(index).to be_frozen
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'builds single privilege' do
|
28
|
-
index = define_privileges{ privilege :man, levels: %i[commoner count] }
|
29
|
-
expect(index.keys).to eq(%i[man])
|
30
|
-
expect(index[:man].keys).to eq(%i[^ base commoner count])
|
31
|
-
expect(index[:man][:base].inherited).to be_nil
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'builds with inheritance' do
|
35
|
-
index = define_privileges do
|
36
|
-
privilege :man
|
37
|
-
privilege :vassal, levels: %i[lord], inherits: :man
|
38
|
-
end
|
39
|
-
|
40
|
-
# structure
|
41
|
-
expect(index.keys).to eq(%i[man vassal])
|
42
|
-
expect(index[:man].keys).to eq(%i[^ base])
|
43
|
-
expect(index[:vassal].keys).to eq(%i[^ base lord])
|
44
|
-
|
45
|
-
# inheritance
|
46
|
-
expect(index[:man][:base].inherited).to be_nil
|
47
|
-
expect(index[:vassal][:base].inherited).to eql([privilege(:man)])
|
48
|
-
expect(index[:vassal][:lord].inherited).to eql([privilege(:vassal)])
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
|
54
|
-
describe '#privilege' do
|
55
|
-
|
56
|
-
it 'adds privilege with no levels' do
|
57
|
-
definer.privilege :man
|
58
|
-
expect(definer.definitions.size).to eq(1)
|
59
|
-
expect(definer.definitions[:man][:inherits]).to be_nil
|
60
|
-
expect(definer.definitions[:man][:levels]).to eql([privilege(:man)])
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'adds privilege with no levels by string' do
|
64
|
-
definer.privilege 'man'
|
65
|
-
expect(definer.definitions.size).to eq(1)
|
66
|
-
expect(definer.definitions[:man][:inherits]).to be_nil
|
67
|
-
expect(definer.definitions[:man][:levels]).to eql([privilege(:man)])
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'adds privilege array of levels' do
|
71
|
-
definer.privilege :man, levels: %i[commoner count]
|
72
|
-
expect(definer.definitions.size).to eq(1)
|
73
|
-
expect(definer.definitions[:man][:inherits]).to be_nil
|
74
|
-
expect(definer.definitions[:man][:levels]).to eql([
|
75
|
-
privilege(:man), privilege(:man, :commoner), privilege(:man, :count)
|
76
|
-
])
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'adds privilege that inherits single other' do
|
80
|
-
definer.privilege :vassal, inherits: :man
|
81
|
-
expect(definer.definitions.size).to eq(1)
|
82
|
-
expect(definer.definitions[:vassal][:inherits]).to eq([:man])
|
83
|
-
end
|
84
|
-
|
85
|
-
it 'adds privilege that inherits multiple others' do
|
86
|
-
definer.privilege :vassal, inherits: %i[man woman apache-helicopter]
|
87
|
-
expect(definer.definitions.size).to eq(1)
|
88
|
-
expect(definer.definitions[:vassal][:inherits]).to eq([:man, :woman, :'apache-helicopter'])
|
89
|
-
end
|
90
|
-
|
91
|
-
it 'adds multiple privileges' do
|
92
|
-
definer.privilege :man
|
93
|
-
definer.privilege :vassal
|
94
|
-
expect(definer.definitions.keys).to eq(%i[man vassal])
|
95
|
-
end
|
96
|
-
|
97
|
-
end
|
98
|
-
|
99
|
-
|
100
|
-
describe '#setup_inheritance' do
|
101
|
-
|
102
|
-
it 'sets inheritance' do
|
103
|
-
definer.privilege :man
|
104
|
-
definer.privilege :vassal, inherits: :man
|
105
|
-
definer.send :setup_inheritance
|
106
|
-
|
107
|
-
vassal = definer.definitions[:vassal]
|
108
|
-
expect(vassal[:levels]).to eql([privilege(:vassal)])
|
109
|
-
expect(vassal[:levels].first.inherited).to eql([privilege(:man)])
|
110
|
-
end
|
111
|
-
|
112
|
-
it 'sets inheritance to top level' do
|
113
|
-
definer.privilege :man, levels: %i[commoner count]
|
114
|
-
definer.privilege :vassal, inherits: :man
|
115
|
-
definer.send :setup_inheritance
|
116
|
-
|
117
|
-
vassal = definer.definitions[:vassal]
|
118
|
-
expect(vassal[:levels]).to eql([privilege(:vassal)])
|
119
|
-
expect(vassal[:levels].first.inherited).to eql([privilege(:man, :count)])
|
120
|
-
end
|
121
|
-
|
122
|
-
it 'sets inheritance throughout levels' do
|
123
|
-
definer.privilege :man
|
124
|
-
definer.privilege :vassal, inherits: :man, levels: %i[lord]
|
125
|
-
definer.send :setup_inheritance
|
126
|
-
|
127
|
-
vassal = definer.definitions[:vassal]
|
128
|
-
expect(vassal[:levels]).to eql([privilege(:vassal), privilege(:vassal, :lord)])
|
129
|
-
expect(vassal[:levels][0].inherited).to eql([privilege(:man)])
|
130
|
-
expect(vassal[:levels][1].inherited).to eql([privilege(:vassal)])
|
131
|
-
end
|
132
|
-
|
133
|
-
end
|
134
|
-
|
135
|
-
|
136
|
-
describe '#build_index' do
|
137
|
-
|
138
|
-
it 'returns hash with single privileges' do
|
139
|
-
definer.privilege :man
|
140
|
-
index = definer.send :build_index
|
141
|
-
expect(index).to be_a(Hash)
|
142
|
-
expect(index.keys).to eq([:man])
|
143
|
-
|
144
|
-
man = index.values.first
|
145
|
-
expect(man.keys).to eq(%i[^ base])
|
146
|
-
expect(man.values).to eql([privilege(:man), privilege(:man)])
|
147
|
-
end
|
148
|
-
|
149
|
-
it 'builds index for privilege with levels' do
|
150
|
-
definer.privilege :man, levels: %i[commoner count]
|
151
|
-
index = definer.send :build_index
|
152
|
-
expect(index).to be_a(Hash)
|
153
|
-
expect(index.keys).to eq([:man])
|
154
|
-
|
155
|
-
man = index[:man]
|
156
|
-
expect(man.keys).to eq(%i[^ base commoner count])
|
157
|
-
expect(man[:'^']).to eql(privilege :man, :count)
|
158
|
-
expect(man[:base]).to eql(privilege :man)
|
159
|
-
expect(man[:commoner]).to eql(privilege :man, :commoner)
|
160
|
-
expect(man[:count]).to eql(privilege :man, :count)
|
161
|
-
end
|
162
|
-
|
163
|
-
it 'returns hash with more privileges' do
|
164
|
-
definer.privilege :man
|
165
|
-
definer.privilege :vassal, levels: %i[lord]
|
166
|
-
index = definer.send :build_index
|
167
|
-
expect(index).to be_a(Hash)
|
168
|
-
expect(index.keys).to eq([:man, :vassal])
|
169
|
-
|
170
|
-
man = index[:man]
|
171
|
-
expect(man.keys).to eq(%i[^ base])
|
172
|
-
expect(man[:'^']).to eql(privilege :man)
|
173
|
-
expect(man[:base]).to eql(privilege :man)
|
174
|
-
|
175
|
-
vassal = index[:vassal]
|
176
|
-
expect(vassal.keys).to eq(%i[^ base lord])
|
177
|
-
expect(vassal[:'^']).to eql(privilege :vassal, :lord)
|
178
|
-
expect(vassal[:base]).to eql(privilege :vassal)
|
179
|
-
expect(vassal[:lord]).to eql(privilege :vassal, :lord)
|
180
|
-
end
|
181
|
-
|
182
|
-
end
|
183
|
-
|
184
|
-
end
|