This is an automated email from the ASF dual-hosted git repository.

zihaoxiang pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new 200d23fc3e [TEST] increase coverage of datasource service (#15801)
200d23fc3e is described below

commit 200d23fc3ebc67058fb49167b41b95c1eb62be8d
Author: Evan Sun <[email protected]>
AuthorDate: Sun Apr 7 09:58:28 2024 +0800

    [TEST] increase coverage of datasource service (#15801)
    
    Co-authored-by: abzymeinsjtu <[email protected]>
---
 .../api/service/impl/DataSourceServiceImpl.java    |   6 +-
 .../api/service/DataSourceServiceTest.java         | 144 +++++++++++++++++----
 .../dao/mapper/DataSourceMapper.java               |   3 +-
 3 files changed, 121 insertions(+), 32 deletions(-)

diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataSourceServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataSourceServiceImpl.java
index a030762457..210900e54c 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataSourceServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataSourceServiceImpl.java
@@ -230,7 +230,7 @@ public class DataSourceServiceImpl extends BaseServiceImpl 
implements DataSource
     @Override
     public PageInfo<DataSource> queryDataSourceListPaging(User loginUser, 
String searchVal, Integer pageNo,
                                                           Integer pageSize) {
-        IPage<DataSource> dataSourceList = null;
+        IPage<DataSource> dataSourceList;
         Page<DataSource> dataSourcePage = new Page<>(pageNo, pageSize);
         PageInfo<DataSource> pageInfo = new PageInfo<>(pageNo, pageSize);
         if (loginUser.getUserType().equals(UserType.ADMIN_USER)) {
@@ -282,7 +282,7 @@ public class DataSourceServiceImpl extends BaseServiceImpl 
implements DataSource
     @Override
     public List<DataSource> queryDataSourceList(User loginUser, Integer type) {
 
-        List<DataSource> datasourceList = null;
+        List<DataSource> datasourceList;
         if (loginUser.getUserType().equals(UserType.ADMIN_USER)) {
             datasourceList = dataSourceMapper.queryDataSourceByType(0, type);
         } else {
@@ -420,7 +420,7 @@ public class DataSourceServiceImpl extends BaseServiceImpl 
implements DataSource
     public List<ParamsOptions> getTables(Integer datasourceId, String 
database) {
         DataSource dataSource = dataSourceMapper.selectById(datasourceId);
 
-        List<String> tableList = null;
+        List<String> tableList;
         BaseConnectionParam connectionParam =
                 (BaseConnectionParam) DataSourceUtils.buildConnectionParams(
                         dataSource.getType(),
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java
index 68d4db0ff2..b4e7aae4b8 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java
@@ -52,15 +52,15 @@ import org.apache.dolphinscheduler.spi.enums.DbType;
 
 import org.apache.commons.collections4.CollectionUtils;
 
+import java.nio.charset.StandardCharsets;
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
+import java.util.Random;
 import java.util.concurrent.ExecutionException;
 
 import org.junit.jupiter.api.Assertions;
@@ -73,6 +73,9 @@ import org.mockito.Mockito;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.dao.DuplicateKeyException;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
 
 /**
  * data source service test
@@ -96,6 +99,15 @@ public class DataSourceServiceTest {
     @Mock
     private ResourcePermissionCheckService resourcePermissionCheckService;
 
+    @Mock
+    private IPage<DataSource> dataSourceList;
+
+    private String randomStringWithLengthN(int n) {
+        byte[] bitArray = new byte[n];
+        new Random().nextBytes(bitArray);
+        return new String(bitArray, StandardCharsets.UTF_8);
+    }
+
     private void passResourcePermissionCheckService() {
         
when(resourcePermissionCheckService.operationPermissionCheck(Mockito.any(), 
Mockito.anyInt(),
                 Mockito.anyString(), Mockito.any())).thenReturn(true);
@@ -131,6 +143,7 @@ public class DataSourceServiceTest {
         
when(dataSourceMapper.queryDataSourceByName(dataSourceName.trim())).thenReturn(dataSourceList);
         passResourcePermissionCheckService();
 
+        // DATASOURCE_EXIST
         assertThrowsServiceException(Status.DATASOURCE_EXIST,
                 () -> dataSourceService.createDataSource(loginUser, 
postgreSqlDatasourceParam));
 
@@ -140,13 +153,24 @@ public class DataSourceServiceTest {
 
             
when(dataSourceMapper.queryDataSourceByName(dataSourceName.trim())).thenReturn(null);
 
+            // DESCRIPTION TOO LONG
+            postgreSqlDatasourceParam.setNote(randomStringWithLengthN(512));
+            assertThrowsServiceException(Status.DESCRIPTION_TOO_LONG_ERROR,
+                    () -> dataSourceService.createDataSource(loginUser, 
postgreSqlDatasourceParam));
+            postgreSqlDatasourceParam.setNote(dataSourceDesc);
+
             // SUCCESS
             assertDoesNotThrow(() -> 
dataSourceService.createDataSource(loginUser, postgreSqlDatasourceParam));
+
+            // Duplicated Key Exception
+            
when(dataSourceMapper.insert(Mockito.any(DataSource.class))).thenThrow(DuplicateKeyException.class);
+            assertThrowsServiceException(Status.DATASOURCE_EXIST,
+                    () -> dataSourceService.createDataSource(loginUser, 
postgreSqlDatasourceParam));
         }
     }
 
     @Test
-    public void updateDataSourceTest() throws ExecutionException {
+    public void updateDataSourceTest() {
         User loginUser = getAdminUser();
 
         int dataSourceId = 12;
@@ -200,32 +224,74 @@ public class DataSourceServiceTest {
             // DATASOURCE_CONNECT_FAILED
             
when(dataSourceMapper.queryDataSourceByName(postgreSqlDatasourceParam.getName())).thenReturn(null);
 
+            // DESCRIPTION TOO LONG
+            postgreSqlDatasourceParam.setNote(randomStringWithLengthN(512));
+            assertThrowsServiceException(Status.DESCRIPTION_TOO_LONG_ERROR,
+                    () -> dataSourceService.updateDataSource(loginUser, 
postgreSqlDatasourceParam));
+            postgreSqlDatasourceParam.setNote(dataSourceDesc);
+
             // SUCCESS
             assertDoesNotThrow(() -> 
dataSourceService.updateDataSource(loginUser, postgreSqlDatasourceParam));
+
+            // Duplicated Key Exception
+            
when(dataSourceMapper.updateById(Mockito.any(DataSource.class))).thenThrow(DuplicateKeyException.class);
+            assertThrowsServiceException(Status.DATASOURCE_EXIST,
+                    () -> dataSourceService.updateDataSource(loginUser, 
postgreSqlDatasourceParam));
         }
     }
 
     @Test
-    public void queryDataSourceListPagingTest() {
-        User loginUser = getAdminUser();
+    public void testQueryDataSourceListPaging() {
+
+        User adminUser = getAdminUser();
+        User generalUser = getGeneralUser();
         String searchVal = "";
         int pageNo = 1;
         int pageSize = 10;
 
         PageInfo<DataSource> pageInfo =
-                dataSourceService.queryDataSourceListPaging(loginUser, 
searchVal, pageNo, pageSize);
+                dataSourceService.queryDataSourceListPaging(adminUser, 
searchVal, pageNo, pageSize);
         Assertions.assertNotNull(pageInfo);
+
+        // test query datasource as general user with no datasource authed
+        
when(dataSourceList.getRecords()).thenReturn(getSingleDataSourceList());
+        when(dataSourceMapper.selectPagingByIds(Mockito.any(), Mockito.any(), 
Mockito.any()))
+                .thenReturn(dataSourceList);
+        assertDoesNotThrow(() -> 
dataSourceService.queryDataSourceListPaging(generalUser, searchVal, pageNo, 
pageSize));
+
+        // test query datasource as general user with datasource authed
+        
when(resourcePermissionCheckService.userOwnedResourceIdsAcquisition(AuthorizationType.DATASOURCE,
+                generalUser.getId(), 
dataSourceServiceLogger)).thenReturn(Collections.singleton(1));
+
+        assertDoesNotThrow(() -> 
dataSourceService.queryDataSourceListPaging(generalUser, searchVal, pageNo, 
pageSize));
     }
 
     @Test
-    public void connectionTest() {
+    public void testConnectionTest() {
         int dataSourceId = -1;
         when(dataSourceMapper.selectById(dataSourceId)).thenReturn(null);
         assertThrowsServiceException(Status.RESOURCE_NOT_EXIST, () -> 
dataSourceService.connectionTest(dataSourceId));
+
+        try (
+                MockedStatic<DataSourceUtils> ignored =
+                        Mockito.mockStatic(DataSourceUtils.class)) {
+            DataSource dataSource = getOracleDataSource(999);
+            
when(dataSourceMapper.selectById(dataSource.getId())).thenReturn(dataSource);
+            DataSourceProcessor dataSourceProcessor = 
Mockito.mock(DataSourceProcessor.class);
+
+            
when(DataSourceUtils.getDatasourceProcessor(Mockito.any())).thenReturn(dataSourceProcessor);
+            
when(dataSourceProcessor.checkDataSourceConnectivity(Mockito.any())).thenReturn(true);
+            assertDoesNotThrow(() -> 
dataSourceService.connectionTest(dataSource.getId()));
+
+            
when(dataSourceProcessor.checkDataSourceConnectivity(Mockito.any())).thenReturn(false);
+            assertThrowsServiceException(Status.CONNECTION_TEST_FAILURE,
+                    () -> 
dataSourceService.connectionTest(dataSource.getId()));
+        }
+
     }
 
     @Test
-    public void deleteTest() {
+    public void testDelete() {
         User loginUser = getAdminUser();
         int dataSourceId = 1;
         // resource not exist
@@ -252,7 +318,7 @@ public class DataSourceServiceTest {
     }
 
     @Test
-    public void unauthDatasourceTest() {
+    public void testUnAuthDatasource() {
         User loginUser = getAdminUser();
         loginUser.setId(1);
         loginUser.setUserType(UserType.ADMIN_USER);
@@ -279,7 +345,7 @@ public class DataSourceServiceTest {
     }
 
     @Test
-    public void authedDatasourceTest() {
+    public void testAuthedDatasource() {
         User loginUser = getAdminUser();
         loginUser.setId(1);
         loginUser.setUserType(UserType.ADMIN_USER);
@@ -300,19 +366,28 @@ public class DataSourceServiceTest {
     }
 
     @Test
-    public void queryDataSourceListTest() {
-        User loginUser = new User();
-        loginUser.setUserType(UserType.GENERAL_USER);
-        Set<Integer> dataSourceIds = new HashSet<>();
-        dataSourceIds.add(1);
+    public void testQueryDataSourceList() {
+        User adminUser = getAdminUser();
+        assertDoesNotThrow(() -> 
dataSourceService.queryDataSourceList(adminUser, DbType.MYSQL.ordinal()));
+
+        User generalUser = getGeneralUser();
+
         
when(resourcePermissionCheckService.userOwnedResourceIdsAcquisition(AuthorizationType.DATASOURCE,
-                loginUser.getId(), 
dataSourceServiceLogger)).thenReturn(dataSourceIds);
+                generalUser.getId(), 
dataSourceServiceLogger)).thenReturn(Collections.emptySet());
+        List<DataSource> emptyList = 
dataSourceService.queryDataSourceList(generalUser, DbType.MYSQL.ordinal());
+        Assertions.assertEquals(emptyList.size(), 0);
+
+        
when(resourcePermissionCheckService.userOwnedResourceIdsAcquisition(AuthorizationType.DATASOURCE,
+                generalUser.getId(), 
dataSourceServiceLogger)).thenReturn(Collections.singleton(1));
 
         DataSource dataSource = new DataSource();
+        dataSource.setId(1);
         dataSource.setType(DbType.MYSQL);
-        
when(dataSourceMapper.selectBatchIds(dataSourceIds)).thenReturn(Collections.singletonList(dataSource));
+        when(dataSourceMapper.selectBatchIds(Collections.singleton(1)))
+                .thenReturn(Collections.singletonList(dataSource));
+
         List<DataSource> list =
-                dataSourceService.queryDataSourceList(loginUser, 
DbType.MYSQL.ordinal());
+                dataSourceService.queryDataSourceList(generalUser, 
DbType.MYSQL.ordinal());
         Assertions.assertNotNull(list);
     }
 
@@ -327,21 +402,28 @@ public class DataSourceServiceTest {
     }
 
     @Test
-    public void queryDataSourceTest() {
-        when(dataSourceMapper.selectById(Mockito.anyInt())).thenReturn(null);
+    public void testQueryDataSource() {
+        // datasource not exists
+        when(dataSourceMapper.selectById(999)).thenReturn(null);
         User loginUser = new User();
         loginUser.setUserType(UserType.GENERAL_USER);
         loginUser.setId(2);
-        try {
-            dataSourceService.queryDataSource(Mockito.anyInt(), loginUser);
-        } catch (Exception e) {
-            
Assertions.assertTrue(e.getMessage().contains(Status.RESOURCE_NOT_EXIST.getMsg()));
-        }
+
+        assertThrowsServiceException(Status.RESOURCE_NOT_EXIST,
+                () -> dataSourceService.queryDataSource(999, loginUser));
 
         DataSource dataSource = getOracleDataSource(1);
-        
when(dataSourceMapper.selectById(Mockito.anyInt())).thenReturn(dataSource);
+        
when(dataSourceMapper.selectById(dataSource.getId())).thenReturn(dataSource);
         
when(resourcePermissionCheckService.operationPermissionCheck(AuthorizationType.DATASOURCE,
                 loginUser.getId(), DATASOURCE, 
baseServiceLogger)).thenReturn(true);
+
+        // no perm
+        
when(resourcePermissionCheckService.resourcePermissionCheck(AuthorizationType.DATASOURCE,
+                new Object[]{dataSource.getId()}, loginUser.getId(), 
baseServiceLogger)).thenReturn(false);
+        assertThrowsServiceException(Status.USER_NO_OPERATION_PERM,
+                () -> dataSourceService.queryDataSource(dataSource.getId(), 
loginUser));
+
+        // success
         
when(resourcePermissionCheckService.resourcePermissionCheck(AuthorizationType.DATASOURCE,
                 new Object[]{dataSource.getId()}, loginUser.getId(), 
baseServiceLogger)).thenReturn(true);
         BaseDataSourceParamDTO paramDTO = 
dataSourceService.queryDataSource(dataSource.getId(), loginUser);
@@ -472,8 +554,16 @@ public class DataSourceServiceTest {
      */
     private User getAdminUser() {
         User loginUser = new User();
-        loginUser.setId(-1);
+        loginUser.setId(1);
         loginUser.setUserName("admin");
+        loginUser.setUserType(UserType.ADMIN_USER);
+        return loginUser;
+    }
+
+    private User getGeneralUser() {
+        User loginUser = new User();
+        loginUser.setId(2);
+        loginUser.setUserName("user");
         loginUser.setUserType(UserType.GENERAL_USER);
         return loginUser;
     }
diff --git 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/DataSourceMapper.java
 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/DataSourceMapper.java
index b5dcc31627..e26fe77ae4 100644
--- 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/DataSourceMapper.java
+++ 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/DataSourceMapper.java
@@ -102,8 +102,7 @@ public interface DataSourceMapper extends 
BaseMapper<DataSource> {
     /**
      * selectPagingByIds
      * @param dataSourcePage
-     * @param ids
-     * @param searchVal
+     * @param dataSourceIds
      * @return
      */
     IPage<DataSource> selectPagingByIds(Page<DataSource> dataSourcePage,

Reply via email to