mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 18:28:43 +08:00 
			
		
		
		
	临时提交,暂时不考虑 unionId,简化模型
This commit is contained in:
		| @@ -1,21 +1,40 @@ | ||||
| package cn.iocoder.yudao.module.system.service.social; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | ||||
| import cn.iocoder.yudao.framework.test.core.util.AssertUtils; | ||||
| import cn.iocoder.yudao.framework.test.core.util.RandomUtils; | ||||
| import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; | ||||
| import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserBindDO; | ||||
| import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO; | ||||
| import cn.iocoder.yudao.module.system.dal.mysql.social.SocialUserBindMapper; | ||||
| import cn.iocoder.yudao.module.system.dal.mysql.social.SocialUserMapper; | ||||
| import cn.iocoder.yudao.framework.test.core.ut.BaseDbAndRedisUnitTest; | ||||
| import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; | ||||
| import com.baomidou.mybatisplus.core.toolkit.PluginUtils; | ||||
| import com.xkcoding.justauth.AuthRequestFactory; | ||||
| import me.zhyd.oauth.enums.AuthResponseStatus; | ||||
| import me.zhyd.oauth.model.AuthCallback; | ||||
| import me.zhyd.oauth.model.AuthResponse; | ||||
| import me.zhyd.oauth.model.AuthUser; | ||||
| import me.zhyd.oauth.request.AuthRequest; | ||||
| import me.zhyd.oauth.utils.AuthStateUtils; | ||||
| import org.junit.jupiter.api.Test; | ||||
| import org.junit.jupiter.api.function.Executable; | ||||
| import org.mockito.MockedStatic; | ||||
| import org.springframework.boot.test.mock.mockito.MockBean; | ||||
| import org.springframework.context.annotation.Import; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
|  | ||||
| import static cn.hutool.core.util.RandomUtil.randomEle; | ||||
| import static cn.hutool.core.util.RandomUtil.randomString; | ||||
| import java.util.List; | ||||
|  | ||||
| import static cn.hutool.core.util.RandomUtil.*; | ||||
| import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; | ||||
| import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; | ||||
| import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; | ||||
| import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; | ||||
| import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SOCIAL_USER_AUTH_FAILURE; | ||||
| import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.SOCIAL_USER_NOT_FOUND; | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.mockito.Mockito.*; | ||||
|  | ||||
| @@ -27,6 +46,8 @@ public class SocialUserServiceTest extends BaseDbAndRedisUnitTest { | ||||
|  | ||||
|     @Resource | ||||
|     private SocialUserMapper socialUserMapper; | ||||
|     @Resource | ||||
|     private SocialUserBindMapper socialUserBindMapper; | ||||
|  | ||||
|     @MockBean | ||||
|     private AuthRequestFactory authRequestFactory; | ||||
| @@ -35,7 +56,7 @@ public class SocialUserServiceTest extends BaseDbAndRedisUnitTest { | ||||
|     public void testGetAuthorizeUrl() { | ||||
|         try (MockedStatic<AuthStateUtils> authStateUtilsMock = mockStatic(AuthStateUtils.class)) { | ||||
|             // 准备参数 | ||||
|             Integer type = 31; | ||||
|             Integer type = SocialTypeEnum.WECHAT_MP.getType(); | ||||
|             String redirectUri = "sss"; | ||||
|             // mock 获得对应的 AuthRequest 实现 | ||||
|             AuthRequest authRequest = mock(AuthRequest.class); | ||||
| @@ -51,25 +72,138 @@ public class SocialUserServiceTest extends BaseDbAndRedisUnitTest { | ||||
|         } | ||||
|     } | ||||
|  | ||||
| //    /** | ||||
| //     * 情况一,创建 SocialUserDO 的情况 | ||||
| //     */ | ||||
| //    @Test | ||||
| //    public void testBindSocialUser_create() { | ||||
| //        // mock 数据 | ||||
| //        // 准备参数 | ||||
| //        Long userId = randomLongId(); | ||||
| //        Integer type = randomEle(SocialTypeEnum.values()).getType(); | ||||
| //        AuthUser authUser = randomPojo(AuthUser.class); | ||||
| //        // mock 方法 | ||||
| // | ||||
| //        // 调用 | ||||
| //        socialService.bindSocialUser(userId, UserTypeEnum.ADMIN.getValue(), type, authUser); | ||||
| //        // 断言 | ||||
| //        List<SocialUserDO> socialUsers = socialUserMapper.selectList("user_id", userId); | ||||
| //        assertEquals(1, socialUsers.size()); | ||||
| //        assertBindSocialUser(socialUsers.get(0), authUser, userId, type); | ||||
| //    } | ||||
|     @Test | ||||
|     public void testAuthSocialUser_exists() { | ||||
|         // 准备参数 | ||||
|         Integer type = SocialTypeEnum.GITEE.getType(); | ||||
|         String code = "tudou"; | ||||
|         String state = "yuanma"; | ||||
|         // mock 方法 | ||||
|         SocialUserDO socialUser = randomPojo(SocialUserDO.class).setType(type).setCode(code).setState(state); | ||||
|         socialUserMapper.insert(socialUser); | ||||
|  | ||||
|         // 调用 | ||||
|         SocialUserDO result = socialUserService.authSocialUser(type, code, state); | ||||
|         // 断言 | ||||
|         assertPojoEquals(socialUser, result); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testAuthSocialUser_authFailure() { | ||||
|         // 准备参数 | ||||
|         Integer type = SocialTypeEnum.GITEE.getType(); | ||||
|         // mock 方法 | ||||
|         AuthRequest authRequest = mock(AuthRequest.class); | ||||
|         when(authRequestFactory.get(anyString())).thenReturn(authRequest); | ||||
|         AuthResponse<?> authResponse = new AuthResponse<>(0, "模拟失败", null); | ||||
|         when(authRequest.login(any(AuthCallback.class))).thenReturn(authResponse); | ||||
|  | ||||
|         // 调用并断言 | ||||
|         assertServiceException( | ||||
|                 () -> socialUserService.authSocialUser(type, randomString(10), randomString(10)), | ||||
|                 SOCIAL_USER_AUTH_FAILURE, "模拟失败"); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testAuthSocialUser_insert() { | ||||
|         // 准备参数 | ||||
|         Integer type = SocialTypeEnum.GITEE.getType(); | ||||
|         String code = "tudou"; | ||||
|         String state = "yuanma"; | ||||
|         // mock 方法 | ||||
|         AuthRequest authRequest = mock(AuthRequest.class); | ||||
|         when(authRequestFactory.get(eq(SocialTypeEnum.GITEE.getSource()))).thenReturn(authRequest); | ||||
|         AuthUser authUser = randomPojo(AuthUser.class); | ||||
|         AuthResponse<AuthUser> authResponse = new AuthResponse<>(AuthResponseStatus.SUCCESS.getCode(), null, authUser); | ||||
|         when(authRequest.login(any(AuthCallback.class))).thenReturn(authResponse); | ||||
|  | ||||
|         // 调用 | ||||
|         SocialUserDO result = socialUserService.authSocialUser(type, code, state); | ||||
|         // 断言 | ||||
|         assertBindSocialUser(type, result, authResponse.getData()); | ||||
|         assertEquals(code, result.getCode()); | ||||
|         assertEquals(state, result.getState()); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testAuthSocialUser_update() { | ||||
|         // 准备参数 | ||||
|         Integer type = SocialTypeEnum.GITEE.getType(); | ||||
|         String code = "tudou"; | ||||
|         String state = "yuanma"; | ||||
|         // mock 数据 | ||||
|         socialUserMapper.insert(randomPojo(SocialUserDO.class).setType(type).setOpenid("test_openid")); | ||||
|         // mock 方法 | ||||
|         AuthRequest authRequest = mock(AuthRequest.class); | ||||
|         when(authRequestFactory.get(eq(SocialTypeEnum.GITEE.getSource()))).thenReturn(authRequest); | ||||
|         AuthUser authUser = randomPojo(AuthUser.class); | ||||
|         authUser.getToken().setOpenId("test_openid"); | ||||
|         AuthResponse<AuthUser> authResponse = new AuthResponse<>(AuthResponseStatus.SUCCESS.getCode(), null, authUser); | ||||
|         when(authRequest.login(any(AuthCallback.class))).thenReturn(authResponse); | ||||
|  | ||||
|         // 调用 | ||||
|         SocialUserDO result = socialUserService.authSocialUser(type, code, state); | ||||
|         // 断言 | ||||
|         assertBindSocialUser(type, result, authResponse.getData()); | ||||
|         assertEquals(code, result.getCode()); | ||||
|         assertEquals(state, result.getState()); | ||||
|     } | ||||
|  | ||||
|     private void assertBindSocialUser(Integer type, SocialUserDO socialUser, AuthUser authUser) { | ||||
|         assertEquals(authUser.getToken().getAccessToken(), socialUser.getToken()); | ||||
|         assertEquals(toJsonString(authUser.getToken()), socialUser.getRawTokenInfo()); | ||||
|         assertEquals(authUser.getNickname(), socialUser.getNickname()); | ||||
|         assertEquals(authUser.getAvatar(), socialUser.getAvatar()); | ||||
|         assertEquals(toJsonString(authUser.getRawUserInfo()), socialUser.getRawUserInfo()); | ||||
|         assertEquals(type, socialUser.getType()); | ||||
|         assertEquals(authUser.getUuid(), socialUser.getOpenid()); | ||||
|         assertEquals(authUser.getToken().getUnionId(), socialUser.getUnionId()); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testGetSocialUserList() { | ||||
|         Long userId = 1L; | ||||
|         Integer userType = UserTypeEnum.ADMIN.getValue(); | ||||
|         // mock 获得绑定 | ||||
|         socialUserBindMapper.insert(randomPojo(SocialUserBindDO.class) // 可被查询到 | ||||
|                 .setUserId(userId).setUserType(userType).setPlatform(SocialTypeEnum.GITEE.getPlatform()) | ||||
|                 .setUnionId("test_unionId")); | ||||
|         socialUserBindMapper.insert(randomPojo(SocialUserBindDO.class) // 不可被查询到 | ||||
|                 .setUserId(2L).setUserType(userType).setPlatform(SocialTypeEnum.DINGTALK.getPlatform())); | ||||
|         // mock 获得社交用户 | ||||
|         SocialUserDO socialUser = randomPojo(SocialUserDO.class).setType(SocialTypeEnum.GITEE.getType()) | ||||
|                 .setUnionId("test_unionId"); | ||||
|         socialUserMapper.insert(socialUser); // 可被查到 | ||||
|         socialUserMapper.insert(randomPojo(SocialUserDO.class)); // 不可被查到 | ||||
|  | ||||
|         // 调用 | ||||
|         List<SocialUserDO> result = socialUserService.getSocialUserList(userId, userType); | ||||
|         // 断言 | ||||
|         assertEquals(1, result.size()); | ||||
|         assertPojoEquals(socialUser, result.get(0)); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testBindSocialUser_create() { | ||||
|         // 准备参数 | ||||
|         SocialUserBindReqDTO reqDTO = new SocialUserBindReqDTO() | ||||
|                 .setUserId(1L).setUserType(UserTypeEnum.ADMIN.getValue()) | ||||
|                 .setType(SocialTypeEnum.GITEE.getType()).setCode("test_code").setState("test_state"); | ||||
|         // mock 数据:获得社交用户 | ||||
|         SocialUserDO socialUser = randomPojo(SocialUserDO.class).setType(reqDTO.getType()) | ||||
|                 .setCode(reqDTO.getCode()).setState(reqDTO.getState()).setUnionId("test_unionId"); | ||||
|         socialUserMapper.insert(socialUser); | ||||
|         // mock 数据:解绑其它账号 | ||||
|         socialUserBindMapper.insert(randomPojo(SocialUserBindDO.class).setUserId(1L).setUserType(UserTypeEnum.ADMIN.getValue()) | ||||
|                 .setPlatform(SocialTypeEnum.GITEE.getPlatform()).setUnionId("test_delete_unionId")); | ||||
|  | ||||
|         // 调用 | ||||
|         socialUserService.bindSocialUser(reqDTO); | ||||
|         // 断言 | ||||
|         List<SocialUserBindDO> socialUserBinds = socialUserBindMapper.selectList(); | ||||
|         assertEquals(1, socialUserBinds.size()); | ||||
|  | ||||
|     } | ||||
| // | ||||
| //    /** | ||||
| //     * 情况二,更新 SocialUserDO 的情况 | ||||
| @@ -119,20 +253,7 @@ public class SocialUserServiceTest extends BaseDbAndRedisUnitTest { | ||||
| //        List<SocialUserDO> socialUsers = socialUserMapper.selectList("user_id", userId); | ||||
| //        assertEquals(1, socialUsers.size()); | ||||
| //    } | ||||
| // | ||||
| //    private void assertBindSocialUser(SocialUserDO socialUser, AuthUser authUser, Long userId, | ||||
| //                                      Integer type) { | ||||
| //        assertEquals(authUser.getToken().getAccessToken(), socialUser.getToken()); | ||||
| //        assertEquals(toJsonString(authUser.getToken()), socialUser.getRawTokenInfo()); | ||||
| //        assertEquals(authUser.getNickname(), socialUser.getNickname()); | ||||
| //        assertEquals(authUser.getAvatar(), socialUser.getAvatar()); | ||||
| //        assertEquals(toJsonString(authUser.getRawUserInfo()), socialUser.getRawUserInfo()); | ||||
| //        assertEquals(userId, socialUser.getUserId()); | ||||
| //        assertEquals(UserTypeEnum.ADMIN.getValue(), socialUser.getUserType()); | ||||
| //        assertEquals(type, socialUser.getType()); | ||||
| //        assertEquals(authUser.getUuid(), socialUser.getOpenid()); | ||||
| //        assertEquals(socialService.getAuthUserUnionId(authUser), socialUser.getUnionId()); | ||||
| //    } | ||||
|  | ||||
| // | ||||
| //    /** | ||||
| //     * 情况一,如果新老的 unionId 是一致的,无需解绑 | ||||
|   | ||||
| @@ -15,6 +15,7 @@ DELETE FROM "system_sms_template"; | ||||
| DELETE FROM "system_sms_log"; | ||||
| DELETE FROM "system_error_code"; | ||||
| DELETE FROM "system_social_user"; | ||||
| DELETE FROM "system_social_user_bind"; | ||||
| DELETE FROM "system_tenant"; | ||||
| DELETE FROM "system_tenant_package"; | ||||
| DELETE FROM "system_sensitive_word"; | ||||
|   | ||||
| @@ -378,16 +378,16 @@ CREATE TABLE IF NOT EXISTS "system_error_code" ( | ||||
|  | ||||
| CREATE TABLE IF NOT EXISTS "system_social_user" ( | ||||
|    "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, | ||||
|    "user_id" bigint NOT NULL, | ||||
|    "user_type" tinyint NOT NULL DEFAULT '0', | ||||
|    "type" tinyint NOT NULL, | ||||
|    "openid" varchar(32) NOT NULL, | ||||
|    "openid" varchar(64) NOT NULL, | ||||
|    "token" varchar(256) DEFAULT NULL, | ||||
|    "union_id" varchar(32) NOT NULL, | ||||
|    "union_id" varchar(64) NOT NULL, | ||||
|    "raw_token_info" varchar(1024) NOT NULL, | ||||
|    "nickname" varchar(32) NOT NULL, | ||||
|    "avatar" varchar(255) DEFAULT NULL, | ||||
|    "raw_user_info" varchar(1024) NOT NULL, | ||||
|    "code" varchar(64) NOT NULL, | ||||
|    "state" varchar(64), | ||||
|    "creator" varchar(64) DEFAULT '', | ||||
|    "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||||
|    "updater" varchar(64) DEFAULT '', | ||||
| @@ -396,6 +396,20 @@ CREATE TABLE IF NOT EXISTS "system_social_user" ( | ||||
|    PRIMARY KEY ("id") | ||||
| ) COMMENT '社交用户'; | ||||
|  | ||||
| CREATE TABLE IF NOT EXISTS "system_social_user_bind" ( | ||||
|    "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, | ||||
|    "user_id" bigint NOT NULL, | ||||
|    "user_type" tinyint NOT NULL DEFAULT '0', | ||||
|    "platform" tinyint NOT NULL, | ||||
|    "union_id" varchar(64) NOT NULL, | ||||
|     "creator" varchar(64) DEFAULT '', | ||||
|     "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||||
|     "updater" varchar(64) DEFAULT '', | ||||
|     "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||||
|     "deleted" bit NOT NULL DEFAULT FALSE, | ||||
|     PRIMARY KEY ("id") | ||||
| ) COMMENT '社交用户的绑定'; | ||||
|  | ||||
| CREATE TABLE IF NOT EXISTS "system_tenant" ( | ||||
|     "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, | ||||
|     "name" varchar(63) NOT NULL, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV