Second batch of unit tests

Making slight changes to RequestContext to make it easier to mock
This commit is contained in:
Benjamin Russell
2016-08-09 11:10:54 -07:00
parent 9f371cd0bc
commit d783fd505b
7 changed files with 387 additions and 118 deletions

View File

@@ -1,35 +1,18 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Data.Common;
using Microsoft.SqlTools.ServiceLayer.Connection;
using Microsoft.SqlTools.ServiceLayer.Connection.Contracts;
using Microsoft.SqlTools.ServiceLayer.QueryExecution;
using Microsoft.SqlTools.ServiceLayer.QueryExecution.Contracts;
using Microsoft.SqlTools.ServiceLayer.Test.Utility;
using Moq;
using Moq.Protected;
using Xunit;
namespace Microsoft.SqlTools.ServiceLayer.Test.QueryExecution
{
public class ExecuteTests
{
private static Dictionary<string, string>[] testData =
{
new Dictionary<string, string> { {"col1", "val11"}, { "col2", "val12"}, { "col3", "val13"}, { "col4", "col14"} },
new Dictionary<string, string> { {"col1", "val21"}, { "col2", "val22"}, { "col3", "val23"}, { "col4", "col24"} },
new Dictionary<string, string> { {"col1", "val31"}, { "col2", "val32"}, { "col3", "val33"}, { "col4", "col34"} },
new Dictionary<string, string> { {"col1", "val41"}, { "col2", "val42"}, { "col3", "val43"}, { "col4", "col44"} },
new Dictionary<string, string> { {"col1", "val51"}, { "col2", "val52"}, { "col3", "val53"}, { "col4", "col54"} },
};
[Fact]
public void QueryCreationTest()
{
// If I create a new query...
Query query = new Query("NO OP", CreateTestConnectionInfo(null));
Query query = new Query("NO OP", Common.CreateTestConnectionInfo(null, false));
// Then:
// ... It should not have executed
@@ -44,7 +27,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.QueryExecution
public void QueryExecuteNoResultSets()
{
// If I execute a query that should get no result sets
Query query = new Query("Query with no result sets", CreateTestConnectionInfo(null));
Query query = new Query("Query with no result sets", Common.CreateTestConnectionInfo(null, false));
query.Execute().Wait();
// Then:
@@ -63,7 +46,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.QueryExecution
[Fact]
public void QueryExecuteQueryOneResultSet()
{
ConnectionInfo ci = CreateTestConnectionInfo(new[] {testData});
ConnectionInfo ci = Common.CreateTestConnectionInfo(new[] {Common.StandardTestData}, false);
// If I execute a query that should get one result set
int resultSets = 1;
@@ -99,11 +82,11 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.QueryExecution
[Fact]
public void QueryExecuteQueryTwoResultSets()
{
var dataset = new[] {testData, testData};
var dataset = new[] {Common.StandardTestData, Common.StandardTestData};
int resultSets = dataset.Length;
int rows = testData.Length;
int columns = testData[0].Count;
ConnectionInfo ci = CreateTestConnectionInfo(dataset);
int rows = Common.StandardTestData.Length;
int columns = Common.StandardTestData[0].Count;
ConnectionInfo ci = Common.CreateTestConnectionInfo(dataset, false);
// If I execute a query that should get two result sets
Query query = new Query("Query with two result sets", ci);
@@ -139,87 +122,43 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.QueryExecution
}
}
#region Mocking
//private static DbDataReader CreateTestReader(int columnCount, int rowCount)
//{
// var readerMock = new Mock<DbDataReader> { CallBase = true };
// // Setup for column reads
// // TODO: We can't test columns because of oddities with how datatable/GetColumn
// // Setup for row reads
// var readSequence = readerMock.SetupSequence(dbReader => dbReader.Read());
// for (int i = 0; i < rowCount; i++)
// {
// readSequence.Returns(true);
// }
// readSequence.Returns(false);
// // Make sure that if we call for data from the reader it works
// readerMock.Setup(dbReader => dbReader[InColumnRange(columnCount)])
// .Returns<object>(i => i.ToString());
// readerMock.Setup(dbReader => dbReader[NotInColumnRange(columnCount)])
// .Throws(new ArgumentOutOfRangeException());
// readerMock.Setup(dbReader => dbReader.HasRows)
// .Returns(rowCount > 0);
// return readerMock.Object;
//}
//private static int InColumnRange(int columnCount)
//{
// return Match.Create<int>(i => i < columnCount && i > 0);
//}
//private static int NotInColumnRange(int columnCount)
//{
// return Match.Create<int>(i => i >= columnCount || i < 0);
//}
private static DbCommand CreateTestCommand(Dictionary<string, string>[][] data)
[Fact]
public void QueryExecuteInvalidQuery()
{
var commandMock = new Mock<DbCommand> {CallBase = true};
commandMock.Protected()
.Setup<DbDataReader>("ExecuteDbDataReader", It.IsAny<CommandBehavior>())
.Returns(new TestDbDataReader(data));
ConnectionInfo ci = Common.CreateTestConnectionInfo(null, true);
return commandMock.Object;
// If I execute a query that is invalid
Query query = new Query("Invalid query", ci);
// Then:
// ... It should throw an exception
Exception e = Assert.Throws<AggregateException>(() => query.Execute().Wait());
}
private static DbConnection CreateTestConnection(Dictionary<string, string>[][] data)
[Fact]
public void QueryExecuteExecutedQuery()
{
var connectionMock = new Mock<DbConnection> {CallBase = true};
connectionMock.Protected()
.Setup<DbCommand>("CreateDbCommand")
.Returns(CreateTestCommand(data));
ConnectionInfo ci = Common.CreateTestConnectionInfo(new[] {Common.StandardTestData}, false);
return connectionMock.Object;
// If I execute a query
Query query = new Query("Any query", ci);
query.Execute().Wait();
// Then:
// ... It should have executed
Assert.True(query.HasExecuted, "The query should have been marked executed.");
// If I execute it again
// Then:
// ... It should throw an invalid operation exception wrapped in an aggregate exception
AggregateException ae = Assert.Throws<AggregateException>(() => query.Execute().Wait());
Assert.Equal(1, ae.InnerExceptions.Count);
Assert.IsType<InvalidOperationException>(ae.InnerExceptions[0]);
// ... The data should still be available
Assert.True(query.HasExecuted, "The query should still be marked executed.");
Assert.NotEmpty(query.ResultSets);
Assert.NotEmpty(query.ResultSummary);
}
private static ISqlConnectionFactory CreateMockFactory(Dictionary<string, string>[][] data)
{
var mockFactory = new Mock<ISqlConnectionFactory>();
mockFactory.Setup(factory => factory.CreateSqlConnection(It.IsAny<string>()))
.Returns(CreateTestConnection(data));
return mockFactory.Object;
}
private static ConnectionInfo CreateTestConnectionInfo(Dictionary<string, string>[][] data)
{
// Create connection info
ConnectionDetails connDetails = new ConnectionDetails
{
UserName = "sa",
Password = "Yukon900",
DatabaseName = "AdventureWorks2016CTP3_2",
ServerName = "sqltools11"
};
return new ConnectionInfo(CreateMockFactory(data), "test://test", connDetails);
}
#endregion
}
}