Skip to content

Commit 2958960

Browse files
Add tests for PermissionUtil (#2764)
1 parent 820d56d commit 2958960

File tree

2 files changed

+189
-3
lines changed

2 files changed

+189
-3
lines changed

src/main/java/net/dv8tion/jda/internal/utils/PermissionUtil.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
2424
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
2525
import net.dv8tion.jda.api.entities.emoji.RichCustomEmoji;
26-
import net.dv8tion.jda.internal.entities.GuildImpl;
2726
import org.apache.commons.collections4.CollectionUtils;
2827

2928
import java.util.Arrays;
@@ -283,8 +282,7 @@ public static boolean checkPermission(IPermissionContainer channel, Member membe
283282
Checks.notNull(member, "Member");
284283
Checks.notNull(permissions, "Permissions");
285284

286-
GuildImpl guild = (GuildImpl) channel.getGuild();
287-
checkGuild(guild, member.getGuild(), "Member");
285+
checkGuild(channel.getGuild(), member.getGuild(), "Member");
288286

289287
long effectivePerms = getEffectivePermission(channel, member);
290288
return isApplied(effectivePerms, Permission.getRaw(permissions));
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
/*
2+
* Copyright 2015 Austin Keener, Michael Ritter, Florian Spieß, and the JDA contributors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package net.dv8tion.jda.test.util;
18+
19+
import net.dv8tion.jda.api.Permission;
20+
import net.dv8tion.jda.api.entities.Guild;
21+
import net.dv8tion.jda.api.entities.Member;
22+
import net.dv8tion.jda.api.entities.PermissionOverride;
23+
import net.dv8tion.jda.api.entities.Role;
24+
import net.dv8tion.jda.api.entities.channel.ChannelType;
25+
import net.dv8tion.jda.api.entities.channel.attribute.IPermissionContainer;
26+
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
27+
import net.dv8tion.jda.api.entities.channel.concrete.VoiceChannel;
28+
import net.dv8tion.jda.internal.utils.PermissionUtil;
29+
import net.dv8tion.jda.test.IntegrationTest;
30+
import org.junit.jupiter.api.BeforeEach;
31+
import org.junit.jupiter.api.Test;
32+
import org.mockito.Mock;
33+
34+
import java.util.Arrays;
35+
import java.util.Collections;
36+
import java.util.EnumSet;
37+
import java.util.stream.Collectors;
38+
39+
import static org.assertj.core.api.Assertions.assertThat;
40+
import static org.mockito.ArgumentMatchers.any;
41+
import static org.mockito.ArgumentMatchers.eq;
42+
import static org.mockito.Mockito.when;
43+
44+
public class PermissionUtilTest extends IntegrationTest
45+
{
46+
private static final EnumSet<Permission> ALL_PERMISSIONS =
47+
Arrays.stream(Permission.values())
48+
.filter(perm -> perm != Permission.UNKNOWN)
49+
.collect(Collectors.toCollection(() -> EnumSet.noneOf(Permission.class)));
50+
51+
private static final EnumSet<Permission> ALL_CHANNEL_PERMISSIONS =
52+
Arrays.stream(Permission.values())
53+
.filter(Permission::isChannel)
54+
.collect(Collectors.toCollection(() -> EnumSet.noneOf(Permission.class)));
55+
56+
private static final long ALL_PERMISSIONS_RAW = Permission.getRaw(ALL_PERMISSIONS);
57+
private static final long ALL_CHANNEL_PERMISSIONS_RAW = Permission.getRaw(ALL_CHANNEL_PERMISSIONS);
58+
59+
@Mock
60+
private Guild guild;
61+
@Mock
62+
private Member member;
63+
@Mock
64+
private TextChannel textChannel;
65+
@Mock
66+
private VoiceChannel voiceChannel;
67+
@Mock
68+
private Role role;
69+
@Mock
70+
private Role publicRole;
71+
72+
@Mock
73+
private PermissionOverride roleOverride;
74+
@Mock
75+
private PermissionOverride publicRoleOverride;
76+
@Mock
77+
private PermissionOverride memberOverride;
78+
79+
@BeforeEach
80+
void setupMocks()
81+
{
82+
when(member.getGuild()).thenReturn(guild);
83+
when(guild.getPublicRole()).thenReturn(publicRole);
84+
when(member.getRoles()).thenReturn(Collections.singletonList(role));
85+
86+
mockChannel(textChannel, ChannelType.TEXT);
87+
mockChannel(voiceChannel, ChannelType.VOICE);
88+
}
89+
90+
private void mockChannel(IPermissionContainer channel, ChannelType type)
91+
{
92+
when(channel.getType()).thenReturn(type);
93+
when(channel.getGuild()).thenReturn(guild);
94+
when(channel.getPermissionContainer()).thenReturn(channel);
95+
when(channel.getPermissionOverride(any(Member.class))).thenReturn(memberOverride);
96+
when(channel.getPermissionOverride(any(Role.class))).thenReturn(roleOverride);
97+
when(channel.getPermissionOverride(eq(publicRole))).thenReturn(publicRoleOverride);
98+
}
99+
100+
@Test
101+
void testNoPermissionHasNoPermission()
102+
{
103+
when(role.getPermissionsRaw()).thenReturn(0L);
104+
105+
assertThat(PermissionUtil.getExplicitPermission(member)).isEqualTo(0L);
106+
}
107+
108+
@Test
109+
void testPermissionInheritedFromPublicRole()
110+
{
111+
when(role.getPermissionsRaw()).thenReturn(Permission.MESSAGE_HISTORY.getRawValue());
112+
when(publicRole.getPermissionsRaw()).thenReturn(Permission.MESSAGE_SEND.getRawValue());
113+
114+
assertThat(PermissionUtil.getExplicitPermission(member))
115+
.isEqualTo(Permission.MESSAGE_HISTORY.getRawValue() | Permission.MESSAGE_SEND.getRawValue());
116+
}
117+
118+
@Test
119+
void testAdminHasAllEffectivePermissions()
120+
{
121+
when(role.getPermissionsRaw()).thenReturn(Permission.ADMINISTRATOR.getRawValue());
122+
when(roleOverride.getDeniedRaw()).thenReturn(Permission.VIEW_CHANNEL.getRawValue());
123+
when(memberOverride.getDeniedRaw()).thenReturn(Permission.VIEW_CHANNEL.getRawValue());
124+
when(publicRoleOverride.getDeniedRaw()).thenReturn(Permission.VIEW_CHANNEL.getRawValue());
125+
126+
assertThat(PermissionUtil.getEffectivePermission(member)).isEqualTo(ALL_PERMISSIONS_RAW);
127+
assertThat(PermissionUtil.getEffectivePermission(textChannel, member)).isEqualTo(ALL_PERMISSIONS_RAW);
128+
assertThat(ALL_PERMISSIONS).allSatisfy(
129+
permission -> assertThat(PermissionUtil.checkPermission(member, permission)).isTrue()
130+
);
131+
assertThat(ALL_CHANNEL_PERMISSIONS).allSatisfy(
132+
permission -> assertThat(PermissionUtil.checkPermission(textChannel, member, permission)).isTrue()
133+
);
134+
}
135+
136+
@Test
137+
void testOwnerHasAllEffectivePermissions()
138+
{
139+
when(member.isOwner()).thenReturn(true);
140+
141+
assertThat(PermissionUtil.getEffectivePermission(member)).isEqualTo(ALL_PERMISSIONS_RAW);
142+
assertThat(PermissionUtil.getEffectivePermission(textChannel, member)).isEqualTo(ALL_PERMISSIONS_RAW);
143+
assertThat(ALL_PERMISSIONS).allSatisfy(
144+
permission -> assertThat(PermissionUtil.checkPermission(member, permission)).isTrue()
145+
);
146+
assertThat(ALL_CHANNEL_PERMISSIONS).allSatisfy(
147+
permission -> assertThat(PermissionUtil.checkPermission(textChannel, member, permission)).isTrue()
148+
);
149+
}
150+
151+
@Test
152+
void testMemberDoesNotHaveViewChannel()
153+
{
154+
when(publicRole.getPermissionsRaw()).thenReturn(Permission.VIEW_CHANNEL.getRawValue());
155+
when(publicRoleOverride.getDeniedRaw()).thenReturn(Permission.VIEW_CHANNEL.getRawValue());
156+
157+
// denies permissions in all channels
158+
159+
assertThat(PermissionUtil.getEffectivePermission(textChannel, member)).isEqualTo(0L);
160+
assertThat(ALL_PERMISSIONS).allSatisfy(
161+
permission -> assertThat(PermissionUtil.checkPermission(textChannel, member, permission)).isFalse()
162+
);
163+
164+
assertThat(PermissionUtil.getEffectivePermission(voiceChannel, member)).isEqualTo(0L);
165+
assertThat(ALL_PERMISSIONS).allSatisfy(
166+
permission -> assertThat(PermissionUtil.checkPermission(voiceChannel, member, permission)).isFalse()
167+
);
168+
}
169+
170+
@Test
171+
void testMemberDoesNotHaveConnectChannel()
172+
{
173+
when(publicRole.getPermissionsRaw()).thenReturn(Permission.VIEW_CHANNEL.getRawValue());
174+
when(publicRoleOverride.getDeniedRaw()).thenReturn(Permission.VOICE_CONNECT.getRawValue());
175+
176+
// denies permissions in voice channels
177+
assertThat(PermissionUtil.getEffectivePermission(voiceChannel, member)).isEqualTo(0L);
178+
assertThat(ALL_PERMISSIONS).allSatisfy(
179+
permission -> assertThat(PermissionUtil.checkPermission(voiceChannel, member, permission)).isFalse()
180+
);
181+
182+
// but should not affect text channel
183+
assertThat(PermissionUtil.getEffectivePermission(textChannel, member)).isEqualTo(Permission.VIEW_CHANNEL.getRawValue());
184+
assertThat(ALL_PERMISSIONS).allSatisfy(
185+
permission -> assertThat(PermissionUtil.checkPermission(textChannel, member, permission)).isEqualTo(permission == Permission.VIEW_CHANNEL)
186+
);
187+
}
188+
}

0 commit comments

Comments
 (0)