// // 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 NUnit.Framework; namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.LanguageExtensibility { public class ExternalLanguageServiceTests : ServiceTestBase { [Test] public async Task VerifyExternalLanguageStatusRequest() { using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile()) { var connectionResult = await LiveConnectionHelper.InitLiveConnectionInfoAsync("master", queryTempFile.FilePath); ExternalLanguageStatusResponseParams result = null; var requestContext = RequestContextMocks.Create(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 }); } } [Test] public async Task VerifyExternalLanguageDeleteRequest() { ExternalLanguage language = new ExternalLanguage { Name = "name" }; Mock operations = new Mock(); operations.Setup(x => x.DeleteLanguage(It.IsAny(), language.Name)); ExternalLanguageService service = new ExternalLanguageService() { ExternalLanguageOperations = operations.Object }; await VerifyRequst( 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); })); } [Test] public async Task VerifyExternalLanguageDeleteRequestFailures() { ExternalLanguage language = new ExternalLanguage { Name = "name" }; Mock operations = new Mock(); operations.Setup(x => x.DeleteLanguage(It.IsAny(), language.Name)).Throws(new Exception("Error")); ExternalLanguageService service = new ExternalLanguageService() { ExternalLanguageOperations = operations.Object }; using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile()) { var connectionResult = await LiveConnectionHelper.InitLiveConnectionInfoAsync("master", queryTempFile.FilePath); var requestContext = RequestContextMocks.Create(r => { }); ExternalLanguageDeleteRequestParams requestParams = new ExternalLanguageDeleteRequestParams { OwnerUri = queryTempFile.FilePath, LanguageName = language.Name }; Assert.That(() => service.HandleExternalLanguageDeleteRequest(requestParams, requestContext.Object), Throws.Exception); } } [Test] public async Task VerifyExternalLanguageDeleteRequestConnectionFailures() { ExternalLanguage language = new ExternalLanguage { Name = "name" }; Mock operations = new Mock(); ExternalLanguageService service = new ExternalLanguageService() { ExternalLanguageOperations = operations.Object }; await VerifyError( test: async (requestContext, connectionUrl) => { ExternalLanguageDeleteRequestParams requestParams = new ExternalLanguageDeleteRequestParams { OwnerUri = "invalid connection", LanguageName = language.Name }; await service.HandleExternalLanguageDeleteRequest(requestParams, requestContext); return null; }); } [Test] public async Task VerifyExternalLanguageUpdateRequest() { ExternalLanguage language = new ExternalLanguage { Name = "name" }; Mock operations = new Mock(); operations.Setup(x => x.UpdateLanguage(It.IsAny(), language)); ExternalLanguageService service = new ExternalLanguageService() { ExternalLanguageOperations = operations.Object }; await VerifyRequst( test: async (requestContext, connectionUrl) => { ExternalLanguageUpdateRequestParams requestParams = new ExternalLanguageUpdateRequestParams { OwnerUri = connectionUrl, Language = language }; await service.HandleExternalLanguageUpdateRequest(requestParams, requestContext); return null; }, verify: (actual => { Assert.NotNull(actual); })); } [Test] public async Task VerifyExternalLanguageUpdateRequestFailures() { ExternalLanguage language = new ExternalLanguage { Name = "name" }; Mock operations = new Mock(); operations.Setup(x => x.UpdateLanguage(It.IsAny(), language)).Throws(new Exception("Error")); ExternalLanguageService service = new ExternalLanguageService() { ExternalLanguageOperations = operations.Object }; using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile()) { var connectionResult = await LiveConnectionHelper.InitLiveConnectionInfoAsync("master", queryTempFile.FilePath); var requestContext = RequestContextMocks.Create(r => { }); ExternalLanguageUpdateRequestParams requestParams = new ExternalLanguageUpdateRequestParams { OwnerUri = queryTempFile.FilePath, Language = language }; Assert.That(() => service.HandleExternalLanguageUpdateRequest(requestParams, requestContext.Object), Throws.Exception); } } [Test] public async Task VerifyExternalLanguageUpdateRequestConnectionFailures() { ExternalLanguage language = new ExternalLanguage { Name = "name" }; Mock operations = new Mock(); ExternalLanguageService service = new ExternalLanguageService() { ExternalLanguageOperations = operations.Object }; await VerifyError( test: async (requestContext, connectionUrl) => { ExternalLanguageUpdateRequestParams requestParams = new ExternalLanguageUpdateRequestParams { OwnerUri = "invalid connection", Language = language }; await service.HandleExternalLanguageUpdateRequest(requestParams, requestContext); return null; }); } [Test] public async Task VerifyExternalLanguageListRequest() { ExternalLanguage language = new ExternalLanguage { Name = "name" }; Mock operations = new Mock(); operations.Setup(x => x.GetLanguages(It.IsAny())).Returns(() => new List { language }); ExternalLanguageService service = new ExternalLanguageService() { ExternalLanguageOperations = operations.Object }; await VerifyRequst( test: async (requestContext, connectionUrl) => { ExternalLanguageListRequestParams requestParams = new ExternalLanguageListRequestParams { OwnerUri = connectionUrl }; await service.HandleExternalLanguageListRequest(requestParams, requestContext); return null; }, verify: (actual => { Assert.NotNull(actual); })); } [Test] public async Task VerifyExternalLanguagListRequestFailures() { ExternalLanguage language = new ExternalLanguage { Name = "name" }; Mock operations = new Mock(); operations.Setup(x => x.GetLanguages(It.IsAny())).Throws(new Exception("Error")); ExternalLanguageService service = new ExternalLanguageService() { ExternalLanguageOperations = operations.Object }; using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile()) { var connectionResult = await LiveConnectionHelper.InitLiveConnectionInfoAsync("master", queryTempFile.FilePath); var requestContext = RequestContextMocks.Create(r => { }); var requestParams = new ExternalLanguageListRequestParams { OwnerUri = queryTempFile.FilePath }; Assert.That(() => service.HandleExternalLanguageListRequest(requestParams, requestContext.Object), Throws.Exception); } } [Test] public async Task VerifyExternalLanguagListRequestConnectionFailures() { ExternalLanguage language = new ExternalLanguage { Name = "name" }; Mock operations = new Mock(); ExternalLanguageService service = new ExternalLanguageService() { ExternalLanguageOperations = operations.Object }; await VerifyError( test: async (requestContext, connectionUrl) => { ExternalLanguageListRequestParams requestParams = new ExternalLanguageListRequestParams { OwnerUri = "invalid connection" }; await service.HandleExternalLanguageListRequest(requestParams, requestContext); return null; }); } public async Task VerifyRequst(Func, string, Task> test, Action verify) { using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile()) { var connectionResult = await LiveConnectionHelper.InitLiveConnectionInfoAsync("master", queryTempFile.FilePath); await RunAndVerify( 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(Func, string, Task> test) { using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile()) { var connectionResult = await LiveConnectionHelper.InitLiveConnectionInfoAsync("master", queryTempFile.FilePath); await RunAndVerifyError( test: (requestContext) => test(requestContext, queryTempFile.FilePath)); ExternalLanguageService.Instance.ConnectionServiceInstance.Disconnect(new DisconnectParams { OwnerUri = queryTempFile.FilePath, Type = ServiceLayer.Connection.ConnectionType.Default }); } } [Test] public async Task VerifyExternalLanguageStatusRequestSendErrorGivenInvalidConnection() { ExternalLanguageStatusResponseParams result = null; var requestContext = RequestContextMocks.Create(r => result = r).AddErrorHandling(null); requestContext.Setup(x => x.SendError(It.IsAny())).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())); } protected override RegisteredServiceProvider CreateServiceProviderWithMinServices() { return base.CreateProvider(); } } }