From 9943b94ab534d83d5174448917077af56ed9da7a Mon Sep 17 00:00:00 2001 From: Matthias Vill Date: Tue, 27 Apr 2021 10:08:51 +0200 Subject: [PATCH] Assert multiple result-sets in tSQLt.AssertResultSetsHaveSameMetaData --- ...tResultSetsHaveSameMetaDataTests.class.sql | 39 +++++++++++++++++++ tSQLtCLR/tSQLtCLR/MetaDataEqualityAsserter.cs | 34 ++++++++++------ 2 files changed, 62 insertions(+), 11 deletions(-) diff --git a/Tests/AssertResultSetsHaveSameMetaDataTests.class.sql b/Tests/AssertResultSetsHaveSameMetaDataTests.class.sql index e0f0177cd..aea1490b4 100644 --- a/Tests/AssertResultSetsHaveSameMetaDataTests.class.sql +++ b/Tests/AssertResultSetsHaveSameMetaDataTests.class.sql @@ -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 + diff --git a/tSQLtCLR/tSQLtCLR/MetaDataEqualityAsserter.cs b/tSQLtCLR/tSQLtCLR/MetaDataEqualityAsserter.cs index a6ba9d02a..1343a758f 100644 --- a/tSQLtCLR/tSQLtCLR/MetaDataEqualityAsserter.cs +++ b/tSQLtCLR/tSQLtCLR/MetaDataEqualityAsserter.cs @@ -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 @@ -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 { @@ -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)