mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-02-17 02:51:45 -05:00
Fix the OE service where returns database as the root node for database connection (#322)
* Fix the OE service where retuns database as the root node if the connection contains database name * Fix OE tests * addressed the comments * addresses comment * fix OE test and add more tests * fix VerifyAdventureWorksDatabaseObjects test
This commit is contained in:
@@ -346,8 +346,20 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
|
|||||||
|
|
||||||
public static ObjectExplorerSession CreateSession(ConnectionCompleteParams response, IMultiServiceProvider serviceProvider)
|
public static ObjectExplorerSession CreateSession(ConnectionCompleteParams response, IMultiServiceProvider serviceProvider)
|
||||||
{
|
{
|
||||||
TreeNode serverNode = new ServerNode(response, serviceProvider);
|
TreeNode rootNode = new ServerNode(response, serviceProvider);
|
||||||
return new ObjectExplorerSession(response.OwnerUri, serverNode, serviceProvider, serviceProvider.GetService<ConnectionService>());
|
var session = new ObjectExplorerSession(response.OwnerUri, rootNode, serviceProvider, serviceProvider.GetService<ConnectionService>());
|
||||||
|
if (!ObjectExplorerUtils.IsSystemDatabaseConnection(response.ConnectionSummary.DatabaseName))
|
||||||
|
{
|
||||||
|
// Assuming the databases are in a folder under server node
|
||||||
|
var children = rootNode.Expand();
|
||||||
|
var databasesRoot = children.FirstOrDefault(x => x.NodeTypeId == NodeTypes.Databases);
|
||||||
|
var databasesChildren = databasesRoot.Expand();
|
||||||
|
var databases = databasesChildren.Where(x => x.NodeType == NodeTypes.Database.ToString());
|
||||||
|
var databaseNode = databases.FirstOrDefault(d => d.Label == response.ConnectionSummary.DatabaseName);
|
||||||
|
databaseNode.Label = rootNode.Label;
|
||||||
|
session.Root = databaseNode;
|
||||||
|
}
|
||||||
|
return session;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes;
|
using Microsoft.SqlTools.ServiceLayer.ObjectExplorer.Nodes;
|
||||||
|
using Microsoft.SqlTools.ServiceLayer.Utility;
|
||||||
|
|
||||||
namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
|
namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
|
||||||
{
|
{
|
||||||
@@ -72,5 +73,19 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check if the database is a system database
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="databaseName">the name of database</param>
|
||||||
|
/// <returns>return true if the database is a system database</returns>
|
||||||
|
public static bool IsSystemDatabaseConnection(string databaseName)
|
||||||
|
{
|
||||||
|
return (string.IsNullOrWhiteSpace(databaseName) ||
|
||||||
|
string.Compare(databaseName, CommonConstants.MasterDatabaseName, StringComparison.OrdinalIgnoreCase) == 0 ||
|
||||||
|
string.Compare(databaseName, CommonConstants.MsdbDatabaseName, StringComparison.OrdinalIgnoreCase) == 0 ||
|
||||||
|
string.Compare(databaseName, CommonConstants.ModelDatabaseName, StringComparison.OrdinalIgnoreCase) == 0 ||
|
||||||
|
string.Compare(databaseName, CommonConstants.TempDbDatabaseName, StringComparison.OrdinalIgnoreCase) == 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,12 +86,17 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer.SmoModel
|
|||||||
|
|
||||||
// TODO Consider adding IsAuthenticatingDatabaseMaster check in the code and
|
// TODO Consider adding IsAuthenticatingDatabaseMaster check in the code and
|
||||||
// referencing result here
|
// referencing result here
|
||||||
if (!string.IsNullOrWhiteSpace(connectionSummary.DatabaseName) &&
|
if (!ObjectExplorerUtils.IsSystemDatabaseConnection(connectionSummary.DatabaseName))
|
||||||
string.Compare(connectionSummary.DatabaseName, CommonConstants.MasterDatabaseName, StringComparison.OrdinalIgnoreCase) != 0 &&
|
|
||||||
(serverInfo.IsCloud /* || !ci.IsAuthenticatingDatabaseMaster */))
|
|
||||||
{
|
{
|
||||||
// We either have an azure with a database specified or a Denali database using a contained user
|
// We either have an azure with a database specified or a Denali database using a contained user
|
||||||
userName += ", " + connectionSummary.DatabaseName;
|
if (string.IsNullOrWhiteSpace(userName))
|
||||||
|
{
|
||||||
|
userName = connectionSummary.DatabaseName;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
userName += ", " + connectionSummary.DatabaseName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
string label;
|
string label;
|
||||||
|
|||||||
@@ -23,15 +23,43 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectExplorer
|
|||||||
private ObjectExplorerService _service = TestServiceProvider.Instance.ObjectExplorerService;
|
private ObjectExplorerService _service = TestServiceProvider.Instance.ObjectExplorerService;
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async void CreateSessionAndExpandOnTheServerShouldReturnTheDatabases()
|
public async void CreateSessionAndExpandOnTheServerShouldReturnServerAsTheRoot()
|
||||||
{
|
{
|
||||||
var query = "";
|
var query = "";
|
||||||
string uri = "CreateSessionAndExpand";
|
string uri = "CreateSessionAndExpandServer";
|
||||||
|
string databaseName = null;
|
||||||
|
using (SqlTestDb testDb = SqlTestDb.CreateNew(TestServerType.OnPrem, false, databaseName, query, uri))
|
||||||
|
{
|
||||||
|
var session = await CreateSession(null, uri);
|
||||||
|
await ExpandServerNodeAndVerifyDatabaseHierachy(testDb.DatabaseName, session);
|
||||||
|
CancelConnection(uri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async void CreateSessionWithTempdbAndExpandOnTheServerShouldReturnServerAsTheRoot()
|
||||||
|
{
|
||||||
|
var query = "";
|
||||||
|
string uri = "CreateSessionAndExpandServer";
|
||||||
|
string databaseName = null;
|
||||||
|
using (SqlTestDb testDb = SqlTestDb.CreateNew(TestServerType.OnPrem, false, databaseName, query, uri))
|
||||||
|
{
|
||||||
|
var session = await CreateSession("tempdb", uri);
|
||||||
|
await ExpandServerNodeAndVerifyDatabaseHierachy(testDb.DatabaseName, session);
|
||||||
|
CancelConnection(uri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async void CreateSessionAndExpandOnTheDatabaseShouldReturnDatabaseAsTheRoot()
|
||||||
|
{
|
||||||
|
var query = "";
|
||||||
|
string uri = "CreateSessionAndExpandDatabase";
|
||||||
string databaseName = null;
|
string databaseName = null;
|
||||||
using (SqlTestDb testDb = SqlTestDb.CreateNew(TestServerType.OnPrem, false, databaseName, query, uri))
|
using (SqlTestDb testDb = SqlTestDb.CreateNew(TestServerType.OnPrem, false, databaseName, query, uri))
|
||||||
{
|
{
|
||||||
var session = await CreateSession(testDb.DatabaseName, uri);
|
var session = await CreateSession(testDb.DatabaseName, uri);
|
||||||
await CreateSessionAndDatabaseNode(testDb.DatabaseName, session);
|
ExpandAndVerifyDatabaseNode(testDb.DatabaseName, session);
|
||||||
CancelConnection(uri);
|
CancelConnection(uri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -44,7 +72,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectExplorer
|
|||||||
return await _service.DoCreateSession(details, uri);
|
return await _service.DoCreateSession(details, uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<NodeInfo> CreateSessionAndDatabaseNode(string databaseName, ObjectExplorerSession session)
|
private async Task<NodeInfo> ExpandServerNodeAndVerifyDatabaseHierachy(string databaseName, ObjectExplorerSession session)
|
||||||
{
|
{
|
||||||
Assert.NotNull(session);
|
Assert.NotNull(session);
|
||||||
Assert.NotNull(session.Root);
|
Assert.NotNull(session.Root);
|
||||||
@@ -70,6 +98,26 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectExplorer
|
|||||||
return databaseNode;
|
return databaseNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ExpandAndVerifyDatabaseNode(string databaseName, ObjectExplorerSession session)
|
||||||
|
{
|
||||||
|
Assert.NotNull(session);
|
||||||
|
Assert.NotNull(session.Root);
|
||||||
|
NodeInfo nodeInfo = session.Root.ToNodeInfo();
|
||||||
|
Assert.Equal(nodeInfo.IsLeaf, false);
|
||||||
|
Assert.Equal(nodeInfo.NodeType, NodeTypes.Database.ToString());
|
||||||
|
Assert.True(nodeInfo.Label.Contains(databaseName));
|
||||||
|
var children = session.Root.Expand();
|
||||||
|
|
||||||
|
//All server children should be folder nodes
|
||||||
|
foreach (var item in children)
|
||||||
|
{
|
||||||
|
Assert.Equal(item.NodeType, "Folder");
|
||||||
|
}
|
||||||
|
|
||||||
|
var tablesRoot = children.FirstOrDefault(x => x.NodeTypeId == NodeTypes.Tables);
|
||||||
|
Assert.NotNull(tablesRoot);
|
||||||
|
}
|
||||||
|
|
||||||
private void CancelConnection(string uri)
|
private void CancelConnection(string uri)
|
||||||
{
|
{
|
||||||
//ConnectionService.Instance.CancelConnect(new CancelConnectParams
|
//ConnectionService.Instance.CancelConnect(new CancelConnectParams
|
||||||
@@ -129,8 +177,8 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectExplorer
|
|||||||
|
|
||||||
using (SqlTestDb testDb = SqlTestDb.CreateNew(TestServerType.OnPrem, false, databaseName, query, uri))
|
using (SqlTestDb testDb = SqlTestDb.CreateNew(TestServerType.OnPrem, false, databaseName, query, uri))
|
||||||
{
|
{
|
||||||
var session = await CreateSession(testDb.DatabaseName, uri);
|
var session = await CreateSession(null, uri);
|
||||||
var databaseNodeInfo = await CreateSessionAndDatabaseNode(testDb.DatabaseName, session);
|
var databaseNodeInfo = await ExpandServerNodeAndVerifyDatabaseHierachy(testDb.DatabaseName, session);
|
||||||
await ExpandTree(databaseNodeInfo, session);
|
await ExpandTree(databaseNodeInfo, session);
|
||||||
CancelConnection(uri);
|
CancelConnection(uri);
|
||||||
}
|
}
|
||||||
@@ -146,7 +194,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectExplorer
|
|||||||
using (SqlTestDb testDb = SqlTestDb.CreateNew(TestServerType.OnPrem, false, databaseName, query, uri))
|
using (SqlTestDb testDb = SqlTestDb.CreateNew(TestServerType.OnPrem, false, databaseName, query, uri))
|
||||||
{
|
{
|
||||||
var session = await CreateSession(testDb.DatabaseName, uri);
|
var session = await CreateSession(testDb.DatabaseName, uri);
|
||||||
var databaseNodeInfo = await CreateSessionAndDatabaseNode(testDb.DatabaseName, session);
|
var databaseNodeInfo = await ExpandServerNodeAndVerifyDatabaseHierachy(testDb.DatabaseName, session);
|
||||||
await ExpandTree(databaseNodeInfo, session);
|
await ExpandTree(databaseNodeInfo, session);
|
||||||
CancelConnection(uri);
|
CancelConnection(uri);
|
||||||
}
|
}
|
||||||
@@ -162,7 +210,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectExplorer
|
|||||||
using (SqlTestDb testDb = SqlTestDb.CreateNew(TestServerType.OnPrem, false, databaseName, query, uri))
|
using (SqlTestDb testDb = SqlTestDb.CreateNew(TestServerType.OnPrem, false, databaseName, query, uri))
|
||||||
{
|
{
|
||||||
var session = await CreateSession(testDb.DatabaseName, uri);
|
var session = await CreateSession(testDb.DatabaseName, uri);
|
||||||
var databaseNodeInfo = await CreateSessionAndDatabaseNode(testDb.DatabaseName, session);
|
var databaseNodeInfo = await ExpandServerNodeAndVerifyDatabaseHierachy(testDb.DatabaseName, session);
|
||||||
await ExpandTree(databaseNodeInfo, session);
|
await ExpandTree(databaseNodeInfo, session);
|
||||||
CancelConnection(uri);
|
CancelConnection(uri);
|
||||||
}
|
}
|
||||||
@@ -178,7 +226,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectExplorer
|
|||||||
using (SqlTestDb testDb = SqlTestDb.CreateNew(TestServerType.OnPrem, false, databaseName, query, uri))
|
using (SqlTestDb testDb = SqlTestDb.CreateNew(TestServerType.OnPrem, false, databaseName, query, uri))
|
||||||
{
|
{
|
||||||
var session = await CreateSession(testDb.DatabaseName, uri);
|
var session = await CreateSession(testDb.DatabaseName, uri);
|
||||||
var databaseNodeInfo = await CreateSessionAndDatabaseNode(testDb.DatabaseName, session);
|
var databaseNodeInfo = await ExpandServerNodeAndVerifyDatabaseHierachy(testDb.DatabaseName, session);
|
||||||
await ExpandTree(databaseNodeInfo, session);
|
await ExpandTree(databaseNodeInfo, session);
|
||||||
CancelConnection(uri);
|
CancelConnection(uri);
|
||||||
}
|
}
|
||||||
@@ -194,7 +242,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.ObjectExplorer
|
|||||||
using (SqlTestDb testDb = SqlTestDb.CreateNew(TestServerType.OnPrem, false, databaseName, query, uri))
|
using (SqlTestDb testDb = SqlTestDb.CreateNew(TestServerType.OnPrem, false, databaseName, query, uri))
|
||||||
{
|
{
|
||||||
var session = await CreateSession(testDb.DatabaseName, uri);
|
var session = await CreateSession(testDb.DatabaseName, uri);
|
||||||
var databaseNodeInfo = await CreateSessionAndDatabaseNode(testDb.DatabaseName, session);
|
var databaseNodeInfo = await ExpandServerNodeAndVerifyDatabaseHierachy(testDb.DatabaseName, session);
|
||||||
await ExpandTree(databaseNodeInfo, session);
|
await ExpandTree(databaseNodeInfo, session);
|
||||||
CancelConnection(uri);
|
CancelConnection(uri);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -347,7 +347,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.ObjectExplorer
|
|||||||
TreeNode databases = children[0];
|
TreeNode databases = children[0];
|
||||||
IList<TreeNode> dbChildren = databases.Expand();
|
IList<TreeNode> dbChildren = databases.Expand();
|
||||||
Assert.Equal(2, dbChildren.Count);
|
Assert.Equal(2, dbChildren.Count);
|
||||||
Assert.Equal("System Databases", dbChildren[0].NodeValue);
|
Assert.Equal(SR.SchemaHierarchy_SystemDatabases, dbChildren[0].NodeValue);
|
||||||
|
|
||||||
TreeNode dbNode = dbChildren[1];
|
TreeNode dbNode = dbChildren[1];
|
||||||
Assert.Equal(dbName, dbNode.NodeValue);
|
Assert.Equal(dbName, dbNode.NodeValue);
|
||||||
|
|||||||
@@ -75,10 +75,49 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.ObjectExplorer
|
|||||||
|
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task CreateSessionRequestReturnsSuccessAndNodeInfo()
|
public async Task CreateSessionRequestWithMasterConnectionReturnsServerSuccessAndNodeInfo()
|
||||||
{
|
{
|
||||||
// Given the connection service fails to connect
|
// Given the connection service fails to connect
|
||||||
ConnectionDetails details = TestObjects.GetTestConnectionDetails();
|
ConnectionDetails details = new ConnectionDetails()
|
||||||
|
{
|
||||||
|
UserName = "user",
|
||||||
|
Password = "password",
|
||||||
|
DatabaseName = "master",
|
||||||
|
ServerName = "serverName"
|
||||||
|
};
|
||||||
|
await CreateSessionRequestAndVerifyServerNodeHelper(details);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task CreateSessionRequestWithEmptyConnectionReturnsServerSuccessAndNodeInfo()
|
||||||
|
{
|
||||||
|
// Given the connection service fails to connect
|
||||||
|
ConnectionDetails details = new ConnectionDetails()
|
||||||
|
{
|
||||||
|
UserName = "user",
|
||||||
|
Password = "password",
|
||||||
|
DatabaseName = "",
|
||||||
|
ServerName = "serverName"
|
||||||
|
};
|
||||||
|
await CreateSessionRequestAndVerifyServerNodeHelper(details);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task CreateSessionRequestWithMsdbConnectionReturnsServerSuccessAndNodeInfo()
|
||||||
|
{
|
||||||
|
// Given the connection service fails to connect
|
||||||
|
ConnectionDetails details = new ConnectionDetails()
|
||||||
|
{
|
||||||
|
UserName = "user",
|
||||||
|
Password = "password",
|
||||||
|
DatabaseName = "msdb",
|
||||||
|
ServerName = "serverName"
|
||||||
|
};
|
||||||
|
await CreateSessionRequestAndVerifyServerNodeHelper(details);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task CreateSessionRequestAndVerifyServerNodeHelper(ConnectionDetails details)
|
||||||
|
{
|
||||||
serviceHostMock.AddEventHandling(ConnectionCompleteNotification.Type, null);
|
serviceHostMock.AddEventHandling(ConnectionCompleteNotification.Type, null);
|
||||||
|
|
||||||
connectionServiceMock.Setup(c => c.Connect(It.IsAny<ConnectParams>()))
|
connectionServiceMock.Setup(c => c.Connect(It.IsAny<ConnectParams>()))
|
||||||
|
|||||||
Reference in New Issue
Block a user