This is an automated email from the ASF dual-hosted git repository.
terrymanu 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 9848b5b59a6 Refactor MCP tests to avoid concrete database type
fixtures (#39043)
9848b5b59a6 is described below
commit 9848b5b59a6b3ef45484335ac78aa83ce869b0ee
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Jul 8 02:29:37 2026 +0800
Refactor MCP tests to avoid concrete database type fixtures (#39043)
---
.../MCPCompletionSpecificationFactoryTest.java | 4 +-
.../core/completion/MCPCompletionServiceTest.java | 4 +-
.../provider/MetadataCompletionProviderTest.java | 4 +-
.../metadata/MetadataResourceHandlerTest.java | 6 +--
.../MCPJdbcTransactionStatementExecutorTest.java | 60 ++++++++--------------
.../execute/MCPJdbcStatementExecutorTest.java | 49 ++++++++++--------
.../MCPSQLExecutionFacadeConcurrencyTest.java | 41 ++++++---------
.../handler/BroadcastTableRuleHandlerTest.java | 2 +-
.../BroadcastWorkflowPlanningServiceTest.java | 2 +-
.../BroadcastWorkflowValidationServiceTest.java | 2 +-
...dwriteSplittingWorkflowPlanningServiceTest.java | 4 +-
...riteSplittingWorkflowValidationServiceTest.java | 6 +--
.../ShardingWorkflowValidationServiceTest.java | 4 +-
.../jdbc/MCPJdbcDatabaseProfileLoaderTest.java | 6 +--
.../jdbc/MCPJdbcMetadataLoaderFailureTest.java | 2 +-
.../metadata/model/MCPDatabaseMetadataTest.java | 10 ++--
.../metadata/query/DatabaseTestDataFactory.java | 6 +--
.../MCPDatabaseCapabilityResponseTest.java | 15 ++++--
.../RuntimeDatabaseValidationServiceTest.java | 4 +-
19 files changed, 111 insertions(+), 120 deletions(-)
diff --git
a/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/transport/capability/completion/MCPCompletionSpecificationFactoryTest.java
b/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/transport/capability/completion/MCPCompletionSpecificationFactoryTest.java
index 636a3b9f6f7..9e4d105dee5 100644
---
a/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/transport/capability/completion/MCPCompletionSpecificationFactoryTest.java
+++
b/mcp/bootstrap/src/test/java/org/apache/shardingsphere/mcp/bootstrap/transport/capability/completion/MCPCompletionSpecificationFactoryTest.java
@@ -198,8 +198,8 @@ class MCPCompletionSpecificationFactoryTest {
private MCPRuntimeContext createRuntimeContext(final
WorkflowSessionContext workflowSessionContext) {
MCPDatabaseCapabilityProvider databaseCapabilityProvider =
mock(MCPDatabaseCapabilityProvider.class);
when(databaseCapabilityProvider.getDatabaseProfiles()).thenReturn(List.of(
- new RuntimeDatabaseProfile("logic_db", "MySQL", "8.0"),
- new RuntimeDatabaseProfile("warehouse", "PostgreSQL", "16")));
+ new RuntimeDatabaseProfile("logic_db", "FixtureDB", "1.0"),
+ new RuntimeDatabaseProfile("warehouse", "FixtureWarehouseDB",
"2.0")));
MCPRuntimeContext result = mock(MCPRuntimeContext.class,
RETURNS_DEEP_STUBS);
when(result.getDatabaseCapabilityProvider()).thenReturn(databaseCapabilityProvider);
when(result.getWorkflowSessionContext()).thenReturn(workflowSessionContext);
diff --git
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/MCPCompletionServiceTest.java
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/MCPCompletionServiceTest.java
index 2e46cb71b99..c33c073ded2 100644
---
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/MCPCompletionServiceTest.java
+++
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/MCPCompletionServiceTest.java
@@ -144,8 +144,8 @@ class MCPCompletionServiceTest {
private MCPRuntimeContext createRuntimeContext(final
WorkflowSessionContext workflowSessionContext) {
MCPDatabaseCapabilityProvider databaseCapabilityProvider =
mock(MCPDatabaseCapabilityProvider.class);
when(databaseCapabilityProvider.getDatabaseProfiles()).thenReturn(List.of(
- new RuntimeDatabaseProfile("logic_db", "MySQL", "8.0"),
- new RuntimeDatabaseProfile("warehouse", "PostgreSQL", "16")));
+ new RuntimeDatabaseProfile("logic_db", "FixtureDB", "1.0"),
+ new RuntimeDatabaseProfile("warehouse", "FixtureWarehouseDB",
"2.0")));
MCPRuntimeContext result = mock(MCPRuntimeContext.class,
RETURNS_DEEP_STUBS);
when(result.getDatabaseCapabilityProvider()).thenReturn(databaseCapabilityProvider);
when(result.getWorkflowSessionContext()).thenReturn(workflowSessionContext);
diff --git
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/provider/MetadataCompletionProviderTest.java
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/provider/MetadataCompletionProviderTest.java
index fe53850783a..f4659a6124b 100644
---
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/provider/MetadataCompletionProviderTest.java
+++
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/completion/provider/MetadataCompletionProviderTest.java
@@ -259,11 +259,11 @@ class MetadataCompletionProviderTest {
}
private RuntimeDatabaseProfile createDatabaseProfile(final String
database) {
- return new RuntimeDatabaseProfile(database, "MySQL", "8.0");
+ return new RuntimeDatabaseProfile(database, "FixtureDB", "1.0");
}
private MCPDatabaseMetadata createDatabaseMetadata() {
- return new MCPDatabaseMetadata("logic_db", "MySQL", "8.0",
List.of(createSchemaMetadata()));
+ return new MCPDatabaseMetadata("logic_db", "FixtureDB", "1.0",
List.of(createSchemaMetadata()));
}
private MCPSchemaMetadata createSchemaMetadata() {
diff --git
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourceHandlerTest.java
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourceHandlerTest.java
index 5b6f43c21bf..ec1a9b9b17f 100644
---
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourceHandlerTest.java
+++
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/resource/handler/metadata/MetadataResourceHandlerTest.java
@@ -113,7 +113,7 @@ class MetadataResourceHandlerTest {
@Test
void assertHandleListResourceWithEmptyScope() {
MetadataResourceHandler handler = new
MetadataResourceHandler("shardingsphere://databases/{database}/schemas",
(requestContext, uriVariables) -> List.of());
- MCPResponse actual =
handler.handle(createDatabaseContext(Optional.of(new
RuntimeDatabaseProfile("logic_db", "MySQL", "8.0"))),
+ MCPResponse actual =
handler.handle(createDatabaseContext(Optional.of(new
RuntimeDatabaseProfile("logic_db", "FixtureDB", "1.0"))),
new MCPUriVariables(Map.of("database", "logic_db")));
Map<?, ?> actualEmptyState = (Map<?, ?>)
actual.toPayload().get("empty_state");
assertThat(actualEmptyState.get("category"), is("empty_scope"));
@@ -124,7 +124,7 @@ class MetadataResourceHandlerTest {
@Test
void assertHandleSchemaDetailResourceNotVisible() {
MetadataResourceHandler handler = new
MetadataResourceHandler("shardingsphere://databases/{database}/schemas/{schema}",
(requestContext, uriVariables) -> List.of());
- MCPResponse actual =
handler.handle(createDatabaseContext(Optional.of(new
RuntimeDatabaseProfile("logic_db", "MySQL", "8.0"))),
+ MCPResponse actual =
handler.handle(createDatabaseContext(Optional.of(new
RuntimeDatabaseProfile("logic_db", "FixtureDB", "1.0"))),
new MCPUriVariables(Map.of("database", "logic_db", "schema",
"missing_schema")));
Map<?, ?> actualEmptyState = (Map<?, ?>)
actual.toPayload().get("empty_state");
assertThat(actualEmptyState.get("category"), is("schema_not_visible"));
@@ -136,7 +136,7 @@ class MetadataResourceHandlerTest {
@Test
void assertHandleObjectDetailResourceNotVisible() {
MetadataResourceHandler handler = new
MetadataResourceHandler("shardingsphere://databases/{database}/schemas/{schema}/tables/{table}",
(requestContext, uriVariables) -> List.of());
- MCPResponse actual =
handler.handle(createDatabaseContext(Optional.of(new
RuntimeDatabaseProfile("logic_db", "MySQL", "8.0"))),
+ MCPResponse actual =
handler.handle(createDatabaseContext(Optional.of(new
RuntimeDatabaseProfile("logic_db", "FixtureDB", "1.0"))),
new MCPUriVariables(Map.of("database", "logic_db", "schema",
"public", "table", "missing_table")));
Map<?, ?> actualEmptyState = (Map<?, ?>)
actual.toPayload().get("empty_state");
assertThat(actualEmptyState.get("category"), is("object_not_visible"));
diff --git
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/session/MCPJdbcTransactionStatementExecutorTest.java
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/session/MCPJdbcTransactionStatementExecutorTest.java
index ed8a58c2842..642a62b126a 100644
---
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/session/MCPJdbcTransactionStatementExecutorTest.java
+++
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/session/MCPJdbcTransactionStatementExecutorTest.java
@@ -17,7 +17,6 @@
package org.apache.shardingsphere.mcp.core.session;
-import
org.apache.shardingsphere.mcp.core.fixture.CoreDatabaseTypeFactoryMocker;
import
org.apache.shardingsphere.mcp.api.protocol.exception.MCPInvalidRequestException;
import
org.apache.shardingsphere.mcp.api.protocol.exception.MCPTransactionStateException;
import
org.apache.shardingsphere.mcp.api.protocol.exception.MCPUnsupportedException;
@@ -25,8 +24,11 @@ import
org.apache.shardingsphere.mcp.core.tool.handler.execute.ClassificationRes
import
org.apache.shardingsphere.mcp.core.tool.handler.execute.MCPJdbcTransactionStatementExecutor;
import
org.apache.shardingsphere.mcp.core.tool.handler.execute.StatementClassifier;
import
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapability;
-import
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityProvider;
+import
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
+import
org.apache.shardingsphere.mcp.support.database.capability.SchemaExecutionSemantics;
+import
org.apache.shardingsphere.mcp.support.database.capability.SchemaSemantics;
import
org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPStatement;
+import
org.apache.shardingsphere.mcp.support.database.capability.TransactionCapability;
import
org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseConfiguration;
import
org.apache.shardingsphere.mcp.support.database.tool.response.SQLExecutionResponse;
import org.junit.jupiter.api.Test;
@@ -35,11 +37,8 @@ import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
-import java.sql.Statement;
import java.util.Collections;
import java.util.Map;
import java.util.stream.Stream;
@@ -49,7 +48,6 @@ import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -67,7 +65,7 @@ class MCPJdbcTransactionStatementExecutorTest {
sessionManager.createSession("session-1");
prepareTransactionState(sql, sessionManager, connection, savepoint);
MCPJdbcTransactionStatementExecutor executor = new
MCPJdbcTransactionStatementExecutor(sessionManager);
- SQLExecutionResponse actual = executor.execute("session-1",
"logic_db", createCapability("logic_db"), new
StatementClassifier().classify(sql));
+ SQLExecutionResponse actual = executor.execute("session-1",
"logic_db", createCapability(), new StatementClassifier().classify(sql));
assertThat(actual.getStatementType(), is(expectedStatementType));
assertThat(actual.getMessage(), is(expectedMessage));
assertDatabaseExecution(sql, sessionManager, runtimeDatabaseConfig,
connection, savepoint);
@@ -90,7 +88,7 @@ class MCPJdbcTransactionStatementExecutorTest {
sessionManager.createSession("session-1");
MCPJdbcTransactionStatementExecutor executor = new
MCPJdbcTransactionStatementExecutor(sessionManager);
MCPUnsupportedException actual =
assertThrows(MCPUnsupportedException.class,
- () -> executor.execute("session-1", "warehouse",
createCapability("warehouse"), new StatementClassifier().classify("SAVEPOINT
sp_1")));
+ () -> executor.execute("session-1", "warehouse",
createCapabilityWithoutSavepoint(), new
StatementClassifier().classify("SAVEPOINT sp_1")));
assertThat(actual.getMessage(), is("Savepoint is not supported."));
}
@@ -100,7 +98,7 @@ class MCPJdbcTransactionStatementExecutorTest {
sessionManager.createSession("session-1");
MCPJdbcTransactionStatementExecutor executor = new
MCPJdbcTransactionStatementExecutor(sessionManager);
MCPInvalidRequestException actual =
assertThrows(MCPInvalidRequestException.class,
- () -> executor.execute("session-1", "logic_db",
createCapability("logic_db"), new StatementClassifier().classify("SELECT 1")));
+ () -> executor.execute("session-1", "logic_db",
createCapability(), new StatementClassifier().classify("SELECT 1")));
assertThat(actual.getMessage(), is("Statement is not a transaction
command."));
}
@@ -109,7 +107,7 @@ class MCPJdbcTransactionStatementExecutorTest {
MCPSessionManager sessionManager = new
MCPSessionManager(Collections.emptyMap());
MCPJdbcTransactionStatementExecutor executor = new
MCPJdbcTransactionStatementExecutor(sessionManager);
MCPSessionNotExistedException actual =
assertThrows(MCPSessionNotExistedException.class,
- () -> executor.execute("session-1", "logic_db",
createCapability("logic_db"), new StatementClassifier().classify("BEGIN")));
+ () -> executor.execute("session-1", "logic_db",
createCapability(), new StatementClassifier().classify("BEGIN")));
assertThat(actual.getMessage(), is("Session does not exist."));
}
@@ -119,7 +117,7 @@ class MCPJdbcTransactionStatementExecutorTest {
sessionManager.createSession("session-1");
MCPJdbcTransactionStatementExecutor executor = new
MCPJdbcTransactionStatementExecutor(sessionManager);
MCPTransactionStateException actual =
assertThrows(MCPTransactionStateException.class,
- () -> executor.execute("session-1", "logic_db",
createCapability("logic_db"), new StatementClassifier().classify("COMMIT")));
+ () -> executor.execute("session-1", "logic_db",
createCapability(), new StatementClassifier().classify("COMMIT")));
assertThat(actual.getMessage(), is("No active transaction."));
}
@@ -130,42 +128,26 @@ class MCPJdbcTransactionStatementExecutorTest {
sessionManager.createSession("session-1");
MCPJdbcTransactionStatementExecutor executor = new
MCPJdbcTransactionStatementExecutor(sessionManager);
MCPInvalidRequestException actual =
assertThrows(MCPInvalidRequestException.class,
- () -> executor.execute("session-1", "logic_db",
createCapability("logic_db"),
+ () -> executor.execute("session-1", "logic_db",
createCapability(),
new
ClassificationResult(SupportedMCPStatement.SAVEPOINT, statementType, sql, "",
"")));
assertThat(actual.getMessage(), is("Savepoint name is required."));
}
- private MCPDatabaseCapabilityProvider createDatabaseCapabilityBuilder() {
- return
CoreDatabaseTypeFactoryMocker.createDatabaseCapabilityProvider(Map.of(
- "logic_db",
createCapabilityRuntimeDatabaseConfiguration("logic_db", "MySQL"),
- "warehouse",
createCapabilityRuntimeDatabaseConfiguration("warehouse", "Hive")));
+ private MCPDatabaseCapability createCapability() {
+ return createCapability("logic_db",
TransactionCapability.LOCAL_WITH_SAVEPOINT);
}
- private MCPDatabaseCapability createCapability(final String databaseName) {
- return
createDatabaseCapabilityBuilder().provide(databaseName).orElseThrow(IllegalStateException::new);
+ private MCPDatabaseCapability createCapability(final String databaseName,
final TransactionCapability transactionCapability) {
+ MCPDatabaseCapabilityOption option =
mock(MCPDatabaseCapabilityOption.class);
+ when(option.getType()).thenReturn("FixtureDB");
+
when(option.getTransactionCapability()).thenReturn(transactionCapability);
+
when(option.getDefaultSchemaSemantics()).thenReturn(SchemaSemantics.NATIVE_SCHEMA);
+
when(option.getSchemaExecutionSemantics()).thenReturn(SchemaExecutionSemantics.FIXED_TO_DATABASE);
+ return new MCPDatabaseCapability(databaseName, "", option);
}
- private RuntimeDatabaseConfiguration
createCapabilityRuntimeDatabaseConfiguration(final String databaseName, final
String databaseType) {
- RuntimeDatabaseConfiguration result =
mock(RuntimeDatabaseConfiguration.class);
- Connection connection = mock(Connection.class);
- DatabaseMetaData databaseMetaData = mock(DatabaseMetaData.class);
- try {
- when(result.openConnection(databaseName)).thenReturn(connection);
- when(connection.getMetaData()).thenReturn(databaseMetaData);
- when(databaseMetaData.getDatabaseProductVersion()).thenReturn("");
-
when(databaseMetaData.getURL()).thenReturn(CoreDatabaseTypeFactoryMocker.createJdbcUrl(databaseType));
- mockEmptyScalarQueries(connection);
- } catch (final SQLException ex) {
- throw new IllegalStateException(ex);
- }
- return result;
- }
-
- private void mockEmptyScalarQueries(final Connection connection) throws
SQLException {
- Statement statement = mock(Statement.class);
- ResultSet resultSet = mock(ResultSet.class);
- when(connection.createStatement()).thenReturn(statement);
- when(statement.executeQuery(anyString())).thenReturn(resultSet);
+ private MCPDatabaseCapability createCapabilityWithoutSavepoint() {
+ return createCapability("warehouse", TransactionCapability.LOCAL);
}
private void prepareTransactionState(final String sql, final
MCPSessionManager sessionManager, final Connection connection, final Savepoint
savepoint) throws SQLException {
diff --git
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcStatementExecutorTest.java
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcStatementExecutorTest.java
index 4aa3a6766db..135f6522c1c 100644
---
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcStatementExecutorTest.java
+++
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPJdbcStatementExecutorTest.java
@@ -17,10 +17,12 @@
package org.apache.shardingsphere.mcp.core.tool.handler.execute;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import
org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPStatement;
import
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapability;
import
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
+import
org.apache.shardingsphere.mcp.support.database.capability.SchemaExecutionSemantics;
+import
org.apache.shardingsphere.mcp.support.database.capability.SchemaSemantics;
+import
org.apache.shardingsphere.mcp.support.database.capability.TransactionCapability;
import
org.apache.shardingsphere.mcp.support.database.exception.QueryDidNotReturnResultSetException;
import
org.apache.shardingsphere.mcp.support.database.exception.StatementClassNotSupportedException;
import
org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseConfiguration;
@@ -80,7 +82,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcTransactionResourceManager transactionResourceManager =
mock(MCPJdbcTransactionResourceManager.class);
when(transactionResourceManager.findTransactionConnection(anyString(),
anyString())).thenReturn(Optional.empty());
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", runtimeDatabaseConfig),
transactionResourceManager);
- SQLExecutionResponse actual =
statementExecutor.execute(executionRequest, classificationResult,
createDatabaseCapability("MySQL"));
+ SQLExecutionResponse actual =
statementExecutor.execute(executionRequest, classificationResult,
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getResultKind(), is(expectedResultKind));
assertThat(actual.getStatementClass(),
is(classificationResult.getStatementClass()));
assertThat(actual.getStatementType(), is(expectedStatementType));
@@ -102,7 +104,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Collections.emptyMap(), transactionResourceManager);
SQLExecutionResponse actual = statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "public", "UPDATE orders SET status = 'DONE'", 10,
1000),
- new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", ""),
createDatabaseCapability("MySQL"));
+ new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getAffectedRows(), is(2));
verify(connection, never()).close();
}
@@ -123,7 +125,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
SQLExecutionResponse actual = statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "public", "SELECT status FROM orders", 10, 1000,
true),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability("MySQL"));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getRows().size(), is(1));
verify(connection).setReadOnly(true);
verify(connection).setAutoCommit(false);
@@ -141,7 +143,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Collections.emptyMap(), transactionResourceManager);
SQLExecutionResponse actual = statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "public", "SELECT status FROM orders", 10, 1000,
true),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability("MySQL"));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getRows().size(), is(1));
verify(connection, never()).setReadOnly(true);
verify(connection, never()).rollback();
@@ -164,7 +166,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
SQLExecutionResponse actual = statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", " ", "SELECT status FROM orders", 0, 0),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability("MySQL"));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getRows().size(), is(2));
assertFalse(actual.isTruncated());
verify(connection, never()).setSchema(anyString());
@@ -186,7 +188,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
SQLExecutionResponse actual = statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "public", "SELECT status FROM orders",
Integer.MAX_VALUE, 1000),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability("MySQL"));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getRows().size(), is(0));
assertFalse(actual.isTruncated());
verify(statement).setMaxRows(Integer.MAX_VALUE);
@@ -208,7 +210,7 @@ class MCPJdbcStatementExecutorTest {
"logic_db", "public", "WITH updated_orders AS (UPDATE orders
SET status = 'DONE' RETURNING *) SELECT * FROM updated_orders", 10, 1000),
new ClassificationResult(SupportedMCPStatement.DML, "SELECT",
"WITH updated_orders AS (UPDATE orders SET status =
'DONE' RETURNING *) SELECT * FROM updated_orders", "", ""),
- createDatabaseCapability("MySQL"));
+
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getResultKind(),
is(ExecuteQueryResultKind.RESULT_SET));
assertThat(actual.getStatementClass(), is(SupportedMCPStatement.DML));
assertThat(actual.getStatementType(), is("SELECT"));
@@ -225,7 +227,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
SQLExecutionResponse actual = statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "logic_db", "UPDATE orders SET status = 'DONE'",
10, 1000),
- new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", ""),
createDatabaseCapability("MySQL"));
+ new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getAffectedRows(), is(1));
verify(connection, never()).setSchema(anyString());
}
@@ -241,7 +243,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
MCPUnsupportedException actual =
assertThrows(MCPUnsupportedException.class, () -> statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "public", "UPDATE orders SET status = 'DONE'", 10,
1000),
- new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", ""),
createDatabaseCapability("PostgreSQL")));
+ new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.BEST_EFFORT)));
assertThat(actual.getMessage(), is("schema"));
verify(connection).setSchema("public");
verify(connection, never()).createStatement();
@@ -258,7 +260,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
QueryDidNotReturnResultSetException actual =
assertThrows(QueryDidNotReturnResultSetException.class, () ->
statementExecutor.execute(new SQLExecutionRequest("session-1",
"logic_db", "public", "SELECT status FROM orders", 10, 1000),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability("MySQL")));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
assertThat(actual.getMessage(), is("Query did not return a result
set."));
}
@@ -272,7 +274,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
StatementClassNotSupportedException actual =
assertThrows(StatementClassNotSupportedException.class, () ->
statementExecutor.execute(new SQLExecutionRequest("session-1",
"logic_db", "public", "BEGIN", 10, 1000),
- new
ClassificationResult(SupportedMCPStatement.TRANSACTION_CONTROL, "BEGIN",
"BEGIN", "", ""), createDatabaseCapability("MySQL")));
+ new
ClassificationResult(SupportedMCPStatement.TRANSACTION_CONTROL, "BEGIN",
"BEGIN", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
assertThat(actual.getMessage(), is("Statement class is not
supported."));
}
@@ -291,7 +293,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
ShardingSphereMCPException actual =
assertThrows(expectedExceptionClass, () -> statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "public", "SELECT status FROM orders", 10, 1000),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability("MySQL")));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
assertThat(actual.getClass(), is(expectedExceptionClass));
assertThat(actual.getMessage(), is(expectedMessage));
assertThat(actual.getCause(), is(sqlException));
@@ -305,7 +307,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Collections.emptyMap(), transactionResourceManager);
MCPTransactionStateException actual =
assertThrows(MCPTransactionStateException.class, () ->
statementExecutor.execute(new SQLExecutionRequest("session-1",
"logic_db", "public", "SELECT status FROM orders", 10, 1000),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability("MySQL")));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
assertThat(actual.getMessage(), is("Transaction already active."));
assertThat(actual.getCause(), is(cause));
}
@@ -317,7 +319,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Collections.emptyMap(), transactionResourceManager);
MCPUnavailableException actual =
assertThrows(MCPUnavailableException.class, () -> statementExecutor.execute(new
SQLExecutionRequest("session-1",
"missing_db", "public", "SELECT status FROM orders", 10, 1000),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability("MySQL")));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
assertThat(actual.getMessage(), is("Database `missing_db` is not
configured."));
}
@@ -335,7 +337,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
MCPQueryFailedException actual =
assertThrows(MCPQueryFailedException.class, () -> statementExecutor.execute(new
SQLExecutionRequest("session-1", "logic_db",
"public", "UPDATE orders SET status = 'DONE'", 10, 1000),
- new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", ""),
createDatabaseCapability("MySQL")));
+ new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
assertThat(actual.getMessage(), is("statement close failed"));
}
@@ -350,7 +352,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
SQLExecutionResponse actual = statementExecutor.execute(new
SQLExecutionRequest("session-1",
"logic_db", "public", "UPDATE orders SET status = 'DONE'", 10,
1000),
- new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", ""),
createDatabaseCapability("MySQL"));
+ new ClassificationResult(SupportedMCPStatement.DML, "UPDATE",
"UPDATE orders SET status = 'DONE'", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE));
assertThat(actual.getAffectedRows(), is(1));
verify(connection).close();
}
@@ -364,7 +366,7 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
assertThrows(NullPointerException.class, () ->
statementExecutor.execute(new SQLExecutionRequest("session-1",
"logic_db", "", "SELECT status FROM orders", 0, 0),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability("MySQL")));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
}
@Test
@@ -378,11 +380,16 @@ class MCPJdbcStatementExecutorTest {
MCPJdbcStatementExecutor statementExecutor = new
MCPJdbcStatementExecutor(Map.of("logic_db", databaseConfig),
transactionResourceManager);
assertThrows(NullPointerException.class, () ->
statementExecutor.execute(new SQLExecutionRequest("session-1",
"logic_db", "", "SELECT status FROM orders", 0, 0),
- new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability("MySQL")));
+ new ClassificationResult(SupportedMCPStatement.QUERY,
"SELECT", "SELECT status FROM orders", "", ""),
createDatabaseCapability(SchemaExecutionSemantics.FIXED_TO_DATABASE)));
}
- private static MCPDatabaseCapability createDatabaseCapability(final String
databaseType) {
- return new MCPDatabaseCapability("logic_db", "",
TypedSPILoader.getService(MCPDatabaseCapabilityOption.class, databaseType));
+ private static MCPDatabaseCapability createDatabaseCapability(final
SchemaExecutionSemantics schemaExecutionSemantics) {
+ MCPDatabaseCapabilityOption option =
mock(MCPDatabaseCapabilityOption.class);
+ when(option.getType()).thenReturn("FixtureDB");
+
when(option.getTransactionCapability()).thenReturn(TransactionCapability.NONE);
+
when(option.getDefaultSchemaSemantics()).thenReturn(SchemaSemantics.NATIVE_SCHEMA);
+
when(option.getSchemaExecutionSemantics()).thenReturn(schemaExecutionSemantics);
+ return new MCPDatabaseCapability("logic_db", "", option);
}
private static Connection createStatementConnection(final boolean
hasResultSet, final int updateCount, final ResultSet resultSet) throws
SQLException {
diff --git
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPSQLExecutionFacadeConcurrencyTest.java
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPSQLExecutionFacadeConcurrencyTest.java
index 12a6e4ce2c0..735dc1099dd 100644
---
a/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPSQLExecutionFacadeConcurrencyTest.java
+++
b/mcp/core/src/test/java/org/apache/shardingsphere/mcp/core/tool/handler/execute/MCPSQLExecutionFacadeConcurrencyTest.java
@@ -17,9 +17,14 @@
package org.apache.shardingsphere.mcp.core.tool.handler.execute;
-import
org.apache.shardingsphere.mcp.core.fixture.CoreDatabaseTypeFactoryMocker;
import
org.apache.shardingsphere.mcp.support.database.metadata.jdbc.RuntimeDatabaseConfiguration;
import
org.apache.shardingsphere.mcp.api.protocol.exception.MCPTransactionStateException;
+import
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapability;
+import
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
+import
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityProvider;
+import
org.apache.shardingsphere.mcp.support.database.capability.SchemaExecutionSemantics;
+import
org.apache.shardingsphere.mcp.support.database.capability.SchemaSemantics;
+import
org.apache.shardingsphere.mcp.support.database.capability.TransactionCapability;
import
org.apache.shardingsphere.mcp.support.database.tool.response.SQLExecutionResponse;
import org.apache.shardingsphere.mcp.core.session.MCPSessionManager;
import
org.apache.shardingsphere.mcp.support.database.tool.request.SQLExecutionRequest;
@@ -27,7 +32,6 @@ import org.junit.jupiter.api.Test;
import org.mockito.internal.configuration.plugins.Plugins;
import java.sql.Connection;
-import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
@@ -173,30 +177,19 @@ class MCPSQLExecutionFacadeConcurrencyTest {
}
private MCPSQLExecutionFacade createFacade(final MCPSessionManager
sessionManager) {
- return new
MCPSQLExecutionFacade(CoreDatabaseTypeFactoryMocker.createDatabaseCapabilityProvider(Map.of("logic_db",
createCapabilityRuntimeDatabaseConfiguration())), sessionManager);
+ MCPDatabaseCapability databaseCapability = createDatabaseCapability();
+ MCPDatabaseCapabilityProvider databaseCapabilityProvider =
mock(MCPDatabaseCapabilityProvider.class);
+
when(databaseCapabilityProvider.provide("logic_db")).thenReturn(Optional.of(databaseCapability));
+ return new MCPSQLExecutionFacade(databaseCapabilityProvider,
sessionManager);
}
- private RuntimeDatabaseConfiguration
createCapabilityRuntimeDatabaseConfiguration() {
- RuntimeDatabaseConfiguration result =
mock(RuntimeDatabaseConfiguration.class);
- Connection connection = mock(Connection.class);
- DatabaseMetaData databaseMetaData = mock(DatabaseMetaData.class);
- try {
- when(result.openConnection("logic_db")).thenReturn(connection);
- when(connection.getMetaData()).thenReturn(databaseMetaData);
- when(databaseMetaData.getDatabaseProductVersion()).thenReturn("");
-
when(databaseMetaData.getURL()).thenReturn(CoreDatabaseTypeFactoryMocker.createJdbcUrl("MySQL"));
- mockEmptyScalarQueries(connection);
- } catch (final SQLException ex) {
- throw new IllegalStateException(ex);
- }
- return result;
- }
-
- private void mockEmptyScalarQueries(final Connection connection) throws
SQLException {
- Statement statement = mock(Statement.class);
- ResultSet resultSet = mock(ResultSet.class);
- when(connection.createStatement()).thenReturn(statement);
- when(statement.executeQuery(anyString())).thenReturn(resultSet);
+ private MCPDatabaseCapability createDatabaseCapability() {
+ MCPDatabaseCapabilityOption option =
mock(MCPDatabaseCapabilityOption.class);
+ when(option.getType()).thenReturn("FixtureDB");
+
when(option.getTransactionCapability()).thenReturn(TransactionCapability.LOCAL_WITH_SAVEPOINT);
+
when(option.getDefaultSchemaSemantics()).thenReturn(SchemaSemantics.NATIVE_SCHEMA);
+
when(option.getSchemaExecutionSemantics()).thenReturn(SchemaExecutionSemantics.FIXED_TO_DATABASE);
+ return new MCPDatabaseCapability("logic_db", "", option);
}
private SQLExecutionRequest createExecutionRequest(final String sessionId,
final String sql) {
diff --git
a/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/resource/handler/BroadcastTableRuleHandlerTest.java
b/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/resource/handler/BroadcastTableRuleHandlerTest.java
index 38d53254e60..f9bb7fcca43 100644
---
a/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/resource/handler/BroadcastTableRuleHandlerTest.java
+++
b/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/resource/handler/BroadcastTableRuleHandlerTest.java
@@ -52,7 +52,7 @@ class BroadcastTableRuleHandlerTest {
MCPFeatureQueryFacade queryFacade = mock(MCPFeatureQueryFacade.class);
MCPDatabaseHandlerContext databaseContext =
mock(MCPDatabaseHandlerContext.class);
when(databaseContext.getQueryFacade()).thenReturn(queryFacade);
- when(queryFacade.getDatabaseType("logic_db")).thenReturn("MySQL");
+ when(queryFacade.getDatabaseType("logic_db")).thenReturn("FixtureDB");
when(ruleInspectionService.queryBroadcastRules(queryFacade,
"logic_db")).thenReturn(List.of(Map.of("broadcast_table", "t_order"),
Map.of("broadcast_table", "t_order_item")));
MCPResponse actual = new
BroadcastTableRuleHandler(ruleInspectionService).handle(databaseContext, new
MCPUriVariables(Map.of("database", "logic_db", "table", "t_order")));
verify(ruleInspectionService).queryBroadcastRules(queryFacade,
"logic_db");
diff --git
a/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastWorkflowPlanningServiceTest.java
b/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastWorkflowPlanningServiceTest.java
index 8a1fa77de72..1075375f524 100644
---
a/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastWorkflowPlanningServiceTest.java
+++
b/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastWorkflowPlanningServiceTest.java
@@ -113,7 +113,7 @@ class BroadcastWorkflowPlanningServiceTest {
private MCPFeatureQueryFacade mockQueryFacade(final List<Map<String,
Object>> broadcastRules) {
MCPFeatureQueryFacade result = mock(MCPFeatureQueryFacade.class);
- when(result.getDatabaseType("logic_db")).thenReturn("MySQL");
+ when(result.getDatabaseType("logic_db")).thenReturn("FixtureDB");
when(result.query(eq("logic_db"), eq(""),
any())).thenReturn(broadcastRules);
return result;
}
diff --git
a/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastWorkflowValidationServiceTest.java
b/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastWorkflowValidationServiceTest.java
index 8ca296d960b..faa7b3b00df 100644
---
a/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastWorkflowValidationServiceTest.java
+++
b/mcp/features/broadcast/src/test/java/org/apache/shardingsphere/mcp/feature/broadcast/tool/service/BroadcastWorkflowValidationServiceTest.java
@@ -64,7 +64,7 @@ class BroadcastWorkflowValidationServiceTest {
BroadcastRuleInspectionService ruleInspectionService =
mock(BroadcastRuleInspectionService.class);
when(ruleInspectionService.queryBroadcastRules(any(),
any())).thenReturn(List.of(Map.of("broadcast_table", "t_order")));
MCPFeatureQueryFacade queryFacade = mock(MCPFeatureQueryFacade.class);
- when(queryFacade.getDatabaseType("logic_db")).thenReturn("MySQL");
+ when(queryFacade.getDatabaseType("logic_db")).thenReturn("FixtureDB");
MCPMetadataQueryFacade metadataQueryFacade =
mock(MCPMetadataQueryFacade.class);
MCPFeatureExecutionFacade executionFacade =
mock(MCPFeatureExecutionFacade.class);
Map<String, Object> actual = createService(ruleInspectionService)
diff --git
a/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingWorkflowPlanningServiceTest.java
b/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingWorkflowPlanningServiceTest.java
index 359a9653083..264dc7e30e6 100644
---
a/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingWorkflowPlanningServiceTest.java
+++
b/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingWorkflowPlanningServiceTest.java
@@ -187,14 +187,14 @@ class ReadwriteSplittingWorkflowPlanningServiceTest {
private MCPFeatureQueryFacade mockRuleQueryFacade(final List<Map<String,
Object>> rules) {
MCPFeatureQueryFacade result = mock(MCPFeatureQueryFacade.class);
- when(result.getDatabaseType("logic_db")).thenReturn("MySQL");
+ when(result.getDatabaseType("logic_db")).thenReturn("FixtureDB");
when(result.query(eq("logic_db"), eq(""), any())).thenReturn(rules);
return result;
}
private MCPFeatureQueryFacade mockStatusQueryFacade(final List<Map<String,
Object>> statuses) {
MCPFeatureQueryFacade result = mock(MCPFeatureQueryFacade.class);
- when(result.getDatabaseType("logic_db")).thenReturn("MySQL");
+ when(result.getDatabaseType("logic_db")).thenReturn("FixtureDB");
when(result.query(eq("logic_db"), eq(""), any())).thenReturn(statuses);
return result;
}
diff --git
a/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingWorkflowValidationServiceTest.java
b/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingWorkflowValidationServiceTest.java
index 92813226e03..28d615e9136 100644
---
a/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingWorkflowValidationServiceTest.java
+++
b/mcp/features/readwrite-splitting/src/test/java/org/apache/shardingsphere/mcp/feature/readwritesplitting/tool/service/ReadwriteSplittingWorkflowValidationServiceTest.java
@@ -73,7 +73,7 @@ class ReadwriteSplittingWorkflowValidationServiceTest {
ReadwriteSplittingInspectionService inspectionService =
mock(ReadwriteSplittingInspectionService.class);
when(inspectionService.queryRules(any(),
any())).thenReturn(List.of(createRuleRow()));
MCPFeatureQueryFacade queryFacade = mock(MCPFeatureQueryFacade.class);
- when(queryFacade.getDatabaseType("logic_db")).thenReturn("MySQL");
+ when(queryFacade.getDatabaseType("logic_db")).thenReturn("FixtureDB");
MCPMetadataQueryFacade metadataQueryFacade =
mock(MCPMetadataQueryFacade.class);
MCPFeatureExecutionFacade executionFacade =
mock(MCPFeatureExecutionFacade.class);
Map<String, Object> actual =
createRuleService(inspectionService).validate(workflowSessionContext,
metadataQueryFacade, queryFacade, executionFacade, "session-1", snapshot);
@@ -144,7 +144,7 @@ class ReadwriteSplittingWorkflowValidationServiceTest {
ReadwriteSplittingInspectionService inspectionService =
mock(ReadwriteSplittingInspectionService.class);
when(inspectionService.queryRuleStatus(any(), any(),
any())).thenReturn(List.of(createStatusRow("ENABLED")));
MCPFeatureQueryFacade queryFacade = mock(MCPFeatureQueryFacade.class);
- when(queryFacade.getDatabaseType("logic_db")).thenReturn("MySQL");
+ when(queryFacade.getDatabaseType("logic_db")).thenReturn("FixtureDB");
Map<String, Object> actual =
createStatusService(inspectionService).validate(
workflowSessionContext, mock(MCPMetadataQueryFacade.class),
queryFacade, mock(MCPFeatureExecutionFacade.class), "session-1", snapshot);
assertThat(actual.get("status"), is("validated"));
@@ -152,7 +152,7 @@ class ReadwriteSplittingWorkflowValidationServiceTest {
}
@Test
- void assertSynchronizeStatusWhenStateDoesNotConverge() throws
ReflectiveOperationException {
+ void assertSynchronizeStatusWhenStateDoesNotConverge() {
WorkflowContextSnapshot snapshot = createStatusSnapshot("plan-1",
"session-1", "executed", "enable");
ReadwriteSplittingInspectionService inspectionService =
mock(ReadwriteSplittingInspectionService.class);
when(inspectionService.queryRuleStatus(any(), any(),
any())).thenReturn(List.of(createStatusRow("DISABLED")));
diff --git
a/mcp/features/sharding/src/test/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowValidationServiceTest.java
b/mcp/features/sharding/src/test/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowValidationServiceTest.java
index 2984d44e34e..05dea041817 100644
---
a/mcp/features/sharding/src/test/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowValidationServiceTest.java
+++
b/mcp/features/sharding/src/test/java/org/apache/shardingsphere/mcp/feature/sharding/tool/service/ShardingWorkflowValidationServiceTest.java
@@ -177,7 +177,7 @@ class ShardingWorkflowValidationServiceTest {
}
@Test
- void assertSynchronizeWhenStateDoesNotConverge() throws
ReflectiveOperationException {
+ void assertSynchronizeWhenStateDoesNotConverge() {
WorkflowContextSnapshot snapshot = createSnapshot("plan-1",
"session-1", "executed", "create",
ShardingFeatureDefinition.TABLE_REFERENCE_WORKFLOW_KIND,
createReferenceRuleRequest());
ShardingInspectionService inspectionService =
mock(ShardingInspectionService.class);
@@ -202,7 +202,7 @@ class ShardingWorkflowValidationServiceTest {
private MCPFeatureQueryFacade createQueryFacade() {
MCPFeatureQueryFacade result = mock(MCPFeatureQueryFacade.class);
- when(result.getDatabaseType("logic_db")).thenReturn("MySQL");
+ when(result.getDatabaseType("logic_db")).thenReturn("FixtureDB");
return result;
}
diff --git
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcDatabaseProfileLoaderTest.java
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcDatabaseProfileLoaderTest.java
index 8e36e906189..df9f6271b56 100644
---
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcDatabaseProfileLoaderTest.java
+++
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcDatabaseProfileLoaderTest.java
@@ -41,10 +41,10 @@ class MCPJdbcDatabaseProfileLoaderTest {
@Test
void assertLoad() throws SQLException {
try (MockedStatic<DatabaseTypeFactory> ignored =
SupportDatabaseTypeFactoryMocker.mockByConnectionMetadata()) {
- RuntimeDatabaseProfile actual = new
MCPJdbcDatabaseProfileLoader().load("logic_db",
createRuntimeDatabaseConfiguration(SupportDatabaseTypeFactoryMocker.createJdbcUrl("MySQL"),
"8.0.32"));
+ RuntimeDatabaseProfile actual = new
MCPJdbcDatabaseProfileLoader().load("logic_db",
createRuntimeDatabaseConfiguration(SupportDatabaseTypeFactoryMocker.createJdbcUrl("FixtureDB"),
"1.0"));
assertThat(actual.getDatabase(), is("logic_db"));
- assertThat(actual.getDatabaseType(), is("MySQL"));
- assertThat(actual.getDatabaseVersion(), is("8.0.32"));
+ assertThat(actual.getDatabaseType(), is("FixtureDB"));
+ assertThat(actual.getDatabaseVersion(), is("1.0"));
}
}
diff --git
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoaderFailureTest.java
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoaderFailureTest.java
index 1290a2e096a..8c436bd1196 100644
---
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoaderFailureTest.java
+++
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcMetadataLoaderFailureTest.java
@@ -36,7 +36,7 @@ class MCPJdbcMetadataLoaderFailureTest {
when(runtimeDatabaseConfiguration.openConnection("logic_db")).thenThrow(expected);
MCPJdbcMetadataLoader metadataLoader = new MCPJdbcMetadataLoader();
RuntimeDatabaseConnectionException actual =
assertThrows(RuntimeDatabaseConnectionException.class,
- () -> metadataLoader.load("logic_db",
runtimeDatabaseConfiguration, new RuntimeDatabaseProfile("logic_db",
"PostgreSQL", "")));
+ () -> metadataLoader.load("logic_db",
runtimeDatabaseConfiguration, new RuntimeDatabaseProfile("logic_db",
"FixtureDB", "")));
assertThat(actual.getMessage(), is("Runtime database `logic_db`
connection failed: connection_failed."));
assertThat(actual.getCause(), is(expected));
}
diff --git
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPDatabaseMetadataTest.java
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPDatabaseMetadataTest.java
index 7a81a13563d..981c8a2cece 100644
---
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPDatabaseMetadataTest.java
+++
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/model/MCPDatabaseMetadataTest.java
@@ -31,8 +31,8 @@ class MCPDatabaseMetadataTest {
void assertCreateSummary() {
MCPDatabaseMetadata actual = createDatabaseMetadata().createSummary();
assertThat(actual.getDatabase(), is("foo_db"));
- assertThat(actual.getDatabaseType(), is("MySQL"));
- assertThat(actual.getDatabaseVersion(), is("8.0"));
+ assertThat(actual.getDatabaseType(), is("FixtureDB"));
+ assertThat(actual.getDatabaseVersion(), is("1.0"));
assertTrue(actual.getSchemas().isEmpty());
}
@@ -40,8 +40,8 @@ class MCPDatabaseMetadataTest {
void assertCreateDetail() {
MCPDatabaseMetadata actual = createDatabaseMetadata().createDetail();
assertThat(actual.getDatabase(), is("foo_db"));
- assertThat(actual.getDatabaseType(), is("MySQL"));
- assertThat(actual.getDatabaseVersion(), is("8.0"));
+ assertThat(actual.getDatabaseType(), is("FixtureDB"));
+ assertThat(actual.getDatabaseVersion(), is("1.0"));
assertThat(actual.getSchemas().get(0).getSchema(), is("bar_schema"));
assertThat(actual.getSchemas().get(1).getSchema(), is("foo_schema"));
assertThat(actual.getSchemas().get(1).getTables().get(0).getTable(),
is("bar_table"));
@@ -49,7 +49,7 @@ class MCPDatabaseMetadataTest {
}
private MCPDatabaseMetadata createDatabaseMetadata() {
- return new MCPDatabaseMetadata("foo_db", "MySQL", "8.0", List.of(new
MCPSchemaMetadata("foo_db", "foo_schema",
+ return new MCPDatabaseMetadata("foo_db", "FixtureDB", "1.0",
List.of(new MCPSchemaMetadata("foo_db", "foo_schema",
List.of(new MCPTableMetadata("foo_db", "foo_schema",
"foo_table", List.of(new MCPColumnMetadata("foo_db", "foo_schema", "foo_table",
"", "foo_column")), List.of()),
new MCPTableMetadata("foo_db", "foo_schema",
"bar_table", List.of(), List.of())),
List.of(new MCPViewMetadata("foo_db", "foo_schema",
"foo_view", List.of())),
diff --git
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/query/DatabaseTestDataFactory.java
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/query/DatabaseTestDataFactory.java
index 19c73f03d26..52b2e58b01f 100644
---
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/query/DatabaseTestDataFactory.java
+++
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/query/DatabaseTestDataFactory.java
@@ -52,7 +52,7 @@ final class DatabaseTestDataFactory {
static List<MCPDatabaseMetadata> createDatabaseMetadata() {
return List.of(
- new MCPDatabaseMetadata("logic_db", "MySQL", "", List.of(
+ new MCPDatabaseMetadata("logic_db", "FixtureDB", "", List.of(
new MCPSchemaMetadata("logic_db", "public", List.of(
new MCPTableMetadata("logic_db", "public",
"orders",
List.of(new
MCPColumnMetadata("logic_db", "public", "orders", "", "order_id")),
@@ -62,9 +62,9 @@ final class DatabaseTestDataFactory {
List.of(new MCPViewMetadata("logic_db",
"public", "orders_view",
List.of(new
MCPColumnMetadata("logic_db", "public", "", "orders_view", "order_id")))),
List.of()))),
- new MCPDatabaseMetadata("runtime_db", "PostgreSQL", "",
List.of(
+ new MCPDatabaseMetadata("runtime_db", "FixtureRuntimeDB", "",
List.of(
new MCPSchemaMetadata("runtime_db", "public",
List.of(), List.of(), List.of(new MCPSequenceMetadata("runtime_db", "public",
"order_seq"))))),
- new MCPDatabaseMetadata("warehouse", "Hive", "", List.of(
+ new MCPDatabaseMetadata("warehouse", "FixtureWarehouseDB", "",
List.of(
new MCPSchemaMetadata("warehouse", "warehouse",
List.of(new MCPTableMetadata("warehouse", "warehouse", "facts", List.of(),
List.of())), List.of(), List.of()))));
}
diff --git
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/response/MCPDatabaseCapabilityResponseTest.java
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/response/MCPDatabaseCapabilityResponseTest.java
index e539d74415c..8b5f6087998 100644
---
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/response/MCPDatabaseCapabilityResponseTest.java
+++
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/response/MCPDatabaseCapabilityResponseTest.java
@@ -17,13 +17,13 @@
package org.apache.shardingsphere.mcp.support.database.response;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import
org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPMetadataObjectType;
import
org.apache.shardingsphere.mcp.support.database.capability.SupportedMCPStatement;
import
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapability;
import
org.apache.shardingsphere.mcp.support.database.capability.MCPDatabaseCapabilityOption;
import
org.apache.shardingsphere.mcp.support.database.capability.SchemaExecutionSemantics;
import
org.apache.shardingsphere.mcp.support.database.capability.SchemaSemantics;
+import
org.apache.shardingsphere.mcp.support.database.capability.TransactionCapability;
import org.junit.jupiter.api.Test;
import java.util.EnumSet;
@@ -31,17 +31,26 @@ import java.util.Map;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
class MCPDatabaseCapabilityResponseTest {
@Test
void assertToPayload() {
- MCPDatabaseCapability actualCapability = new
MCPDatabaseCapability("logic_db", "8.0.32",
TypedSPILoader.getService(MCPDatabaseCapabilityOption.class, "MySQL"));
+ MCPDatabaseCapabilityOption option =
mock(MCPDatabaseCapabilityOption.class);
+ when(option.getType()).thenReturn("FixtureDB");
+ when(option.isIndexSupported()).thenReturn(true);
+
when(option.getTransactionCapability()).thenReturn(TransactionCapability.LOCAL_WITH_SAVEPOINT);
+
when(option.getDefaultSchemaSemantics()).thenReturn(SchemaSemantics.DATABASE_AS_SCHEMA);
+
when(option.getSchemaExecutionSemantics()).thenReturn(SchemaExecutionSemantics.FIXED_TO_DATABASE);
+ when(option.isExplainAnalyzeSupported("1.0")).thenReturn(true);
+ MCPDatabaseCapability actualCapability = new
MCPDatabaseCapability("logic_db", "1.0", option);
Map<String, Object> actual = new
MCPDatabaseCapabilityResponse(actualCapability).toPayload();
assertThat(actual, is(Map.ofEntries(
Map.entry("response_mode", "detail"),
Map.entry("database", "logic_db"),
- Map.entry("databaseType", "MySQL"),
+ Map.entry("databaseType", "FixtureDB"),
Map.entry("supportedObjectTypes",
EnumSet.of(SupportedMCPMetadataObjectType.SCHEMA,
SupportedMCPMetadataObjectType.TABLE,
SupportedMCPMetadataObjectType.VIEW,
SupportedMCPMetadataObjectType.COLUMN, SupportedMCPMetadataObjectType.INDEX)),
Map.entry("supportedStatementClasses",
EnumSet.of(SupportedMCPStatement.QUERY, SupportedMCPStatement.DML,
SupportedMCPStatement.DDL,
diff --git
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/tool/service/RuntimeDatabaseValidationServiceTest.java
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/tool/service/RuntimeDatabaseValidationServiceTest.java
index 20bb5f984ca..c6745284101 100644
---
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/tool/service/RuntimeDatabaseValidationServiceTest.java
+++
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/tool/service/RuntimeDatabaseValidationServiceTest.java
@@ -199,7 +199,7 @@ class RuntimeDatabaseValidationServiceTest {
}
private static RuntimeDatabaseProfile createProfile() {
- return new RuntimeDatabaseProfile("logic_db", "MySQL", "8.0.36");
+ return new RuntimeDatabaseProfile("logic_db", "FixtureDB", "1.0");
}
private static RuntimeDatabaseConfiguration
createRuntimeDatabaseConfiguration() {
@@ -207,7 +207,7 @@ class RuntimeDatabaseValidationServiceTest {
}
private static MCPDatabaseMetadata createMetadata(final String schemaName)
{
- return new MCPDatabaseMetadata("logic_db", "MySQL", "8.0.36",
List.of(new MCPSchemaMetadata("logic_db", schemaName, List.of(), List.of(),
List.of())));
+ return new MCPDatabaseMetadata("logic_db", "FixtureDB", "1.0",
List.of(new MCPSchemaMetadata("logic_db", schemaName, List.of(), List.of(),
List.of())));
}
private static Map<String, Object> createRecoveryPayload(final
RuntimeDatabaseConnectionException cause) {