blob: a6c2d891c79335aee8fcb6bb0302bf736299d1b8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.shenyu.admin.service;
import org.apache.shenyu.admin.config.properties.DashboardProperties;
import org.apache.shenyu.admin.mapper.DashboardUserMapper;
import org.apache.shenyu.admin.mapper.PermissionMapper;
import org.apache.shenyu.admin.mapper.ResourceMapper;
import org.apache.shenyu.admin.mapper.UserRoleMapper;
import org.apache.shenyu.admin.model.custom.UserInfo;
import org.apache.shenyu.admin.model.entity.DashboardUserDO;
import org.apache.shenyu.admin.model.entity.PermissionDO;
import org.apache.shenyu.admin.model.entity.ResourceDO;
import org.apache.shenyu.admin.model.entity.UserRoleDO;
import org.apache.shenyu.admin.model.vo.PermissionMenuVO;
import org.apache.shenyu.admin.service.impl.PermissionServiceImpl;
import org.apache.shenyu.admin.spring.SpringBeanUtils;
import org.apache.shenyu.admin.utils.JwtUtils;
import org.apache.shenyu.common.constant.ResourceTypeConstants;
import org.apache.shiro.SecurityUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
import org.mockito.stubbing.Answer;
import org.springframework.context.ConfigurableApplicationContext;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when;
/**
* add test case for {@link PermissionServiceImpl}.
*/
@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.LENIENT)
public final class PermissionServiceTest {
@Mock
private DashboardUserMapper mockDashboardUserMapper;
@Mock
private UserRoleMapper mockUserRoleMapper;
@Mock
private PermissionMapper mockPermissionMapper;
@Mock
private ResourceMapper mockResourceMapper;
private PermissionServiceImpl permissionServiceImplUnderTest;
@Mock
private org.apache.shiro.mgt.SecurityManager securityManager;
@Mock
private DashboardProperties dashboardProperties;
@BeforeEach
public void setUp() throws Exception {
SecurityUtils.setSecurityManager(securityManager);
ConfigurableApplicationContext context = mock(ConfigurableApplicationContext.class);
SpringBeanUtils.getInstance().setApplicationContext(context);
final DashboardUserDO dashboardUserDO = DashboardUserDO.builder().id("1").userName("admin").role(1).enabled(true).build();
final UserRoleDO userRoleDO = UserRoleDO.builder().userId("1").roleId("1346358560427216896")
.id("1351007709096976384").dateCreated(new Timestamp(1610940313000L)).dateUpdated(new Timestamp(1610940313000L)).build();
List<PermissionDO> permissionDOS = new ArrayList<>();
permissionDOS.add(PermissionDO.builder().objectId("1346358560427216896").resourceId("1346775491550474240").id("1351007708572688384").build());
permissionDOS.add(PermissionDO.builder().objectId("1346358560427216896").resourceId("1346776175553376256").id("1351007708585271296").build());
permissionDOS.add(PermissionDO.builder().objectId("1346358560427216896").resourceId("1346777157943259136").id("1351007708593659904").build());
permissionDOS.add(PermissionDO.builder().objectId("1346358560427216896").resourceId("1347053375029653504").id("1351007708593659914").build());
final ResourceDO resourceDO1 = ResourceDO.builder().title("SHENYU.MENU.PLUGIN.LIST").name("plug").url("/plug").component("PluginList")
.resourceType(0).sort(0).icon("dashboard").isLeaf(false).isRoute(0).status(1)
.dateCreated(new Timestamp(1610940313000L))
.dateUpdated(new Timestamp(1610940313000L))
.id("1346775491550474240").build();
final ResourceDO resourceDO2 = ResourceDO.builder().title("SHENYU.MENU.SYSTEM.MANAGMENT").name("system").url("/system").component("system")
.resourceType(0).sort(1).icon("setting").isLeaf(false).isRoute(0).status(1)
.dateCreated(new Timestamp(1610940313000L))
.dateUpdated(new Timestamp(1610940313000L))
.id("1346776175553376256").build();
final ResourceDO resourceDO3 = ResourceDO.builder().parentId("1346776175553376256").title("SHENYU.MENU.SYSTEM.MANAGMENT.USER").name("manage").url("/system/manage").component("manage")
.resourceType(1).sort(1).icon("").isLeaf(false).isRoute(0).status(1)
.dateCreated(new Timestamp(1610940313000L))
.dateUpdated(new Timestamp(1610940313000L))
.id("1346777157943259136").build();
final ResourceDO resourceDO4 = ResourceDO.builder().parentId("1347027526339538944").title("SHENYU.BUTTON.PLUGIN.SYNCHRONIZE")
.resourceType(2).sort(4).isLeaf(true).isRoute(0).perms("plugin:sign:modify").status(1)
.dateCreated(new Timestamp(1610940313000L))
.dateUpdated(new Timestamp(1610940313000L))
.id("1347053375029653504").build();
final Set<String> resourceIds = Stream.of("1346775491550474240", "1346776175553376256", "1346777157943259136", "1347053375029653504").collect(Collectors.toSet());
when(mockDashboardUserMapper.selectByUserName("admin")).thenReturn(dashboardUserDO);
when(mockUserRoleMapper.findByUserId("1")).thenReturn(Collections.singletonList(userRoleDO));
when(mockPermissionMapper.findByObjectIds(Collections.singletonList("1346358560427216896"))).thenReturn(permissionDOS);
// when(mockResourceMapper.selectById("1346775491550474240")).thenReturn(resourceDO1);
// when(mockResourceMapper.selectById("1346776175553376256")).thenReturn(resourceDO2);
// when(mockResourceMapper.selectById("1346777157943259136")).thenReturn(resourceDO3);
// when(mockResourceMapper.selectById("1347053375029653504")).thenReturn(resourceDO4);
// when(mockResourceMapper.selectAll()).thenReturn(Arrays.asList(resourceDO1, resourceDO2, resourceDO3, resourceDO4));
when(mockResourceMapper.selectByUserName("admin")).thenReturn(Arrays.asList(resourceDO2, resourceDO3, resourceDO1, resourceDO4));
when(mockResourceMapper.selectByResourceType(ResourceTypeConstants.MENU_TYPE_2)).thenReturn(Collections.singletonList(resourceDO4));
permissionServiceImplUnderTest = new PermissionServiceImpl(mockPermissionMapper, mockResourceMapper, dashboardProperties);
}
@Test
public void testGetPermissionMenu() {
try (MockedStatic<JwtUtils> mocked = mockStatic(JwtUtils.class)) {
mocked.when(JwtUtils::getUserInfo)
.thenAnswer((Answer<UserInfo>) invocation -> UserInfo.builder().userId("1").userName("admin").build());
final PermissionMenuVO expectedResult = new PermissionMenuVO(Arrays.asList(
new PermissionMenuVO.MenuInfo("1346776175553376256", "system", "/system", "system",
new PermissionMenuVO.Meta("setting", "SHENYU.MENU.SYSTEM.MANAGMENT"), Collections.singletonList(
new PermissionMenuVO.MenuInfo("1346777157943259136", "manage", "/system/manage", "manage",
new PermissionMenuVO.Meta("", "SHENYU.MENU.SYSTEM.MANAGMENT.USER"), Collections.emptyList(), 1)
), 1),
new PermissionMenuVO.MenuInfo("1346775491550474240", "plug", "/plug", "PluginList",
new PermissionMenuVO.Meta("dashboard", "SHENYU.MENU.PLUGIN.LIST"), Collections.emptyList(), 0)
),
Collections.singletonList(new PermissionMenuVO.AuthPerm("plugin:sign:modify", "SHENYU.BUTTON.PLUGIN.SYNCHRONIZE", null)),
Collections.singletonList(new PermissionMenuVO.AuthPerm("plugin:sign:modify", "SHENYU.BUTTON.PLUGIN.SYNCHRONIZE", null)));
String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTYxMTc5MjEzOX0.eFORUk5kZawKLTsfRYojy-uaaDySo9kWtcfgxISS_3g";
final PermissionMenuVO result = permissionServiceImplUnderTest.getPermissionMenu(token);
assertThat(result.getCurrentAuth(), containsInAnyOrder(expectedResult.getCurrentAuth().toArray()));
assertThat(result.getAllAuth(), containsInAnyOrder(expectedResult.getAllAuth().toArray()));
assertThat(result.getMenu(), containsInAnyOrder(expectedResult.getMenu().toArray()));
}
}
@Test
public void testGetAuthPermByUserName() {
final Set<String> result = permissionServiceImplUnderTest.getAuthPermByUserName("admin");
assertThat(result.size(), is(1));
}
}