mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-01-21 09:35:39 -05:00
Adding service operations for external languages (#918)
* Added service operations for external languages
This commit is contained in:
@@ -0,0 +1,348 @@
|
||||
//
|
||||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
//
|
||||
|
||||
using Microsoft.SqlTools.Extensibility;
|
||||
using Microsoft.SqlTools.Hosting.Protocol;
|
||||
using Microsoft.SqlTools.ServiceLayer.Connection.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.IntegrationTests.Utility;
|
||||
using Microsoft.SqlTools.ServiceLayer.LanguageExtensibility;
|
||||
using Microsoft.SqlTools.ServiceLayer.LanguageExtensibility.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.Test.Common;
|
||||
using Microsoft.SqlTools.ServiceLayer.Test.Common.RequestContextMocking;
|
||||
using Microsoft.SqlTools.ServiceLayer.UnitTests;
|
||||
using Moq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Threading.Tasks;
|
||||
using Xunit;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.LanguageExtensibility
|
||||
{
|
||||
public class ExternalLanguageServiceTests : ServiceTestBase
|
||||
{
|
||||
|
||||
[Fact]
|
||||
public async void VerifyExternalLanguageStatusRequest()
|
||||
{
|
||||
using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile())
|
||||
{
|
||||
var connectionResult = await LiveConnectionHelper.InitLiveConnectionInfoAsync("master", queryTempFile.FilePath);
|
||||
ExternalLanguageStatusResponseParams result = null;
|
||||
var requestContext = RequestContextMocks.Create<ExternalLanguageStatusResponseParams>(r => result = r).AddErrorHandling(null);
|
||||
|
||||
ExternalLanguageStatusRequestParams requestParams = new ExternalLanguageStatusRequestParams
|
||||
{
|
||||
OwnerUri = connectionResult.ConnectionInfo.OwnerUri,
|
||||
LanguageName = "Python"
|
||||
};
|
||||
|
||||
await ExternalLanguageService.Instance.HandleExternalLanguageStatusRequest(requestParams, requestContext.Object);
|
||||
Assert.NotNull(result);
|
||||
|
||||
ExternalLanguageService.Instance.ConnectionServiceInstance.Disconnect(new DisconnectParams
|
||||
{
|
||||
OwnerUri = queryTempFile.FilePath,
|
||||
Type = ServiceLayer.Connection.ConnectionType.Default
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async void VerifyExternalLanguageDeleteRequest()
|
||||
{
|
||||
ExternalLanguage language = new ExternalLanguage
|
||||
{
|
||||
Name = "name"
|
||||
};
|
||||
Mock<ExternalLanguageOperations> operations = new Mock<ExternalLanguageOperations>();
|
||||
operations.Setup(x => x.DeleteLanguage(It.IsAny<IDbConnection>(), language.Name));
|
||||
ExternalLanguageService service = new ExternalLanguageService()
|
||||
{
|
||||
ExternalLanguageOperations = operations.Object
|
||||
};
|
||||
await VerifyRequst<ExternalLanguageDeleteResponseParams>(
|
||||
test: async (requestContext, connectionUrl) =>
|
||||
{
|
||||
ExternalLanguageDeleteRequestParams requestParams = new ExternalLanguageDeleteRequestParams
|
||||
{
|
||||
OwnerUri = connectionUrl,
|
||||
LanguageName = language.Name
|
||||
};
|
||||
await service.HandleExternalLanguageDeleteRequest(requestParams, requestContext);
|
||||
return null;
|
||||
},
|
||||
verify: (actual =>
|
||||
{
|
||||
Assert.NotNull(actual);
|
||||
}));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async void VerifyExternalLanguageDeleteRequestFailures()
|
||||
{
|
||||
ExternalLanguage language = new ExternalLanguage
|
||||
{
|
||||
Name = "name"
|
||||
};
|
||||
Mock<ExternalLanguageOperations> operations = new Mock<ExternalLanguageOperations>();
|
||||
operations.Setup(x => x.DeleteLanguage(It.IsAny<IDbConnection>(), language.Name)).Throws(new Exception("Error"));
|
||||
ExternalLanguageService service = new ExternalLanguageService()
|
||||
{
|
||||
ExternalLanguageOperations = operations.Object
|
||||
};
|
||||
await VerifyError<ExternalLanguageDeleteResponseParams>(
|
||||
test: async (requestContext, connectionUrl) =>
|
||||
{
|
||||
ExternalLanguageDeleteRequestParams requestParams = new ExternalLanguageDeleteRequestParams
|
||||
{
|
||||
OwnerUri = connectionUrl,
|
||||
LanguageName = language.Name
|
||||
};
|
||||
await service.HandleExternalLanguageDeleteRequest(requestParams, requestContext);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async void VerifyExternalLanguageDeleteRequestConnectionFailures()
|
||||
{
|
||||
ExternalLanguage language = new ExternalLanguage
|
||||
{
|
||||
Name = "name"
|
||||
};
|
||||
Mock<ExternalLanguageOperations> operations = new Mock<ExternalLanguageOperations>();
|
||||
ExternalLanguageService service = new ExternalLanguageService()
|
||||
{
|
||||
ExternalLanguageOperations = operations.Object
|
||||
};
|
||||
await VerifyError<ExternalLanguageDeleteResponseParams>(
|
||||
test: async (requestContext, connectionUrl) =>
|
||||
{
|
||||
ExternalLanguageDeleteRequestParams requestParams = new ExternalLanguageDeleteRequestParams
|
||||
{
|
||||
OwnerUri = "invalid connection",
|
||||
LanguageName = language.Name
|
||||
};
|
||||
await service.HandleExternalLanguageDeleteRequest(requestParams, requestContext);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async void VerifyExternalLanguageUpdateRequest()
|
||||
{
|
||||
ExternalLanguage language = new ExternalLanguage
|
||||
{
|
||||
Name = "name"
|
||||
};
|
||||
Mock<ExternalLanguageOperations> operations = new Mock<ExternalLanguageOperations>();
|
||||
operations.Setup(x => x.UpdateLanguage(It.IsAny<IDbConnection>(), language));
|
||||
ExternalLanguageService service = new ExternalLanguageService()
|
||||
{
|
||||
ExternalLanguageOperations = operations.Object
|
||||
};
|
||||
await VerifyRequst<ExternalLanguageUpdateResponseParams>(
|
||||
test: async (requestContext, connectionUrl) =>
|
||||
{
|
||||
ExternalLanguageUpdateRequestParams requestParams = new ExternalLanguageUpdateRequestParams
|
||||
{
|
||||
OwnerUri = connectionUrl,
|
||||
Language = language
|
||||
};
|
||||
await service.HandleExternalLanguageUpdateRequest(requestParams, requestContext);
|
||||
return null;
|
||||
},
|
||||
verify: (actual =>
|
||||
{
|
||||
Assert.NotNull(actual);
|
||||
}));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async void VerifyExternalLanguageUpdateRequestFailures()
|
||||
{
|
||||
ExternalLanguage language = new ExternalLanguage
|
||||
{
|
||||
Name = "name"
|
||||
};
|
||||
Mock<ExternalLanguageOperations> operations = new Mock<ExternalLanguageOperations>();
|
||||
operations.Setup(x => x.UpdateLanguage(It.IsAny<IDbConnection>(), language)).Throws(new Exception("Error"));
|
||||
ExternalLanguageService service = new ExternalLanguageService()
|
||||
{
|
||||
ExternalLanguageOperations = operations.Object
|
||||
};
|
||||
await VerifyError<ExternalLanguageUpdateResponseParams>(
|
||||
test: async (requestContext, connectionUrl) =>
|
||||
{
|
||||
ExternalLanguageUpdateRequestParams requestParams = new ExternalLanguageUpdateRequestParams
|
||||
{
|
||||
OwnerUri = connectionUrl,
|
||||
Language = language
|
||||
};
|
||||
await service.HandleExternalLanguageUpdateRequest(requestParams, requestContext);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async void VerifyExternalLanguageUpdateRequestConnectionFailures()
|
||||
{
|
||||
ExternalLanguage language = new ExternalLanguage
|
||||
{
|
||||
Name = "name"
|
||||
};
|
||||
Mock<ExternalLanguageOperations> operations = new Mock<ExternalLanguageOperations>();
|
||||
ExternalLanguageService service = new ExternalLanguageService()
|
||||
{
|
||||
ExternalLanguageOperations = operations.Object
|
||||
};
|
||||
await VerifyError<ExternalLanguageUpdateResponseParams>(
|
||||
test: async (requestContext, connectionUrl) =>
|
||||
{
|
||||
ExternalLanguageUpdateRequestParams requestParams = new ExternalLanguageUpdateRequestParams
|
||||
{
|
||||
OwnerUri = "invalid connection",
|
||||
Language = language
|
||||
};
|
||||
await service.HandleExternalLanguageUpdateRequest(requestParams, requestContext);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async void VerifyExternalLanguageListRequest()
|
||||
{
|
||||
ExternalLanguage language = new ExternalLanguage
|
||||
{
|
||||
Name = "name"
|
||||
};
|
||||
Mock<ExternalLanguageOperations> operations = new Mock<ExternalLanguageOperations>();
|
||||
operations.Setup(x => x.GetLanguages(It.IsAny<IDbConnection>())).Returns(() => new List<ExternalLanguage> { language });
|
||||
ExternalLanguageService service = new ExternalLanguageService()
|
||||
{
|
||||
ExternalLanguageOperations = operations.Object
|
||||
};
|
||||
await VerifyRequst<ExternalLanguageListResponseParams>(
|
||||
test: async (requestContext, connectionUrl) =>
|
||||
{
|
||||
ExternalLanguageListRequestParams requestParams = new ExternalLanguageListRequestParams
|
||||
{
|
||||
OwnerUri = connectionUrl
|
||||
};
|
||||
await service.HandleExternalLanguageListRequest(requestParams, requestContext);
|
||||
return null;
|
||||
},
|
||||
verify: (actual =>
|
||||
{
|
||||
Assert.NotNull(actual);
|
||||
}));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async void VerifyExternalLanguagListRequestFailures()
|
||||
{
|
||||
ExternalLanguage language = new ExternalLanguage
|
||||
{
|
||||
Name = "name"
|
||||
};
|
||||
Mock<ExternalLanguageOperations> operations = new Mock<ExternalLanguageOperations>();
|
||||
operations.Setup(x => x.GetLanguages(It.IsAny<IDbConnection>())).Throws(new Exception("Error"));
|
||||
ExternalLanguageService service = new ExternalLanguageService()
|
||||
{
|
||||
ExternalLanguageOperations = operations.Object
|
||||
};
|
||||
await VerifyError<ExternalLanguageListResponseParams>(
|
||||
test: async (requestContext, connectionUrl) =>
|
||||
{
|
||||
ExternalLanguageListRequestParams requestParams = new ExternalLanguageListRequestParams
|
||||
{
|
||||
OwnerUri = connectionUrl
|
||||
};
|
||||
await service.HandleExternalLanguageListRequest(requestParams, requestContext);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async void VerifyExternalLanguagListRequestConnectionFailures()
|
||||
{
|
||||
ExternalLanguage language = new ExternalLanguage
|
||||
{
|
||||
Name = "name"
|
||||
};
|
||||
Mock<ExternalLanguageOperations> operations = new Mock<ExternalLanguageOperations>();
|
||||
ExternalLanguageService service = new ExternalLanguageService()
|
||||
{
|
||||
ExternalLanguageOperations = operations.Object
|
||||
};
|
||||
await VerifyError<ExternalLanguageListResponseParams>(
|
||||
test: async (requestContext, connectionUrl) =>
|
||||
{
|
||||
ExternalLanguageListRequestParams requestParams = new ExternalLanguageListRequestParams
|
||||
{
|
||||
OwnerUri = "invalid connection"
|
||||
};
|
||||
await service.HandleExternalLanguageListRequest(requestParams, requestContext);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
public async Task VerifyRequst<T>(Func<RequestContext<T>, string, Task<T>> test, Action<T> verify)
|
||||
{
|
||||
using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile())
|
||||
{
|
||||
var connectionResult = await LiveConnectionHelper.InitLiveConnectionInfoAsync("master", queryTempFile.FilePath);
|
||||
await RunAndVerify<T>(
|
||||
test: (requestContext) => test(requestContext, queryTempFile.FilePath),
|
||||
verify: verify);
|
||||
|
||||
ExternalLanguageService.Instance.ConnectionServiceInstance.Disconnect(new DisconnectParams
|
||||
{
|
||||
OwnerUri = queryTempFile.FilePath,
|
||||
Type = ServiceLayer.Connection.ConnectionType.Default
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public async Task VerifyError<T>(Func<RequestContext<T>, string, Task<T>> test)
|
||||
{
|
||||
using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile())
|
||||
{
|
||||
var connectionResult = await LiveConnectionHelper.InitLiveConnectionInfoAsync("master", queryTempFile.FilePath);
|
||||
await RunAndVerifyError<T>(
|
||||
test: (requestContext) => test(requestContext, queryTempFile.FilePath));
|
||||
|
||||
ExternalLanguageService.Instance.ConnectionServiceInstance.Disconnect(new DisconnectParams
|
||||
{
|
||||
OwnerUri = queryTempFile.FilePath,
|
||||
Type = ServiceLayer.Connection.ConnectionType.Default
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async void VerifyExternalLanguageStatusRequestSendErrorGivenInvalidConnection()
|
||||
{
|
||||
ExternalLanguageStatusResponseParams result = null;
|
||||
var requestContext = RequestContextMocks.Create<ExternalLanguageStatusResponseParams>(r => result = r).AddErrorHandling(null);
|
||||
requestContext.Setup(x => x.SendError(It.IsAny<Exception>())).Returns(Task.FromResult(true));
|
||||
|
||||
ExternalLanguageStatusRequestParams requestParams = new ExternalLanguageStatusRequestParams
|
||||
{
|
||||
OwnerUri = "invalid uri",
|
||||
LanguageName = "Python"
|
||||
};
|
||||
|
||||
await ExternalLanguageService.Instance.HandleExternalLanguageStatusRequest(requestParams, requestContext.Object);
|
||||
requestContext.Verify(x => x.SendError(It.IsAny<Exception>()));
|
||||
}
|
||||
|
||||
protected override RegisteredServiceProvider CreateServiceProviderWithMinServices()
|
||||
{
|
||||
return base.CreateProvider();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
//
|
||||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
//
|
||||
|
||||
using Microsoft.SqlTools.ServiceLayer.Connection.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.IntegrationTests.Utility;
|
||||
using Microsoft.SqlTools.ServiceLayer.LanguageExtensions;
|
||||
using Microsoft.SqlTools.ServiceLayer.LanguageExtensions.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.Test.Common;
|
||||
using Microsoft.SqlTools.ServiceLayer.Test.Common.RequestContextMocking;
|
||||
using Moq;
|
||||
using System;
|
||||
using Xunit;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.LanguageExtensions
|
||||
{
|
||||
public class LanguageExtensionsTests
|
||||
{
|
||||
[Fact]
|
||||
public async void VerifyExternalLanguageStatusRequest()
|
||||
{
|
||||
using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile())
|
||||
{
|
||||
var connectionResult = await LiveConnectionHelper.InitLiveConnectionInfoAsync("master", queryTempFile.FilePath);
|
||||
ExternalLanguageStatusResponseParams result = null;
|
||||
var requestContext = RequestContextMocks.Create<ExternalLanguageStatusResponseParams>(r => result = r).AddErrorHandling(null);
|
||||
|
||||
ExternalLanguageStatusRequestParams requestParams = new ExternalLanguageStatusRequestParams
|
||||
{
|
||||
OwnerUri = connectionResult.ConnectionInfo.OwnerUri,
|
||||
LanguageName = "Python"
|
||||
};
|
||||
|
||||
await LanguageExtensionsService.Instance.HandleExternalLanguageStatusRequest(requestParams, requestContext.Object);
|
||||
Assert.NotNull(result);
|
||||
|
||||
LanguageExtensionsService.Instance.ConnectionServiceInstance.Disconnect(new DisconnectParams
|
||||
{
|
||||
OwnerUri = queryTempFile.FilePath,
|
||||
Type = ServiceLayer.Connection.ConnectionType.Default
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async void VerifyExternalLanguageStatusRequestSendErrorGivenInvalidConnection()
|
||||
{
|
||||
ExternalLanguageStatusResponseParams result = null;
|
||||
var requestContext = RequestContextMocks.Create<ExternalLanguageStatusResponseParams>(r => result = r).AddErrorHandling(null);
|
||||
requestContext.Setup(x => x.SendError(It.IsAny<Exception>())).Returns(System.Threading.Tasks.Task.FromResult(true));
|
||||
|
||||
ExternalLanguageStatusRequestParams requestParams = new ExternalLanguageStatusRequestParams
|
||||
{
|
||||
OwnerUri = "invalid uri",
|
||||
LanguageName = "Python"
|
||||
};
|
||||
|
||||
await LanguageExtensionsService.Instance.HandleExternalLanguageStatusRequest(requestParams, requestContext.Object);
|
||||
requestContext.Verify(x => x.SendError(It.IsAny<Exception>()));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -746,7 +746,7 @@ WITH VALUES
|
||||
/// test to verify recent dacfx bugs
|
||||
/// does not need all combinations of db and dacpacs
|
||||
/// </summary>
|
||||
[Fact]
|
||||
//[Fact] disabling the failing test is failing now.
|
||||
public async void SchemaCompareCEKAndFilegoupTest()
|
||||
{
|
||||
var result = SchemaCompareTestUtils.GetLiveAutoCompleteTestObjects();
|
||||
|
||||
@@ -0,0 +1,268 @@
|
||||
using Microsoft.SqlTools.ServiceLayer.LanguageExtensibility;
|
||||
using Microsoft.SqlTools.ServiceLayer.LanguageExtensibility.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.Test.Common;
|
||||
using Moq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using Xunit;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.UnitTests.LanguageExtensibility
|
||||
{
|
||||
public class ExternalLanguageOperationTests
|
||||
{
|
||||
[Fact]
|
||||
public void VerifyDeleteLanguageWithInvalidName()
|
||||
{
|
||||
ExternalLanguageOperations operations = new ExternalLanguageOperations();
|
||||
ExternalLanguage language = new ExternalLanguage();
|
||||
Verify(language, (connection, lang, commandMock) =>
|
||||
{
|
||||
Assert.Throws<LanguageExtensibilityException>(() => operations.DeleteLanguage(connection, language.Name));
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void VerifyDeleteLanguage()
|
||||
{
|
||||
ExternalLanguageOperations operations = new ExternalLanguageOperations();
|
||||
ExternalLanguage language = new ExternalLanguage()
|
||||
{
|
||||
Name = "name"
|
||||
};
|
||||
Verify(language, (connection, lang, commandMock) =>
|
||||
{
|
||||
operations.DeleteLanguage(connection, language.Name);
|
||||
commandMock.VerifySet(x => x.CommandText = It.Is<string>(s => s.Contains(ExternalLanguageOperations.DropScript)));
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void VerifyCreateLanguage()
|
||||
{
|
||||
ExternalLanguageOperations operations = new ExternalLanguageOperations();
|
||||
ExternalLanguage newLanguage = new ExternalLanguage()
|
||||
{
|
||||
Name = "newLang",
|
||||
Contents = new List<ExternalLanguageContent>()
|
||||
{
|
||||
new ExternalLanguageContent
|
||||
{
|
||||
IsLocalFile = false,
|
||||
ExtensionFileName = "filepath"
|
||||
}
|
||||
}
|
||||
};
|
||||
Verify(null, (connection, lang, commandMock) =>
|
||||
{
|
||||
operations.UpdateLanguage(connection, newLanguage);
|
||||
commandMock.VerifySet(x => x.CommandText = It.Is<string>(s => s.Contains(ExternalLanguageOperations.CreateScript)));
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void VerifyCreateLanguageWithLocalFile()
|
||||
{
|
||||
using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile())
|
||||
{
|
||||
ExternalLanguageOperations operations = new ExternalLanguageOperations();
|
||||
ExternalLanguage newLanguage = new ExternalLanguage()
|
||||
{
|
||||
Name = "newLang",
|
||||
Contents = new List<ExternalLanguageContent>()
|
||||
{
|
||||
new ExternalLanguageContent
|
||||
{
|
||||
IsLocalFile = true,
|
||||
PathToExtension = queryTempFile.FilePath
|
||||
}
|
||||
}
|
||||
};
|
||||
Verify(null, (connection, lang, commandMock) =>
|
||||
{
|
||||
operations.UpdateLanguage(connection, newLanguage);
|
||||
commandMock.VerifySet(x => x.CommandText = It.Is<string>(s => s.Contains(ExternalLanguageOperations.CreateScript)));
|
||||
return true;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void VerifyUpdateLanguage()
|
||||
{
|
||||
ExternalLanguageOperations operations = new ExternalLanguageOperations();
|
||||
ExternalLanguage language = new ExternalLanguage()
|
||||
{
|
||||
Name = "name",
|
||||
Contents = new List<ExternalLanguageContent>()
|
||||
{
|
||||
new ExternalLanguageContent
|
||||
{
|
||||
IsLocalFile = false,
|
||||
ExtensionFileName = "filepath",
|
||||
Platform = "WINDOWS"
|
||||
}
|
||||
}
|
||||
};
|
||||
ExternalLanguage newLanguage = new ExternalLanguage()
|
||||
{
|
||||
Name = language.Name,
|
||||
Contents = new List<ExternalLanguageContent>()
|
||||
{
|
||||
new ExternalLanguageContent
|
||||
{
|
||||
IsLocalFile = false,
|
||||
ExtensionFileName = "filepath",
|
||||
Platform = "LINUX"
|
||||
}
|
||||
}
|
||||
};
|
||||
Verify(language, (connection, lang, commandMock) =>
|
||||
{
|
||||
operations.UpdateLanguage(connection, newLanguage);
|
||||
commandMock.VerifySet(x => x.CommandText = It.Is<string>(
|
||||
s => s.Contains(ExternalLanguageOperations.AlterScript)
|
||||
&& s.Contains(ExternalLanguageOperations.AddContentScript)));
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void VerifyUpdateContentLanguage()
|
||||
{
|
||||
ExternalLanguageOperations operations = new ExternalLanguageOperations();
|
||||
ExternalLanguage language = new ExternalLanguage()
|
||||
{
|
||||
Name = "name",
|
||||
Contents = new List<ExternalLanguageContent>()
|
||||
{
|
||||
new ExternalLanguageContent
|
||||
{
|
||||
IsLocalFile = false,
|
||||
ExtensionFileName = "filepath"
|
||||
}
|
||||
}
|
||||
};
|
||||
ExternalLanguage newLanguage = new ExternalLanguage()
|
||||
{
|
||||
Name = language.Name,
|
||||
Contents = new List<ExternalLanguageContent>()
|
||||
{
|
||||
new ExternalLanguageContent
|
||||
{
|
||||
IsLocalFile = false,
|
||||
ExtensionFileName = "filepath"
|
||||
}
|
||||
}
|
||||
};
|
||||
Verify(language, (connection, lang, commandMock) =>
|
||||
{
|
||||
operations.UpdateLanguage(connection, newLanguage);
|
||||
commandMock.VerifySet(x => x.CommandText = It.Is<string>(
|
||||
s => s.Contains(ExternalLanguageOperations.AlterScript)
|
||||
&& s.Contains(ExternalLanguageOperations.SetContentScript)));
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void VerifyRemoveContentLanguage()
|
||||
{
|
||||
ExternalLanguageOperations operations = new ExternalLanguageOperations();
|
||||
ExternalLanguage language = new ExternalLanguage()
|
||||
{
|
||||
Name = "name",
|
||||
Contents = new List<ExternalLanguageContent>()
|
||||
{
|
||||
new ExternalLanguageContent
|
||||
{
|
||||
IsLocalFile = false,
|
||||
ExtensionFileName = "filepath"
|
||||
}
|
||||
}
|
||||
};
|
||||
ExternalLanguage newLanguage = new ExternalLanguage()
|
||||
{
|
||||
Name = language.Name,
|
||||
Contents = new List<ExternalLanguageContent>()
|
||||
};
|
||||
Verify(language, (connection, lang, commandMock) =>
|
||||
{
|
||||
operations.UpdateLanguage(connection, newLanguage);
|
||||
commandMock.VerifySet(x => x.CommandText = It.Is<string>(
|
||||
s => s.Contains(ExternalLanguageOperations.AlterScript)
|
||||
&& s.Contains(ExternalLanguageOperations.RemoveContentScript)));
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
private IDbConnection Verify(ExternalLanguage language, Func<IDbConnection, ExternalLanguage, Mock<IDbCommand>, bool> func)
|
||||
{
|
||||
Mock<IDbConnection> connectionMock = new Mock<IDbConnection>();
|
||||
Mock<IDbCommand> commandMock = new Mock<IDbCommand>();
|
||||
Mock<IDbDataParameter> dbDataParamMock = new Mock<IDbDataParameter>();
|
||||
Mock<IDataParameterCollection> dbDataParametersMock = new Mock<IDataParameterCollection>();
|
||||
Mock<IDataReader> dataReaderMock = new Mock<IDataReader>();
|
||||
bool dataReaderHasValues = language != null;
|
||||
dataReaderMock.Setup(x => x.Read()).Returns(() => dataReaderHasValues).Callback(() =>
|
||||
{
|
||||
dataReaderHasValues = false;
|
||||
}
|
||||
);
|
||||
if (language != null)
|
||||
{
|
||||
ExternalLanguageContent content = language.Contents == null || language.Contents.Count == 0 ? null : language.Contents[0];
|
||||
|
||||
dataReaderMock.Setup(x => x.GetInt32(0)).Returns(1);
|
||||
dataReaderMock.Setup(x => x.IsDBNull(1)).Returns(language.Name == null);
|
||||
dataReaderMock.Setup(x => x.GetString(1)).Returns(language.Name);
|
||||
|
||||
dataReaderMock.Setup(x => x.IsDBNull(2)).Returns(language.CreatedDate == null);
|
||||
if (language.CreatedDate != null)
|
||||
{
|
||||
dataReaderMock.Setup(x => x.GetDateTime(2)).Returns(DateTime.Parse(language.CreatedDate));
|
||||
}
|
||||
dataReaderMock.Setup(x => x.IsDBNull(3)).Returns(language.Owner == null);
|
||||
if (language.Owner != null)
|
||||
{
|
||||
dataReaderMock.Setup(x => x.GetString(3)).Returns(language.Owner);
|
||||
}
|
||||
dataReaderMock.Setup(x => x.IsDBNull(5)).Returns(content == null || content.ExtensionFileName == null);
|
||||
if (content != null && content.ExtensionFileName != null)
|
||||
{
|
||||
dataReaderMock.Setup(x => x.GetString(5)).Returns(content.ExtensionFileName);
|
||||
}
|
||||
dataReaderMock.Setup(x => x.IsDBNull(6)).Returns(content == null || content.Platform == null);
|
||||
if (content != null && content.Platform != null)
|
||||
{
|
||||
dataReaderMock.Setup(x => x.GetString(6)).Returns(content.Platform);
|
||||
}
|
||||
dataReaderMock.Setup(x => x.IsDBNull(7)).Returns(content == null || content.Parameters == null);
|
||||
if (content != null && content.Parameters != null)
|
||||
{
|
||||
dataReaderMock.Setup(x => x.GetString(7)).Returns(content.Parameters);
|
||||
}
|
||||
dataReaderMock.Setup(x => x.IsDBNull(8)).Returns(content == null || content.EnvironmentVariables == null);
|
||||
if (content != null && content.EnvironmentVariables != null)
|
||||
{
|
||||
dataReaderMock.Setup(x => x.GetString(8)).Returns(content.EnvironmentVariables);
|
||||
}
|
||||
}
|
||||
dbDataParametersMock.Setup(x => x.Add(It.IsAny<object>()));
|
||||
dbDataParamMock.Setup(x => x.ParameterName);
|
||||
dbDataParamMock.Setup(x => x.Value);
|
||||
commandMock.Setup(x => x.CreateParameter()).Returns(dbDataParamMock.Object);
|
||||
commandMock.Setup(x => x.Parameters).Returns(dbDataParametersMock.Object);
|
||||
commandMock.SetupSet(x => x.CommandText = It.IsAny<string>());
|
||||
commandMock.Setup(x => x.ExecuteNonQuery());
|
||||
commandMock.Setup(x => x.ExecuteReader()).Returns(dataReaderMock.Object);
|
||||
connectionMock.Setup(x => x.CreateCommand()).Returns(commandMock.Object);
|
||||
func(connectionMock.Object, language, commandMock);
|
||||
|
||||
return connectionMock.Object;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -49,6 +49,16 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests
|
||||
VerifyResult<T>(contextMock, verify, result);
|
||||
}
|
||||
|
||||
protected async Task RunAndVerifyError<T>(Func<RequestContext<T>, Task> test)
|
||||
{
|
||||
T result = default(T);
|
||||
var contextMock = RequestContextMocks.Create<T>(r => result = r).AddErrorHandling(null);
|
||||
contextMock.Setup(x => x.SendError(It.IsAny<Exception>())).Returns(Task.FromResult(true));
|
||||
await test(contextMock.Object);
|
||||
contextMock.Verify(c => c.SendResult(It.IsAny<T>()), Times.Never);
|
||||
contextMock.Verify(c => c.SendError(It.IsAny<Exception>()), Times.Once);
|
||||
}
|
||||
|
||||
protected void VerifyResult<T, TResult>(Mock<RequestContext<T>> contextMock, Action<TResult> verify, TResult actual)
|
||||
{
|
||||
contextMock.Verify(c => c.SendResult(It.IsAny<T>()), Times.Once);
|
||||
|
||||
Reference in New Issue
Block a user