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

zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 1fb76c905e3 Add more test cases on DatabaseMetaDataExecutorTest 
(#37496)
1fb76c905e3 is described below

commit 1fb76c905e307c73f8ae2e5a39f12c661bfe1167
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Dec 24 21:50:01 2025 +0800

    Add more test cases on DatabaseMetaDataExecutorTest (#37496)
    
    * Add more test cases on DatabaseMetaDataExecutorTest
    
    * Add more test cases on DatabaseMetaDataExecutorTest
---
 .../executor/DatabaseMetaDataExecutorTest.java     | 85 ++++++++++++++++++----
 1 file changed, 70 insertions(+), 15 deletions(-)

diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DatabaseMetaDataExecutorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DatabaseMetaDataExecutorTest.java
index d09bb89293e..7dccc3f71cc 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DatabaseMetaDataExecutorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/admin/executor/DatabaseMetaDataExecutorTest.java
@@ -20,7 +20,6 @@ package 
org.apache.shardingsphere.proxy.backend.handler.admin.executor;
 import 
org.apache.shardingsphere.authority.provider.database.DatabasePermittedPrivileges;
 import org.apache.shardingsphere.authority.rule.AuthorityRule;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
@@ -42,19 +41,26 @@ import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyMap;
+import static org.mockito.Mockito.CALLS_REAL_METHODS;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
 
 @ExtendWith(AutoMockExtension.class)
 @StaticMockSettings(SystemSchemaUtils.class)
@@ -79,9 +85,10 @@ class DatabaseMetaDataExecutorTest {
         expectedResultSetMap.put("sn", "foo_ds");
         expectedResultSetMap.put("DEFAULT_CHARACTER_SET_NAME", "utf8mb4");
         String sql = "SELECT SCHEMA_NAME AS sn, DEFAULT_CHARACTER_SET_NAME 
FROM information_schema.SCHEMATA";
-        ShardingSphereDatabase database = createDatabase(expectedResultSetMap);
+        ShardingSphereDatabase database = new 
ShardingSphereDatabase("auth_db", databaseType,
+                new ResourceMetaData(Collections.singletonMap("foo_ds", new 
MockedDataSource(mockConnection(expectedResultSetMap)))), mock(), 
Collections.emptyList());
         DatabaseMetaDataExecutor executor = new DatabaseMetaDataExecutor(sql, 
Collections.emptyList());
-        executor.execute(connectionSession, mockMetaData(database));
+        executor.execute(connectionSession, mockMetaData(database, 
Collections.singleton("auth_db")));
         assertThat(executor.getRows().get(0).get("sn"), is("foo_ds"));
         
assertThat(executor.getRows().get(0).get("DEFAULT_CHARACTER_SET_NAME"), 
is("utf8mb4"));
     }
@@ -89,9 +96,10 @@ class DatabaseMetaDataExecutorTest {
     @Test
     void assertExecuteWithDefaultValue() throws SQLException {
         String sql = "SELECT COUNT(*) AS support_ndb FROM 
information_schema.ENGINES WHERE Engine = 'ndbcluster'";
-        ShardingSphereDatabase database = 
createDatabase(Collections.singletonMap("support_ndb", "0"));
+        ShardingSphereDatabase database = new 
ShardingSphereDatabase("auth_db", databaseType,
+                new ResourceMetaData(Collections.singletonMap("foo_ds", new 
MockedDataSource(mockConnection(Collections.singletonMap("support_ndb", 
"0"))))), mock(), Collections.emptyList());
         DatabaseMetaDataExecutor executor = new DatabaseMetaDataExecutor(sql, 
Collections.emptyList());
-        executor.execute(connectionSession, mockMetaData(database));
+        executor.execute(connectionSession, mockMetaData(database, 
Collections.singleton("auth_db")));
         assertThat(executor.getQueryResultMetaData().getColumnCount(), is(1));
         while (executor.getMergedResult().next()) {
             assertThat(executor.getMergedResult().getValue(1, String.class), 
is("0"));
@@ -101,18 +109,65 @@ class DatabaseMetaDataExecutorTest {
     @Test
     void assertExecuteWithPreparedStatement() throws SQLException {
         String sql = "SELECT COUNT(*) AS support_ndb FROM 
information_schema.ENGINES WHERE Engine = ?";
-        ShardingSphereDatabase database = 
createDatabase(Collections.singletonMap("support_ndb", "0"));
+        ShardingSphereDatabase database = new 
ShardingSphereDatabase("auth_db", databaseType,
+                new ResourceMetaData(Collections.singletonMap("foo_ds", new 
MockedDataSource(mockConnection(Collections.singletonMap("support_ndb", 
"0"))))), mock(), Collections.emptyList());
         DatabaseMetaDataExecutor executor = new DatabaseMetaDataExecutor(sql, 
Collections.singletonList("ndbcluster"));
-        executor.execute(connectionSession, mockMetaData(database));
+        executor.execute(connectionSession, mockMetaData(database, 
Collections.singleton("auth_db")));
         assertThat(executor.getQueryResultMetaData().getColumnCount(), is(1));
         while (executor.getMergedResult().next()) {
             assertThat(executor.getMergedResult().getValue(1, String.class), 
is("0"));
         }
     }
     
-    private ShardingSphereDatabase createDatabase(final Map<String, String> 
expectedResultSetMap) throws SQLException {
-        return new ShardingSphereDatabase("auth_db",
-                databaseType, new 
ResourceMetaData(Collections.singletonMap("foo_ds", new 
MockedDataSource(mockConnection(expectedResultSetMap)))), 
mock(RuleMetaData.class), Collections.emptyList());
+    @Test
+    void assertGetDatabasesWithAuthorizedFromAllDatabases() {
+        when(connectionSession.getCurrentDatabaseName()).thenReturn("foo_db");
+        ShardingSphereDatabase database = new ShardingSphereDatabase(
+                "auth_db", databaseType, new 
ResourceMetaData(Collections.singletonMap("foo_ds", new MockedDataSource())), 
mock(), Collections.emptyList());
+        DatabaseMetaDataExecutor executor = new 
DatabaseMetaDataExecutor("SELECT 1", Collections.emptyList());
+        Collection<ShardingSphereDatabase> actual = 
executor.getDatabases(connectionSession, mockMetaData(database, 
Collections.singleton("auth_db")));
+        assertFalse(actual.isEmpty());
+        assertThat(actual.iterator().next(), is(database));
+    }
+    
+    @Test
+    void assertGetDatabasesReturnEmptyWhenUnauthorized() {
+        when(connectionSession.getCurrentDatabaseName()).thenReturn("foo_db");
+        ShardingSphereDatabase database = new ShardingSphereDatabase(
+                "auth_db", databaseType, new 
ResourceMetaData(Collections.singletonMap("foo_ds", new MockedDataSource())), 
mock(), Collections.emptyList());
+        DatabaseMetaDataExecutor executor = new 
DatabaseMetaDataExecutor("SELECT 1", Collections.emptyList());
+        assertTrue(executor.getDatabases(connectionSession, 
mockMetaData(database, Collections.emptySet())).isEmpty());
+    }
+    
+    @Test
+    void assertExecuteSkipLoadMetaDataWithoutStorageUnit() throws SQLException 
{
+        ShardingSphereDatabase database =
+                new ShardingSphereDatabase("empty_db", databaseType, new 
ResourceMetaData(Collections.emptyMap(), Collections.emptyMap()), 
mock(RuleMetaData.class), Collections.emptyList());
+        DatabaseMetaDataExecutor executor = 
mock(DatabaseMetaDataExecutor.class, withSettings().useConstructor("SELECT 1", 
Collections.emptyList()).defaultAnswer(CALLS_REAL_METHODS));
+        
doReturn(Collections.singleton(database)).when(executor).getDatabases(any(ConnectionSession.class),
 any(ShardingSphereMetaData.class));
+        assertThat(connectionSession.getCurrentDatabaseName(), is("auth_db"));
+        assertThat(connectionSession.getConnectionContext().getGrantee(), 
is(grantee));
+        executor.execute(connectionSession, new 
ShardingSphereMetaData(Collections.singleton(database), mock(), mock(), 
mock()));
+        assertTrue(executor.getRows().isEmpty());
+        assertThat(executor.getQueryResultMetaData().getColumnCount(), is(0));
+    }
+    
+    @Test
+    void assertExecuteFillLabelsWhenRowsFilteredOut() throws SQLException {
+        Map<String, String> expectedResultSetMap = 
Collections.singletonMap("foo_column", "foo_value");
+        ShardingSphereDatabase database = new ShardingSphereDatabase("auth_db",
+                databaseType, new 
ResourceMetaData(Collections.singletonMap("foo_ds", new 
MockedDataSource(mockConnection(expectedResultSetMap)))), mock(), 
Collections.emptyList());
+        DatabaseMetaDataExecutor executor = 
mock(DatabaseMetaDataExecutor.class, withSettings().useConstructor(
+                "SELECT foo_column FROM foo_table", 
Collections.emptyList()).defaultAnswer(CALLS_REAL_METHODS));
+        doAnswer(invocation -> {
+            Map<String, Object> rows = invocation.getArgument(1);
+            rows.clear();
+            return null;
+        }).when(executor).preProcess(any(ShardingSphereDatabase.class), 
anyMap(), anyMap());
+        executor.execute(connectionSession, mockMetaData(database, 
Collections.singleton("auth_db")));
+        assertTrue(executor.getRows().isEmpty());
+        assertThat(executor.getQueryResultMetaData().getColumnCount(), is(1));
+        assertFalse(executor.getMergedResult().next());
     }
     
     private Connection mockConnection(final Map<String, String> 
expectedResultSetMap) throws SQLException {
@@ -135,10 +190,10 @@ class DatabaseMetaDataExecutorTest {
         return result;
     }
     
-    private ShardingSphereMetaData mockMetaData(final ShardingSphereDatabase 
database) {
+    private ShardingSphereMetaData mockMetaData(final ShardingSphereDatabase 
database, final Collection<String> permittedDatabases) {
         AuthorityRule authorityRule = mock(AuthorityRule.class);
-        when(authorityRule.findPrivileges(grantee)).thenReturn(Optional.of(new 
DatabasePermittedPrivileges(Collections.singleton("auth_db"))));
-        return new ShardingSphereMetaData(
-                Collections.singleton(database), mock(ResourceMetaData.class), 
new RuleMetaData(Collections.singleton(authorityRule)), new 
ConfigurationProperties(new Properties()));
+        when(authorityRule.findUser(grantee)).thenReturn(Optional.empty());
+        when(authorityRule.findPrivileges(grantee)).thenReturn(Optional.of(new 
DatabasePermittedPrivileges(permittedDatabases)));
+        return new ShardingSphereMetaData(Collections.singleton(database), 
mock(), new RuleMetaData(Collections.singleton(authorityRule)), mock());
     }
 }

Reply via email to