From 6eeac9efdb16f92d19536bf23a2d1471705fe752 Mon Sep 17 00:00:00 2001 From: dongyukun <1208714201@qq.com> Date: 星期二, 31 十二月 2024 18:34:38 +0800 Subject: [PATCH] 调度模型下发 --- iailab-module-system/iailab-module-system-biz/src/test/java/com/iailab/module/system/controller/admin/oauth2/OAuth2OpenControllerTest.java | 674 ++++++++++++++++++++++++++++---------------------------- 1 files changed, 337 insertions(+), 337 deletions(-) diff --git a/iailab-module-system/iailab-module-system-biz/src/test/java/com/iailab/module/system/controller/admin/oauth2/OAuth2OpenControllerTest.java b/iailab-module-system/iailab-module-system-biz/src/test/java/com/iailab/module/system/controller/admin/oauth2/OAuth2OpenControllerTest.java index 7ad391b..fe2faaa 100644 --- a/iailab-module-system/iailab-module-system-biz/src/test/java/com/iailab/module/system/controller/admin/oauth2/OAuth2OpenControllerTest.java +++ b/iailab-module-system/iailab-module-system-biz/src/test/java/com/iailab/module/system/controller/admin/oauth2/OAuth2OpenControllerTest.java @@ -1,337 +1,337 @@ -package com.iailab.module.system.controller.admin.oauth2; - -import cn.hutool.core.collection.ListUtil; -import cn.hutool.core.date.LocalDateTimeUtil; -import cn.hutool.core.map.MapUtil; -import com.iailab.framework.common.core.KeyValue; -import com.iailab.framework.common.enums.UserTypeEnum; -import com.iailab.framework.common.exception.ErrorCode; -import com.iailab.framework.common.pojo.CommonResult; -import com.iailab.framework.common.util.collection.SetUtils; -import com.iailab.framework.common.util.object.ObjectUtils; -import com.iailab.framework.test.core.ut.BaseMockitoUnitTest; -import com.iailab.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAccessTokenRespVO; -import com.iailab.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAuthorizeInfoRespVO; -import com.iailab.module.system.controller.admin.oauth2.vo.open.OAuth2OpenCheckTokenRespVO; -import com.iailab.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; -import com.iailab.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; -import com.iailab.module.system.dal.dataobject.oauth2.OAuth2ClientDO; -import com.iailab.module.system.enums.oauth2.OAuth2GrantTypeEnum; -import com.iailab.module.system.service.oauth2.OAuth2ApproveService; -import com.iailab.module.system.service.oauth2.OAuth2ClientService; -import com.iailab.module.system.service.oauth2.OAuth2GrantService; -import com.iailab.module.system.service.oauth2.OAuth2TokenService; -import org.assertj.core.util.Lists; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import javax.servlet.http.HttpServletRequest; -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; - -import static com.iailab.framework.common.util.collection.SetUtils.asSet; -import static com.iailab.framework.test.core.util.AssertUtils.assertPojoEquals; -import static com.iailab.framework.test.core.util.AssertUtils.assertServiceException; -import static com.iailab.framework.test.core.util.RandomUtils.randomPojo; -import static com.iailab.framework.test.core.util.RandomUtils.randomString; -import static java.util.Arrays.asList; -import static org.hamcrest.CoreMatchers.anyOf; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.isNull; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * {@link OAuth2OpenController} 的单元测试 - * - * @author iailab - */ -public class OAuth2OpenControllerTest extends BaseMockitoUnitTest { - - @InjectMocks - private OAuth2OpenController oauth2OpenController; - - @Mock - private OAuth2GrantService oauth2GrantService; - @Mock - private OAuth2ClientService oauth2ClientService; - @Mock - private OAuth2ApproveService oauth2ApproveService; - @Mock - private OAuth2TokenService oauth2TokenService; - - @Test - public void testPostAccessToken_authorizationCode() { - // 准备参数 - String granType = OAuth2GrantTypeEnum.AUTHORIZATION_CODE.getGrantType(); - String code = randomString(); - String redirectUri = randomString(); - String state = randomString(); - HttpServletRequest request = mockRequest("test_client_id", "test_client_secret"); - // mock 方法(client) - OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("test_client_id"); - when(oauth2ClientService.validOAuthClientFromCache(eq("test_client_id"), eq("test_client_secret"), eq(granType), eq(new ArrayList<>()), eq(redirectUri))).thenReturn(client); - - // mock 方法(访问令牌) - OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) - .setExpiresTime(LocalDateTimeUtil.offset(LocalDateTime.now(), 30000L, ChronoUnit.MILLIS)); - when(oauth2GrantService.grantAuthorizationCodeForAccessToken(eq("test_client_id"), - eq(code), eq(redirectUri), eq(state))).thenReturn(accessTokenDO); - - // 调用 - CommonResult<OAuth2OpenAccessTokenRespVO> result = oauth2OpenController.postAccessToken(request, granType, - code, redirectUri, state, null, null, null, null); - // 断言 - assertEquals(0, result.getCode()); - assertPojoEquals(accessTokenDO, result.getData()); - assertTrue(ObjectUtils.equalsAny(result.getData().getExpiresIn(), 29L, 30L)); // 执行过程会过去几毫秒 - } - - @Test - public void testPostAccessToken_password() { - // 准备参数 - String granType = OAuth2GrantTypeEnum.PASSWORD.getGrantType(); - String username = randomString(); - String password = randomString(); - String scope = "write read"; - HttpServletRequest request = mockRequest("test_client_id", "test_client_secret"); - // mock 方法(client) - OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("test_client_id"); - when(oauth2ClientService.validOAuthClientFromCache(eq("test_client_id"), eq("test_client_secret"), - eq(granType), eq(Lists.newArrayList("write", "read")), isNull())).thenReturn(client); - - // mock 方法(访问令牌) - OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) - .setExpiresTime(LocalDateTimeUtil.offset(LocalDateTime.now(), 30000L, ChronoUnit.MILLIS)); - when(oauth2GrantService.grantPassword(eq(username), eq(password), eq("test_client_id"), - eq(Lists.newArrayList("write", "read")))).thenReturn(accessTokenDO); - - // 调用 - CommonResult<OAuth2OpenAccessTokenRespVO> result = oauth2OpenController.postAccessToken(request, granType, - null, null, null, username, password, scope, null); - // 断言 - assertEquals(0, result.getCode()); - assertPojoEquals(accessTokenDO, result.getData()); - assertTrue(ObjectUtils.equalsAny(result.getData().getExpiresIn(), 29L, 30L)); // 执行过程会过去几毫秒 - } - - @Test - public void testPostAccessToken_refreshToken() { - // 准备参数 - String granType = OAuth2GrantTypeEnum.REFRESH_TOKEN.getGrantType(); - String refreshToken = randomString(); - String password = randomString(); - HttpServletRequest request = mockRequest("test_client_id", "test_client_secret"); - // mock 方法(client) - OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("test_client_id"); - when(oauth2ClientService.validOAuthClientFromCache(eq("test_client_id"), eq("test_client_secret"), - eq(granType), eq(Lists.newArrayList()), isNull())).thenReturn(client); - - // mock 方法(访问令牌) - OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) - .setExpiresTime(LocalDateTimeUtil.offset(LocalDateTime.now(), 30000L, ChronoUnit.MILLIS)); - when(oauth2GrantService.grantRefreshToken(eq(refreshToken), eq("test_client_id"))).thenReturn(accessTokenDO); - - // 调用 - CommonResult<OAuth2OpenAccessTokenRespVO> result = oauth2OpenController.postAccessToken(request, granType, - null, null, null, null, password, null, refreshToken); - // 断言 - assertEquals(0, result.getCode()); - assertPojoEquals(accessTokenDO, result.getData()); - assertTrue(ObjectUtils.equalsAny(result.getData().getExpiresIn(), 29L, 30L)); // 执行过程会过去几毫秒 - } - - @Test - public void testPostAccessToken_implicit() { - // 调用,并断言 - assertServiceException(() -> oauth2OpenController.postAccessToken(null, - OAuth2GrantTypeEnum.IMPLICIT.getGrantType(), null, null, null, - null, null, null, null), - new ErrorCode(400, "Token 接口不支持 implicit 授权模式")); - } - - @Test - public void testRevokeToken() { - // 准备参数 - HttpServletRequest request = mockRequest("demo_client_id", "demo_client_secret"); - String token = randomString(); - // mock 方法(client) - OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("demo_client_id"); - when(oauth2ClientService.validOAuthClientFromCache(eq("demo_client_id"), - eq("demo_client_secret"), isNull(), isNull(), isNull())).thenReturn(client); - // mock 方法(移除) - when(oauth2GrantService.revokeToken(eq("demo_client_id"), eq(token))).thenReturn(true); - - // 调用 - CommonResult<Boolean> result = oauth2OpenController.revokeToken(request, token); - // 断言 - assertEquals(0, result.getCode()); - assertTrue(result.getData()); - } - - @Test - public void testCheckToken() { - // 准备参数 - HttpServletRequest request = mockRequest("demo_client_id", "demo_client_secret"); - String token = randomString(); - // mock 方法 - OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class).setUserType(UserTypeEnum.ADMIN.getValue()).setExpiresTime(LocalDateTimeUtil.of(1653485731195L)); - when(oauth2TokenService.checkAccessToken(eq(token))).thenReturn(accessTokenDO); - - // 调用 - CommonResult<OAuth2OpenCheckTokenRespVO> result = oauth2OpenController.checkToken(request, token); - // 断言 - assertEquals(0, result.getCode()); - assertPojoEquals(accessTokenDO, result.getData()); - assertEquals(1653485731L, result.getData().getExp()); // 执行过程会过去几毫秒 - } - - @Test - public void testAuthorize() { - // 准备参数 - String clientId = randomString(); - // mock 方法(client) - OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("demo_client_id").setScopes(ListUtil.toList("read", "write", "all")); - when(oauth2ClientService.validOAuthClientFromCache(eq(clientId))).thenReturn(client); - // mock 方法(approve) - List<OAuth2ApproveDO> approves = asList( - randomPojo(OAuth2ApproveDO.class).setScope("read").setApproved(true), - randomPojo(OAuth2ApproveDO.class).setScope("write").setApproved(false)); - when(oauth2ApproveService.getApproveList(isNull(), eq(UserTypeEnum.ADMIN.getValue()), eq(clientId))).thenReturn(approves); - - // 调用 - CommonResult<OAuth2OpenAuthorizeInfoRespVO> result = oauth2OpenController.authorize(clientId); - // 断言 - assertEquals(0, result.getCode()); - assertPojoEquals(client, result.getData().getClient()); - assertEquals(new KeyValue<>("read", true), result.getData().getScopes().get(0)); - assertEquals(new KeyValue<>("write", false), result.getData().getScopes().get(1)); - assertEquals(new KeyValue<>("all", false), result.getData().getScopes().get(2)); - } - - @Test - public void testApproveOrDeny_grantTypeError() { - // 调用,并断言 - assertServiceException(() -> oauth2OpenController.approveOrDeny(randomString(), null, - null, null, null, null), - new ErrorCode(400, "response_type 参数值只允许 code 和 token")); - } - - @Test // autoApprove = true,但是不通过 - public void testApproveOrDeny_autoApproveNo() { - // 准备参数 - String responseType = "code"; - String clientId = randomString(); - String scope = "{\"read\": true, \"write\": false}"; - String redirectUri = randomString(); - String state = randomString(); - // mock 方法 - OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class); - when(oauth2ClientService.validOAuthClientFromCache(eq(clientId), isNull(), eq("authorization_code"), - eq(asSet("read", "write")), eq(redirectUri))).thenReturn(client); - - // 调用 - CommonResult<String> result = oauth2OpenController.approveOrDeny(responseType, clientId, - scope, redirectUri, true, state); - // 断言 - assertEquals(0, result.getCode()); - assertNull(result.getData()); - } - - @Test // autoApprove = false,但是不通过 - public void testApproveOrDeny_ApproveNo() { - // 准备参数 - String responseType = "token"; - String clientId = randomString(); - String scope = "{\"read\": true, \"write\": false}"; - String redirectUri = "https://www.baidu.com"; - String state = "test"; - // mock 方法 - OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class); - when(oauth2ClientService.validOAuthClientFromCache(eq(clientId), isNull(), eq("implicit"), - eq(asSet("read", "write")), eq(redirectUri))).thenReturn(client); - - // 调用 - CommonResult<String> result = oauth2OpenController.approveOrDeny(responseType, clientId, - scope, redirectUri, false, state); - // 断言 - assertEquals(0, result.getCode()); - assertEquals("https://www.baidu.com#error=access_denied&error_description=User%20denied%20access&state=test", result.getData()); - } - - @Test // autoApprove = true,通过 + token - public void testApproveOrDeny_autoApproveWithToken() { - // 准备参数 - String responseType = "token"; - String clientId = randomString(); - String scope = "{\"read\": true, \"write\": false}"; - String redirectUri = "https://www.baidu.com"; - String state = "test"; - // mock 方法(client) - OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId(clientId).setAdditionalInformation(null); - when(oauth2ClientService.validOAuthClientFromCache(eq(clientId), isNull(), eq("implicit"), - eq(asSet("read", "write")), eq(redirectUri))).thenReturn(client); - // mock 方法(场景一) - when(oauth2ApproveService.checkForPreApproval(isNull(), eq(UserTypeEnum.ADMIN.getValue()), - eq(clientId), eq(SetUtils.asSet("read", "write")))).thenReturn(true); - // mock 方法(访问令牌) - OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) - .setAccessToken("test_access_token").setExpiresTime(LocalDateTimeUtil.offset(LocalDateTime.now(), 30010L, ChronoUnit.MILLIS)); - when(oauth2GrantService.grantImplicit(isNull(), eq(UserTypeEnum.ADMIN.getValue()), - eq(clientId), eq(ListUtil.toList("read")))).thenReturn(accessTokenDO); - - // 调用 - CommonResult<String> result = oauth2OpenController.approveOrDeny(responseType, clientId, - scope, redirectUri, true, state); - // 断言 - assertEquals(0, result.getCode()); - assertThat(result.getData(), anyOf( // 29 和 30 都有一定概率,主要是时间计算 - is("https://www.baidu.com#access_token=test_access_token&token_type=bearer&state=test&expires_in=29&scope=read"), - is("https://www.baidu.com#access_token=test_access_token&token_type=bearer&state=test&expires_in=30&scope=read") - )); - } - - @Test // autoApprove = false,通过 + code - public void testApproveOrDeny_approveWithCode() { - // 准备参数 - String responseType = "code"; - String clientId = randomString(); - String scope = "{\"read\": true, \"write\": false}"; - String redirectUri = "https://www.baidu.com"; - String state = "test"; - // mock 方法(client) - OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId(clientId).setAdditionalInformation(null); - when(oauth2ClientService.validOAuthClientFromCache(eq(clientId), isNull(), eq("authorization_code"), - eq(asSet("read", "write")), eq(redirectUri))).thenReturn(client); - // mock 方法(场景二) - when(oauth2ApproveService.updateAfterApproval(isNull(), eq(UserTypeEnum.ADMIN.getValue()), eq(clientId), - eq(MapUtil.builder(new LinkedHashMap<String, Boolean>()).put("read", true).put("write", false).build()))) - .thenReturn(true); - // mock 方法(访问令牌) - String authorizationCode = "test_code"; - when(oauth2GrantService.grantAuthorizationCodeForCode(isNull(), eq(UserTypeEnum.ADMIN.getValue()), - eq(clientId), eq(ListUtil.toList("read")), eq(redirectUri), eq(state))).thenReturn(authorizationCode); - - // 调用 - CommonResult<String> result = oauth2OpenController.approveOrDeny(responseType, clientId, - scope, redirectUri, false, state); - // 断言 - assertEquals(0, result.getCode()); - assertEquals("https://www.baidu.com?code=test_code&state=test", result.getData()); - } - - private HttpServletRequest mockRequest(String clientId, String secret) { - HttpServletRequest request = mock(HttpServletRequest.class); - when(request.getParameter(eq("client_id"))).thenReturn(clientId); - when(request.getParameter(eq("client_secret"))).thenReturn(secret); - return request; - } - -} +//package com.iailab.module.system.controller.admin.oauth2; +// +//import cn.hutool.core.collection.ListUtil; +//import cn.hutool.core.date.LocalDateTimeUtil; +//import cn.hutool.core.map.MapUtil; +//import com.iailab.framework.common.core.KeyValue; +//import com.iailab.framework.common.enums.UserTypeEnum; +//import com.iailab.framework.common.exception.ErrorCode; +//import com.iailab.framework.common.pojo.CommonResult; +//import com.iailab.framework.common.util.collection.SetUtils; +//import com.iailab.framework.common.util.object.ObjectUtils; +//import com.iailab.framework.test.core.ut.BaseMockitoUnitTest; +//import com.iailab.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAccessTokenRespVO; +//import com.iailab.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAuthorizeInfoRespVO; +//import com.iailab.module.system.controller.admin.oauth2.vo.open.OAuth2OpenCheckTokenRespVO; +//import com.iailab.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +//import com.iailab.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; +//import com.iailab.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +//import com.iailab.module.system.enums.oauth2.OAuth2GrantTypeEnum; +//import com.iailab.module.system.service.oauth2.OAuth2ApproveService; +//import com.iailab.module.system.service.oauth2.OAuth2ClientService; +//import com.iailab.module.system.service.oauth2.OAuth2GrantService; +//import com.iailab.module.system.service.oauth2.OAuth2TokenService; +//import org.assertj.core.util.Lists; +//import org.junit.jupiter.api.Test; +//import org.mockito.InjectMocks; +//import org.mockito.Mock; +// +//import javax.servlet.http.HttpServletRequest; +//import java.time.LocalDateTime; +//import java.time.temporal.ChronoUnit; +//import java.util.ArrayList; +//import java.util.LinkedHashMap; +//import java.util.List; +// +//import static com.iailab.framework.common.util.collection.SetUtils.asSet; +//import static com.iailab.framework.test.core.util.AssertUtils.assertPojoEquals; +//import static com.iailab.framework.test.core.util.AssertUtils.assertServiceException; +//import static com.iailab.framework.test.core.util.RandomUtils.randomPojo; +//import static com.iailab.framework.test.core.util.RandomUtils.randomString; +//import static java.util.Arrays.asList; +//import static org.hamcrest.CoreMatchers.anyOf; +//import static org.hamcrest.CoreMatchers.is; +//import static org.hamcrest.MatcherAssert.assertThat; +//import static org.junit.jupiter.api.Assertions.*; +//import static org.mockito.ArgumentMatchers.eq; +//import static org.mockito.ArgumentMatchers.isNull; +//import static org.mockito.Mockito.mock; +//import static org.mockito.Mockito.when; +// +///** +// * {@link OAuth2OpenController} 的单元测试 +// * +// * @author iailab +// */ +//public class OAuth2OpenControllerTest extends BaseMockitoUnitTest { +// +// @InjectMocks +// private OAuth2OpenController oauth2OpenController; +// +// @Mock +// private OAuth2GrantService oauth2GrantService; +// @Mock +// private OAuth2ClientService oauth2ClientService; +// @Mock +// private OAuth2ApproveService oauth2ApproveService; +// @Mock +// private OAuth2TokenService oauth2TokenService; +// +// @Test +// public void testPostAccessToken_authorizationCode() { +// // 准备参数 +// String granType = OAuth2GrantTypeEnum.AUTHORIZATION_CODE.getGrantType(); +// String code = randomString(); +// String redirectUri = randomString(); +// String state = randomString(); +// HttpServletRequest request = mockRequest("test_client_id", "test_client_secret"); +// // mock 方法(client) +// OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("test_client_id"); +// when(oauth2ClientService.validOAuthClientFromCache(eq("test_client_id"), eq("test_client_secret"), eq(granType), eq(new ArrayList<>()), eq(redirectUri))).thenReturn(client); +// +// // mock 方法(访问令牌) +// OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) +// .setExpiresTime(LocalDateTimeUtil.offset(LocalDateTime.now(), 30000L, ChronoUnit.MILLIS)); +// when(oauth2GrantService.grantAuthorizationCodeForAccessToken(eq("test_client_id"), +// eq(code), eq(redirectUri), eq(state))).thenReturn(accessTokenDO); +// +// // 调用 +// CommonResult<OAuth2OpenAccessTokenRespVO> result = oauth2OpenController.postAccessToken(request, granType, +// code, redirectUri, state, null, null, null, null); +// // 断言 +// assertEquals(0, result.getCode()); +// assertPojoEquals(accessTokenDO, result.getData()); +// assertTrue(ObjectUtils.equalsAny(result.getData().getExpiresIn(), 29L, 30L)); // 执行过程会过去几毫秒 +// } +// +// @Test +// public void testPostAccessToken_password() { +// // 准备参数 +// String granType = OAuth2GrantTypeEnum.PASSWORD.getGrantType(); +// String username = randomString(); +// String password = randomString(); +// String scope = "write read"; +// HttpServletRequest request = mockRequest("test_client_id", "test_client_secret"); +// // mock 方法(client) +// OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("test_client_id"); +// when(oauth2ClientService.validOAuthClientFromCache(eq("test_client_id"), eq("test_client_secret"), +// eq(granType), eq(Lists.newArrayList("write", "read")), isNull())).thenReturn(client); +// +// // mock 方法(访问令牌) +// OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) +// .setExpiresTime(LocalDateTimeUtil.offset(LocalDateTime.now(), 30000L, ChronoUnit.MILLIS)); +// when(oauth2GrantService.grantPassword(eq(username), eq(password), eq("test_client_id"), +// eq(Lists.newArrayList("write", "read")))).thenReturn(accessTokenDO); +// +// // 调用 +// CommonResult<OAuth2OpenAccessTokenRespVO> result = oauth2OpenController.postAccessToken(request, granType, +// null, null, null, username, password, scope, null); +// // 断言 +// assertEquals(0, result.getCode()); +// assertPojoEquals(accessTokenDO, result.getData()); +// assertTrue(ObjectUtils.equalsAny(result.getData().getExpiresIn(), 29L, 30L)); // 执行过程会过去几毫秒 +// } +// +// @Test +// public void testPostAccessToken_refreshToken() { +// // 准备参数 +// String granType = OAuth2GrantTypeEnum.REFRESH_TOKEN.getGrantType(); +// String refreshToken = randomString(); +// String password = randomString(); +// HttpServletRequest request = mockRequest("test_client_id", "test_client_secret"); +// // mock 方法(client) +// OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("test_client_id"); +// when(oauth2ClientService.validOAuthClientFromCache(eq("test_client_id"), eq("test_client_secret"), +// eq(granType), eq(Lists.newArrayList()), isNull())).thenReturn(client); +// +// // mock 方法(访问令牌) +// OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) +// .setExpiresTime(LocalDateTimeUtil.offset(LocalDateTime.now(), 30000L, ChronoUnit.MILLIS)); +// when(oauth2GrantService.grantRefreshToken(eq(refreshToken), eq("test_client_id"))).thenReturn(accessTokenDO); +// +// // 调用 +// CommonResult<OAuth2OpenAccessTokenRespVO> result = oauth2OpenController.postAccessToken(request, granType, +// null, null, null, null, password, null, refreshToken); +// // 断言 +// assertEquals(0, result.getCode()); +// assertPojoEquals(accessTokenDO, result.getData()); +// assertTrue(ObjectUtils.equalsAny(result.getData().getExpiresIn(), 29L, 30L)); // 执行过程会过去几毫秒 +// } +// +// @Test +// public void testPostAccessToken_implicit() { +// // 调用,并断言 +// assertServiceException(() -> oauth2OpenController.postAccessToken(null, +// OAuth2GrantTypeEnum.IMPLICIT.getGrantType(), null, null, null, +// null, null, null, null), +// new ErrorCode(400, "Token 接口不支持 implicit 授权模式")); +// } +// +// @Test +// public void testRevokeToken() { +// // 准备参数 +// HttpServletRequest request = mockRequest("demo_client_id", "demo_client_secret"); +// String token = randomString(); +// // mock 方法(client) +// OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("demo_client_id"); +// when(oauth2ClientService.validOAuthClientFromCache(eq("demo_client_id"), +// eq("demo_client_secret"), isNull(), isNull(), isNull())).thenReturn(client); +// // mock 方法(移除) +// when(oauth2GrantService.revokeToken(eq("demo_client_id"), eq(token))).thenReturn(true); +// +// // 调用 +// CommonResult<Boolean> result = oauth2OpenController.revokeToken(request, token); +// // 断言 +// assertEquals(0, result.getCode()); +// assertTrue(result.getData()); +// } +// +// @Test +// public void testCheckToken() { +// // 准备参数 +// HttpServletRequest request = mockRequest("demo_client_id", "demo_client_secret"); +// String token = randomString(); +// // mock 方法 +// OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class).setUserType(UserTypeEnum.ADMIN.getValue()).setExpiresTime(LocalDateTimeUtil.of(1653485731195L)); +// when(oauth2TokenService.checkAccessToken(eq(token))).thenReturn(accessTokenDO); +// +// // 调用 +// CommonResult<OAuth2OpenCheckTokenRespVO> result = oauth2OpenController.checkToken(request, token); +// // 断言 +// assertEquals(0, result.getCode()); +// assertPojoEquals(accessTokenDO, result.getData()); +// assertEquals(1653485731L, result.getData().getExp()); // 执行过程会过去几毫秒 +// } +// +// @Test +// public void testAuthorize() { +// // 准备参数 +// String clientId = randomString(); +// // mock 方法(client) +// OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("demo_client_id").setScopes(ListUtil.toList("read", "write", "all")); +// when(oauth2ClientService.validOAuthClientFromCache(eq(clientId))).thenReturn(client); +// // mock 方法(approve) +// List<OAuth2ApproveDO> approves = asList( +// randomPojo(OAuth2ApproveDO.class).setScope("read").setApproved(true), +// randomPojo(OAuth2ApproveDO.class).setScope("write").setApproved(false)); +// when(oauth2ApproveService.getApproveList(isNull(), eq(UserTypeEnum.ADMIN.getValue()), eq(clientId))).thenReturn(approves); +// +// // 调用 +// CommonResult<OAuth2OpenAuthorizeInfoRespVO> result = oauth2OpenController.authorize(clientId); +// // 断言 +// assertEquals(0, result.getCode()); +// assertPojoEquals(client, result.getData().getClient()); +// assertEquals(new KeyValue<>("read", true), result.getData().getScopes().get(0)); +// assertEquals(new KeyValue<>("write", false), result.getData().getScopes().get(1)); +// assertEquals(new KeyValue<>("all", false), result.getData().getScopes().get(2)); +// } +// +// @Test +// public void testApproveOrDeny_grantTypeError() { +// // 调用,并断言 +// assertServiceException(() -> oauth2OpenController.approveOrDeny(randomString(), null, +// null, null, null, null), +// new ErrorCode(400, "response_type 参数值只允许 code 和 token")); +// } +// +// @Test // autoApprove = true,但是不通过 +// public void testApproveOrDeny_autoApproveNo() { +// // 准备参数 +// String responseType = "code"; +// String clientId = randomString(); +// String scope = "{\"read\": true, \"write\": false}"; +// String redirectUri = randomString(); +// String state = randomString(); +// // mock 方法 +// OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class); +// when(oauth2ClientService.validOAuthClientFromCache(eq(clientId), isNull(), eq("authorization_code"), +// eq(asSet("read", "write")), eq(redirectUri))).thenReturn(client); +// +// // 调用 +// CommonResult<String> result = oauth2OpenController.approveOrDeny(responseType, clientId, +// scope, redirectUri, true, state); +// // 断言 +// assertEquals(0, result.getCode()); +// assertNull(result.getData()); +// } +// +// @Test // autoApprove = false,但是不通过 +// public void testApproveOrDeny_ApproveNo() { +// // 准备参数 +// String responseType = "token"; +// String clientId = randomString(); +// String scope = "{\"read\": true, \"write\": false}"; +// String redirectUri = "https://www.baidu.com"; +// String state = "test"; +// // mock 方法 +// OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class); +// when(oauth2ClientService.validOAuthClientFromCache(eq(clientId), isNull(), eq("implicit"), +// eq(asSet("read", "write")), eq(redirectUri))).thenReturn(client); +// +// // 调用 +// CommonResult<String> result = oauth2OpenController.approveOrDeny(responseType, clientId, +// scope, redirectUri, false, state); +// // 断言 +// assertEquals(0, result.getCode()); +// assertEquals("https://www.baidu.com#error=access_denied&error_description=User%20denied%20access&state=test", result.getData()); +// } +// +// @Test // autoApprove = true,通过 + token +// public void testApproveOrDeny_autoApproveWithToken() { +// // 准备参数 +// String responseType = "token"; +// String clientId = randomString(); +// String scope = "{\"read\": true, \"write\": false}"; +// String redirectUri = "https://www.baidu.com"; +// String state = "test"; +// // mock 方法(client) +// OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId(clientId).setAdditionalInformation(null); +// when(oauth2ClientService.validOAuthClientFromCache(eq(clientId), isNull(), eq("implicit"), +// eq(asSet("read", "write")), eq(redirectUri))).thenReturn(client); +// // mock 方法(场景一) +// when(oauth2ApproveService.checkForPreApproval(isNull(), eq(UserTypeEnum.ADMIN.getValue()), +// eq(clientId), eq(SetUtils.asSet("read", "write")))).thenReturn(true); +// // mock 方法(访问令牌) +// OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) +// .setAccessToken("test_access_token").setExpiresTime(LocalDateTimeUtil.offset(LocalDateTime.now(), 30010L, ChronoUnit.MILLIS)); +// when(oauth2GrantService.grantImplicit(isNull(), eq(UserTypeEnum.ADMIN.getValue()), +// eq(clientId), eq(ListUtil.toList("read")))).thenReturn(accessTokenDO); +// +// // 调用 +// CommonResult<String> result = oauth2OpenController.approveOrDeny(responseType, clientId, +// scope, redirectUri, true, state); +// // 断言 +// assertEquals(0, result.getCode()); +// assertThat(result.getData(), anyOf( // 29 和 30 都有一定概率,主要是时间计算 +// is("https://www.baidu.com#access_token=test_access_token&token_type=bearer&state=test&expires_in=29&scope=read"), +// is("https://www.baidu.com#access_token=test_access_token&token_type=bearer&state=test&expires_in=30&scope=read") +// )); +// } +// +// @Test // autoApprove = false,通过 + code +// public void testApproveOrDeny_approveWithCode() { +// // 准备参数 +// String responseType = "code"; +// String clientId = randomString(); +// String scope = "{\"read\": true, \"write\": false}"; +// String redirectUri = "https://www.baidu.com"; +// String state = "test"; +// // mock 方法(client) +// OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId(clientId).setAdditionalInformation(null); +// when(oauth2ClientService.validOAuthClientFromCache(eq(clientId), isNull(), eq("authorization_code"), +// eq(asSet("read", "write")), eq(redirectUri))).thenReturn(client); +// // mock 方法(场景二) +// when(oauth2ApproveService.updateAfterApproval(isNull(), eq(UserTypeEnum.ADMIN.getValue()), eq(clientId), +// eq(MapUtil.builder(new LinkedHashMap<String, Boolean>()).put("read", true).put("write", false).build()))) +// .thenReturn(true); +// // mock 方法(访问令牌) +// String authorizationCode = "test_code"; +// when(oauth2GrantService.grantAuthorizationCodeForCode(isNull(), eq(UserTypeEnum.ADMIN.getValue()), +// eq(clientId), eq(ListUtil.toList("read")), eq(redirectUri), eq(state))).thenReturn(authorizationCode); +// +// // 调用 +// CommonResult<String> result = oauth2OpenController.approveOrDeny(responseType, clientId, +// scope, redirectUri, false, state); +// // 断言 +// assertEquals(0, result.getCode()); +// assertEquals("https://www.baidu.com?code=test_code&state=test", result.getData()); +// } +// +// private HttpServletRequest mockRequest(String clientId, String secret) { +// HttpServletRequest request = mock(HttpServletRequest.class); +// when(request.getParameter(eq("client_id"))).thenReturn(clientId); +// when(request.getParameter(eq("client_secret"))).thenReturn(secret); +// return request; +// } +// +//} -- Gitblit v1.9.3