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 a6c888630d9 Add more test cases on SingleSQLRouterTest (#38087)
a6c888630d9 is described below

commit a6c888630d98d157b3a7eb346e4dbd77aac9dacb
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Feb 18 21:26:34 2026 +0800

    Add more test cases on SingleSQLRouterTest (#38087)
---
 .../single/route/SingleSQLRouterTest.java          | 255 ++++++++++++++-------
 1 file changed, 169 insertions(+), 86 deletions(-)

diff --git 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java
index ae6afc54d23..b4d26bcfb83 100644
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java
+++ 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java
@@ -19,6 +19,8 @@ package org.apache.shardingsphere.single.route;
 
 import org.apache.groovy.util.Maps;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import 
org.apache.shardingsphere.infra.binder.context.segment.table.TablesContext;
+import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.type.CommonSQLStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.datanode.DataNode;
@@ -30,12 +32,15 @@ import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaDa
 import 
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedTable;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.route.SQLRouter;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.infra.route.context.RouteMapper;
 import org.apache.shardingsphere.infra.route.context.RouteUnit;
+import org.apache.shardingsphere.infra.route.engine.SQLRouteEngine;
 import 
org.apache.shardingsphere.infra.rule.attribute.datanode.DataNodeRuleAttribute;
+import 
org.apache.shardingsphere.infra.rule.attribute.table.TableMapperRuleAttribute;
 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
@@ -45,6 +50,7 @@ import org.apache.shardingsphere.single.rule.SingleRule;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.CreateTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.apache.shardingsphere.test.infra.fixture.jdbc.MockedDataSource;
@@ -53,164 +59,241 @@ import org.junit.jupiter.api.Test;
 import javax.sql.DataSource;
 import java.sql.Connection;
 import java.sql.SQLException;
-import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Properties;
 
-import static org.hamcrest.Matchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.hamcrest.Matchers.is;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 class SingleSQLRouterTest {
     
     private final DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
     
+    private final SingleSQLRouter singleSQLRouter = 
OrderedSPILoader.getServices(SQLRouter.class).stream()
+            .filter(SingleSQLRouter.class::isInstance)
+            .map(SingleSQLRouter.class::cast)
+            .findFirst()
+            .orElseThrow(() -> new IllegalStateException("SingleSQLRouter SPI 
service is unavailable."));
+    
     @Test
     void assertCreateRouteContextWithSingleDataSource() throws SQLException {
-        SingleRule rule = new SingleRule(new SingleRuleConfiguration(), 
"foo_db", databaseType, Collections.singletonMap("foo_ds", new 
MockedDataSource(mockConnection())), Collections.emptyList());
-        
rule.getAttributes().getAttribute(DataNodeRuleAttribute.class).getAllDataNodes().put("t_order",
 Collections.singleton(new DataNode("foo_ds", "foo_db", "t_order")));
-        ShardingSphereDatabase database = mockSingleDatabase();
-        RouteContext actual = new SingleSQLRouter().createRouteContext(
-                createQueryContext(), mock(RuleMetaData.class), database, 
rule, Collections.singletonList("t_order"), new ConfigurationProperties(new 
Properties()));
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        
when(database.getResourceMetaData().getStorageUnits()).thenReturn(Collections.singletonMap("foo_ds",
 mock()));
+        SingleRule rule = createSingleRule();
+        RouteContext actual = 
singleSQLRouter.createRouteContext(createQueryContext(), mock(), database, 
rule, Collections.singletonList("foo_tbl"), new ConfigurationProperties(new 
Properties()));
         assertThat(actual.getRouteUnits().size(), is(1));
         RouteUnit routeUnit = actual.getRouteUnits().iterator().next();
         assertThat(routeUnit.getDataSourceMapper().getLogicName(), 
is("foo_ds"));
         assertThat(routeUnit.getDataSourceMapper().getActualName(), 
is("foo_ds"));
-        assertFalse(routeUnit.getTableMappers().isEmpty());
-    }
-    
-    private ShardingSphereDatabase mockSingleDatabase() {
-        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        
when(result.getResourceMetaData().getStorageUnits()).thenReturn(Collections.singletonMap("foo_ds",
 mock(StorageUnit.class)));
-        return result;
+        assertThat(routeUnit.getTableMappers().size(), is(1));
+        RouteMapper tableMapper = 
routeUnit.getTableMappers().iterator().next();
+        assertThat(tableMapper.getLogicName(), is("foo_tbl"));
+        assertThat(tableMapper.getActualName(), is("foo_tbl"));
     }
     
     @Test
     void assertCreateRouteContextWithReadwriteSplittingDataSource() throws 
SQLException {
-        SingleRule rule = new SingleRule(new SingleRuleConfiguration(),
-                "foo_db", databaseType, 
Collections.singletonMap("readwrite_ds", new 
MockedDataSource(mockConnection())), Collections.emptyList());
-        
rule.getAttributes().getAttribute(DataNodeRuleAttribute.class).getAllDataNodes().put("t_order",
 Collections.singletonList(new DataNode("write_ds", "foo_db", "t_order")));
         ShardingSphereDatabase database = mockReadwriteSplittingDatabase();
-        RouteContext actual = new SingleSQLRouter().createRouteContext(
-                createQueryContext(), mock(RuleMetaData.class), database, 
rule, Collections.singletonList("t_order"), new ConfigurationProperties(new 
Properties()));
+        SingleRule rule = createReadwriteSplittingRule();
+        RouteContext actual = 
singleSQLRouter.createRouteContext(createQueryContext(), mock(), database, 
rule, Collections.singletonList("foo_tbl"), new ConfigurationProperties(new 
Properties()));
         assertThat(actual.getRouteUnits().size(), is(1));
         RouteUnit routeUnit = actual.getRouteUnits().iterator().next();
         assertThat(routeUnit.getDataSourceMapper().getLogicName(), 
is("readwrite_ds"));
         assertThat(routeUnit.getDataSourceMapper().getActualName(), 
is("write_ds"));
-        assertFalse(routeUnit.getTableMappers().isEmpty());
-    }
-    
-    private ShardingSphereDatabase mockReadwriteSplittingDatabase() {
-        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        when(result.getName()).thenReturn(" db_schema");
-        
when(result.getResourceMetaData().getStorageUnits()).thenReturn(Collections.singletonMap("write_ds",
 mock(StorageUnit.class)));
-        return result;
+        assertThat(routeUnit.getTableMappers().size(), is(1));
+        RouteMapper tableMapper = 
routeUnit.getTableMappers().iterator().next();
+        assertThat(tableMapper.getLogicName(), is("foo_tbl"));
+        assertThat(tableMapper.getActualName(), is("foo_tbl"));
     }
     
     @Test
     void assertCreateRouteContextWithMultiDataSource() throws SQLException {
-        SingleRule rule = new SingleRule(new SingleRuleConfiguration(), 
"foo_db", databaseType, createMultiDataSourceMap(), Collections.emptyList());
         ShardingSphereDatabase database = mockDatabaseWithMultipleResources();
-        RouteContext actual = new SingleSQLRouter().createRouteContext(
-                createQueryContext(), mock(RuleMetaData.class), database, 
rule, Collections.singletonList("t_order"), new ConfigurationProperties(new 
Properties()));
-        List<RouteUnit> routeUnits = new ArrayList<>(actual.getRouteUnits());
+        SingleRule rule = new SingleRule(new SingleRuleConfiguration(), 
"foo_db", databaseType, createMultiDataSourceMap(), Collections.emptyList());
+        RouteContext actual = 
singleSQLRouter.createRouteContext(createQueryContext(), mock(), database, 
rule, Collections.singletonList("foo_tbl"), new ConfigurationProperties(new 
Properties()));
         assertThat(actual.getRouteUnits().size(), is(1));
-        assertThat(routeUnits.get(0).getDataSourceMapper().getLogicName(), 
is(routeUnits.get(0).getDataSourceMapper().getActualName()));
-        assertThat(routeUnits.get(0).getTableMappers().size(), is(1));
-        RouteMapper tableMapper = 
routeUnits.get(0).getTableMappers().iterator().next();
-        assertThat(tableMapper.getActualName(), is("t_order"));
-        assertThat(tableMapper.getLogicName(), is("t_order"));
+        RouteUnit routeUnit = actual.getRouteUnits().iterator().next();
+        assertThat(routeUnit.getDataSourceMapper().getLogicName(), 
is(routeUnit.getDataSourceMapper().getActualName()));
+        assertTrue(Arrays.asList("ds_0", 
"ds_1").contains(routeUnit.getDataSourceMapper().getActualName()));
+        assertThat(routeUnit.getTableMappers().size(), is(1));
+        RouteMapper tableMapper = 
routeUnit.getTableMappers().iterator().next();
+        assertThat(tableMapper.getLogicName(), is("foo_tbl"));
+        assertThat(tableMapper.getActualName(), is("foo_tbl"));
     }
     
-    private Map<String, DataSource> createMultiDataSourceMap() throws 
SQLException {
-        Map<String, DataSource> result = new HashMap<>(2, 1F);
-        Connection connection = mockConnection();
-        result.put("ds_0", new MockedDataSource(connection));
-        result.put("ds_1", new MockedDataSource(connection));
-        return result;
+    @Test
+    void assertCreateRouteContextWithDistributedTable() {
+        QueryContext queryContext = mockQueryContext(new 
CreateTableStatement(databaseType));
+        ShardingSphereDatabase database = 
mockDatabaseWithDistributedTables(Collections.singleton("foo_tbl"));
+        SingleRule rule = mock(SingleRule.class);
+        when(rule.getQualifiedTables(queryContext.getSqlStatementContext(), 
database)).thenReturn(Collections.singletonList(new QualifiedTable("foo_db", 
"foo_tbl")));
+        RouteContext actual = singleSQLRouter.createRouteContext(queryContext, 
mock(), database, rule, Collections.singletonList("foo_tbl"), new 
ConfigurationProperties(new Properties()));
+        assertTrue(actual.getRouteUnits().isEmpty());
     }
     
-    private Connection mockConnection() throws SQLException {
-        Connection result = mock(Connection.class, RETURNS_DEEP_STUBS);
-        
when(result.getMetaData().getURL()).thenReturn("jdbc:mock://127.0.0.1/db");
-        return result;
+    @Test
+    void assertRouteBySQLRouteEngine() throws SQLException {
+        SingleRule rule = createSingleRule();
+        SQLRouteEngine sqlRouteEngine = new 
SQLRouteEngine(Collections.singleton(rule), new ConfigurationProperties(new 
Properties()));
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        
when(database.getResourceMetaData().getStorageUnits()).thenReturn(Collections.singletonMap("foo_ds",
 mock()));
+        RouteContext actual = sqlRouteEngine.route(createQueryContext(), 
mock(), database);
+        assertThat(actual.getRouteUnits().size(), is(1));
     }
     
-    private ShardingSphereDatabase mockDatabaseWithMultipleResources() {
-        Map<String, StorageUnit> storageUnits = new HashMap<>(2, 1F);
-        DataSourcePoolProperties dataSourcePoolProps0 = 
mock(DataSourcePoolProperties.class, RETURNS_DEEP_STUBS);
-        
when(dataSourcePoolProps0.getConnectionPropertySynonyms().getStandardProperties()).thenReturn(Maps.of("url",
 "jdbc:mock://127.0.0.1/ds_0", "username", "test"));
-        storageUnits.put("ds_0", new StorageUnit(mock(StorageNode.class), 
dataSourcePoolProps0, new MockedDataSource()));
-        DataSourcePoolProperties dataSourcePoolProps1 = 
mock(DataSourcePoolProperties.class, RETURNS_DEEP_STUBS);
-        
when(dataSourcePoolProps1.getConnectionPropertySynonyms().getStandardProperties()).thenReturn(Maps.of("url",
 "jdbc:mock://127.0.0.1/ds_1", "username", "test"));
-        storageUnits.put("ds_1", new StorageUnit(mock(StorageNode.class), 
dataSourcePoolProps1, new MockedDataSource()));
-        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        
when(result.getResourceMetaData().getStorageUnits()).thenReturn(storageUnits);
-        when(result.getName()).thenReturn("foo_db");
-        ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
-        when(schema.containsTable("t_order")).thenReturn(true);
-        when(result.getSchema(any())).thenReturn(schema);
-        return result;
+    @Test
+    void assertCreateRouteContextWithNonCreateStatement() {
+        QueryContext queryContext = mockQueryContext(new 
SQLStatement(databaseType));
+        SQLStatementContext sqlStatementContext = 
queryContext.getSqlStatementContext();
+        ShardingSphereDatabase database = 
mockDatabaseWithDistributedTables(Collections.emptyList());
+        QualifiedTable qualifiedTable = new QualifiedTable("foo_db", 
"foo_tbl");
+        SingleRule rule = mock(SingleRule.class);
+        when(rule.getQualifiedTables(sqlStatementContext, 
database)).thenReturn(Collections.singletonList(qualifiedTable));
+        
when(rule.getSingleTables(Collections.singletonList(qualifiedTable))).thenReturn(Collections.emptyList());
+        RouteContext actual = singleSQLRouter.createRouteContext(queryContext, 
mock(), database, rule, Collections.singletonList("foo_tbl"), new 
ConfigurationProperties(new Properties()));
+        assertTrue(actual.getRouteUnits().isEmpty());
+        
verify(rule).getSingleTables(Collections.singletonList(qualifiedTable));
     }
     
     @Test
     void assertDecorateRouteContextWithSingleDataSource() {
-        SingleRule rule = new SingleRule(new SingleRuleConfiguration(),
-                "foo_db", databaseType, Collections.singletonMap("foo_ds", new 
MockedDataSource()), Collections.emptyList());
         RouteContext routeContext = new RouteContext();
-        routeContext.getRouteUnits().add(new RouteUnit(new 
RouteMapper("foo_ds", "foo_ds"), Collections.singletonList(new 
RouteMapper("t_order", "t_order"))));
-        SingleSQLRouter sqlRouter = (SingleSQLRouter) 
OrderedSPILoader.getServices(SQLRouter.class, 
Collections.singleton(rule)).get(rule);
-        sqlRouter.decorateRouteContext(
-                routeContext, createQueryContext(), 
mockReadwriteSplittingDatabase(), rule, Collections.singletonList("t_order"), 
new ConfigurationProperties(new Properties()));
-        Iterator<String> routedDataSourceNames = 
routeContext.getActualDataSourceNames().iterator();
-        assertThat(routedDataSourceNames.next(), is("foo_ds"));
+        routeContext.getRouteUnits().add(new RouteUnit(new 
RouteMapper("foo_ds", "foo_ds"), Collections.singletonList(new 
RouteMapper("foo_tbl", "foo_tbl"))));
+        ShardingSphereDatabase database = mockReadwriteSplittingDatabase();
+        SingleRule rule = new SingleRule(new SingleRuleConfiguration(), 
"foo_db", databaseType, Collections.singletonMap("foo_ds", new 
MockedDataSource()), Collections.emptyList());
+        singleSQLRouter.decorateRouteContext(routeContext, 
createQueryContext(), database, rule, Collections.singletonList("foo_tbl"), new 
ConfigurationProperties(new Properties()));
+        assertThat(routeContext.getActualDataSourceNames().size(), is(1));
+        assertThat(routeContext.getActualDataSourceNames().iterator().next(), 
is("foo_ds"));
     }
     
     @Test
     void assertDecorateRouteContextWithReadwriteSplittingDataSource() {
+        RouteContext routeContext = new RouteContext();
+        routeContext.getRouteUnits().add(new RouteUnit(new 
RouteMapper("readwrite_ds", "readwrite_ds"), Collections.emptyList()));
+        routeContext.getRouteUnits().add(new RouteUnit(new 
RouteMapper("write_ds", "write_ds"), Collections.singletonList(new 
RouteMapper("foo_tbl", "foo_tbl"))));
         SingleRule rule = new SingleRule(new SingleRuleConfiguration(),
                 "foo_db", databaseType, 
Collections.singletonMap("readwrite_ds", new MockedDataSource()), 
Collections.emptyList());
-        RouteContext routeContext = new RouteContext();
-        RouteUnit readWriteRouteUnit = new RouteUnit(new 
RouteMapper("readwrite_ds", "readwrite_ds"), Collections.emptyList());
-        RouteUnit writeRouteUnit = new RouteUnit(new RouteMapper("write_ds", 
"write_ds"), Collections.singletonList(new RouteMapper("t_order", "t_order")));
-        routeContext.getRouteUnits().add(readWriteRouteUnit);
-        routeContext.getRouteUnits().add(writeRouteUnit);
-        SingleSQLRouter sqlRouter = (SingleSQLRouter) 
OrderedSPILoader.getServices(SQLRouter.class, 
Collections.singleton(rule)).get(rule);
         ShardingSphereDatabase database = new ShardingSphereDatabase("foo_db",
                 mock(DatabaseType.class), mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS), new RuleMetaData(Collections.singleton(rule)), 
Collections.emptyList());
-        sqlRouter.decorateRouteContext(routeContext, createQueryContext(), 
database, rule, Collections.singletonList("t_order"), new 
ConfigurationProperties(new Properties()));
+        singleSQLRouter.decorateRouteContext(routeContext, 
createQueryContext(), database, rule, Collections.singletonList("foo_tbl"), new 
ConfigurationProperties(new Properties()));
         assertThat(routeContext.getActualDataSourceNames().size(), is(1));
         assertTrue(Arrays.asList("write_ds", 
"readwrite_ds").contains(routeContext.getActualDataSourceNames().iterator().next()));
     }
     
     @Test
     void assertDecorateRouteContextWithMultiDataSource() throws SQLException {
-        SingleRule rule = new SingleRule(new SingleRuleConfiguration(), 
"foo_db", databaseType, createMultiDataSourceMap(), Collections.emptyList());
         RouteContext routeContext = new RouteContext();
         routeContext.getRouteUnits().add(new RouteUnit(new RouteMapper("ds_0", 
"ds_0"), Collections.emptyList()));
         routeContext.getRouteUnits().add(new RouteUnit(new RouteMapper("ds_1", 
"ds_1"), Collections.emptyList()));
-        SingleSQLRouter sqlRouter = (SingleSQLRouter) 
OrderedSPILoader.getServices(SQLRouter.class, 
Collections.singleton(rule)).get(rule);
-        sqlRouter.decorateRouteContext(routeContext, createQueryContext(), 
mockDatabaseWithMultipleResources(), rule, Collections.singletonList("t_order"),
-                new ConfigurationProperties(new Properties()));
+        ShardingSphereDatabase database = mockDatabaseWithMultipleResources();
+        SingleRule rule = new SingleRule(new SingleRuleConfiguration(), 
"foo_db", databaseType, createMultiDataSourceMap(), Collections.emptyList());
+        singleSQLRouter.decorateRouteContext(routeContext, 
createQueryContext(), database, rule, Collections.singletonList("foo_tbl"), new 
ConfigurationProperties(new Properties()));
         assertThat(routeContext.getActualDataSourceNames().size(), is(1));
         assertTrue(Arrays.asList("ds_0", 
"ds_1").contains(routeContext.getActualDataSourceNames().iterator().next()));
     }
     
+    @Test
+    void assertDecorateRouteContextWithDistributedTable() {
+        QueryContext queryContext = mockQueryContext(new 
CreateTableStatement(databaseType));
+        ShardingSphereDatabase database = 
mockDatabaseWithDistributedTables(Collections.singleton("foo_tbl"));
+        SingleRule rule = mock(SingleRule.class);
+        SQLStatementContext sqlStatementContext = 
queryContext.getSqlStatementContext();
+        when(rule.getQualifiedTables(sqlStatementContext, 
database)).thenReturn(Collections.singletonList(new QualifiedTable("foo_db", 
"foo_tbl")));
+        RouteContext routeContext = new RouteContext();
+        routeContext.getRouteUnits().add(new RouteUnit(new 
RouteMapper("foo_ds", "foo_ds"), Collections.singletonList(new 
RouteMapper("foo_tbl", "foo_tbl"))));
+        singleSQLRouter.decorateRouteContext(routeContext, queryContext, 
database, rule, Collections.singletonList("foo_tbl"), new 
ConfigurationProperties(new Properties()));
+        assertThat(routeContext.getActualDataSourceNames().size(), is(1));
+        assertThat(routeContext.getActualDataSourceNames().iterator().next(), 
is("foo_ds"));
+    }
+    
+    private SingleRule createSingleRule() throws SQLException {
+        Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS);
+        
when(connection.getMetaData().getURL()).thenReturn("jdbc:mock://127.0.0.1/db");
+        SingleRule result = new SingleRule(new SingleRuleConfiguration(),
+                "foo_db", databaseType, Collections.singletonMap("foo_ds", new 
MockedDataSource(connection)), Collections.emptyList());
+        
result.getAttributes().getAttribute(DataNodeRuleAttribute.class).getAllDataNodes().put("foo_tbl",
 Collections.singleton(new DataNode("foo_ds", "foo_db", "foo_tbl")));
+        return result;
+    }
+    
+    private SingleRule createReadwriteSplittingRule() throws SQLException {
+        Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS);
+        
when(connection.getMetaData().getURL()).thenReturn("jdbc:mock://127.0.0.1/db");
+        SingleRule result = new SingleRule(new SingleRuleConfiguration(),
+                "foo_db", databaseType, 
Collections.singletonMap("readwrite_ds", new MockedDataSource(connection)), 
Collections.emptyList());
+        
result.getAttributes().getAttribute(DataNodeRuleAttribute.class).getAllDataNodes().put("foo_tbl",
 Collections.singletonList(new DataNode("write_ds", "foo_db", "foo_tbl")));
+        return result;
+    }
+    
+    private ShardingSphereDatabase mockReadwriteSplittingDatabase() {
+        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        when(result.getName()).thenReturn(" db_schema");
+        
when(result.getResourceMetaData().getStorageUnits()).thenReturn(Collections.singletonMap("write_ds",
 mock(StorageUnit.class)));
+        return result;
+    }
+    
+    private Map<String, DataSource> createMultiDataSourceMap() throws 
SQLException {
+        Map<String, DataSource> result = new HashMap<>(2, 1F);
+        Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS);
+        
when(connection.getMetaData().getURL()).thenReturn("jdbc:mock://127.0.0.1/db");
+        result.put("ds_0", new MockedDataSource(connection));
+        result.put("ds_1", new MockedDataSource(connection));
+        return result;
+    }
+    
+    private ShardingSphereDatabase mockDatabaseWithMultipleResources() {
+        Map<String, StorageUnit> storageUnits = new HashMap<>(2, 1F);
+        DataSourcePoolProperties dataSourcePoolProps0 = 
mock(DataSourcePoolProperties.class, RETURNS_DEEP_STUBS);
+        
when(dataSourcePoolProps0.getConnectionPropertySynonyms().getStandardProperties()).thenReturn(Maps.of("url",
 "jdbc:mock://127.0.0.1/ds_0", "username", "test"));
+        storageUnits.put("ds_0", new StorageUnit(mock(StorageNode.class), 
dataSourcePoolProps0, new MockedDataSource()));
+        DataSourcePoolProperties dataSourcePoolProps1 = 
mock(DataSourcePoolProperties.class, RETURNS_DEEP_STUBS);
+        
when(dataSourcePoolProps1.getConnectionPropertySynonyms().getStandardProperties()).thenReturn(Maps.of("url",
 "jdbc:mock://127.0.0.1/ds_1", "username", "test"));
+        storageUnits.put("ds_1", new StorageUnit(mock(StorageNode.class), 
dataSourcePoolProps1, new MockedDataSource()));
+        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        
when(result.getResourceMetaData().getStorageUnits()).thenReturn(storageUnits);
+        when(result.getName()).thenReturn("foo_db");
+        ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
+        when(schema.containsTable("foo_tbl")).thenReturn(true);
+        when(result.getSchema(any())).thenReturn(schema);
+        return result;
+    }
+    
+    private ShardingSphereDatabase mockDatabaseWithDistributedTables(final 
Collection<String> distributedTableNames) {
+        Map<String, StorageUnit> storageUnits = new HashMap<>(2, 1F);
+        storageUnits.put("ds_0", mock(StorageUnit.class));
+        storageUnits.put("ds_1", mock(StorageUnit.class));
+        TableMapperRuleAttribute tableMapperRuleAttribute = 
mock(TableMapperRuleAttribute.class);
+        
when(tableMapperRuleAttribute.getDistributedTableNames()).thenReturn(distributedTableNames);
+        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
+        
when(result.getResourceMetaData().getStorageUnits()).thenReturn(storageUnits);
+        
when(result.getRuleMetaData().getAttributes(TableMapperRuleAttribute.class)).thenReturn(Collections.singletonList(tableMapperRuleAttribute));
+        return result;
+    }
+    
+    private QueryContext mockQueryContext(final SQLStatement sqlStatement) {
+        SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class);
+        TablesContext tablesContext = mock(TablesContext.class);
+        
when(tablesContext.getTableNames()).thenReturn(Collections.singleton("foo_tbl"));
+        when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
+        when(sqlStatementContext.getTablesContext()).thenReturn(tablesContext);
+        QueryContext result = mock(QueryContext.class);
+        when(result.getSqlStatementContext()).thenReturn(sqlStatementContext);
+        return result;
+    }
+    
     private QueryContext createQueryContext() {
         CreateTableStatement createTableStatement = new 
CreateTableStatement(databaseType);
-        TableNameSegment tableNameSegment = new TableNameSegment(1, 2, new 
IdentifierValue("t_order"));
+        TableNameSegment tableNameSegment = new TableNameSegment(1, 2, new 
IdentifierValue("foo_tbl"));
         tableNameSegment.setTableBoundInfo(new TableSegmentBoundInfo(new 
IdentifierValue("foo_db"), new IdentifierValue("foo_schema")));
         createTableStatement.setTable(new 
SimpleTableSegment(tableNameSegment));
         createTableStatement.buildAttributes();
@@ -219,6 +302,6 @@ class SingleSQLRouterTest {
         ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
         when(metaData.containsDatabase("foo_db")).thenReturn(true);
         
when(metaData.getDatabase("foo_db")).thenReturn(mock(ShardingSphereDatabase.class));
-        return new QueryContext(new 
CommonSQLStatementContext(createTableStatement), "CREATE TABLE", new 
LinkedList<>(), new HintValueContext(), connectionContext, metaData);
+        return new QueryContext(new 
CommonSQLStatementContext(createTableStatement), "CREATE TABLE", 
Collections.emptyList(), new HintValueContext(), connectionContext, metaData);
     }
 }

Reply via email to