extend the list databases request (#951)

* extend the list databases request

* reuse databaseInfo and refactor

* fix typo
This commit is contained in:
Alan Ren
2020-04-28 16:12:56 -07:00
committed by GitHub
parent 96df91c8fa
commit 8f6662b019
6 changed files with 369 additions and 71 deletions

View File

@@ -20,6 +20,7 @@ using Moq;
using Moq.Protected;
using Xunit;
using System.Linq;
using Microsoft.SqlTools.ServiceLayer.Admin.Contracts;
namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
{
@@ -144,7 +145,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
// Given a second connection that succeeds
var mockConnection2 = new Mock<DbConnection> { CallBase = true };
mockConnection2.Setup(x => x.OpenAsync(It.IsAny<CancellationToken>()))
.Returns(() => Task.Run(() => {}));
.Returns(() => Task.Run(() => { }));
var mockFactory = new Mock<ISqlConnectionFactory>();
mockFactory.SetupSequence(factory => factory.CreateSqlConnection(It.IsAny<string>(), It.IsAny<string>()))
@@ -338,7 +339,8 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
// register disconnect callback
connectionService.RegisterOnDisconnectTask(
(result, uri) => {
(result, uri) =>
{
callbackInvoked = true;
Assert.True(uri.Equals(ownerUri));
return Task.FromResult(true);
@@ -431,7 +433,8 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
.Connect(new ConnectParams()
{
OwnerUri = ownerUri,
Connection = new ConnectionDetails() {
Connection = new ConnectionDetails()
{
ServerName = server,
DatabaseName = database,
UserName = userName,
@@ -465,7 +468,8 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
.Connect(new ConnectParams()
{
OwnerUri = "file:///my/test/file.sql",
Connection = new ConnectionDetails() {
Connection = new ConnectionDetails()
{
ServerName = "my-server",
DatabaseName = "test",
UserName = userName,
@@ -761,7 +765,8 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
// register disconnect callback
connectionService.RegisterOnDisconnectTask(
(result, uri) => {
(result, uri) =>
{
callbackInvoked = true;
Assert.True(uri.Equals(ownerUri));
return Task.FromResult(true);
@@ -853,28 +858,12 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
Assert.False(disconnectResult);
}
/// <summary>
/// Verifies the the list databases operation lists database names for the server used by a connection.
/// </summary>
[Fact]
public async Task ListDatabasesOnServerForCurrentConnectionReturnsDatabaseNames()
private async Task<ListDatabasesResponse> RunListDatabasesRequestHandler(TestResultSet testdata, bool? includeDetails)
{
// Result set for the query of database names
TestDbColumn[] cols = {new TestDbColumn("name")};
object[][] rows =
{
new object[] {"master"},
new object[] {"model"},
new object[] {"msdb"},
new object[] {"tempdb"},
new object[] {"mydatabase"}
};
TestResultSet data = new TestResultSet(cols, rows);
// Setup mock connection factory to inject query results
var mockFactory = new Mock<ISqlConnectionFactory>();
mockFactory.Setup(factory => factory.CreateSqlConnection(It.IsAny<string>(), It.IsAny<string>()))
.Returns(CreateMockDbConnection(new[] {data}));
.Returns(CreateMockDbConnection(new[] { testdata }));
var connectionService = new ConnectionService(mockFactory.Object);
// connect to a database instance
@@ -891,9 +880,34 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
Assert.NotEmpty(connectionResult.ConnectionId);
// list databases for the connection
ListDatabasesParams parameters = new ListDatabasesParams {OwnerUri = ownerUri};
var listDatabasesResult = connectionService.ListDatabases(parameters);
string[] databaseNames = listDatabasesResult.DatabaseNames;
ListDatabasesParams parameters = new ListDatabasesParams
{
OwnerUri = ownerUri,
IncludeDetails = includeDetails
};
return connectionService.ListDatabases(parameters);
}
/// <summary>
/// Verifies the the list databases operation lists database names for the server used by a connection.
/// </summary>
[Fact]
public async Task ListDatabasesOnServerForCurrentConnectionReturnsDatabaseNames()
{
// Result set for the query of database names
TestDbColumn[] cols = { new TestDbColumn("name") };
object[][] rows =
{
new object[] {"mydatabase"}, // this should be sorted to the end in the response
new object[] {"master"},
new object[] {"model"},
new object[] {"msdb"},
new object[] {"tempdb"}
};
TestResultSet data = new TestResultSet(cols, rows);
var response = await RunListDatabasesRequestHandler(testdata: data, includeDetails: null);
string[] databaseNames = response.DatabaseNames;
Assert.Equal(databaseNames.Length, 5);
Assert.Equal(databaseNames[0], "master");
@@ -903,6 +917,79 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
Assert.Equal(databaseNames[4], "mydatabase");
}
/// <summary>
/// Verifies the the list databases operation lists database names for the server used by a connection.
/// </summary>
[Fact]
public async Task ListDatabasesOnServerForCurrentConnectionReturnsDatabaseDetails()
{
// Result set for the query of database names
TestDbColumn[] cols = {
new TestDbColumn("name"),
new TestDbColumn("state"),
new TestDbColumn("size"),
new TestDbColumn("last_backup")
};
object[][] rows =
{
new object[] {"mydatabase", "Online", "10", "2010-01-01 11:11:11"}, // this should be sorted to the end in the response
new object[] {"master", "Online", "11", "2010-01-01 11:11:12"},
new object[] {"model", "Offline", "12", "2010-01-01 11:11:13"},
new object[] {"msdb", "Online", "13", "2010-01-01 11:11:14"},
new object[] {"tempdb", "Online", "14", "2010-01-01 11:11:15"}
};
TestResultSet data = new TestResultSet(cols, rows);
var response = await RunListDatabasesRequestHandler(testdata: data, includeDetails: true);
Assert.Equal(response.Databases.Length, 5);
VerifyDatabaseDetail(rows[0], response.Databases[4]);
VerifyDatabaseDetail(rows[1], response.Databases[0]);
VerifyDatabaseDetail(rows[2], response.Databases[1]);
VerifyDatabaseDetail(rows[3], response.Databases[2]);
VerifyDatabaseDetail(rows[4], response.Databases[3]);
}
private void VerifyDatabaseDetail(object[] expected, DatabaseInfo actual)
{
Assert.Equal(expected[0], actual.Options[ListDatabasesRequestDatabaseProperties.Name]);
Assert.Equal(expected[1], actual.Options[ListDatabasesRequestDatabaseProperties.State]);
Assert.Equal(expected[2], actual.Options[ListDatabasesRequestDatabaseProperties.SizeInMB]);
Assert.Equal(expected[3], actual.Options[ListDatabasesRequestDatabaseProperties.LastBackup]);
}
/// <summary>
/// Verify that the factory is returning DatabaseNamesHandler
/// </summary>
[Fact]
public void ListDatabaseRequestFactoryReturnsDatabaseNamesHandler()
{
var handler = ListDatabaseRequestHandlerFactory.getHandler(includeDetails: false, isSqlDB: true);
Assert.IsType(typeof(DatabaseNamesHandler), handler);
handler = ListDatabaseRequestHandlerFactory.getHandler(includeDetails: false, isSqlDB: false);
Assert.IsType(typeof(DatabaseNamesHandler), handler);
}
/// <summary>
/// Verify that the factory is returning SqlDBDatabaseDetailHandler
/// </summary>
[Fact]
public void ListDatabaseRequestFactoryReturnsSqlDBHandler()
{
var handler = ListDatabaseRequestHandlerFactory.getHandler(includeDetails: true, isSqlDB: true);
Assert.IsType(typeof(SqlDBDatabaseDetailHandler), handler);
}
/// <summary>
/// Verify that the factory is returning SqlServerDatabaseDetailHandler
/// </summary>
[Fact]
public void ListDatabaseRequestFactoryReturnsSqlServerHandler()
{
var handler = ListDatabaseRequestHandlerFactory.getHandler(includeDetails: true, isSqlDB: false);
Assert.IsType(typeof(SqlServerDatabaseDetailHandler), handler);
}
/// <summary>
/// Verify that the SQL parser correctly detects errors in text
/// </summary>
@@ -914,7 +1001,8 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
// setup connection service with callback
var connectionService = TestObjects.GetTestConnectionService();
connectionService.RegisterOnConnectionTask(
(sqlConnection) => {
(sqlConnection) =>
{
callbackInvoked = true;
return Task.FromResult(true);
}
@@ -1048,7 +1136,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
/// Test that the connection summary comparer creates a hash code correctly
/// </summary>
[Theory]
[InlineData(true, null, null ,null)]
[InlineData(true, null, null, null)]
[InlineData(false, null, null, null)]
[InlineData(false, null, null, "sa")]
[InlineData(false, null, "test", null)]
@@ -1586,7 +1674,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
[Fact]
public async void ConnectingWithAzureAccountUsesToken()
{
// Set up mock connection factory
// Set up mock connection factory
var mockFactory = new Mock<ISqlConnectionFactory>();
mockFactory.Setup(factory => factory.CreateSqlConnection(It.IsAny<string>(), It.IsAny<string>()))
.Returns(new TestSqlConnection(null));