class SecurityConfigTest {
@Nested
class RoleHierarchyTest{
private static final String hierarchyString = """
ROLE_ADMIN > ROLE_STAFF
ROLE_ADMIN > plan:delete:all
ROLE_STAFF > ROLE_USER
ROLE_STAFF > plan:read:all
ROLE_USER > place:read:all
ROLE_USER > plan:update:owned
""";
private static RoleHierarchy roleHierarchy;
@BeforeAll
static void setUp() {
RoleHierarchyImpl hierarchy = new RoleHierarchyImpl();
hierarchy.setHierarchy(hierarchyString);
roleHierarchy = hierarchy;
}
static Stream<Arguments> provideRolesAndExpectedPermissions() {
return Stream.of(
Arguments.of("ROLE_USER", new String[]{"place:read:all", "plan:update:owned"}),
Arguments.of("ROLE_STAFF", new String[]{"place:read:all", "plan:update:owned", "plan:read:all"}),
Arguments.of("ROLE_ADMIN", new String[]{"place:read:all", "plan:update:owned", "plan:read:all", "plan:delete:all"})
);
}
@ParameterizedTest
@MethodSource("provideRolesAndExpectedPermissions")
void roleHierarchy(String role, String... expectedPermissions) {
//given
//when
Set<String> permissions = roleHierarchy.getReachableGrantedAuthorities(Set.of(new SimpleGrantedAuthority(role)))
.stream()
.map(GrantedAuthority::getAuthority)
.collect(Collectors.toSet());
//then
for (String expectedPermission : expectedPermissions) {
Assertions.assertTrue(permissions.contains(expectedPermission));
}
}
}
}
@ParameterizedTest
와 @MethodSource
를 사용하면, 케이스별로 정의된 테스트를 할 수 있어, 매우 간단하게 테스트를 작성할 수 있다.
특히 여러개의 인자를 전달할 때는 org.junit.jupiter.params.provider.Arguments
를 사용하여 여러 인자를 전달 할 수 있다.
특히 org.junit.jupiter.params.provider
패키지에 가면, csv라던지 여러가지 방법으로 테스트 인자를 전달할 수 있는 클래스가 모여있다.