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