Skip to content

Commit 66734f1

Browse files
committed
Add comprehensive tests for all Pundit policies
Adds test coverage for all 11 authorization policy files that were previously untested. Policies control access to admin functions and sensitive data, making this coverage critical for security. Test Coverage Results: - 62 new policy tests (all passing) - 10 of 11 policies: 100% coverage - ApplicationPolicy: 92.59% (base class) - Overall project: 95.22% coverage (up from 95.08%) Policies Tested: - AdminPortalPolicy (2 tests) - ApplicationPolicy (6 tests) - ChapterPolicy (12 tests) - ContactPolicy (2 tests) - EventPolicy (4 tests) - GroupPolicy (4 tests) - MemberNotePolicy (2 tests) - OrganiserPolicy (6 tests) - SponsorPolicy (10 tests) - TestimonialPolicy (2 tests) - WorkshopPolicy (12 tests) Testing Pattern: Each policy test follows a consistent pattern testing authorization boundaries with happy path (admin succeeds) and sad path (regular member denied) scenarios. Tests use Fabrication for test data and Rolify for role assignment, matching existing codebase patterns.
1 parent da058ae commit 66734f1

11 files changed

Lines changed: 628 additions & 0 deletions
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
RSpec.describe AdminPortalPolicy do
2+
subject { described_class.new(user, :admin_portal) }
3+
4+
let(:admin) { Fabricate(:member).tap { |m| m.add_role(:admin) } }
5+
let(:regular_member) { Fabricate(:member) }
6+
7+
describe '#index?' do
8+
context 'when user is admin' do
9+
let(:user) { admin }
10+
11+
it 'permits access' do
12+
expect(subject.index?).to be true
13+
end
14+
end
15+
16+
context 'when user is regular member' do
17+
let(:user) { regular_member }
18+
19+
it 'denies access' do
20+
expect(subject.index?).to be false
21+
end
22+
end
23+
end
24+
end
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
RSpec.describe ApplicationPolicy do
2+
subject { described_class.new(user, record) }
3+
4+
let(:record) { double('record') }
5+
let(:admin) { Fabricate(:member).tap { |m| m.add_role(:admin) } }
6+
let(:regular_member) { Fabricate(:member) }
7+
8+
describe '#index?' do
9+
let(:user) { admin }
10+
11+
it 'denies access by default' do
12+
expect(subject.index?).to be false
13+
end
14+
end
15+
16+
describe '#create?' do
17+
let(:user) { admin }
18+
19+
it 'denies access by default' do
20+
expect(subject.create?).to be false
21+
end
22+
end
23+
24+
describe '#new?' do
25+
let(:user) { admin }
26+
27+
it 'delegates to create?' do
28+
expect(subject.new?).to eq(subject.create?)
29+
end
30+
end
31+
32+
describe '#update?' do
33+
let(:user) { admin }
34+
35+
it 'denies access by default' do
36+
expect(subject.update?).to be false
37+
end
38+
end
39+
40+
describe '#edit?' do
41+
let(:user) { admin }
42+
43+
it 'delegates to update?' do
44+
expect(subject.edit?).to eq(subject.update?)
45+
end
46+
end
47+
48+
describe '#destroy?' do
49+
let(:user) { admin }
50+
51+
it 'denies access by default' do
52+
expect(subject.destroy?).to be false
53+
end
54+
end
55+
end
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
RSpec.describe ChapterPolicy do
2+
subject { described_class.new(user, chapter) }
3+
4+
let(:chapter) { Fabricate(:chapter) }
5+
let(:admin) { Fabricate(:member).tap { |m| m.add_role(:admin) } }
6+
let(:regular_member) { Fabricate(:member) }
7+
8+
describe '#index?' do
9+
context 'when user is admin' do
10+
let(:user) { admin }
11+
12+
it 'permits access' do
13+
expect(subject.index?).to be true
14+
end
15+
end
16+
17+
context 'when user is regular member' do
18+
let(:user) { regular_member }
19+
20+
it 'denies access' do
21+
expect(subject.index?).to be false
22+
end
23+
end
24+
end
25+
26+
describe '#create?' do
27+
context 'when user is admin' do
28+
let(:user) { admin }
29+
30+
it 'permits access' do
31+
expect(subject.create?).to be true
32+
end
33+
end
34+
35+
context 'when user is regular member' do
36+
let(:user) { regular_member }
37+
38+
it 'denies access' do
39+
expect(subject.create?).to be false
40+
end
41+
end
42+
end
43+
44+
describe '#show?' do
45+
context 'when user is admin' do
46+
let(:user) { admin }
47+
48+
it 'permits access' do
49+
expect(subject.show?).to be true
50+
end
51+
end
52+
53+
context 'when user is regular member' do
54+
let(:user) { regular_member }
55+
56+
it 'denies access' do
57+
expect(subject.show?).to be false
58+
end
59+
end
60+
end
61+
62+
describe '#edit?' do
63+
context 'when user is admin' do
64+
let(:user) { admin }
65+
66+
it 'permits access' do
67+
expect(subject.edit?).to be true
68+
end
69+
end
70+
71+
context 'when user is regular member' do
72+
let(:user) { regular_member }
73+
74+
it 'denies access' do
75+
expect(subject.edit?).to be false
76+
end
77+
end
78+
end
79+
80+
describe '#update?' do
81+
context 'when user is admin' do
82+
let(:user) { admin }
83+
84+
it 'permits access' do
85+
expect(subject.update?).to be true
86+
end
87+
end
88+
89+
context 'when user is regular member' do
90+
let(:user) { regular_member }
91+
92+
it 'denies access' do
93+
expect(subject.update?).to be false
94+
end
95+
end
96+
end
97+
98+
describe '#members?' do
99+
context 'when user is admin' do
100+
let(:user) { admin }
101+
102+
it 'permits access' do
103+
expect(subject.members?).to be true
104+
end
105+
end
106+
107+
context 'when user is regular member' do
108+
let(:user) { regular_member }
109+
110+
it 'denies access' do
111+
expect(subject.members?).to be false
112+
end
113+
end
114+
end
115+
end
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
RSpec.describe ContactPolicy do
2+
subject { described_class.new(user, contact) }
3+
4+
let(:contact) { Fabricate(:contact) }
5+
let(:admin) { Fabricate(:member).tap { |m| m.add_role(:admin) } }
6+
let(:regular_member) { Fabricate(:member) }
7+
8+
describe '#index?' do
9+
context 'when user is admin' do
10+
let(:user) { admin }
11+
12+
it 'permits access' do
13+
expect(subject.index?).to be true
14+
end
15+
end
16+
17+
context 'when user is regular member' do
18+
let(:user) { regular_member }
19+
20+
it 'denies access' do
21+
expect(subject.index?).to be false
22+
end
23+
end
24+
end
25+
end

