Skip to content

Commit

Permalink
Assert multiple result-sets in tSQLt.AssertResultSetsHaveSameMetaData
Browse files Browse the repository at this point in the history
  • Loading branch information
Matthias Vill committed Apr 27, 2021
1 parent ee89085 commit 9943b94
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 11 deletions.
39 changes: 39 additions & 0 deletions Tests/AssertResultSetsHaveSameMetaDataTests.class.sql
Original file line number Diff line number Diff line change
Expand Up @@ -195,3 +195,42 @@ BEGIN
END;
GO

CREATE PROC tSQLt_test_AssertResultSetsHaveSameMetaData.[test AssertResultSetsHaveSameMetaData does not fail for multiple identical single column result sets]
AS
BEGIN
EXEC tSQLt.AssertResultSetsHaveSameMetaData
'SELECT CAST(1 AS INT) A; SELECT CAST(1.02 AS DECIMAL(10,2)) A',
'SELECT CAST(3 AS INT) A; SELECT CAST(3.05 AS DECIMAL(10,2)) A';
EXEC tSQLt.AssertResultSetsHaveSameMetaData
'SELECT CAST(1.02 AS DECIMAL(10,2)) A; SELECT CAST(''ABC'' AS VARCHAR(15)) A',
'SELECT CAST(3.05 AS DECIMAL(10,2)) A; SELECT CAST(''XYZ'' AS VARCHAR(15)) A';
EXEC tSQLt.AssertResultSetsHaveSameMetaData
'SELECT CAST(1 AS INT) A; SELECT CAST(''ABC'' AS VARCHAR(15)) A; SELECT CAST(1.02 AS DECIMAL(10,2)) A',
'SELECT CAST(3 AS INT) A; SELECT CAST(''XYZ'' AS VARCHAR(15)) A; SELECT CAST(3.05 AS DECIMAL(10,2)) A';
EXEC tSQLt.AssertResultSetsHaveSameMetaData
'SELECT NULL A; SELECT NULL B; SELECT NULL C; SELECT NULL D',
'SELECT NULL A; SELECT NULL B; SELECT NULL C; SELECT NULL D';
END;
GO

CREATE PROC tSQLt_test_AssertResultSetsHaveSameMetaData.[test AssertResultSetsHaveSameMetaData fails for multiple differing single column result sets]
AS
BEGIN
EXEC tSQLt_testutil.assertFailCalled
'EXEC tSQLt.AssertResultSetsHaveSameMetaData
''SELECT CAST(1 AS INT) A; SELECT CAST(1 AS INT) A'',
''SELECT CAST(1 AS INT) A; SELECT CAST(3 AS BIGINT) A'';',
'Expected tSQLt.Fail called when AssertResultSetsHaveSameMetaData called with differing 2nd resultsets [INT and BIGINT]';
EXEC tSQLt_testutil.assertFailCalled
'EXEC tSQLt.AssertResultSetsHaveSameMetaData
''SELECT CAST(1 AS INT) A; SELECT CAST(3 AS BIGINT) A; SELECT CAST(1.02 AS DECIMAL(10,2)) A'',
''SELECT CAST(1 AS INT) A; SELECT CAST(3 AS BIGINT) A; SELECT CAST(3.05 AS DECIMAL(10,9)) A'';',
'Expected tSQLt.Fail called when AssertResultSetsHaveSameMetaData called with differing 3rd resultsets [DECIMAL(10,2) and DECIMAL(10,9)]';
EXEC tSQLt_testutil.assertFailCalled
'EXEC tSQLt.AssertResultSetsHaveSameMetaData
''SELECT CAST(''''ABC'''' AS VARCHAR(15)) A; SELECT CAST(3 AS BIGINT) A; SELECT CAST(1.02 AS DECIMAL(10,2)) A'',
''SELECT CAST(''''XYZ'''' AS VARCHAR(23)) A; SELECT CAST(3 AS BIGINT) A; SELECT CAST(1.02 AS DECIMAL(10,2)) A'';',
'Expected tSQLt.Fail called when AssertResultSetsHaveSameMetaData called with differing 1st resultsets [VARCHAR(15) and VARCHAR(23)]';
END;
GO

34 changes: 23 additions & 11 deletions tSQLtCLR/tSQLtCLR/MetaDataEqualityAsserter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
using System.Data.Sql;
using System.Data.SqlTypes;
using System.Data.SqlClient;

using System.Text;
using Microsoft.SqlServer.Server;

namespace tSQLtCLR
Expand Down Expand Up @@ -35,15 +35,23 @@ public void AssertResultSetsHaveSameMetaData(SqlString expectedCommand, SqlStrin
private String createSchemaStringFromCommand(SqlString command)
{
SqlDataReader reader = null;
int resultSet = 0;
StringBuilder schemaString = new StringBuilder();

try
{
reader = testDatabaseFacade.executeCommand(command);
reader.Read();
DataTable schema = attemptToGetSchemaTable(command, reader);
throwExceptionIfSchemaIsEmpty(command, schema);

return buildSchemaString(schema);
do
{
resultSet++;
reader.Read();
DataTable schema = attemptToGetSchemaTable(command, reader);
throwExceptionIfSchemaIsEmpty(command, schema);
buildSchemaString(schema, resultSet, schemaString);
} while (reader.NextResult());

return schemaString.ToString();
}
finally
{
Expand Down Expand Up @@ -80,26 +88,30 @@ private static void throwExceptionIfSchemaIsEmpty(SqlString command, DataTable s
}
}

private static String buildSchemaString(DataTable schema)
private static void buildSchemaString(DataTable schema, int resultSet, StringBuilder schemaString)
{
String schemaString = "";
if (resultSet > 1)
{
schemaString.AppendLine();
}

schemaString.Append(resultSet).Append(": ");

foreach (DataRow row in schema.Rows)
{
if (row["IsHidden"].ToString() != "True")
{
schemaString += "[";
schemaString.Append("[");
foreach (DataColumn column in schema.Columns)
{
if (columnPropertyIsValidForMetaDataComparison(column))
{
schemaString += "{" + column.ColumnName + ":" + row[column.ColumnName] + "}";
schemaString.Append("{").Append(column.ColumnName).Append(":").Append(row[column.ColumnName]).Append("}");
}
}
schemaString += "]";
schemaString.Append("]");
}
}
return schemaString;
}

private static bool columnPropertyIsValidForMetaDataComparison(DataColumn column)
Expand Down

0 comments on commit 9943b94

Please sign in to comment.