Files
sqltoolsservice/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/AzureFunctions/AzureFunctionsServiceTests.cs
Charles Gagnon 076ed9644b Add route to GetAzureFunctions request + cleanup (#1521)
* Add route to GetAzureFunctions request + cleanup

* update comments

* comments

* Add comment
2022-05-31 10:22:20 -07:00

258 lines
12 KiB
C#

//
// 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.AzureFunctions;
using Microsoft.SqlTools.ServiceLayer.AzureFunctions.Contracts;
using Microsoft.SqlTools.ServiceLayer.Utility;
using Microsoft.SqlTools.ServiceLayer.Test.Common.Extensions;
using NUnit.Framework;
using System;
using System.IO;
namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.AzureFunctions
{
class AzureFunctionsServiceTests
{
private string testAzureFunctionsFolder = Path.Combine("..", "..", "..", "AzureFunctions", "AzureFunctionTestFiles");
/// <summary>
/// Verify input binding gets added
/// </summary>
[Test]
public void AddSqlInputBinding()
{
// copy the original file because the input binding will be inserted into the file
string originalFile = Path.Join(testAzureFunctionsFolder, "AzureFunctionsNoBindings.cs");
string testFile = Path.Join(Path.GetTempPath(), $"InsertSqlInputBinding-{DateTime.Now.ToString("yyyy - dd - MM--HH - mm - ss")}.cs");
File.Copy(originalFile, testFile, true);
AddSqlBindingParams parameters = new AddSqlBindingParams
{
bindingType = BindingType.input,
filePath = testFile,
functionName = "GetArtists_get",
objectName = "[dbo].[table1]",
connectionStringSetting = "SqlConnectionString"
};
AddSqlBindingOperation operation = new AddSqlBindingOperation(parameters);
ResultStatus result = operation.AddBinding();
Assert.That(result.Success, Is.True, "Operation should be successful");
Assert.That(result.ErrorMessage, Is.Null, "There should be no errors");
string expectedFileText = File.ReadAllText(Path.Join(testAzureFunctionsFolder, "AzureFunctionsInputBinding.cs"));
string actualFileText = File.ReadAllText(testFile);
Assert.That(expectedFileText.NormalizeLineEndings(), Is.EqualTo(actualFileText.NormalizeLineEndings()));
}
/// <summary>
/// Verify output binding gets added
/// </summary>
[Test]
public void AddSqlOutputBinding()
{
// copy the original file because the output binding will be inserted into the file
string originalFile = Path.Join(testAzureFunctionsFolder, "AzureFunctionsNoBindings.cs");
string testFile = Path.Join(Path.GetTempPath(), $"InsertSqlOutputBinding-{DateTime.Now.ToString("yyyy - dd - MM--HH - mm - ss")}.cs");
File.Copy(originalFile, testFile, true);
AddSqlBindingParams parameters = new AddSqlBindingParams
{
bindingType = BindingType.output,
filePath = testFile,
functionName = "NewArtist_post",
objectName = "[dbo].[table1]",
connectionStringSetting = "SqlConnectionString"
};
AddSqlBindingOperation operation = new AddSqlBindingOperation(parameters);
ResultStatus result = operation.AddBinding();
Assert.That(result.Success, Is.True, "Operation should be successful");
Assert.That(result.ErrorMessage, Is.Null, "There should be no errors");
string expectedFileText = File.ReadAllText(Path.Join(testAzureFunctionsFolder, "AzureFunctionsOutputBinding.cs"));
string actualFileText = File.ReadAllText(testFile);
Assert.That(expectedFileText.NormalizeLineEndings(), Is.EqualTo(actualFileText.NormalizeLineEndings()));
}
/// <summary>
/// Verify output binding gets added for an async method
/// </summary>
[Test]
public void AddSqlOutputBindingAsync()
{
// copy the original file because the output binding will be inserted into the file
string originalFile = Path.Join(testAzureFunctionsFolder, "AzureFunctionsNoBindings.cs");
string testFile = Path.Join(Path.GetTempPath(), $"InsertSqlOutputBindingAsync-{DateTime.Now.ToString("yyyy - dd - MM--HH - mm - ss")}.cs");
File.Copy(originalFile, testFile, true);
AddSqlBindingParams parameters = new AddSqlBindingParams
{
bindingType = BindingType.output,
filePath = testFile,
functionName = "NewArtists_post",
objectName = "[dbo].[table1]",
connectionStringSetting = "SqlConnectionString"
};
AddSqlBindingOperation operation = new AddSqlBindingOperation(parameters);
ResultStatus result = operation.AddBinding();
Assert.That(result.Success, Is.True);
Assert.That(result.ErrorMessage, Is.Null);
string expectedFileText = File.ReadAllText(Path.Join(testAzureFunctionsFolder, "AzureFunctionsOutputBindingAsync.cs"));
string actualFileText = File.ReadAllText(testFile);
Assert.That(actualFileText, Is.EqualTo(expectedFileText));
}
/// <summary>
/// Verify what happens when specified azure function isn't found
/// </summary>
[Test]
public void NoAzureFunctionForSqlBinding()
{
// copy the original file because the input binding will be inserted into the file
string originalFile = Path.Join(testAzureFunctionsFolder, "AzureFunctionsNoBindings.cs");
string testFile = Path.Join(Path.GetTempPath(), $"NoAzureFunctionForSqlBinding-{DateTime.Now.ToString("yyyy - dd - MM--HH - mm - ss")}.cs");
File.Copy(originalFile, testFile, true);
AddSqlBindingParams parameters = new AddSqlBindingParams
{
bindingType = BindingType.input,
filePath = testFile,
functionName = "noExistingFunction",
objectName = "[dbo].[table1]",
connectionStringSetting = "SqlConnectionString"
};
AddSqlBindingOperation operation = new AddSqlBindingOperation(parameters);
ResultStatus result = operation.AddBinding();
Assert.That(result.Success, Is.False);
Assert.That(result.ErrorMessage, Is.Not.Null);
Assert.That(result.ErrorMessage, Is.EqualTo(SR.CouldntFindAzureFunction("noExistingFunction", testFile)));
}
/// <summary>
/// Verify what happens when there's more than one Azure function with the specified name in the file
/// </summary>
[Test]
public void MoreThanOneAzureFunctionWithSpecifiedName()
{
// copy the original file because the input binding will be inserted into the file
string originalFile = Path.Join(testAzureFunctionsFolder, "AzureFunctionsMultipleSameFunction.cs");
string testFile = Path.Join(Path.GetTempPath(), $"MoreThanOneAzureFunctionWithSpecifiedName-{DateTime.Now.ToString("yyyy - dd - MM--HH - mm - ss")}.cs");
File.Copy(originalFile, testFile, true);
AddSqlBindingParams parameters = new AddSqlBindingParams
{
bindingType = BindingType.input,
filePath = testFile,
functionName = "GetArtists_get",
objectName = "[dbo].[table1]",
connectionStringSetting = "SqlConnectionString"
};
AddSqlBindingOperation operation = new AddSqlBindingOperation(parameters);
ResultStatus result = operation.AddBinding();
Assert.That(result.Success, Is.False);
Assert.That(result.ErrorMessage, Is.Not.Null);
Assert.That(result.ErrorMessage, Is.EqualTo(SR.MoreThanOneAzureFunctionWithName("GetArtists_get", testFile)));
}
/// <summary>
/// Verify getting the names of Azure functions in a file
/// </summary>
[Test]
public void GetAzureFunctionNames()
{
string testFile = Path.Join(testAzureFunctionsFolder, "AzureFunctionsName.cs");
GetAzureFunctionsParams parameters = new GetAzureFunctionsParams
{
FilePath = testFile
};
GetAzureFunctionsOperation operation = new GetAzureFunctionsOperation(parameters);
GetAzureFunctionsResult result = operation.GetAzureFunctions();
Assert.That(result.AzureFunctions.Length, Is.EqualTo(2));
Assert.That(result.AzureFunctions[0].Name, Is.EqualTo("WithName"));
Assert.That(result.AzureFunctions[1].Name, Is.EqualTo("{interpolated}String"));
}
/// <summary>
/// Verify there are no errors when a file doesn't have any Azure functions
/// </summary>
[Test]
public void GetAzureFunctionsWhenNoFunctions()
{
// make blank file
string testFile = Path.Join(Path.GetTempPath(), $"NoAzureFunctions-{DateTime.Now.ToString("yyyy - dd - MM--HH - mm - ss")}.cs");
FileStream fstream = File.Create(testFile);
fstream.Close();
GetAzureFunctionsParams parameters = new GetAzureFunctionsParams
{
FilePath = testFile
};
GetAzureFunctionsOperation operation = new GetAzureFunctionsOperation(parameters);
GetAzureFunctionsResult result = operation.GetAzureFunctions();
Assert.That(result.AzureFunctions.Length, Is.EqualTo(0));
}
/// <summary>
/// Verify there are no errors when a file doesn't have any Azure functions
/// </summary>
[Test]
public void GetAzureFunctionsNet5()
{
string testFile = Path.Join(testAzureFunctionsFolder, "AzureFunctionsNet5.cs");
GetAzureFunctionsParams parameters = new GetAzureFunctionsParams
{
FilePath = testFile
};
GetAzureFunctionsOperation operation = new GetAzureFunctionsOperation(parameters);
Exception ex = Assert.Throws<Exception>(() => { operation.GetAzureFunctions(); });
Assert.That(ex.Message, Is.EqualTo(SR.SqlBindingsNet5NotSupported));
}
/// <summary>
/// Verify getting the routes of Azure Functions in a file
/// </summary>
[Test]
public void GetAzureFunctionsRoute()
{
string testFile = Path.Join(testAzureFunctionsFolder, "AzureFunctionsRoute.cs");
GetAzureFunctionsParams parameters = new GetAzureFunctionsParams
{
FilePath = testFile
};
GetAzureFunctionsOperation operation = new GetAzureFunctionsOperation(parameters);
GetAzureFunctionsResult result = operation.GetAzureFunctions();
Assert.That(result.AzureFunctions.Length, Is.EqualTo(8));
Assert.That(result.AzureFunctions[0].Route, Is.EqualTo("withRoute"));
Assert.That(result.AzureFunctions[1].Route, Is.EqualTo("{interpolated}String"));
Assert.That(result.AzureFunctions[2].Route, Is.EqualTo("$withDollarSigns$"));
Assert.That(result.AzureFunctions[3].Route, Is.EqualTo("withRouteNoSpaces"));
Assert.That(result.AzureFunctions[4].Route, Is.EqualTo("withRouteExtraSpaces"));
Assert.That(result.AzureFunctions[5].Route, Is.Null, "Route specified as null should be null");
Assert.That(result.AzureFunctions[6].Route, Is.Null, "No route specified should be null");
Assert.That(result.AzureFunctions[7].Route, Is.EqualTo(""));
}
}
}