spec/policies/event_policy_spec.rb

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
RSpec.describe EventPolicy do
2+
subject { described_class.new(user, event) }
3+
4+
let(:event) { Fabricate(:event) }
5+
let(:admin) { Fabricate(:member).tap { |m| m.add_role(:admin) } }
6+
let(:regular_member) { Fabricate(:member) }
7+
8+
describe '#invite?' do
9+
context 'when user is admin' do
10+
let(:user) { admin }
11+
12+
it 'permits access' do
13+
expect(subject.invite?).to be true
14+
end
15+
end
16+
17+
context 'when user is regular member' do
18+
let(:user) { regular_member }
19+
20+
it 'denies access' do
21+
expect(subject.invite?).to be false
22+
end
23+
end
24+
end
25+
26+
describe '#show?' do
27+
context 'when user is admin' do
28+
let(:user) { admin }
29+
30+
it 'permits access' do
31+
expect(subject.show?).to be true
32+
end
33+
end
34+
35+
context 'when user is regular member' do
36+
let(:user) { regular_member }
37+
38+
it 'denies access' do
39+
expect(subject.show?).to be false
40+
end
41+
end
42+
end
43+
end

spec/policies/group_policy_spec.rb

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
RSpec.describe GroupPolicy do
2+
subject { described_class.new(user, group) }
3+
4+
let(:group) { Fabricate(:group) }
5+
let(:admin) { Fabricate(:member).tap { |m| m.add_role(:admin) } }
6+
let(:regular_member) { Fabricate(:member) }
7+
8+
describe '#create?' do
9+
context 'when user is admin' do
10+
let(:user) { admin }
11+
12+
it 'permits access' do
13+
expect(subject.create?).to be true
14+
end
15+
end
16+
17+
context 'when user is regular member' do
18+
let(:user) { regular_member }
19+
20+
it 'denies access' do
21+
expect(subject.create?).to be false
22+
end
23+
end
24+
end
25+
26+
describe '#show?' do
27+
context 'when user is admin' do
28+
let(:user) { admin }
29+
30+
it 'permits access' do
31+
expect(subject.show?).to be true
32+
end
33+
end
34+
35+
context 'when user is regular member' do
36+
let(:user) { regular_member }
37+
38+
it 'denies access' do
39+
expect(subject.show?).to be false
40+
end
41+
end
42+
end
43+
end
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
RSpec.describe MemberNotePolicy do
2+
subject { described_class.new(user, member_note) }
3+
4+
let(:member_note) { Fabricate(:member_note) }
5+
let(:admin) { Fabricate(:member).tap { |m| m.add_role(:admin) } }
6+
let(:regular_member) { Fabricate(:member) }
7+
8+
describe '#create?' do
9+
context 'when user is admin' do
10+
let(:user) { admin }
11+
12+
it 'permits access' do
13+
expect(subject.create?).to be true
14+
end
15+
end
16+
17+
context 'when user is regular member' do
18+
let(:user) { regular_member }
19+
20+
it 'denies access' do
21+
expect(subject.create?).to be false
22+
end
23+
end
24+
end
25+
end
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
RSpec.describe OrganiserPolicy do
2+
subject { described_class.new(user, organiser) }
3+
4+
let(:organiser) { Fabricate(:member) }
5+
let(:admin) { Fabricate(:member).tap { |m| m.add_role(:admin) } }
6+
let(:regular_member) { Fabricate(:member) }
7+
8+
describe '#index?' do
9+
context 'when user is admin' do
10+
let(:user) { admin }
11+
12+
it 'permits access' do
13+
expect(subject.index?).to be true
14+
end
15+
end
16+
17+
context 'when user is regular member' do
18+
let(:user) { regular_member }
19+
20+
it 'denies access' do
21+
expect(subject.index?).to be false
22+
end
23+
end
24+
end
25+
26+
describe '#create?' do
27+
context 'when user is admin' do
28+
let(:user) { admin }
29+
30+
it 'permits access' do
31+
expect(subject.create?).to be true
32+
end
33+
end
34+
35+
context 'when user is regular member' do
36+
let(:user) { regular_member }
37+
38+
it 'denies access' do
39+
expect(subject.create?).to be false
40+
end
41+
end
42+
end
43+
44+
describe '#destroy?' do
45+
context 'when user is admin' do
46+
let(:user) { admin }
47+
48+
it 'permits access' do
49+
expect(subject.destroy?).to be true
50+
end
51+
end
52+
53+
context 'when user is regular member' do
54+
let(:user) { regular_member }
55+
56+
it 'denies access' do
57+
expect(subject.destroy?).to be false
58+
end
59+
end
60+
end
61+
end

0 commit comments

Comments
 (0)