From 20180c5537ee8ae57d5187cc95a9002024f06074 Mon Sep 17 00:00:00 2001 From: Ed Elliott Date: Wed, 4 Oct 2017 21:39:16 +0100 Subject: [PATCH] Feature/cobertura (#21) * adding test db project and corbertura summary --- src/SQLCover/SQLCover.sln | 16 +- src/SQLCover/SQLCover/CodeCoverage.cs | 4 + src/SQLCover/SQLCover/CoverageResult.cs | 20 + .../Functions/GetParticlesInRectangle.sql | 15 + .../Functions/GetStatusMessage.sql | 9 + .../Functions/IsExperimentReady.sql | 14 + .../AlertParticleDiscovered.sql | 10 + .../SendHiggsBosonDiscoveryEmail.sql | 7 + .../Accelerator/Tables/Color.sql | 6 + .../Accelerator/Tables/Particle.sql | 10 + ...inside the boundaries of the rectangle.sql | 39 + ...d with an Id, Point Location and Value.sql | 25 + ...ticle within the rectangle is returned.sql | 25 + ...ected something other than higgs-boson.sql | 26 + ...l is sent if we detected a higgs-boson.sql | 28 + ...ed if Particle color is in Color table.sql | 23 + ...f Particle color is not in Color table.sql | 29 + ...en there are no particles in the table.sql | 16 + ...ady for experimentation if 2 particles.sql | 20 + ...ssage includes the number of particles.sql | 18 + ...imentation if there is only 1 particle.sql | 17 + .../DatabaseWithTests/Assemblies/tSQLtCLR.dll | Bin 0 -> 20992 bytes .../DatabaseWithTests.sqlproj | 853 ++++++++++++++++++ .../dbo/Stored Procedures/add_audit_login.sql | 4 + .../dbo/Tables/companies.sql | 6 + .../DatabaseWithTests/dbo/Tables/contacts.sql | 8 + .../dbo/Tables/contracts.sql | 6 + .../dbo/Tables/currencies.sql | 5 + .../DatabaseWithTests/dbo/Tables/location.sql | 10 + .../DatabaseWithTests/dbo/Tables/schedule.sql | 7 + .../dbo/Tables/user_types.sql | 5 + .../DatabaseWithTests/dbo/Tables/users.sql | 15 + ...st incorrect password causes exception.sql | 10 + .../security/Accelerator.sql | 3 + .../security/AcceleratorTests.sql | 7 + .../security/Stored Procedures/login_user.sql | 16 + .../DatabaseWithTests/security/bertie.sql | 7 + .../security/login tests.sql | 7 + .../DatabaseWithTests/security/security.sql | 3 + .../test/DatabaseWithTests/security/tSQLt.sql | 3 + .../tSQLt/Functions/F_Num.sql | 17 + .../Functions/GetTestResultFormatter.sql | 16 + .../tSQLt/Functions/Info.sql | 28 + .../tSQLt/Functions/Private_Bin2Hex.sql | 6 + .../Functions/Private_FindConstraint.sql | 15 + .../Functions/Private_GetCleanObjectName.sql | 7 + .../Functions/Private_GetCleanSchemaName.sql | 15 + .../Private_GetCommaSeparatedColumnList.sql | 14 + .../Functions/Private_GetConfiguration.sql | 10 + .../Functions/Private_GetConstraintType.sql | 9 + ..._GetDataTypeOrComputedColumnDefinition.sql | 20 + ...Private_GetDefaultConstraintDefinition.sql | 15 + .../Private_GetExternalAccessKeyBytes.sql | 5 + .../Private_GetForeignKeyDefinition.sql | 53 ++ .../Private_GetForeignKeyParColumns.sql | 13 + .../Private_GetForeignKeyRefColumns.sql | 14 + .../Functions/Private_GetFullTypeName.sql | 26 + .../Private_GetIdentityDefinition.sql | 19 + .../Private_GetLastTestNameIfNotProvided.sql | 18 + .../Private_GetOriginalTableInfo.sql | 11 + .../Private_GetOriginalTableName.sql | 16 + .../Functions/Private_GetQuotedFullName.sql | 9 + ...rivate_GetQuotedTableNameForConstraint.sql | 18 + .../tSQLt/Functions/Private_GetSchemaId.sql | 13 + .../Private_GetUniqueConstraintDefinition.sql | 54 ++ .../tSQLt/Functions/Private_IsTestClass.sql | 16 + .../Private_QuoteClassNameForNewTestClass.sql | 12 + ...ivate_ResolveApplyConstraintParameters.sql | 19 + ...FakeTableNamesForBackwardCompatibility.sql | 12 + .../tSQLt/Functions/Private_ResolveName.sql | 19 + .../Functions/Private_ResolveObjectName.sql | 25 + .../Functions/Private_ResolveSchemaName.sql | 21 + .../tSQLt/Functions/Private_ScriptIndex.sql | 74 ++ .../Functions/Private_SqlVariantFormatter.sql | 23 + .../tSQLt/Functions/Private_SqlVersion.sql | 6 + .../tSQLt/Functions/TestCaseSummary.sql | 18 + .../Stored Procedures/ApplyConstraint.sql | 36 + .../tSQLt/Stored Procedures/ApplyTrigger.sql | 34 + .../Stored Procedures/AssertEmptyTable.sql | 34 + .../tSQLt/Stored Procedures/AssertEquals.sql | 17 + .../Stored Procedures/AssertEqualsString.sql | 16 + .../Stored Procedures/AssertEqualsTable.sql | 47 + .../AssertEqualsTableSchema.sql | 43 + .../tSQLt/Stored Procedures/AssertLike.sql | 21 + .../Stored Procedures/AssertNotEquals.sql | 20 + .../AssertObjectDoesNotExist.sql | 16 + .../Stored Procedures/AssertObjectExists.sql | 29 + .../AssertResultSetsHaveSameMetaData.sql | 4 + .../Stored Procedures/AssertStringIn.sql | 16 + .../tSQLt/Stored Procedures/CaptureOutput.sql | 4 + .../DefaultResultFormatter.sql | 40 + .../tSQLt/Stored Procedures/DropClass.sql | 72 ++ .../EnableExternalAccess.sql | 29 + .../Stored Procedures/ExpectException.sql | 21 + .../Stored Procedures/ExpectNoException.sql | 21 + .../tSQLt/Stored Procedures/Fail.sql | 54 ++ .../tSQLt/Stored Procedures/FakeFunction.sql | 26 + .../tSQLt/Stored Procedures/FakeTable.sql | 53 ++ .../Stored Procedures/GetNewTranName.sql | 8 + .../InstallExternalAccessKey.sql | 57 ++ .../Stored Procedures/LogCapturedOutput.sql | 8 + .../tSQLt/Stored Procedures/NewConnection.sql | 4 + .../tSQLt/Stored Procedures/NewTestClass.sql | 25 + .../NullTestResultFormatter.sql | 6 + .../Private_ApplyCheckConstraint.sql | 22 + .../Private_ApplyForeignKeyConstraint.sql | 30 + .../Private_ApplyUniqueConstraint.sql | 26 + .../Private_CleanTestResult.sql | 5 + .../Private_CompareTables.sql | 60 ++ ...e_CompareTablesFailIfUnequalRowsExists.sql | 21 + .../Private_CreateFakeFunction.sql | 47 + .../Private_CreateFakeOfTable.sql | 40 + .../Private_CreateProcedureSpy.sql | 96 ++ ...vate_CreateResultTableForCompareTables.sql | 14 + ...ivate_DisallowOverwritingNonTestSchema.sql | 12 + .../Private_GetCursorForRunAll.sql | 11 + .../Private_GetCursorForRunNew.sql | 13 + .../Private_GetSetupProcedureName.sql | 12 + .../tSQLt/Stored Procedures/Private_Init.sql | 25 + .../Stored Procedures/Private_InputBuffer.sql | 9 + .../Private_MarkFakeTable.sql | 18 + .../Private_MarkObjectBeforeRename.sql | 11 + .../Private_MarkSchemaAsTestClass.sql | 30 + .../Private_OutputTestResults.sql | 9 + .../tSQLt/Stored Procedures/Private_Print.sql | 29 + .../Stored Procedures/Private_PrintXML.sql | 8 + .../Private_RemoveSchemaBinding.sql | 10 + .../Private_RemoveSchemaBoundReferences.sql | 21 + .../Private_RenameObjectToUniqueName.sql | 22 + ..._RenameObjectToUniqueNameUsingObjectId.sql | 15 + .../Private_ResetNewTestClassList.sql | 6 + .../tSQLt/Stored Procedures/Private_Run.sql | 39 + .../Stored Procedures/Private_RunAll.sql | 7 + .../Stored Procedures/Private_RunCursor.sql | 28 + .../Private_RunMethodHandler.sql | 22 + .../Stored Procedures/Private_RunNew.sql | 7 + .../Stored Procedures/Private_RunTest.sql | 210 +++++ .../Private_RunTestClass.sql | 31 + .../Private_SaveTestNameForSession.sql | 15 + .../Private_SetConfiguration.sql | 17 + .../Private_SetFakeViewOff_SingleView.sql | 20 + .../Private_SetFakeViewOn_SingleView.sql | 39 + .../Private_ValidateFakeTableParameters.sql | 17 + ...idateObjectsCompatibleWithFakeFunction.sql | 47 + ...dateProcedureCanBeUsedWithSpyProcedure.sql | 15 + ...ateThatAllDataTypesInTableAreSupported.sql | 12 + .../RemoveExternalAccessKey.sql | 15 + .../tSQLt/Stored Procedures/RemoveObject.sql | 17 + .../RemoveObjectIfExists.sql | 7 + .../tSQLt/Stored Procedures/RenameClass.sql | 36 + .../tSQLt/Stored Procedures/Reset.sql | 5 + .../Stored Procedures/ResultSetFilter.sql | 4 + .../tSQLt/Stored Procedures/Run.sql | 8 + .../tSQLt/Stored Procedures/RunAll.sql | 5 + .../tSQLt/Stored Procedures/RunC.sql | 12 + .../tSQLt/Stored Procedures/RunNew.sql | 6 + .../tSQLt/Stored Procedures/RunTest.sql | 7 + .../tSQLt/Stored Procedures/RunTestClass.sql | 7 + .../Stored Procedures/RunWithNullResults.sql | 7 + .../Stored Procedures/RunWithXmlResults.sql | 7 + .../Stored Procedures/SetFakeViewOff.sql | 26 + .../tSQLt/Stored Procedures/SetFakeViewOn.sql | 25 + .../SetTestResultFormatter.sql | 23 + .../tSQLt/Stored Procedures/SetVerbose.sql | 6 + .../tSQLt/Stored Procedures/SpyProcedure.sql | 22 + .../tSQLt/Stored Procedures/StubRecord.sql | 97 ++ .../Stored Procedures/SuppressOutput.sql | 4 + .../tSQLt/Stored Procedures/TableToText.sql | 9 + .../tSQLt/Stored Procedures/Uninstall.sql | 10 + .../Stored Procedures/XmlResultFormatter.sql | 212 +++++ .../tSQLt/Tables/CaptureOutputLog.sql | 6 + ...Private_AssertEqualsTableSchema_Actual.sql | 13 + ...ivate_AssertEqualsTableSchema_Expected.sql | 13 + .../tSQLt/Tables/Private_Configurations.sql | 6 + .../tSQLt/Tables/Private_ExpectException.sql | 4 + .../tSQLt/Tables/Private_NewTestClassList.sql | 5 + .../tSQLt/Tables/Private_NullCellTable.sql | 12 + .../tSQLt/Tables/Private_RenamedObjectLog.sql | 7 + .../tSQLt/Tables/Run_LastExecution.sql | 6 + .../tSQLt/Tables/TestMessage.sql | 4 + .../tSQLt/Tables/TestResult.sql | 13 + .../User Defined Types/AssertStringTable.sql | 3 + .../tSQLt/User Defined Types/Private.sql | 3 + .../tSQLt/Views/Private_SysIndexes.sql | 1 + .../tSQLt/Views/Private_SysTypes.sql | 1 + .../tSQLt/Views/TestClasses.sql | 9 + .../DatabaseWithTests/tSQLt/Views/Tests.sql | 8 + 187 files changed, 4636 insertions(+), 2 deletions(-) create mode 100644 src/SQLCover/test/DatabaseWithTests/Accelerator/Functions/GetParticlesInRectangle.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/Accelerator/Functions/GetStatusMessage.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/Accelerator/Functions/IsExperimentReady.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/Accelerator/Stored Procedures/AlertParticleDiscovered.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/Accelerator/Stored Procedures/SendHiggsBosonDiscoveryEmail.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/Accelerator/Tables/Color.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/Accelerator/Tables/Particle.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test a particle is included only if it fits inside the boundaries of the rectangle.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test a particle within the rectangle is returned with an Id, Point Location and Value.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test a particle within the rectangle is returned.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test email is not sent if we detected something other than higgs-boson.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test email is sent if we detected a higgs-boson.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test foreign key is not violated if Particle color is in Color table.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test foreign key violated if Particle color is not in Color table.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test no particles are in a rectangle when there are no particles in the table.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test ready for experimentation if 2 particles.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test status message includes the number of particles.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test we are not ready for experimentation if there is only 1 particle.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/Assemblies/tSQLtCLR.dll create mode 100644 src/SQLCover/test/DatabaseWithTests/DatabaseWithTests.sqlproj create mode 100644 src/SQLCover/test/DatabaseWithTests/dbo/Stored Procedures/add_audit_login.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/dbo/Tables/companies.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/dbo/Tables/contacts.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/dbo/Tables/contracts.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/dbo/Tables/currencies.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/dbo/Tables/location.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/dbo/Tables/schedule.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/dbo/Tables/user_types.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/dbo/Tables/users.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/login tests/Stored Procedures/test incorrect password causes exception.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/security/Accelerator.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/security/AcceleratorTests.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/security/Stored Procedures/login_user.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/security/bertie.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/security/login tests.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/security/security.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/security/tSQLt.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/F_Num.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/GetTestResultFormatter.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Info.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_Bin2Hex.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_FindConstraint.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetCleanObjectName.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetCleanSchemaName.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetCommaSeparatedColumnList.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetConfiguration.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetConstraintType.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetDataTypeOrComputedColumnDefinition.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetDefaultConstraintDefinition.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetExternalAccessKeyBytes.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetForeignKeyDefinition.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetForeignKeyParColumns.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetForeignKeyRefColumns.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetFullTypeName.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetIdentityDefinition.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetLastTestNameIfNotProvided.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetOriginalTableInfo.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetOriginalTableName.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetQuotedFullName.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetQuotedTableNameForConstraint.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetSchemaId.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetUniqueConstraintDefinition.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_IsTestClass.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_QuoteClassNameForNewTestClass.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveApplyConstraintParameters.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveFakeTableNamesForBackwardCompatibility.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveName.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveObjectName.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveSchemaName.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ScriptIndex.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_SqlVariantFormatter.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_SqlVersion.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/TestCaseSummary.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ApplyConstraint.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ApplyTrigger.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEmptyTable.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEquals.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEqualsString.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEqualsTable.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEqualsTableSchema.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertLike.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertNotEquals.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertObjectDoesNotExist.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertObjectExists.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertResultSetsHaveSameMetaData.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertStringIn.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/CaptureOutput.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/DefaultResultFormatter.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/DropClass.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/EnableExternalAccess.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ExpectException.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ExpectNoException.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Fail.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/FakeFunction.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/FakeTable.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/GetNewTranName.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/InstallExternalAccessKey.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/LogCapturedOutput.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/NewConnection.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/NewTestClass.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/NullTestResultFormatter.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ApplyCheckConstraint.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ApplyForeignKeyConstraint.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ApplyUniqueConstraint.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CleanTestResult.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CompareTables.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CompareTablesFailIfUnequalRowsExists.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CreateFakeFunction.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CreateFakeOfTable.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CreateProcedureSpy.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CreateResultTableForCompareTables.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_DisallowOverwritingNonTestSchema.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_GetCursorForRunAll.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_GetCursorForRunNew.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_GetSetupProcedureName.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_Init.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_InputBuffer.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_MarkFakeTable.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_MarkObjectBeforeRename.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_MarkSchemaAsTestClass.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_OutputTestResults.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_Print.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_PrintXML.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RemoveSchemaBinding.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RemoveSchemaBoundReferences.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RenameObjectToUniqueName.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RenameObjectToUniqueNameUsingObjectId.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ResetNewTestClassList.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_Run.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunAll.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunCursor.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunMethodHandler.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunNew.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunTest.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunTestClass.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_SaveTestNameForSession.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_SetConfiguration.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_SetFakeViewOff_SingleView.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_SetFakeViewOn_SingleView.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ValidateFakeTableParameters.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ValidateObjectsCompatibleWithFakeFunction.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ValidateProcedureCanBeUsedWithSpyProcedure.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ValidateThatAllDataTypesInTableAreSupported.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RemoveExternalAccessKey.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RemoveObject.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RemoveObjectIfExists.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RenameClass.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Reset.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ResultSetFilter.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Run.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunAll.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunC.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunNew.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunTest.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunTestClass.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunWithNullResults.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunWithXmlResults.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SetFakeViewOff.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SetFakeViewOn.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SetTestResultFormatter.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SetVerbose.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SpyProcedure.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/StubRecord.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SuppressOutput.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/TableToText.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Uninstall.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/XmlResultFormatter.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/CaptureOutputLog.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_AssertEqualsTableSchema_Actual.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_AssertEqualsTableSchema_Expected.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_Configurations.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_ExpectException.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_NewTestClassList.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_NullCellTable.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_RenamedObjectLog.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Run_LastExecution.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/TestMessage.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/TestResult.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/User Defined Types/AssertStringTable.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/User Defined Types/Private.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Views/Private_SysIndexes.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Views/Private_SysTypes.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Views/TestClasses.sql create mode 100644 src/SQLCover/test/DatabaseWithTests/tSQLt/Views/Tests.sql diff --git a/src/SQLCover/SQLCover.sln b/src/SQLCover/SQLCover.sln index e0de453..bec640d 100644 --- a/src/SQLCover/SQLCover.sln +++ b/src/SQLCover/SQLCover.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.24720.0 +# Visual Studio 15 +VisualStudioVersion = 15.0.26730.12 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SQLCover", "SQLCover\SQLCover.csproj", "{2AB093C7-88AE-4F6B-940E-9AE6DBC4CC87}" EndProject @@ -15,6 +15,8 @@ Project("{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}") = "DatabaseProject", "Database EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestLib", "test\TestLib\TestLib.csproj", "{892698FB-618A-4D80-B035-3520148603BF}" EndProject +Project("{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}") = "DatabaseWithTests", "test\DatabaseWithTests\DatabaseWithTests.sqlproj", "{021EDCB7-E7A1-4F6E-BF0D-73AA4DA7B62A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -43,6 +45,12 @@ Global {892698FB-618A-4D80-B035-3520148603BF}.Debug|Any CPU.Build.0 = Debug|Any CPU {892698FB-618A-4D80-B035-3520148603BF}.Release|Any CPU.ActiveCfg = Release|Any CPU {892698FB-618A-4D80-B035-3520148603BF}.Release|Any CPU.Build.0 = Release|Any CPU + {021EDCB7-E7A1-4F6E-BF0D-73AA4DA7B62A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {021EDCB7-E7A1-4F6E-BF0D-73AA4DA7B62A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {021EDCB7-E7A1-4F6E-BF0D-73AA4DA7B62A}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {021EDCB7-E7A1-4F6E-BF0D-73AA4DA7B62A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {021EDCB7-E7A1-4F6E-BF0D-73AA4DA7B62A}.Release|Any CPU.Build.0 = Release|Any CPU + {021EDCB7-E7A1-4F6E-BF0D-73AA4DA7B62A}.Release|Any CPU.Deploy.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -52,5 +60,9 @@ Global {4D42F47A-D116-4881-8270-7B9250FB898C} = {DB9215AD-D611-49A3-8061-2AA1E957F12C} {25389F17-3E61-491E-B99A-B845AE8529BA} = {DB9215AD-D611-49A3-8061-2AA1E957F12C} {892698FB-618A-4D80-B035-3520148603BF} = {DB9215AD-D611-49A3-8061-2AA1E957F12C} + {021EDCB7-E7A1-4F6E-BF0D-73AA4DA7B62A} = {DB9215AD-D611-49A3-8061-2AA1E957F12C} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {5524B744-8BA0-4B61-8D23-CD1685FEE6F0} EndGlobalSection EndGlobal diff --git a/src/SQLCover/SQLCover/CodeCoverage.cs b/src/SQLCover/SQLCover/CodeCoverage.cs index 35f472a..4900a0d 100644 --- a/src/SQLCover/SQLCover/CodeCoverage.cs +++ b/src/SQLCover/SQLCover/CodeCoverage.cs @@ -39,6 +39,10 @@ public CodeCoverage(string connectionString, string databaseName, string[] exclu { } + public CodeCoverage(string connectionString, string databaseName, string[] excludeFilter, bool logging, bool debugger) : this(connectionString, databaseName, excludeFilter, logging, debugger, TraceControllerType.Default) + { + } + public CodeCoverage(string connectionString, string databaseName, string[] excludeFilter, bool logging, bool debugger, TraceControllerType traceType) { if (debugger) diff --git a/src/SQLCover/SQLCover/CoverageResult.cs b/src/SQLCover/SQLCover/CoverageResult.cs index e9f12da..2ace887 100644 --- a/src/SQLCover/SQLCover/CoverageResult.cs +++ b/src/SQLCover/SQLCover/CoverageResult.cs @@ -146,6 +146,26 @@ public void SaveSourceFiles(string path) } } + /// + /// https://raw.githubusercontent.com/jenkinsci/cobertura-plugin/master/src/test/resources/hudson/plugins/cobertura/coverage-with-data.xml + /// http://cobertura.sourceforge.net/xml/coverage-03.dtd + /// + /// + public string Cobertura() + { + var statements = _batches.Sum(p => p.StatementCount); + var coveredStatements = _batches.Sum(p => p.CoveredStatementCount); + + var builder = new StringBuilder(); + builder.Append(""); + builder.Append(""); + builder.AppendFormat("", statements, coveredStatements,coveredStatements / (float)statements, (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds); + builder.Append("\r\n"); + + return builder.ToString(); + + } + public string OpenCoverXml() { var statements = _batches.Sum(p => p.StatementCount); diff --git a/src/SQLCover/test/DatabaseWithTests/Accelerator/Functions/GetParticlesInRectangle.sql b/src/SQLCover/test/DatabaseWithTests/Accelerator/Functions/GetParticlesInRectangle.sql new file mode 100644 index 0000000..7909872 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/Accelerator/Functions/GetParticlesInRectangle.sql @@ -0,0 +1,15 @@ + +CREATE FUNCTION Accelerator.GetParticlesInRectangle( + @X1 DECIMAL(10,2), + @Y1 DECIMAL(10,2), + @X2 DECIMAL(10,2), + @Y2 DECIMAL(10,2) +) +RETURNS TABLE +AS RETURN ( + SELECT Id, X, Y, Value + FROM Accelerator.Particle + WHERE X > @X1 AND X < @X2 + AND + Y > @Y1 AND Y < @Y2 +); diff --git a/src/SQLCover/test/DatabaseWithTests/Accelerator/Functions/GetStatusMessage.sql b/src/SQLCover/test/DatabaseWithTests/Accelerator/Functions/GetStatusMessage.sql new file mode 100644 index 0000000..66670b9 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/Accelerator/Functions/GetStatusMessage.sql @@ -0,0 +1,9 @@ + +CREATE FUNCTION Accelerator.GetStatusMessage() + RETURNS NVARCHAR(MAX) +AS +BEGIN + DECLARE @NumParticles INT; + SELECT @NumParticles = COUNT(1) FROM Accelerator.Particle; + RETURN 'The Accelerator is prepared with ' + CAST(@NumParticles AS NVARCHAR(MAX)) + ' particles.'; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/Accelerator/Functions/IsExperimentReady.sql b/src/SQLCover/test/DatabaseWithTests/Accelerator/Functions/IsExperimentReady.sql new file mode 100644 index 0000000..b36c389 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/Accelerator/Functions/IsExperimentReady.sql @@ -0,0 +1,14 @@ + +CREATE FUNCTION Accelerator.IsExperimentReady() +RETURNS BIT +AS +BEGIN + DECLARE @NumParticles INT; + + SELECT @NumParticles = COUNT(1) FROM Accelerator.Particle; + + IF @NumParticles > 2 + RETURN 1; + + RETURN 0; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/Accelerator/Stored Procedures/AlertParticleDiscovered.sql b/src/SQLCover/test/DatabaseWithTests/Accelerator/Stored Procedures/AlertParticleDiscovered.sql new file mode 100644 index 0000000..6d11f2f --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/Accelerator/Stored Procedures/AlertParticleDiscovered.sql @@ -0,0 +1,10 @@ + +CREATE PROCEDURE Accelerator.AlertParticleDiscovered + @ParticleDiscovered NVARCHAR(MAX) +AS +BEGIN + IF @ParticleDiscovered = 'Higgs Boson' + BEGIN + EXEC Accelerator.SendHiggsBosonDiscoveryEmail 'particle-discovery@new-era-particles.tsqlt.org'; + END; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/Accelerator/Stored Procedures/SendHiggsBosonDiscoveryEmail.sql b/src/SQLCover/test/DatabaseWithTests/Accelerator/Stored Procedures/SendHiggsBosonDiscoveryEmail.sql new file mode 100644 index 0000000..9812c2b --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/Accelerator/Stored Procedures/SendHiggsBosonDiscoveryEmail.sql @@ -0,0 +1,7 @@ + +CREATE PROCEDURE Accelerator.SendHiggsBosonDiscoveryEmail + @EmailAddress NVARCHAR(MAX) +AS +BEGIN + RAISERROR('Not Implemented - yet',16,10); +END; diff --git a/src/SQLCover/test/DatabaseWithTests/Accelerator/Tables/Color.sql b/src/SQLCover/test/DatabaseWithTests/Accelerator/Tables/Color.sql new file mode 100644 index 0000000..aa30aa4 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/Accelerator/Tables/Color.sql @@ -0,0 +1,6 @@ +CREATE TABLE [Accelerator].[Color] ( + [Id] INT IDENTITY (1, 1) NOT NULL, + [ColorName] NVARCHAR (MAX) NOT NULL, + CONSTRAINT [PK_Color_Id] PRIMARY KEY CLUSTERED ([Id] ASC) +); + diff --git a/src/SQLCover/test/DatabaseWithTests/Accelerator/Tables/Particle.sql b/src/SQLCover/test/DatabaseWithTests/Accelerator/Tables/Particle.sql new file mode 100644 index 0000000..d23eea4 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/Accelerator/Tables/Particle.sql @@ -0,0 +1,10 @@ +CREATE TABLE [Accelerator].[Particle] ( + [Id] INT IDENTITY (1, 1) NOT NULL, + [X] DECIMAL (10, 2) NOT NULL, + [Y] DECIMAL (10, 2) NOT NULL, + [Value] NVARCHAR (MAX) NOT NULL, + [ColorId] INT NOT NULL, + CONSTRAINT [PK_Point_Id] PRIMARY KEY CLUSTERED ([Id] ASC), + CONSTRAINT [FK_ParticleColor] FOREIGN KEY ([ColorId]) REFERENCES [Accelerator].[Color] ([Id]) +); + diff --git a/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test a particle is included only if it fits inside the boundaries of the rectangle.sql b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test a particle is included only if it fits inside the boundaries of the rectangle.sql new file mode 100644 index 0000000..93450bd --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test a particle is included only if it fits inside the boundaries of the rectangle.sql @@ -0,0 +1,39 @@ + +CREATE PROCEDURE AcceleratorTests.[test a particle is included only if it fits inside the boundaries of the rectangle] +AS +BEGIN + --Assemble: Fake the Particle table to make sure it is empty and that constraints will not be a problem + EXEC tSQLt.FakeTable 'Accelerator.Particle'; + -- Populate the Particle table with rows that hug the rectangle boundaries + INSERT INTO Accelerator.Particle (Id, X, Y) VALUES ( 1, -0.01, 0.50); + INSERT INTO Accelerator.Particle (Id, X, Y) VALUES ( 2, 0.00, 0.50); + INSERT INTO Accelerator.Particle (Id, X, Y) VALUES ( 3, 0.01, 0.50); + INSERT INTO Accelerator.Particle (Id, X, Y) VALUES ( 4, 0.99, 0.50); + INSERT INTO Accelerator.Particle (Id, X, Y) VALUES ( 5, 1.00, 0.50); + INSERT INTO Accelerator.Particle (Id, X, Y) VALUES ( 6, 1.01, 0.50); + INSERT INTO Accelerator.Particle (Id, X, Y) VALUES ( 7, 0.50, -0.01); + INSERT INTO Accelerator.Particle (Id, X, Y) VALUES ( 8, 0.50, 0.00); + INSERT INTO Accelerator.Particle (Id, X, Y) VALUES ( 9, 0.50, 0.01); + INSERT INTO Accelerator.Particle (Id, X, Y) VALUES (10, 0.50, 0.99); + INSERT INTO Accelerator.Particle (Id, X, Y) VALUES (11, 0.50, 1.00); + INSERT INTO Accelerator.Particle (Id, X, Y) VALUES (12, 0.50, 1.01); + + --Act: Call the GetParticlesInRectangle Table-Valued Function and capture the relevant columns into the #Actual temp table + SELECT Id, X, Y + INTO #Actual + FROM Accelerator.GetParticlesInRectangle(0.0, 0.0, 1.0, 1.0); + + --Assert: Create an empty #Expected temp table that has the same structure as the #Actual table + SELECT TOP(0) * + INTO #Expected + FROM #Actual; + + -- The expected data is inserted into the #Expected table + INSERT INTO #Expected (Id, X, Y) VALUES (3, 0.01, 0.50); + INSERT INTO #Expected (Id, X, Y) VALUES (4, 0.99, 0.50); + INSERT INTO #Expected (Id, X, Y) VALUES (9, 0.50, 0.01); + INSERT INTO #Expected (Id, X, Y) VALUES (10, 0.50, 0.99); + + -- Compare the data in the #Expected and #Actual tables + EXEC tSQLt.AssertEqualsTable '#Expected', '#Actual'; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test a particle within the rectangle is returned with an Id, Point Location and Value.sql b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test a particle within the rectangle is returned with an Id, Point Location and Value.sql new file mode 100644 index 0000000..d459ebb --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test a particle within the rectangle is returned with an Id, Point Location and Value.sql @@ -0,0 +1,25 @@ + +CREATE PROCEDURE AcceleratorTests.[test a particle within the rectangle is returned with an Id, Point Location and Value] +AS +BEGIN + --Assemble: Fake the Particle table to make sure it is empty and that constraints will not be a problem + EXEC tSQLt.FakeTable 'Accelerator.Particle'; + -- Put a test particle into the table + INSERT INTO Accelerator.Particle (Id, X, Y, Value) VALUES (1, 0.5, 0.5, 'MyValue'); + + --Act: Call the GetParticlesInRectangle Table-Valued Function and capture the relevant columns into the #Actual temp table + SELECT Id, X, Y, Value + INTO #Actual + FROM Accelerator.GetParticlesInRectangle(0.0, 0.0, 1.0, 1.0); + + --Assert: Create an empty #Expected temp table that has the same structure as the #Actual table + SELECT TOP(0) * + INTO #Expected + FROM #Actual; + + -- A single row with the expected data is inserted into the #Expected table + INSERT INTO #Expected (Id, X, Y, Value) VALUES (1, 0.5, 0.5, 'MyValue'); + + -- Compare the data in the #Expected and #Actual tables + EXEC tSQLt.AssertEqualsTable '#Expected', '#Actual'; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test a particle within the rectangle is returned.sql b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test a particle within the rectangle is returned.sql new file mode 100644 index 0000000..1ffa102 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test a particle within the rectangle is returned.sql @@ -0,0 +1,25 @@ + +CREATE PROCEDURE AcceleratorTests.[test a particle within the rectangle is returned] +AS +BEGIN + --Assemble: Fake the Particle table to make sure it is empty and that constraints will not be a problem + EXEC tSQLt.FakeTable 'Accelerator.Particle'; + -- Put a test particle into the table + INSERT INTO Accelerator.Particle (Id, X, Y) VALUES (1, 0.5, 0.5); + + --Act: Call the GetParticlesInRectangle Table-Valued Function and capture the Id column into the #Actual temp table + SELECT Id + INTO #Actual + FROM Accelerator.GetParticlesInRectangle(0.0, 0.0, 1.0, 1.0); + + --Assert: Create an empty #Expected temp table that has the same structure as the #Actual table + SELECT TOP(0) * + INTO #Expected + FROM #Actual; + + -- A single row with an Id value of 1 is expected + INSERT INTO #Expected (Id) VALUES (1); + + -- Compare the data in the #Expected and #Actual tables + EXEC tSQLt.AssertEqualsTable '#Expected', '#Actual'; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test email is not sent if we detected something other than higgs-boson.sql b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test email is not sent if we detected something other than higgs-boson.sql new file mode 100644 index 0000000..0f7f71b --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test email is not sent if we detected something other than higgs-boson.sql @@ -0,0 +1,26 @@ + + +CREATE PROCEDURE AcceleratorTests.[test email is not sent if we detected something other than higgs-boson] +AS +BEGIN + --Assemble: Replace the SendHiggsBosonDiscoveryEmail with a spy. + EXEC tSQLt.SpyProcedure 'Accelerator.SendHiggsBosonDiscoveryEmail'; + + --Act: Call the AlertParticleDiscovered procedure - this is the procedure being tested. + EXEC Accelerator.AlertParticleDiscovered 'Proton'; + + --Assert: A spy records the parameters passed to the procedure in a *_SpyProcedureLog table. + -- Copy the EmailAddress parameter values that the spy recorded into the #Actual temp table. + SELECT EmailAddress + INTO #Actual + FROM Accelerator.SendHiggsBosonDiscoveryEmail_SpyProcedureLog; + + -- Create an empty #Expected temp table that has the same structure as the #Actual table + SELECT TOP(0) * INTO #Expected FROM #Actual; + + -- The SendHiggsBosonDiscoveryEmail should not have been called. So the #Expected table is empty. + + -- Compare the data in the #Expected and #Actual tables + EXEC tSQLt.AssertEqualsTable '#Expected', '#Actual'; + +END; diff --git a/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test email is sent if we detected a higgs-boson.sql b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test email is sent if we detected a higgs-boson.sql new file mode 100644 index 0000000..a6937bb --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test email is sent if we detected a higgs-boson.sql @@ -0,0 +1,28 @@ + +CREATE PROCEDURE AcceleratorTests.[test email is sent if we detected a higgs-boson] +AS +BEGIN + --Assemble: Replace the SendHiggsBosonDiscoveryEmail with a spy. + EXEC tSQLt.SpyProcedure 'Accelerator.SendHiggsBosonDiscoveryEmail'; + + --Act: Call the AlertParticleDiscovered procedure - this is the procedure being tested. + EXEC Accelerator.AlertParticleDiscovered 'Higgs Boson'; + + --Assert: A spy records the parameters passed to the procedure in a *_SpyProcedureLog table. + -- Copy the EmailAddress parameter values that the spy recorded into the #Actual temp table. + SELECT EmailAddress + INTO #Actual + FROM Accelerator.SendHiggsBosonDiscoveryEmail_SpyProcedureLog; + + -- Create an empty #Expected temp table that has the same structure as the #Actual table + SELECT TOP(0) * INTO #Expected FROM #Actual; + + -- Add a row to the #Expected table with the expected email address. + INSERT INTO #Expected + (EmailAddress) + VALUES + ('particle-discovery@new-era-particles.tsqlt.org'); + + -- Compare the data in the #Expected and #Actual tables + EXEC tSQLt.AssertEqualsTable '#Expected', '#Actual'; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test foreign key is not violated if Particle color is in Color table.sql b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test foreign key is not violated if Particle color is in Color table.sql new file mode 100644 index 0000000..eeaca40 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test foreign key is not violated if Particle color is in Color table.sql @@ -0,0 +1,23 @@ + +CREATE PROC AcceleratorTests.[test foreign key is not violated if Particle color is in Color table] +AS +BEGIN + --Assemble: Fake the Particle and the Color tables to make sure they are empty and other + -- constraints will not be a problem + EXEC tSQLt.FakeTable 'Accelerator.Particle'; + EXEC tSQLt.FakeTable 'Accelerator.Color'; + -- Put the FK_ParticleColor foreign key constraint back onto the Particle table + -- so we can test it. + EXEC tSQLt.ApplyConstraint 'Accelerator.Particle', 'FK_ParticleColor'; + + -- Insert a record into the Color table. We'll reference this Id again in the Act + -- step. + INSERT INTO Accelerator.Color (Id) VALUES (7); + + --Act: Attempt to insert a record into the Particle table. + INSERT INTO Accelerator.Particle (ColorId) VALUES (7); + + --Assert: If any exception was thrown, the test will automatically fail. Therefore, the test + -- passes as long as there was no exception. This is one of the VERY rare cases when + -- at test case does not have an Assert step. +END diff --git a/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test foreign key violated if Particle color is not in Color table.sql b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test foreign key violated if Particle color is not in Color table.sql new file mode 100644 index 0000000..f80b803 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test foreign key violated if Particle color is not in Color table.sql @@ -0,0 +1,29 @@ + +CREATE PROCEDURE AcceleratorTests.[test foreign key violated if Particle color is not in Color table] +AS +BEGIN + --Assemble: Fake the Particle and the Color tables to make sure they are empty and other + -- constraints will not be a problem + EXEC tSQLt.FakeTable 'Accelerator.Particle'; + EXEC tSQLt.FakeTable 'Accelerator.Color'; + -- Put the FK_ParticleColor foreign key constraint back onto the Particle table + -- so we can test it. + EXEC tSQLt.ApplyConstraint 'Accelerator.Particle', 'FK_ParticleColor'; + + --Act: Attempt to insert a record into the Particle table without any records in Color table. + -- We expect an exception to happen, so we capture the ERROR_MESSAGE() + DECLARE @err NVARCHAR(MAX); SET @err = ''; + BEGIN TRY + INSERT INTO Accelerator.Particle (ColorId) VALUES (7); + END TRY + BEGIN CATCH + SET @err = ERROR_MESSAGE(); + END CATCH + + --Assert: Check that trying to insert the record resulted in the FK_ParticleColor foreign key being violated. + -- If no exception happened the value of @err is still ''. + IF (@err NOT LIKE '%FK_ParticleColor%') + BEGIN + EXEC tSQLt.Fail 'Expected exception (FK_ParticleColor exception) not thrown. Instead:',@err; + END; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test no particles are in a rectangle when there are no particles in the table.sql b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test no particles are in a rectangle when there are no particles in the table.sql new file mode 100644 index 0000000..6567729 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test no particles are in a rectangle when there are no particles in the table.sql @@ -0,0 +1,16 @@ + +CREATE PROCEDURE AcceleratorTests.[test no particles are in a rectangle when there are no particles in the table] +AS +BEGIN + --Assemble: Fake the Particle table to make sure it is empty + EXEC tSQLt.FakeTable 'Accelerator.Particle'; + + DECLARE @ParticlesInRectangle INT; + + --Act: Call the GetParticlesInRectangle Table-Valued Function and capture the number of rows it returns. + SELECT @ParticlesInRectangle = COUNT(1) + FROM Accelerator.GetParticlesInRectangle(0.0, 0.0, 1.0, 1.0); + + --Assert: Check that 0 rows were returned + EXEC tSQLt.AssertEquals 0, @ParticlesInRectangle; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test ready for experimentation if 2 particles.sql b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test ready for experimentation if 2 particles.sql new file mode 100644 index 0000000..99a6597 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test ready for experimentation if 2 particles.sql @@ -0,0 +1,20 @@ + +CREATE PROCEDURE + AcceleratorTests.[test ready for experimentation if 2 particles] +AS +BEGIN + --Assemble: Fake the Particle table to make sure + -- it is empty and has no constraints + EXEC tSQLt.FakeTable 'Accelerator.Particle'; + INSERT INTO Accelerator.Particle (Id) VALUES (1); + INSERT INTO Accelerator.Particle (Id) VALUES (2); + + DECLARE @Ready BIT; + + --Act: Call the IsExperimentReady function + SELECT @Ready = Accelerator.IsExperimentReady(); + + --Assert: Check that 1 is returned from IsExperimentReady + EXEC tSQLt.AssertEquals 1, @Ready; + +END; diff --git a/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test status message includes the number of particles.sql b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test status message includes the number of particles.sql new file mode 100644 index 0000000..7a13170 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test status message includes the number of particles.sql @@ -0,0 +1,18 @@ + +CREATE PROCEDURE AcceleratorTests.[test status message includes the number of particles] +AS +BEGIN + --Assemble: Fake the Particle table to make sure it is empty and that constraints will not be a problem + EXEC tSQLt.FakeTable 'Accelerator.Particle'; + -- Put 3 test particles into the table + INSERT INTO Accelerator.Particle (Id) VALUES (1); + INSERT INTO Accelerator.Particle (Id) VALUES (2); + INSERT INTO Accelerator.Particle (Id) VALUES (3); + + --Act: Call the GetStatusMessageFunction + DECLARE @StatusMessage NVARCHAR(MAX); + SELECT @StatusMessage = Accelerator.GetStatusMessage(); + + --Assert: Make sure the status message is correct + EXEC tSQLt.AssertEqualsString 'The Accelerator is prepared with 3 particles.', @StatusMessage; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test we are not ready for experimentation if there is only 1 particle.sql b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test we are not ready for experimentation if there is only 1 particle.sql new file mode 100644 index 0000000..b17d30b --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/AcceleratorTests/Stored Procedures/test we are not ready for experimentation if there is only 1 particle.sql @@ -0,0 +1,17 @@ + +CREATE PROCEDURE AcceleratorTests.[test we are not ready for experimentation if there is only 1 particle] +AS +BEGIN + --Assemble: Fake the Particle table to make sure it is empty and has no constraints + EXEC tSQLt.FakeTable 'Accelerator.Particle'; + INSERT INTO Accelerator.Particle (Id) VALUES (1); + + DECLARE @Ready BIT; + + --Act: Call the IsExperimentReady function + SELECT @Ready = Accelerator.IsExperimentReady(); + + --Assert: Check that 0 is returned from IsExperimentReady + EXEC tSQLt.AssertEquals 0, @Ready; + +END; diff --git a/src/SQLCover/test/DatabaseWithTests/Assemblies/tSQLtCLR.dll b/src/SQLCover/test/DatabaseWithTests/Assemblies/tSQLtCLR.dll new file mode 100644 index 0000000000000000000000000000000000000000..7ccc94ba7b4c1a1a9bc751104fe74d87a65f5002 GIT binary patch literal 20992 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 literal 0 HcmV?d00001 diff --git a/src/SQLCover/test/DatabaseWithTests/DatabaseWithTests.sqlproj b/src/SQLCover/test/DatabaseWithTests/DatabaseWithTests.sqlproj new file mode 100644 index 0000000..cb1d65d --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/DatabaseWithTests.sqlproj @@ -0,0 +1,853 @@ + + + + + Debug + AnyCPU + DatabaseWithTests + 2.0 + 4.1 + {021edcb7-e7a1-4f6e-bf0d-73aa4da7b62a} + Microsoft.Data.Tools.Schema.Sql.Sql130DatabaseSchemaProvider + Database + + + DatabaseWithTests + DatabaseWithTests + 1033,CI + BySchemaAndSchemaType + True + v4.6.1 + CS + Properties + False + True + True + Latin1_General_CI_AS + False + False + All + Off + 900 + 60 + 200 + 30 + 100 + Off + 0 + On + Off + DISABLED + False + False + None + True + False + 2049 + OFF + 60 + SECONDS + False + True + 2 + Days + False + False + True + False + CHECKSUM + EnableBroker + False + SIMPLE + False + False + True + False + 130 + False + False + False + False + False + False + False + False + ONLINE + False + GLOBAL + False + True + False + True + False + MULTI_USER + FULL + True + PRIMARY + + + bin\Release\ + $(MSBuildProjectName).sql + False + pdbonly + true + false + true + prompt + 4 + + + bin\Debug\ + $(MSBuildProjectName).sql + false + true + full + false + true + true + prompt + 4 + + + 11.0 + + True + 11.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + On + On + + + + + + + + + + + + + + + + + + + + + Assemblies\tSQLtCLR.dll + tSQLtCLR + True + False + dbo + SAFE + + + + + $(DacPacRootPath)\Extensions\Microsoft\SQLDB\Extensions\SqlServer\130\SqlSchemas\master.dacpac + False + master + + + \ No newline at end of file diff --git a/src/SQLCover/test/DatabaseWithTests/dbo/Stored Procedures/add_audit_login.sql b/src/SQLCover/test/DatabaseWithTests/dbo/Stored Procedures/add_audit_login.sql new file mode 100644 index 0000000..353f8cf --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/dbo/Stored Procedures/add_audit_login.sql @@ -0,0 +1,4 @@ + + create procedure add_audit_login(@user_name nvarchar(max)) + as + print 'audited user login' \ No newline at end of file diff --git a/src/SQLCover/test/DatabaseWithTests/dbo/Tables/companies.sql b/src/SQLCover/test/DatabaseWithTests/dbo/Tables/companies.sql new file mode 100644 index 0000000..c2d8527 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/dbo/Tables/companies.sql @@ -0,0 +1,6 @@ +CREATE TABLE [dbo].[companies] ( + [company_id] INT IDENTITY (1, 1) NOT NULL, + [company_name] NVARCHAR (255) NOT NULL, + [primary_address_id] INT NOT NULL +); + diff --git a/src/SQLCover/test/DatabaseWithTests/dbo/Tables/contacts.sql b/src/SQLCover/test/DatabaseWithTests/dbo/Tables/contacts.sql new file mode 100644 index 0000000..7247ad1 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/dbo/Tables/contacts.sql @@ -0,0 +1,8 @@ +CREATE TABLE [dbo].[contacts] ( + [contact_id] INT IDENTITY (1, 1) NOT NULL, + [first_name] NVARCHAR (50) NOT NULL, + [last_name] NVARCHAR (50) NOT NULL, + [phone_number] NVARCHAR (50) NOT NULL, + PRIMARY KEY CLUSTERED ([contact_id] ASC) +); + diff --git a/src/SQLCover/test/DatabaseWithTests/dbo/Tables/contracts.sql b/src/SQLCover/test/DatabaseWithTests/dbo/Tables/contracts.sql new file mode 100644 index 0000000..b9e7a06 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/dbo/Tables/contracts.sql @@ -0,0 +1,6 @@ +CREATE TABLE [dbo].[contracts] ( + [contract_id] INT IDENTITY (1, 1) NOT NULL, + [contract_description] VARCHAR (25) NOT NULL, + PRIMARY KEY CLUSTERED ([contract_id] ASC) +); + diff --git a/src/SQLCover/test/DatabaseWithTests/dbo/Tables/currencies.sql b/src/SQLCover/test/DatabaseWithTests/dbo/Tables/currencies.sql new file mode 100644 index 0000000..0b0a1bb --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/dbo/Tables/currencies.sql @@ -0,0 +1,5 @@ +CREATE TABLE [dbo].[currencies] ( + [currency_id] INT IDENTITY (1, 1) NOT NULL, + [currency_code] VARCHAR (3) NOT NULL +); + diff --git a/src/SQLCover/test/DatabaseWithTests/dbo/Tables/location.sql b/src/SQLCover/test/DatabaseWithTests/dbo/Tables/location.sql new file mode 100644 index 0000000..3045675 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/dbo/Tables/location.sql @@ -0,0 +1,10 @@ +CREATE TABLE [dbo].[location] ( + [location_id] INT IDENTITY (1, 1) NOT NULL, + [address_line_1] NVARCHAR (50) NOT NULL, + [address_line_2] NVARCHAR (50) NOT NULL, + [address_line_3] NVARCHAR (50) NOT NULL, + [address_line_4] NVARCHAR (50) NOT NULL, + [address_line_5] NVARCHAR (50) NOT NULL, + [primary_contact_id] INT NOT NULL +); + diff --git a/src/SQLCover/test/DatabaseWithTests/dbo/Tables/schedule.sql b/src/SQLCover/test/DatabaseWithTests/dbo/Tables/schedule.sql new file mode 100644 index 0000000..15d158b --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/dbo/Tables/schedule.sql @@ -0,0 +1,7 @@ +CREATE TABLE [dbo].[schedule] ( + [schedule_id] INT IDENTITY (1, 1) NOT NULL, + [date] DATE NOT NULL, + [approved] INT DEFAULT ((0)) NOT NULL, + PRIMARY KEY CLUSTERED ([schedule_id] ASC) +); + diff --git a/src/SQLCover/test/DatabaseWithTests/dbo/Tables/user_types.sql b/src/SQLCover/test/DatabaseWithTests/dbo/Tables/user_types.sql new file mode 100644 index 0000000..6683c04 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/dbo/Tables/user_types.sql @@ -0,0 +1,5 @@ +CREATE TABLE [dbo].[user_types] ( + [user_type_id] INT NOT NULL, + [user_type] NVARCHAR (50) NOT NULL +); + diff --git a/src/SQLCover/test/DatabaseWithTests/dbo/Tables/users.sql b/src/SQLCover/test/DatabaseWithTests/dbo/Tables/users.sql new file mode 100644 index 0000000..bdf65cf --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/dbo/Tables/users.sql @@ -0,0 +1,15 @@ +CREATE TABLE [dbo].[users] ( + [user_id] INT IDENTITY (1, 1) NOT NULL, + [user_name] NVARCHAR (255) NOT NULL, + [password] NVARCHAR (255) NOT NULL, + [company_id] INT NOT NULL, + [user_type] INT NOT NULL, + [pay_currency_id] INT NOT NULL, + [home_office_location_id] INT NOT NULL, + [contract_type_id] INT NOT NULL, + [parking_space_allocated] INT NOT NULL, + [holiday_schedule_id] INT NOT NULL, + [enabled] INT NOT NULL, + PRIMARY KEY CLUSTERED ([user_id] ASC) +); + diff --git a/src/SQLCover/test/DatabaseWithTests/login tests/Stored Procedures/test incorrect password causes exception.sql b/src/SQLCover/test/DatabaseWithTests/login tests/Stored Procedures/test incorrect password causes exception.sql new file mode 100644 index 0000000..aac5277 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/login tests/Stored Procedures/test incorrect password causes exception.sql @@ -0,0 +1,10 @@ + +CREATE procedure [login tests].[test incorrect password causes exception] +as + exec tSQLt.ExpectException 'username or password not found' + exec tSQLt.FakeTable 'dbo.users' + + insert into dbo.users(user_name, password, [enabled]) + select 'user_name', 'password', 1 + + exec security.login_user 'user_name', 'some other password' diff --git a/src/SQLCover/test/DatabaseWithTests/security/Accelerator.sql b/src/SQLCover/test/DatabaseWithTests/security/Accelerator.sql new file mode 100644 index 0000000..2142672 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/security/Accelerator.sql @@ -0,0 +1,3 @@ +CREATE SCHEMA [Accelerator] + AUTHORIZATION [dbo]; + diff --git a/src/SQLCover/test/DatabaseWithTests/security/AcceleratorTests.sql b/src/SQLCover/test/DatabaseWithTests/security/AcceleratorTests.sql new file mode 100644 index 0000000..db065bd --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/security/AcceleratorTests.sql @@ -0,0 +1,7 @@ +CREATE SCHEMA [AcceleratorTests] + AUTHORIZATION [dbo]; + + +GO +EXECUTE sp_addextendedproperty @name = N'tSQLt.TestClass', @value = 1, @level0type = N'SCHEMA', @level0name = N'AcceleratorTests'; + diff --git a/src/SQLCover/test/DatabaseWithTests/security/Stored Procedures/login_user.sql b/src/SQLCover/test/DatabaseWithTests/security/Stored Procedures/login_user.sql new file mode 100644 index 0000000..6c4555a --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/security/Stored Procedures/login_user.sql @@ -0,0 +1,16 @@ +CREATE procedure security.login_user (@user_name nvarchar(50), @hashed_password nvarchar(255)) + as + + if not exists(select * from dbo.users where user_name = @user_name and password = @hashed_password) + begin + RAISERROR ('username or password not found', 16, 1) + end + + if not exists(select * from dbo.users where user_name = @user_name and password = @hashed_password and enabled = 1) + begin + raiserror( 'user is not enabled', 16, 1); + end + + exec add_audit_login @user_name; + + select user_id from dbo.users where user_name = @user_name and password = @hashed_password and enabled = 1 diff --git a/src/SQLCover/test/DatabaseWithTests/security/bertie.sql b/src/SQLCover/test/DatabaseWithTests/security/bertie.sql new file mode 100644 index 0000000..16234c9 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/security/bertie.sql @@ -0,0 +1,7 @@ +CREATE SCHEMA [bertie] + AUTHORIZATION [dbo]; + + +GO +EXECUTE sp_addextendedproperty @name = N'tSQLt.TestClass', @value = 1, @level0type = N'SCHEMA', @level0name = N'bertie'; + diff --git a/src/SQLCover/test/DatabaseWithTests/security/login tests.sql b/src/SQLCover/test/DatabaseWithTests/security/login tests.sql new file mode 100644 index 0000000..d0b081a --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/security/login tests.sql @@ -0,0 +1,7 @@ +CREATE SCHEMA [login tests] + AUTHORIZATION [dbo]; + + +GO +EXECUTE sp_addextendedproperty @name = N'tSQLt.TestClass', @value = 1, @level0type = N'SCHEMA', @level0name = N'login tests'; + diff --git a/src/SQLCover/test/DatabaseWithTests/security/security.sql b/src/SQLCover/test/DatabaseWithTests/security/security.sql new file mode 100644 index 0000000..8fb6226 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/security/security.sql @@ -0,0 +1,3 @@ +CREATE SCHEMA [security] + AUTHORIZATION [dbo]; + diff --git a/src/SQLCover/test/DatabaseWithTests/security/tSQLt.sql b/src/SQLCover/test/DatabaseWithTests/security/tSQLt.sql new file mode 100644 index 0000000..c5c5f2b --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/security/tSQLt.sql @@ -0,0 +1,3 @@ +CREATE SCHEMA [tSQLt] + AUTHORIZATION [dbo]; + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/F_Num.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/F_Num.sql new file mode 100644 index 0000000..5729eec --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/F_Num.sql @@ -0,0 +1,17 @@ + + + +CREATE FUNCTION [tSQLt].[F_Num]( + @N INT +) +RETURNS TABLE +AS +RETURN WITH C0(c) AS (SELECT 1 UNION ALL SELECT 1), + C1(c) AS (SELECT 1 FROM C0 AS A CROSS JOIN C0 AS B), + C2(c) AS (SELECT 1 FROM C1 AS A CROSS JOIN C1 AS B), + C3(c) AS (SELECT 1 FROM C2 AS A CROSS JOIN C2 AS B), + C4(c) AS (SELECT 1 FROM C3 AS A CROSS JOIN C3 AS B), + C5(c) AS (SELECT 1 FROM C4 AS A CROSS JOIN C4 AS B), + C6(c) AS (SELECT 1 FROM C5 AS A CROSS JOIN C5 AS B) + SELECT TOP(CASE WHEN @N>0 THEN @N ELSE 0 END) ROW_NUMBER() OVER (ORDER BY c) no + FROM C6; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/GetTestResultFormatter.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/GetTestResultFormatter.sql new file mode 100644 index 0000000..b6d6457 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/GetTestResultFormatter.sql @@ -0,0 +1,16 @@ + +CREATE FUNCTION tSQLt.GetTestResultFormatter() +RETURNS NVARCHAR(MAX) +AS +BEGIN + DECLARE @FormatterName NVARCHAR(MAX); + + SELECT @FormatterName = CAST(value AS NVARCHAR(MAX)) + FROM sys.extended_properties + WHERE name = N'tSQLt.ResultsFormatter' + AND major_id = OBJECT_ID('tSQLt.Private_OutputTestResults'); + + SELECT @FormatterName = COALESCE(@FormatterName, 'tSQLt.DefaultResultFormatter'); + + RETURN @FormatterName; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Info.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Info.sql new file mode 100644 index 0000000..717f766 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Info.sql @@ -0,0 +1,28 @@ + +CREATE FUNCTION tSQLt.Info() +RETURNS TABLE +AS +RETURN +SELECT Version = '1.0.5873.27393', + ClrVersion = (SELECT tSQLt.Private::Info()), + ClrSigningKey = (SELECT tSQLt.Private::SigningKey()), + V.SqlVersion, + V.SqlBuild, + V.SqlEdition + FROM + ( + SELECT CAST(VI.major+'.'+VI.minor AS NUMERIC(10,2)) AS SqlVersion, + CAST(VI.build+'.'+VI.revision AS NUMERIC(10,2)) AS SqlBuild, + SqlEdition + FROM + ( + SELECT PARSENAME(PSV.ProductVersion,4) major, + PARSENAME(PSV.ProductVersion,3) minor, + PARSENAME(PSV.ProductVersion,2) build, + PARSENAME(PSV.ProductVersion,1) revision, + Edition AS SqlEdition + FROM tSQLt.Private_SqlVersion() AS PSV + )VI + )V; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_Bin2Hex.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_Bin2Hex.sql new file mode 100644 index 0000000..ae9d72a --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_Bin2Hex.sql @@ -0,0 +1,6 @@ +CREATE FUNCTION tSQLt.Private_Bin2Hex(@vb VARBINARY(MAX)) +RETURNS TABLE +AS +RETURN + SELECT X.S AS bare, '0x'+X.S AS prefix + FROM (SELECT LOWER(CAST('' AS XML).value('xs:hexBinary(sql:variable("@vb") )','VARCHAR(MAX)')))X(S); diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_FindConstraint.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_FindConstraint.sql new file mode 100644 index 0000000..f06f7b6 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_FindConstraint.sql @@ -0,0 +1,15 @@ + +CREATE FUNCTION tSQLt.Private_FindConstraint +( + @TableObjectId INT, + @ConstraintName NVARCHAR(MAX) +) +RETURNS TABLE +AS +RETURN + SELECT TOP(1) constraints.object_id AS ConstraintObjectId, type_desc AS ConstraintType + FROM sys.objects constraints + CROSS JOIN tSQLt.Private_GetOriginalTableInfo(@TableObjectId) orgTbl + WHERE @ConstraintName IN (constraints.name, QUOTENAME(constraints.name)) + AND constraints.parent_object_id = orgTbl.OrgTableObjectId + ORDER BY LEN(constraints.name) ASC; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetCleanObjectName.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetCleanObjectName.sql new file mode 100644 index 0000000..590e759 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetCleanObjectName.sql @@ -0,0 +1,7 @@ + +CREATE FUNCTION [tSQLt].[Private_GetCleanObjectName](@ObjectName NVARCHAR(MAX)) +RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN (SELECT OBJECT_NAME(OBJECT_ID(@ObjectName))); +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetCleanSchemaName.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetCleanSchemaName.sql new file mode 100644 index 0000000..41a9fcc --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetCleanSchemaName.sql @@ -0,0 +1,15 @@ + +/*******************************************************************************************/ +/*******************************************************************************************/ +/*******************************************************************************************/ +CREATE FUNCTION tSQLt.Private_GetCleanSchemaName(@SchemaName NVARCHAR(MAX), @ObjectName NVARCHAR(MAX)) +RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN (SELECT SCHEMA_NAME(schema_id) + FROM sys.objects + WHERE object_id = CASE WHEN ISNULL(@SchemaName,'') in ('','[]') + THEN OBJECT_ID(@ObjectName) + ELSE OBJECT_ID(@SchemaName + '.' + @ObjectName) + END); +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetCommaSeparatedColumnList.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetCommaSeparatedColumnList.sql new file mode 100644 index 0000000..98f25e7 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetCommaSeparatedColumnList.sql @@ -0,0 +1,14 @@ +CREATE FUNCTION tSQLt.Private_GetCommaSeparatedColumnList (@Table NVARCHAR(MAX), @ExcludeColumn NVARCHAR(MAX)) +RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN STUFF(( + SELECT ',' + CASE WHEN system_type_id = TYPE_ID('timestamp') THEN ';TIMESTAMP columns are unsupported!;' ELSE QUOTENAME(name) END + FROM sys.columns + WHERE object_id = OBJECT_ID(@Table) + AND name <> @ExcludeColumn + ORDER BY column_id + FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)') + ,1, 1, ''); + +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetConfiguration.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetConfiguration.sql new file mode 100644 index 0000000..1b35f40 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetConfiguration.sql @@ -0,0 +1,10 @@ +CREATE FUNCTION tSQLt.Private_GetConfiguration( + @Name NVARCHAR(100) +) +RETURNS TABLE +AS +RETURN + SELECT PC.Name, + PC.Value + FROM tSQLt.Private_Configurations AS PC + WHERE PC.Name = @Name; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetConstraintType.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetConstraintType.sql new file mode 100644 index 0000000..de56860 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetConstraintType.sql @@ -0,0 +1,9 @@ + +CREATE FUNCTION tSQLt.Private_GetConstraintType(@TableObjectId INT, @ConstraintName NVARCHAR(MAX)) +RETURNS TABLE +AS +RETURN + SELECT object_id,type,type_desc + FROM sys.objects + WHERE object_id = OBJECT_ID(SCHEMA_NAME(schema_id)+'.'+@ConstraintName) + AND parent_object_id = @TableObjectId; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetDataTypeOrComputedColumnDefinition.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetDataTypeOrComputedColumnDefinition.sql new file mode 100644 index 0000000..1ca4034 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetDataTypeOrComputedColumnDefinition.sql @@ -0,0 +1,20 @@ +CREATE FUNCTION tSQLt.Private_GetDataTypeOrComputedColumnDefinition(@UserTypeId INT, @MaxLength INT, @Precision INT, @Scale INT, @CollationName NVARCHAR(MAX), @ObjectId INT, @ColumnId INT, @ReturnDetails BIT) +RETURNS TABLE +AS +RETURN SELECT + COALESCE(cc.IsComputedColumn, 0) AS IsComputedColumn, + COALESCE(cc.ComputedColumnDefinition, GFTN.TypeName) AS ColumnDefinition + FROM (SELECT @UserTypeId, @MaxLength, @Precision, @Scale, @CollationName, @ObjectId, @ColumnId, @ReturnDetails) + AS V(UserTypeId, MaxLength, Precision, Scale, CollationName, ObjectId, ColumnId, ReturnDetails) + CROSS APPLY tSQLt.Private_GetFullTypeName(V.UserTypeId, V.MaxLength, V.Precision, V.Scale, V.CollationName) AS GFTN + LEFT JOIN (SELECT 1 AS IsComputedColumn, + ' AS '+ cci.definition + CASE WHEN cci.is_persisted = 1 THEN ' PERSISTED' ELSE '' END AS ComputedColumnDefinition, + cci.object_id, + cci.column_id + FROM sys.computed_columns cci + )cc + ON cc.object_id = V.ObjectId + AND cc.column_id = V.ColumnId + AND V.ReturnDetails = 1; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetDefaultConstraintDefinition.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetDefaultConstraintDefinition.sql new file mode 100644 index 0000000..582f430 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetDefaultConstraintDefinition.sql @@ -0,0 +1,15 @@ +CREATE FUNCTION tSQLt.Private_GetDefaultConstraintDefinition(@ObjectId INT, @ColumnId INT, @ReturnDetails BIT) +RETURNS TABLE +AS +RETURN SELECT + COALESCE(IsDefault, 0) AS IsDefault, + COALESCE(DefaultDefinition, '') AS DefaultDefinition + FROM (SELECT 1) X(X) + LEFT JOIN (SELECT 1 AS IsDefault,' DEFAULT '+ definition AS DefaultDefinition,parent_object_id,parent_column_id + FROM sys.default_constraints + )dc + ON dc.parent_object_id = @ObjectId + AND dc.parent_column_id = @ColumnId + AND @ReturnDetails = 1; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetExternalAccessKeyBytes.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetExternalAccessKeyBytes.sql new file mode 100644 index 0000000..18c9855 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetExternalAccessKeyBytes.sql @@ -0,0 +1,5 @@ +CREATE FUNCTION tSQLt.Private_GetExternalAccessKeyBytes() +RETURNS TABLE +AS +RETURN + SELECT 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C0103005419AD560000000000000000E00002210B010B00000400000006000000000000CE2300000020000000400000000000100020000000020000040000000000000004000000000000000080000000020000817000000300408500001000001000000000100000100000000000001000000000000000000000007C2300004F00000000400000E002000000000000000000000000000000000000006000000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000D4030000002000000004000000020000000000000000000000000000200000602E72737263000000E0020000004000000004000000060000000000000000000000000000400000402E72656C6F6300000C0000000060000000020000000A00000000000000000000000000004000004200000000000000000000000000000000B0230000000000004800000002000500D0200000AC0200000900000000000000000000000000000050200000800000000000000000000000000000000000000000000000000000000000000000000000213462F5B9EF260060DE50E40053E6687E4C3CB839148A25A72ED4644D1DB6A8835FE0C2D5FDD8B91073B9C39F7A8FCD4BE43786C9306E73D060E389A18E678E8BF334A1C46DCD33B21D6986A0DDEF92A7C1CD14E1D25582B177CF24DFBE14AB8845A657360F13F7E75792FFBC48D5C7FB979E2E480BFDB7B8AEEB16FB394A3A42534A4201000100000000000C00000076322E302E35303732370000000005006C0000009C000000237E000008010000AC00000023537472696E677300000000B40100000800000023555300BC010000100000002347554944000000CC010000E000000023426C6F620000000000000002000001071400000900000000FA2533001600000100000002000000010000000200000002000000010000000100000000000A0001000000000006004E002E00060074002E00000000000100000000000100010009006E000A0011006E000F002E000B00B5002E001300BE000480000000000000000000000100000013009200000002000000000000000000000001002500000000000000003C4D6F64756C653E007453514C7445787465726E616C4163636573734B65792E646C6C006D73636F726C69620053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E73417474726962757465002E63746F720052756E74696D65436F6D7061746962696C697479417474726962757465007453514C7445787465726E616C4163636573734B6579000000000003200000000000FA9D540989B0294FAE952438919E8F450008B77A5C561934E08904200101080320000180A00024000004800000940000000602000000240000525341310004000001000100F7D9A45F2B508C2887A8794B053CE5DEB28743B7C748FF545F1F51218B684454B785054629C1417D1D3542B095D80BA171294948FCF978A502AA03240C024746B563BC29B4D8DCD6956593C0C425446021D699EF6FB4DC2155DE7E393150AD6617EDC01216EA93FCE5F8F7BE9FF605AD2B8344E8CC01BEDB924ED06FD368D1D00801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F777301000000A42300000000000000000000BE230000002000000000000000000000000000000000000000000000B0230000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF2500200010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058400000840200000000000000000000840234000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000000000000000000000000000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B004E4010000010053007400720069006E006700460069006C00650049006E0066006F000000C001000001003000300030003000300034006200300000002C0002000100460069006C0065004400650073006300720069007000740069006F006E000000000020000000300008000100460069006C006500560065007200730069006F006E000000000030002E0030002E0030002E003000000058001B00010049006E007400650072006E0061006C004E0061006D00650000007400530051004C007400450078007400650072006E0061006C004100630063006500730073004B00650079002E0064006C006C00000000002800020001004C006500670061006C0043006F00700079007200690067006800740000002000000060001B0001004F0072006900670069006E0061006C00460069006C0065006E0061006D00650000007400530051004C007400450078007400650072006E0061006C004100630063006500730073004B00650079002E0064006C006C0000000000340008000100500072006F006400750063007400560065007200730069006F006E00000030002E0030002E0030002E003000000038000800010041007300730065006D0062006C0079002000560065007200730069006F006E00000030002E0030002E0030002E003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000C000000D03300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 AS ExternalAccessKeyBytes, 0x7722217D36028E4C AS ExternalAccessKeyThumbPrint; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetForeignKeyDefinition.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetForeignKeyDefinition.sql new file mode 100644 index 0000000..2561978 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetForeignKeyDefinition.sql @@ -0,0 +1,53 @@ + +CREATE FUNCTION tSQLt.Private_GetForeignKeyDefinition( + @SchemaName NVARCHAR(MAX), + @ParentTableName NVARCHAR(MAX), + @ForeignKeyName NVARCHAR(MAX), + @NoCascade BIT +) +RETURNS TABLE +AS +RETURN SELECT 'CONSTRAINT ' + name + ' FOREIGN KEY (' + + parCols + ') REFERENCES ' + refName + '(' + refCols + ')'+ + CASE WHEN @NoCascade = 1 THEN '' + ELSE delete_referential_action_cmd + ' ' + update_referential_action_cmd + END AS cmd, + CASE + WHEN RefTableIsFakedInd = 1 + THEN 'CREATE UNIQUE INDEX ' + tSQLt.Private::CreateUniqueObjectName() + ' ON ' + refName + '(' + refCols + ');' + ELSE '' + END CreIdxCmd + FROM (SELECT QUOTENAME(SCHEMA_NAME(k.schema_id)) AS SchemaName, + QUOTENAME(k.name) AS name, + QUOTENAME(OBJECT_NAME(k.parent_object_id)) AS parName, + QUOTENAME(SCHEMA_NAME(refTab.schema_id)) + '.' + QUOTENAME(refTab.name) AS refName, + parCol.ColNames AS parCols, + refCol.ColNames AS refCols, + 'ON UPDATE '+ + CASE k.update_referential_action + WHEN 0 THEN 'NO ACTION' + WHEN 1 THEN 'CASCADE' + WHEN 2 THEN 'SET NULL' + WHEN 3 THEN 'SET DEFAULT' + END AS update_referential_action_cmd, + 'ON DELETE '+ + CASE k.delete_referential_action + WHEN 0 THEN 'NO ACTION' + WHEN 1 THEN 'CASCADE' + WHEN 2 THEN 'SET NULL' + WHEN 3 THEN 'SET DEFAULT' + END AS delete_referential_action_cmd, + CASE WHEN e.name IS NULL THEN 0 + ELSE 1 + END AS RefTableIsFakedInd + FROM sys.foreign_keys k + CROSS APPLY tSQLt.Private_GetForeignKeyParColumns(k.object_id) AS parCol + CROSS APPLY tSQLt.Private_GetForeignKeyRefColumns(k.object_id) AS refCol + LEFT JOIN sys.extended_properties e + ON e.name = 'tSQLt.FakeTable_OrgTableName' + AND e.value = OBJECT_NAME(k.referenced_object_id) + JOIN sys.tables refTab + ON COALESCE(e.major_id,k.referenced_object_id) = refTab.object_id + WHERE k.parent_object_id = OBJECT_ID(@SchemaName + '.' + @ParentTableName) + AND k.object_id = OBJECT_ID(@SchemaName + '.' + @ForeignKeyName) + )x; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetForeignKeyParColumns.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetForeignKeyParColumns.sql new file mode 100644 index 0000000..54ec178 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetForeignKeyParColumns.sql @@ -0,0 +1,13 @@ +CREATE FUNCTION tSQLt.Private_GetForeignKeyParColumns( + @ConstraintObjectId INT +) +RETURNS TABLE +AS +RETURN SELECT STUFF(( + SELECT ','+QUOTENAME(pci.name) FROM sys.foreign_key_columns c + JOIN sys.columns pci + ON pci.object_id = c.parent_object_id + AND pci.column_id = c.parent_column_id + WHERE @ConstraintObjectId = c.constraint_object_id + FOR XML PATH(''),TYPE + ).value('.','NVARCHAR(MAX)'),1,1,'') AS ColNames diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetForeignKeyRefColumns.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetForeignKeyRefColumns.sql new file mode 100644 index 0000000..9622b97 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetForeignKeyRefColumns.sql @@ -0,0 +1,14 @@ + +CREATE FUNCTION tSQLt.Private_GetForeignKeyRefColumns( + @ConstraintObjectId INT +) +RETURNS TABLE +AS +RETURN SELECT STUFF(( + SELECT ','+QUOTENAME(rci.name) FROM sys.foreign_key_columns c + JOIN sys.columns rci + ON rci.object_id = c.referenced_object_id + AND rci.column_id = c.referenced_column_id + WHERE @ConstraintObjectId = c.constraint_object_id + FOR XML PATH(''),TYPE + ).value('.','NVARCHAR(MAX)'),1,1,'') AS ColNames; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetFullTypeName.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetFullTypeName.sql new file mode 100644 index 0000000..d4711a1 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetFullTypeName.sql @@ -0,0 +1,26 @@ +CREATE FUNCTION tSQLt.Private_GetFullTypeName(@TypeId INT, @Length INT, @Precision INT, @Scale INT, @CollationName NVARCHAR(MAX)) +RETURNS TABLE +AS +RETURN SELECT X.SchemaName + '.' + X.Name + X.Suffix + X.Collation AS TypeName, X.SchemaName, X.Name, X.Suffix, X.is_table_type AS IsTableType +FROM( + SELECT QUOTENAME(SCHEMA_NAME(T.schema_id)) SchemaName, QUOTENAME(T.name) Name, + CASE WHEN T.max_length = -1 + THEN '' + WHEN @Length = -1 + THEN '(MAX)' + WHEN T.name LIKE 'n%char' + THEN '(' + CAST(@Length / 2 AS NVARCHAR) + ')' + WHEN T.name LIKE '%char' OR T.name LIKE '%binary' + THEN '(' + CAST(@Length AS NVARCHAR) + ')' + WHEN T.name IN ('decimal', 'numeric') + THEN '(' + CAST(@Precision AS NVARCHAR) + ',' + CAST(@Scale AS NVARCHAR) + ')' + ELSE '' + END Suffix, + CASE WHEN @CollationName IS NULL OR T.is_user_defined = 1 THEN '' + ELSE ' COLLATE ' + @CollationName + END Collation, + T.is_table_type + FROM tSQLt.Private_SysTypes AS T WHERE T.user_type_id = @TypeId + )X; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetIdentityDefinition.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetIdentityDefinition.sql new file mode 100644 index 0000000..cc9baea --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetIdentityDefinition.sql @@ -0,0 +1,19 @@ + +CREATE FUNCTION tSQLt.Private_GetIdentityDefinition(@ObjectId INT, @ColumnId INT, @ReturnDetails BIT) +RETURNS TABLE +AS +RETURN SELECT + COALESCE(IsIdentity, 0) AS IsIdentityColumn, + COALESCE(IdentityDefinition, '') AS IdentityDefinition + FROM (SELECT 1) X(X) + LEFT JOIN (SELECT 1 AS IsIdentity, + ' IDENTITY(' + CAST(seed_value AS NVARCHAR(MAX)) + ',' + CAST(increment_value AS NVARCHAR(MAX)) + ')' AS IdentityDefinition, + object_id, + column_id + FROM sys.identity_columns + ) AS id + ON id.object_id = @ObjectId + AND id.column_id = @ColumnId + AND @ReturnDetails = 1; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetLastTestNameIfNotProvided.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetLastTestNameIfNotProvided.sql new file mode 100644 index 0000000..f129b12 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetLastTestNameIfNotProvided.sql @@ -0,0 +1,18 @@ + +---------------------------------------------------------------------- +CREATE FUNCTION tSQLt.Private_GetLastTestNameIfNotProvided(@TestName NVARCHAR(MAX)) +RETURNS NVARCHAR(MAX) +AS +BEGIN + IF(LTRIM(ISNULL(@TestName,'')) = '') + BEGIN + SELECT @TestName = TestName + FROM tSQLt.Run_LastExecution le + JOIN sys.dm_exec_sessions es + ON le.SessionId = es.session_id + AND le.LoginTime = es.login_time + WHERE es.session_id = @@SPID; + END + + RETURN @TestName; +END diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetOriginalTableInfo.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetOriginalTableInfo.sql new file mode 100644 index 0000000..add8238 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetOriginalTableInfo.sql @@ -0,0 +1,11 @@ + +CREATE FUNCTION tSQLt.Private_GetOriginalTableInfo(@TableObjectId INT) +RETURNS TABLE +AS + RETURN SELECT CAST(value AS NVARCHAR(4000)) OrgTableName, + OBJECT_ID(QUOTENAME(OBJECT_SCHEMA_NAME(@TableObjectId)) + '.' + QUOTENAME(CAST(value AS NVARCHAR(4000)))) OrgTableObjectId + FROM sys.extended_properties + WHERE class_desc = 'OBJECT_OR_COLUMN' + AND major_id = @TableObjectId + AND minor_id = 0 + AND name = 'tSQLt.FakeTable_OrgTableName'; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetOriginalTableName.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetOriginalTableName.sql new file mode 100644 index 0000000..94066a5 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetOriginalTableName.sql @@ -0,0 +1,16 @@ + + +/*******************************************************************************************/ +/*******************************************************************************************/ +/*******************************************************************************************/ +CREATE FUNCTION tSQLt.Private_GetOriginalTableName(@SchemaName NVARCHAR(MAX), @TableName NVARCHAR(MAX)) --DELETE!!! +RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN (SELECT CAST(value AS NVARCHAR(4000)) + FROM sys.extended_properties + WHERE class_desc = 'OBJECT_OR_COLUMN' + AND major_id = OBJECT_ID(@SchemaName + '.' + @TableName) + AND minor_id = 0 + AND name = 'tSQLt.FakeTable_OrgTableName'); +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetQuotedFullName.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetQuotedFullName.sql new file mode 100644 index 0000000..20b8184 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetQuotedFullName.sql @@ -0,0 +1,9 @@ + +CREATE FUNCTION tSQLt.Private_GetQuotedFullName(@Objectid INT) +RETURNS NVARCHAR(517) +AS +BEGIN + DECLARE @QuotedName NVARCHAR(517); + SELECT @QuotedName = QUOTENAME(OBJECT_SCHEMA_NAME(@Objectid)) + '.' + QUOTENAME(OBJECT_NAME(@Objectid)); + RETURN @QuotedName; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetQuotedTableNameForConstraint.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetQuotedTableNameForConstraint.sql new file mode 100644 index 0000000..06c8b91 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetQuotedTableNameForConstraint.sql @@ -0,0 +1,18 @@ +CREATE FUNCTION tSQLt.Private_GetQuotedTableNameForConstraint(@ConstraintObjectId INT) +RETURNS TABLE +AS +RETURN + SELECT QUOTENAME(SCHEMA_NAME(newtbl.schema_id)) + '.' + QUOTENAME(OBJECT_NAME(newtbl.object_id)) QuotedTableName, + SCHEMA_NAME(newtbl.schema_id) SchemaName, + OBJECT_NAME(newtbl.object_id) TableName, + OBJECT_NAME(constraints.parent_object_id) OrgTableName + FROM sys.objects AS constraints + JOIN sys.extended_properties AS p + JOIN sys.objects AS newtbl + ON newtbl.object_id = p.major_id + AND p.minor_id = 0 + AND p.class_desc = 'OBJECT_OR_COLUMN' + AND p.name = 'tSQLt.FakeTable_OrgTableName' + ON OBJECT_NAME(constraints.parent_object_id) = CAST(p.value AS NVARCHAR(4000)) + AND constraints.schema_id = newtbl.schema_id + AND constraints.object_id = @ConstraintObjectId; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetSchemaId.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetSchemaId.sql new file mode 100644 index 0000000..a668f91 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetSchemaId.sql @@ -0,0 +1,13 @@ + +CREATE FUNCTION tSQLt.Private_GetSchemaId(@SchemaName NVARCHAR(MAX)) +RETURNS INT +AS +BEGIN + RETURN ( + SELECT TOP(1) schema_id + FROM sys.schemas + WHERE @SchemaName IN (name, QUOTENAME(name), QUOTENAME(name, '"')) + ORDER BY + CASE WHEN name = @SchemaName THEN 0 ELSE 1 END + ); +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetUniqueConstraintDefinition.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetUniqueConstraintDefinition.sql new file mode 100644 index 0000000..fc96034 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_GetUniqueConstraintDefinition.sql @@ -0,0 +1,54 @@ +CREATE FUNCTION tSQLt.Private_GetUniqueConstraintDefinition +( + @ConstraintObjectId INT, + @QuotedTableName NVARCHAR(MAX) +) +RETURNS TABLE +AS +RETURN + SELECT 'ALTER TABLE '+ + @QuotedTableName + + ' ADD CONSTRAINT ' + + QUOTENAME(OBJECT_NAME(@ConstraintObjectId)) + + ' ' + + CASE WHEN KC.type_desc = 'UNIQUE_CONSTRAINT' + THEN 'UNIQUE' + ELSE 'PRIMARY KEY' + END + + '(' + + STUFF(( + SELECT ','+QUOTENAME(C.name) + FROM sys.index_columns AS IC + JOIN sys.columns AS C + ON IC.object_id = C.object_id + AND IC.column_id = C.column_id + WHERE KC.unique_index_id = IC.index_id + AND KC.parent_object_id = IC.object_id + FOR XML PATH(''),TYPE + ).value('.','NVARCHAR(MAX)'), + 1, + 1, + '' + ) + + ');' AS CreateConstraintCmd, + CASE WHEN KC.type_desc = 'UNIQUE_CONSTRAINT' + THEN '' + ELSE ( + SELECT 'ALTER TABLE ' + + @QuotedTableName + + ' ALTER COLUMN ' + + QUOTENAME(C.name)+ + cc.ColumnDefinition + + ' NOT NULL;' + FROM sys.index_columns AS IC + JOIN sys.columns AS C + ON IC.object_id = C.object_id + AND IC.column_id = C.column_id + CROSS APPLY tSQLt.Private_GetDataTypeOrComputedColumnDefinition(C.user_type_id, C.max_length, C.precision, C.scale, C.collation_name, C.object_id, C.column_id, 0) cc + WHERE KC.unique_index_id = IC.index_id + AND KC.parent_object_id = IC.object_id + FOR XML PATH(''),TYPE + ).value('.','NVARCHAR(MAX)') + END AS NotNullColumnCmd + FROM sys.key_constraints AS KC + WHERE KC.object_id = @ConstraintObjectId; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_IsTestClass.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_IsTestClass.sql new file mode 100644 index 0000000..0e5f47e --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_IsTestClass.sql @@ -0,0 +1,16 @@ + +CREATE FUNCTION tSQLt.Private_IsTestClass(@TestClassName NVARCHAR(MAX)) +RETURNS BIT +AS +BEGIN + RETURN + CASE + WHEN EXISTS( + SELECT 1 + FROM tSQLt.TestClasses + WHERE SchemaId = tSQLt.Private_GetSchemaId(@TestClassName) + ) + THEN 1 + ELSE 0 + END; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_QuoteClassNameForNewTestClass.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_QuoteClassNameForNewTestClass.sql new file mode 100644 index 0000000..13b672b --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_QuoteClassNameForNewTestClass.sql @@ -0,0 +1,12 @@ + +CREATE FUNCTION tSQLt.Private_QuoteClassNameForNewTestClass(@ClassName NVARCHAR(MAX)) + RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN + CASE WHEN @ClassName LIKE '[[]%]' THEN @ClassName + ELSE QUOTENAME(@ClassName) + END; +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveApplyConstraintParameters.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveApplyConstraintParameters.sql new file mode 100644 index 0000000..305be50 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveApplyConstraintParameters.sql @@ -0,0 +1,19 @@ + +CREATE FUNCTION tSQLt.Private_ResolveApplyConstraintParameters +( + @A NVARCHAR(MAX), + @B NVARCHAR(MAX), + @C NVARCHAR(MAX) +) +RETURNS TABLE +AS +RETURN + SELECT ConstraintObjectId, ConstraintType + FROM tSQLt.Private_FindConstraint(OBJECT_ID(@A), @B) + WHERE @C IS NULL + UNION ALL + SELECT * + FROM tSQLt.Private_FindConstraint(OBJECT_ID(@A + '.' + @B), @C) + UNION ALL + SELECT * + FROM tSQLt.Private_FindConstraint(OBJECT_ID(@C + '.' + @A), @B); diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveFakeTableNamesForBackwardCompatibility.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveFakeTableNamesForBackwardCompatibility.sql new file mode 100644 index 0000000..426e3df --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveFakeTableNamesForBackwardCompatibility.sql @@ -0,0 +1,12 @@ + +CREATE FUNCTION tSQLt.Private_ResolveFakeTableNamesForBackwardCompatibility + (@TableName NVARCHAR(MAX), @SchemaName NVARCHAR(MAX)) +RETURNS TABLE AS +RETURN + SELECT QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) AS CleanSchemaName, + QUOTENAME(OBJECT_NAME(object_id)) AS CleanTableName + FROM (SELECT CASE + WHEN @SchemaName IS NULL THEN OBJECT_ID(@TableName) + ELSE COALESCE(OBJECT_ID(@SchemaName + '.' + @TableName),OBJECT_ID(@TableName + '.' + @SchemaName)) + END object_id + ) ids; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveName.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveName.sql new file mode 100644 index 0000000..a735304 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveName.sql @@ -0,0 +1,19 @@ + +CREATE FUNCTION tSQLt.Private_ResolveName(@Name NVARCHAR(MAX)) +RETURNS TABLE +AS +RETURN + WITH resolvedNames(ord, schemaId, objectId, quotedSchemaName, quotedObjectName, quotedFullName, isTestClass, isTestCase, isSchema) AS + (SELECT 1, schemaId, NULL, quotedSchemaName, NULL, quotedSchemaName, isTestClass, 0, 1 + FROM tSQLt.Private_ResolveSchemaName(@Name) + UNION ALL + SELECT 2, schemaId, objectId, quotedSchemaName, quotedObjectName, quotedFullName, 0, isTestCase, 0 + FROM tSQLt.Private_ResolveObjectName(@Name) + UNION ALL + SELECT 3, NULL, NULL, NULL, NULL, NULL, 0, 0, 0 + ) + SELECT TOP(1) schemaId, objectId, quotedSchemaName, quotedObjectName, quotedFullName, isTestClass, isTestCase, isSchema + FROM resolvedNames + WHERE schemaId IS NOT NULL + OR ord = 3 + ORDER BY ord diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveObjectName.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveObjectName.sql new file mode 100644 index 0000000..e481a80 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveObjectName.sql @@ -0,0 +1,25 @@ + +CREATE FUNCTION tSQLt.Private_ResolveObjectName(@Name NVARCHAR(MAX)) +RETURNS TABLE +AS +RETURN + WITH ids(schemaId, objectId) AS + (SELECT SCHEMA_ID(OBJECT_SCHEMA_NAME(OBJECT_ID(@Name))), + OBJECT_ID(@Name) + ), + idsWithNames(schemaId, objectId, quotedSchemaName, quotedObjectName) AS + (SELECT schemaId, objectId, + QUOTENAME(SCHEMA_NAME(schemaId)) AS quotedSchemaName, + QUOTENAME(OBJECT_NAME(objectId)) AS quotedObjectName + FROM ids + ) + SELECT schemaId, + objectId, + quotedSchemaName, + quotedObjectName, + quotedSchemaName + '.' + quotedObjectName AS quotedFullName, + CASE WHEN LOWER(quotedObjectName) LIKE '[[]test%]' + AND objectId = OBJECT_ID(quotedSchemaName + '.' + quotedObjectName,'P') + THEN 1 ELSE 0 END AS isTestCase + FROM idsWithNames; + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveSchemaName.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveSchemaName.sql new file mode 100644 index 0000000..0211337 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ResolveSchemaName.sql @@ -0,0 +1,21 @@ + +CREATE FUNCTION tSQLt.Private_ResolveSchemaName(@Name NVARCHAR(MAX)) +RETURNS TABLE +AS +RETURN + WITH ids(schemaId) AS + (SELECT tSQLt.Private_GetSchemaId(@Name) + ), + idsWithNames(schemaId, quotedSchemaName) AS + (SELECT schemaId, + QUOTENAME(SCHEMA_NAME(schemaId)) + FROM ids + ) + SELECT schemaId, + quotedSchemaName, + CASE WHEN EXISTS(SELECT 1 FROM tSQLt.TestClasses WHERE TestClasses.SchemaId = idsWithNames.schemaId) + THEN 1 + ELSE 0 + END AS isTestClass, + CASE WHEN schemaId IS NOT NULL THEN 1 ELSE 0 END AS isSchema + FROM idsWithNames; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ScriptIndex.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ScriptIndex.sql new file mode 100644 index 0000000..f31a14e --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_ScriptIndex.sql @@ -0,0 +1,74 @@ +CREATE FUNCTION tSQLt.Private_ScriptIndex +( + @object_id INT, + @index_id INT +) +RETURNS TABLE +AS +RETURN + SELECT I.index_id, + I.name AS index_name, + I.is_primary_key, + I.is_unique, + I.is_disabled, + 'CREATE ' + + CASE WHEN I.is_unique = 1 THEN 'UNIQUE ' ELSE '' END + + CASE I.type + WHEN 1 THEN 'CLUSTERED' + WHEN 2 THEN 'NONCLUSTERED' + WHEN 5 THEN 'CLUSTERED COLUMNSTORE' + WHEN 6 THEN 'NONCLUSTERED COLUMNSTORE' + ELSE '{Index Type Not Supported!}' + END + + ' INDEX ' + + QUOTENAME(I.name)+ + ' ON ' + QUOTENAME(OBJECT_SCHEMA_NAME(@object_id)) + '.' + QUOTENAME(OBJECT_NAME(@object_id)) + + CASE WHEN I.type NOT IN (5) + THEN + '('+ + CL.column_list + + ')' + ELSE '' + END + + CASE WHEN I.has_filter = 1 + THEN 'WHERE' + I.filter_definition + ELSE '' + END + + CASE WHEN I.is_hypothetical = 1 + THEN 'WITH(STATISTICS_ONLY = -1)' + ELSE '' + END + + ';' AS create_cmd + FROM tSQLt.Private_SysIndexes AS I + CROSS APPLY + ( + SELECT + ( + SELECT + CASE WHEN OIC.rn > 1 THEN ',' ELSE '' END + + CASE WHEN OIC.rn = 1 AND OIC.is_included_column = 1 AND I.type NOT IN (6) THEN ')INCLUDE(' ELSE '' END + + QUOTENAME(OIC.name) + + CASE WHEN OIC.is_included_column = 0 + THEN CASE WHEN OIC.is_descending_key = 1 THEN 'DESC' ELSE 'ASC' END + ELSE '' + END + FROM + ( + SELECT C.name, + IC.is_descending_key, + IC.key_ordinal, + IC.is_included_column, + ROW_NUMBER()OVER(PARTITION BY IC.is_included_column ORDER BY IC.key_ordinal, IC.index_column_id) AS rn + FROM sys.index_columns AS IC + JOIN sys.columns AS C + ON IC.column_id = C.column_id + AND IC.object_id = C.object_id + WHERE IC.object_id = I.object_id + AND IC.index_id = I.index_id + )OIC + ORDER BY OIC.is_included_column, OIC.rn + FOR XML PATH(''),TYPE + ).value('.','NVARCHAR(MAX)') AS column_list + )CL + WHERE I.object_id = @object_id + AND I.index_id = ISNULL(@index_id,I.index_id); diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_SqlVariantFormatter.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_SqlVariantFormatter.sql new file mode 100644 index 0000000..8a8925d --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_SqlVariantFormatter.sql @@ -0,0 +1,23 @@ + +CREATE FUNCTION tSQLt.Private_SqlVariantFormatter(@Value SQL_VARIANT) +RETURNS NVARCHAR(MAX) +AS +BEGIN + RETURN CASE UPPER(CAST(SQL_VARIANT_PROPERTY(@Value,'BaseType')AS sysname)) + WHEN 'FLOAT' THEN CONVERT(NVARCHAR(MAX),@Value,2) + WHEN 'REAL' THEN CONVERT(NVARCHAR(MAX),@Value,1) + WHEN 'MONEY' THEN CONVERT(NVARCHAR(MAX),@Value,2) + WHEN 'SMALLMONEY' THEN CONVERT(NVARCHAR(MAX),@Value,2) + WHEN 'DATE' THEN CONVERT(NVARCHAR(MAX),@Value,126) + WHEN 'DATETIME' THEN CONVERT(NVARCHAR(MAX),@Value,126) + WHEN 'DATETIME2' THEN CONVERT(NVARCHAR(MAX),@Value,126) + WHEN 'DATETIMEOFFSET' THEN CONVERT(NVARCHAR(MAX),@Value,126) + WHEN 'SMALLDATETIME' THEN CONVERT(NVARCHAR(MAX),@Value,126) + WHEN 'TIME' THEN CONVERT(NVARCHAR(MAX),@Value,126) + WHEN 'BINARY' THEN CONVERT(NVARCHAR(MAX),@Value,1) + WHEN 'VARBINARY' THEN CONVERT(NVARCHAR(MAX),@Value,1) + ELSE CAST(@Value AS NVARCHAR(MAX)) + END; +END + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_SqlVersion.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_SqlVersion.sql new file mode 100644 index 0000000..2572e34 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/Private_SqlVersion.sql @@ -0,0 +1,6 @@ +CREATE FUNCTION tSQLt.Private_SqlVersion() +RETURNS TABLE +AS +RETURN + SELECT CAST(SERVERPROPERTY('ProductVersion')AS NVARCHAR(128)) ProductVersion, + CAST(SERVERPROPERTY('Edition')AS NVARCHAR(128)) Edition; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/TestCaseSummary.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/TestCaseSummary.sql new file mode 100644 index 0000000..fc6c84b --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Functions/TestCaseSummary.sql @@ -0,0 +1,18 @@ + + +CREATE FUNCTION tSQLt.TestCaseSummary() +RETURNS TABLE +AS +RETURN WITH A(Cnt, SuccessCnt, FailCnt, ErrorCnt) AS ( + SELECT COUNT(1), + ISNULL(SUM(CASE WHEN Result = 'Success' THEN 1 ELSE 0 END), 0), + ISNULL(SUM(CASE WHEN Result = 'Failure' THEN 1 ELSE 0 END), 0), + ISNULL(SUM(CASE WHEN Result = 'Error' THEN 1 ELSE 0 END), 0) + FROM tSQLt.TestResult + + ) + SELECT 'Test Case Summary: ' + CAST(Cnt AS NVARCHAR) + ' test case(s) executed, '+ + CAST(SuccessCnt AS NVARCHAR) + ' succeeded, '+ + CAST(FailCnt AS NVARCHAR) + ' failed, '+ + CAST(ErrorCnt AS NVARCHAR) + ' errored.' Msg,* + FROM A; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ApplyConstraint.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ApplyConstraint.sql new file mode 100644 index 0000000..4e9fc59 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ApplyConstraint.sql @@ -0,0 +1,36 @@ + +CREATE PROCEDURE tSQLt.ApplyConstraint + @TableName NVARCHAR(MAX), + @ConstraintName NVARCHAR(MAX), + @SchemaName NVARCHAR(MAX) = NULL, --parameter preserved for backward compatibility. Do not use. Will be removed soon. + @NoCascade BIT = 0 +AS +BEGIN + DECLARE @ConstraintType NVARCHAR(MAX); + DECLARE @ConstraintObjectId INT; + + SELECT @ConstraintType = ConstraintType, @ConstraintObjectId = ConstraintObjectId + FROM tSQLt.Private_ResolveApplyConstraintParameters (@TableName, @ConstraintName, @SchemaName); + + IF @ConstraintType = 'CHECK_CONSTRAINT' + BEGIN + EXEC tSQLt.Private_ApplyCheckConstraint @ConstraintObjectId; + RETURN 0; + END + + IF @ConstraintType = 'FOREIGN_KEY_CONSTRAINT' + BEGIN + EXEC tSQLt.Private_ApplyForeignKeyConstraint @ConstraintObjectId, @NoCascade; + RETURN 0; + END; + + IF @ConstraintType IN('UNIQUE_CONSTRAINT', 'PRIMARY_KEY_CONSTRAINT') + BEGIN + EXEC tSQLt.Private_ApplyUniqueConstraint @ConstraintObjectId; + RETURN 0; + END; + + RAISERROR ('ApplyConstraint could not resolve the object names, ''%s'', ''%s''. Be sure to call ApplyConstraint and pass in two parameters, such as: EXEC tSQLt.ApplyConstraint ''MySchema.MyTable'', ''MyConstraint''', + 16, 10, @TableName, @ConstraintName); + RETURN 0; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ApplyTrigger.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ApplyTrigger.sql new file mode 100644 index 0000000..3579029 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ApplyTrigger.sql @@ -0,0 +1,34 @@ + +CREATE PROCEDURE tSQLt.ApplyTrigger + @TableName NVARCHAR(MAX), + @TriggerName NVARCHAR(MAX) +AS +BEGIN + DECLARE @OrgTableObjectId INT; + SELECT @OrgTableObjectId = OrgTableObjectId FROM tSQLt.Private_GetOriginalTableInfo(OBJECT_ID(@TableName)) orgTbl + IF(@OrgTableObjectId IS NULL) + BEGIN + RAISERROR('%s does not exist or was not faked by tSQLt.FakeTable.', 16, 10, @TableName); + END; + + DECLARE @FullTriggerName NVARCHAR(MAX); + DECLARE @TriggerObjectId INT; + SELECT @FullTriggerName = QUOTENAME(SCHEMA_NAME(schema_id))+'.'+QUOTENAME(name), @TriggerObjectId = object_id + FROM sys.objects WHERE PARSENAME(@TriggerName,1) = name AND parent_object_id = @OrgTableObjectId; + + DECLARE @TriggerCode NVARCHAR(MAX); + SELECT @TriggerCode = m.definition + FROM sys.sql_modules m + WHERE m.object_id = @TriggerObjectId; + + IF (@TriggerCode IS NULL) + BEGIN + RAISERROR('%s is not a trigger on %s', 16, 10, @TriggerName, @TableName); + END; + + EXEC tSQLt.RemoveObject @FullTriggerName; + + EXEC(@TriggerCode); +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEmptyTable.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEmptyTable.sql new file mode 100644 index 0000000..6feed4f --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEmptyTable.sql @@ -0,0 +1,34 @@ + +CREATE PROCEDURE tSQLt.AssertEmptyTable + @TableName NVARCHAR(MAX), + @Message NVARCHAR(MAX) = '' +AS +BEGIN + EXEC tSQLt.AssertObjectExists @TableName; + + DECLARE @FullName NVARCHAR(MAX); + IF(OBJECT_ID(@TableName) IS NULL AND OBJECT_ID('tempdb..'+@TableName) IS NOT NULL) + BEGIN + SET @FullName = CASE WHEN LEFT(@TableName,1) = '[' THEN @TableName ELSE QUOTENAME(@TableName)END; + END; + ELSE + BEGIN + SET @FullName = tSQLt.Private_GetQuotedFullName(OBJECT_ID(@TableName)); + END; + + DECLARE @cmd NVARCHAR(MAX); + DECLARE @exists INT; + SET @cmd = 'SELECT @exists = CASE WHEN EXISTS(SELECT 1 FROM '+@FullName+') THEN 1 ELSE 0 END;' + EXEC sp_executesql @cmd,N'@exists INT OUTPUT', @exists OUTPUT; + + IF(@exists = 1) + BEGIN + DECLARE @TableToText NVARCHAR(MAX); + EXEC tSQLt.TableToText @TableName = @FullName,@txt = @TableToText OUTPUT; + DECLARE @Msg NVARCHAR(MAX); + SET @Msg = @FullName + ' was not empty:' + CHAR(13) + CHAR(10)+ @TableToText; + EXEC tSQLt.Fail @Message,@Msg; + END +END + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEquals.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEquals.sql new file mode 100644 index 0000000..c6c462a --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEquals.sql @@ -0,0 +1,17 @@ + + +CREATE PROCEDURE tSQLt.AssertEquals + @Expected SQL_VARIANT, + @Actual SQL_VARIANT, + @Message NVARCHAR(MAX) = '' +AS +BEGIN + IF ((@Expected = @Actual) OR (@Actual IS NULL AND @Expected IS NULL)) + RETURN 0; + + DECLARE @Msg NVARCHAR(MAX); + SELECT @Msg = 'Expected: <' + ISNULL(CAST(@Expected AS NVARCHAR(MAX)), 'NULL') + + '> but was: <' + ISNULL(CAST(@Actual AS NVARCHAR(MAX)), 'NULL') + '>'; + IF((COALESCE(@Message,'') <> '') AND (@Message NOT LIKE '% ')) SET @Message = @Message + ' '; + EXEC tSQLt.Fail @Message, @Msg; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEqualsString.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEqualsString.sql new file mode 100644 index 0000000..bc6fc2f --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEqualsString.sql @@ -0,0 +1,16 @@ +CREATE PROCEDURE tSQLt.AssertEqualsString + @Expected NVARCHAR(MAX), + @Actual NVARCHAR(MAX), + @Message NVARCHAR(MAX) = '' +AS +BEGIN + IF ((@Expected = @Actual) OR (@Actual IS NULL AND @Expected IS NULL)) + RETURN 0; + + DECLARE @Msg NVARCHAR(MAX); + SELECT @Msg = CHAR(13)+CHAR(10)+ + 'Expected: ' + ISNULL('<'+@Expected+'>', 'NULL') + + CHAR(13)+CHAR(10)+ + 'but was : ' + ISNULL('<'+@Actual+'>', 'NULL'); + EXEC tSQLt.Fail @Message, @Msg; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEqualsTable.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEqualsTable.sql new file mode 100644 index 0000000..245096d --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEqualsTable.sql @@ -0,0 +1,47 @@ + +CREATE PROCEDURE tSQLt.AssertEqualsTable + @Expected NVARCHAR(MAX), + @Actual NVARCHAR(MAX), + @Message NVARCHAR(MAX) = NULL, + @FailMsg NVARCHAR(MAX) = 'Unexpected/missing resultset rows!' +AS +BEGIN + + EXEC tSQLt.AssertObjectExists @Expected; + EXEC tSQLt.AssertObjectExists @Actual; + + DECLARE @ResultTable NVARCHAR(MAX); + DECLARE @ResultColumn NVARCHAR(MAX); + DECLARE @ColumnList NVARCHAR(MAX); + DECLARE @UnequalRowsExist INT; + DECLARE @CombinedMessage NVARCHAR(MAX); + + SELECT @ResultTable = tSQLt.Private::CreateUniqueObjectName(); + SELECT @ResultColumn = 'RC_' + @ResultTable; + + EXEC tSQLt.Private_CreateResultTableForCompareTables + @ResultTable = @ResultTable, + @ResultColumn = @ResultColumn, + @BaseTable = @Expected; + + SELECT @ColumnList = tSQLt.Private_GetCommaSeparatedColumnList(@ResultTable, @ResultColumn); + + EXEC tSQLt.Private_ValidateThatAllDataTypesInTableAreSupported @ResultTable, @ColumnList; + + EXEC @UnequalRowsExist = tSQLt.Private_CompareTables + @Expected = @Expected, + @Actual = @Actual, + @ResultTable = @ResultTable, + @ColumnList = @ColumnList, + @MatchIndicatorColumnName = @ResultColumn; + + SET @CombinedMessage = ISNULL(@Message + CHAR(13) + CHAR(10),'') + @FailMsg; + EXEC tSQLt.Private_CompareTablesFailIfUnequalRowsExists + @UnequalRowsExist = @UnequalRowsExist, + @ResultTable = @ResultTable, + @ResultColumn = @ResultColumn, + @ColumnList = @ColumnList, + @FailMsg = @CombinedMessage; +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEqualsTableSchema.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEqualsTableSchema.sql new file mode 100644 index 0000000..e4f5c3c --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertEqualsTableSchema.sql @@ -0,0 +1,43 @@ +CREATE PROCEDURE tSQLt.AssertEqualsTableSchema + @Expected NVARCHAR(MAX), + @Actual NVARCHAR(MAX), + @Message NVARCHAR(MAX) = NULL +AS +BEGIN + INSERT INTO tSQLt.Private_AssertEqualsTableSchema_Expected([RANK(column_id)],name,system_type_id,user_type_id,max_length,precision,scale,collation_name,is_nullable) + SELECT + RANK()OVER(ORDER BY C.column_id), + C.name, + CAST(C.system_type_id AS NVARCHAR(MAX))+QUOTENAME(TS.name) system_type_id, + CAST(C.user_type_id AS NVARCHAR(MAX))+CASE WHEN TU.system_type_id<> TU.user_type_id THEN QUOTENAME(SCHEMA_NAME(TU.schema_id))+'.' ELSE '' END + QUOTENAME(TU.name) user_type_id, + C.max_length, + C.precision, + C.scale, + C.collation_name, + C.is_nullable + FROM sys.columns AS C + JOIN sys.types AS TS + ON C.system_type_id = TS.user_type_id + JOIN sys.types AS TU + ON C.user_type_id = TU.user_type_id + WHERE C.object_id = OBJECT_ID(@Expected); + INSERT INTO tSQLt.Private_AssertEqualsTableSchema_Actual([RANK(column_id)],name,system_type_id,user_type_id,max_length,precision,scale,collation_name,is_nullable) + SELECT + RANK()OVER(ORDER BY C.column_id), + C.name, + CAST(C.system_type_id AS NVARCHAR(MAX))+QUOTENAME(TS.name) system_type_id, + CAST(C.user_type_id AS NVARCHAR(MAX))+CASE WHEN TU.system_type_id<> TU.user_type_id THEN QUOTENAME(SCHEMA_NAME(TU.schema_id))+'.' ELSE '' END + QUOTENAME(TU.name) user_type_id, + C.max_length, + C.precision, + C.scale, + C.collation_name, + C.is_nullable + FROM sys.columns AS C + JOIN sys.types AS TS + ON C.system_type_id = TS.user_type_id + JOIN sys.types AS TU + ON C.user_type_id = TU.user_type_id + WHERE C.object_id = OBJECT_ID(@Actual); + + EXEC tSQLt.AssertEqualsTable 'tSQLt.Private_AssertEqualsTableSchema_Expected','tSQLt.Private_AssertEqualsTableSchema_Actual',@Message=@Message,@FailMsg='Unexpected/missing column(s)'; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertLike.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertLike.sql new file mode 100644 index 0000000..9f949c3 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertLike.sql @@ -0,0 +1,21 @@ +CREATE PROCEDURE [tSQLt].[AssertLike] + @ExpectedPattern NVARCHAR(MAX), + @Actual NVARCHAR(MAX), + @Message NVARCHAR(MAX) = '' +AS +BEGIN + IF (LEN(@ExpectedPattern) > 4000) + BEGIN + RAISERROR ('@ExpectedPattern may not exceed 4000 characters.', 16, 10); + END; + + IF ((@Actual LIKE @ExpectedPattern) OR (@Actual IS NULL AND @ExpectedPattern IS NULL)) + BEGIN + RETURN 0; + END + + DECLARE @Msg NVARCHAR(MAX); + SELECT @Msg = CHAR(13) + CHAR(10) + 'Expected: <' + ISNULL(@ExpectedPattern, 'NULL') + '>' + + CHAR(13) + CHAR(10) + ' but was: <' + ISNULL(@Actual, 'NULL') + '>'; + EXEC tSQLt.Fail @Message, @Msg; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertNotEquals.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertNotEquals.sql new file mode 100644 index 0000000..8161f12 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertNotEquals.sql @@ -0,0 +1,20 @@ + +CREATE PROCEDURE tSQLt.AssertNotEquals + @Expected SQL_VARIANT, + @Actual SQL_VARIANT, + @Message NVARCHAR(MAX) = '' +AS +BEGIN + IF (@Expected = @Actual) + OR (@Expected IS NULL AND @Actual IS NULL) + BEGIN + DECLARE @Msg NVARCHAR(MAX); + SET @Msg = 'Expected actual value to not ' + + COALESCE('equal <' + tSQLt.Private_SqlVariantFormatter(@Expected)+'>', 'be NULL') + + '.'; + EXEC tSQLt.Fail @Message,@Msg; + END; + RETURN 0; +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertObjectDoesNotExist.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertObjectDoesNotExist.sql new file mode 100644 index 0000000..ef2781d --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertObjectDoesNotExist.sql @@ -0,0 +1,16 @@ + +CREATE PROCEDURE tSQLt.AssertObjectDoesNotExist + @ObjectName NVARCHAR(MAX), + @Message NVARCHAR(MAX) = '' +AS +BEGIN + DECLARE @Msg NVARCHAR(MAX); + IF OBJECT_ID(@ObjectName) IS NOT NULL + OR(@ObjectName LIKE '#%' AND OBJECT_ID('tempdb..'+@ObjectName) IS NOT NULL) + BEGIN + SELECT @Msg = '''' + @ObjectName + ''' does exist!'; + EXEC tSQLt.Fail @Message,@Msg; + END; +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertObjectExists.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertObjectExists.sql new file mode 100644 index 0000000..ff26899 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertObjectExists.sql @@ -0,0 +1,29 @@ + +CREATE PROCEDURE tSQLt.AssertObjectExists + @ObjectName NVARCHAR(MAX), + @Message NVARCHAR(MAX) = '' +AS +BEGIN + DECLARE @Msg NVARCHAR(MAX); + IF(@ObjectName LIKE '#%') + BEGIN + IF OBJECT_ID('tempdb..'+@ObjectName) IS NULL + BEGIN + SELECT @Msg = '''' + COALESCE(@ObjectName, 'NULL') + ''' does not exist'; + EXEC tSQLt.Fail @Message, @Msg; + RETURN 1; + END; + END + ELSE + BEGIN + IF OBJECT_ID(@ObjectName) IS NULL + BEGIN + SELECT @Msg = '''' + COALESCE(@ObjectName, 'NULL') + ''' does not exist'; + EXEC tSQLt.Fail @Message, @Msg; + RETURN 1; + END; + END; + RETURN 0; +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertResultSetsHaveSameMetaData.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertResultSetsHaveSameMetaData.sql new file mode 100644 index 0000000..16e792a --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertResultSetsHaveSameMetaData.sql @@ -0,0 +1,4 @@ +CREATE PROCEDURE [tSQLt].[AssertResultSetsHaveSameMetaData] +@expectedCommand NVARCHAR (MAX) NULL, @actualCommand NVARCHAR (MAX) NULL +AS EXTERNAL NAME [tSQLtCLR].[tSQLtCLR.StoredProcedures].[AssertResultSetsHaveSameMetaData] + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertStringIn.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertStringIn.sql new file mode 100644 index 0000000..59dfd3f --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/AssertStringIn.sql @@ -0,0 +1,16 @@ + +CREATE PROCEDURE tSQLt.AssertStringIn + @Expected tSQLt.AssertStringTable READONLY, + @Actual NVARCHAR(MAX), + @Message NVARCHAR(MAX) = '' +AS +BEGIN + IF(NOT EXISTS(SELECT 1 FROM @Expected WHERE value = @Actual)) + BEGIN + DECLARE @ExpectedMessage NVARCHAR(MAX); + SELECT value INTO #ExpectedSet FROM @Expected; + EXEC tSQLt.TableToText @TableName = '#ExpectedSet', @OrderBy = 'value',@txt = @ExpectedMessage OUTPUT; + SET @ExpectedMessage = ISNULL('<'+@Actual+'>','NULL')+CHAR(13)+CHAR(10)+'is not in'+CHAR(13)+CHAR(10)+@ExpectedMessage; + EXEC tSQLt.Fail @Message, @ExpectedMessage; + END; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/CaptureOutput.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/CaptureOutput.sql new file mode 100644 index 0000000..e828ea0 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/CaptureOutput.sql @@ -0,0 +1,4 @@ +CREATE PROCEDURE [tSQLt].[CaptureOutput] +@command NVARCHAR (MAX) NULL +AS EXTERNAL NAME [tSQLtCLR].[tSQLtCLR.StoredProcedures].[CaptureOutput] + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/DefaultResultFormatter.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/DefaultResultFormatter.sql new file mode 100644 index 0000000..6b07a82 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/DefaultResultFormatter.sql @@ -0,0 +1,40 @@ + +CREATE PROCEDURE tSQLt.DefaultResultFormatter +AS +BEGIN + DECLARE @Msg1 NVARCHAR(MAX); + DECLARE @Msg2 NVARCHAR(MAX); + DECLARE @Msg3 NVARCHAR(MAX); + DECLARE @Msg4 NVARCHAR(MAX); + DECLARE @IsSuccess INT; + DECLARE @SuccessCnt INT; + DECLARE @Severity INT; + + SELECT ROW_NUMBER() OVER(ORDER BY Result DESC, Name ASC) No,Name [Test Case Name], + RIGHT(SPACE(7)+CAST(DATEDIFF(MILLISECOND,TestStartTime,TestEndTime) AS VARCHAR(7)),7) AS [Dur(ms)], Result + INTO #TestResultOutput + FROM tSQLt.TestResult; + + EXEC tSQLt.TableToText @Msg1 OUTPUT, '#TestResultOutput', 'No'; + + SELECT @Msg3 = Msg, + @IsSuccess = 1 - SIGN(FailCnt + ErrorCnt), + @SuccessCnt = SuccessCnt + FROM tSQLt.TestCaseSummary(); + + SELECT @Severity = 16*(1-@IsSuccess); + + SELECT @Msg2 = REPLICATE('-',LEN(@Msg3)), + @Msg4 = CHAR(13)+CHAR(10); + + + EXEC tSQLt.Private_Print @Msg4,0; + EXEC tSQLt.Private_Print '+----------------------+',0; + EXEC tSQLt.Private_Print '|Test Execution Summary|',0; + EXEC tSQLt.Private_Print '+----------------------+',0; + EXEC tSQLt.Private_Print @Msg4,0; + EXEC tSQLt.Private_Print @Msg1,0; + EXEC tSQLt.Private_Print @Msg2,0; + EXEC tSQLt.Private_Print @Msg3, @Severity; + EXEC tSQLt.Private_Print @Msg2,0; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/DropClass.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/DropClass.sql new file mode 100644 index 0000000..bc5d456 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/DropClass.sql @@ -0,0 +1,72 @@ + +CREATE PROCEDURE tSQLt.DropClass + @ClassName NVARCHAR(MAX) +AS +BEGIN + DECLARE @Cmd NVARCHAR(MAX); + + WITH ObjectInfo(name, type) AS + ( + SELECT QUOTENAME(SCHEMA_NAME(O.schema_id))+'.'+QUOTENAME(O.name) , O.type + FROM sys.objects AS O + WHERE O.schema_id = SCHEMA_ID(@ClassName) + ), + TypeInfo(name) AS + ( + SELECT QUOTENAME(SCHEMA_NAME(T.schema_id))+'.'+QUOTENAME(T.name) + FROM sys.types AS T + WHERE T.schema_id = SCHEMA_ID(@ClassName) + ), + XMLSchemaInfo(name) AS + ( + SELECT QUOTENAME(SCHEMA_NAME(XSC.schema_id))+'.'+QUOTENAME(XSC.name) + FROM sys.xml_schema_collections AS XSC + WHERE XSC.schema_id = SCHEMA_ID(@ClassName) + ), + DropStatements(no,cmd) AS + ( + SELECT 10, + 'DROP ' + + CASE type WHEN 'P' THEN 'PROCEDURE' + WHEN 'PC' THEN 'PROCEDURE' + WHEN 'U' THEN 'TABLE' + WHEN 'IF' THEN 'FUNCTION' + WHEN 'TF' THEN 'FUNCTION' + WHEN 'FN' THEN 'FUNCTION' + WHEN 'V' THEN 'VIEW' + END + + ' ' + + name + + ';' + FROM ObjectInfo + UNION ALL + SELECT 20, + 'DROP TYPE ' + + name + + ';' + FROM TypeInfo + UNION ALL + SELECT 30, + 'DROP XML SCHEMA COLLECTION ' + + name + + ';' + FROM XMLSchemaInfo + UNION ALL + SELECT 10000,'DROP SCHEMA ' + QUOTENAME(name) +';' + FROM sys.schemas + WHERE schema_id = SCHEMA_ID(PARSENAME(@ClassName,1)) + ), + StatementBlob(xml)AS + ( + SELECT cmd [text()] + FROM DropStatements + ORDER BY no + FOR XML PATH(''), TYPE + ) + SELECT @Cmd = xml.value('/', 'NVARCHAR(MAX)') + FROM StatementBlob; + + EXEC(@Cmd); +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/EnableExternalAccess.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/EnableExternalAccess.sql new file mode 100644 index 0000000..8429872 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/EnableExternalAccess.sql @@ -0,0 +1,29 @@ +CREATE PROCEDURE tSQLt.EnableExternalAccess + @try BIT = 0, + @enable BIT = 1 +AS +BEGIN + BEGIN TRY + IF @enable = 1 + BEGIN + EXEC('ALTER ASSEMBLY tSQLtCLR WITH PERMISSION_SET = EXTERNAL_ACCESS;'); + END + ELSE + BEGIN + EXEC('ALTER ASSEMBLY tSQLtCLR WITH PERMISSION_SET = SAFE;'); + END + END TRY + BEGIN CATCH + IF(@try = 0) + BEGIN + DECLARE @Message NVARCHAR(4000); + SET @Message = 'The attempt to ' + + CASE WHEN @enable = 1 THEN 'enable' ELSE 'disable' END + + ' tSQLt features requiring EXTERNAL_ACCESS failed' + + ': '+ERROR_MESSAGE(); + RAISERROR(@Message,16,10); + END; + RETURN -1; + END CATCH; + RETURN 0; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ExpectException.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ExpectException.sql new file mode 100644 index 0000000..1dddc7d --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ExpectException.sql @@ -0,0 +1,21 @@ + +CREATE PROCEDURE tSQLt.ExpectException +@ExpectedMessage NVARCHAR(MAX) = NULL, +@ExpectedSeverity INT = NULL, +@ExpectedState INT = NULL, +@Message NVARCHAR(MAX) = NULL, +@ExpectedMessagePattern NVARCHAR(MAX) = NULL, +@ExpectedErrorNumber INT = NULL +AS +BEGIN + IF(EXISTS(SELECT 1 FROM #ExpectException WHERE ExpectException = 1)) + BEGIN + DELETE #ExpectException; + RAISERROR('Each test can only contain one call to tSQLt.ExpectException.',16,10); + END; + + INSERT INTO #ExpectException(ExpectException, ExpectedMessage, ExpectedSeverity, ExpectedState, ExpectedMessagePattern, ExpectedErrorNumber, FailMessage) + VALUES(1, @ExpectedMessage, @ExpectedSeverity, @ExpectedState, @ExpectedMessagePattern, @ExpectedErrorNumber, @Message); +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ExpectNoException.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ExpectNoException.sql new file mode 100644 index 0000000..5436bd1 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ExpectNoException.sql @@ -0,0 +1,21 @@ + +CREATE PROCEDURE tSQLt.ExpectNoException + @Message NVARCHAR(MAX) = NULL +AS +BEGIN + IF(EXISTS(SELECT 1 FROM #ExpectException WHERE ExpectException = 0)) + BEGIN + DELETE #ExpectException; + RAISERROR('Each test can only contain one call to tSQLt.ExpectNoException.',16,10); + END; + IF(EXISTS(SELECT 1 FROM #ExpectException WHERE ExpectException = 1)) + BEGIN + DELETE #ExpectException; + RAISERROR('tSQLt.ExpectNoException cannot follow tSQLt.ExpectException inside a single test.',16,10); + END; + + INSERT INTO #ExpectException(ExpectException, FailMessage) + VALUES(0, @Message); +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Fail.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Fail.sql new file mode 100644 index 0000000..22d3932 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Fail.sql @@ -0,0 +1,54 @@ + +CREATE PROCEDURE tSQLt.Fail + @Message0 NVARCHAR(MAX) = '', + @Message1 NVARCHAR(MAX) = '', + @Message2 NVARCHAR(MAX) = '', + @Message3 NVARCHAR(MAX) = '', + @Message4 NVARCHAR(MAX) = '', + @Message5 NVARCHAR(MAX) = '', + @Message6 NVARCHAR(MAX) = '', + @Message7 NVARCHAR(MAX) = '', + @Message8 NVARCHAR(MAX) = '', + @Message9 NVARCHAR(MAX) = '' +AS +BEGIN + DECLARE @WarningMessage NVARCHAR(MAX); + SET @WarningMessage = ''; + + IF XACT_STATE() = -1 + BEGIN + SET @WarningMessage = CHAR(13)+CHAR(10)+'Warning: Uncommitable transaction detected!'; + + DECLARE @TranName NVARCHAR(MAX); + SELECT @TranName = TranName + FROM tSQLt.TestResult + WHERE Id = (SELECT MAX(Id) FROM tSQLt.TestResult); + + DECLARE @TranCount INT; + SET @TranCount = @@TRANCOUNT; + ROLLBACK; + WHILE(@TranCount>0) + BEGIN + BEGIN TRAN; + SET @TranCount = @TranCount -1; + END; + SAVE TRAN @TranName; + END; + + INSERT INTO tSQLt.TestMessage(Msg) + SELECT COALESCE(@Message0, '!NULL!') + + COALESCE(@Message1, '!NULL!') + + COALESCE(@Message2, '!NULL!') + + COALESCE(@Message3, '!NULL!') + + COALESCE(@Message4, '!NULL!') + + COALESCE(@Message5, '!NULL!') + + COALESCE(@Message6, '!NULL!') + + COALESCE(@Message7, '!NULL!') + + COALESCE(@Message8, '!NULL!') + + COALESCE(@Message9, '!NULL!') + + @WarningMessage; + + RAISERROR('tSQLt.Failure',16,10); +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/FakeFunction.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/FakeFunction.sql new file mode 100644 index 0000000..d502ddf --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/FakeFunction.sql @@ -0,0 +1,26 @@ +CREATE PROCEDURE tSQLt.FakeFunction + @FunctionName NVARCHAR(MAX), + @FakeFunctionName NVARCHAR(MAX) +AS +BEGIN + DECLARE @FunctionObjectId INT; + DECLARE @FakeFunctionObjectId INT; + DECLARE @IsScalarFunction BIT; + + EXEC tSQLt.Private_ValidateObjectsCompatibleWithFakeFunction + @FunctionName = @FunctionName, + @FakeFunctionName = @FakeFunctionName, + @FunctionObjectId = @FunctionObjectId OUT, + @FakeFunctionObjectId = @FakeFunctionObjectId OUT, + @IsScalarFunction = @IsScalarFunction OUT; + + EXEC tSQLt.RemoveObject @ObjectName = @FunctionName; + + EXEC tSQLt.Private_CreateFakeFunction + @FunctionName = @FunctionName, + @FakeFunctionName = @FakeFunctionName, + @FunctionObjectId = @FunctionObjectId, + @FakeFunctionObjectId = @FakeFunctionObjectId, + @IsScalarFunction = @IsScalarFunction; + +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/FakeTable.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/FakeTable.sql new file mode 100644 index 0000000..392e34b --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/FakeTable.sql @@ -0,0 +1,53 @@ + +CREATE PROCEDURE tSQLt.FakeTable + @TableName NVARCHAR(MAX), + @SchemaName NVARCHAR(MAX) = NULL, --parameter preserved for backward compatibility. Do not use. Will be removed soon. + @Identity BIT = NULL, + @ComputedColumns BIT = NULL, + @Defaults BIT = NULL +AS +BEGIN + DECLARE @OrigSchemaName NVARCHAR(MAX); + DECLARE @OrigTableName NVARCHAR(MAX); + DECLARE @NewNameOfOriginalTable NVARCHAR(4000); + DECLARE @OrigTableFullName NVARCHAR(MAX); SET @OrigTableFullName = NULL; + + SELECT @OrigSchemaName = @SchemaName, + @OrigTableName = @TableName + + IF(@OrigTableName NOT IN (PARSENAME(@OrigTableName,1),QUOTENAME(PARSENAME(@OrigTableName,1))) + AND @OrigSchemaName IS NOT NULL) + BEGIN + RAISERROR('When @TableName is a multi-part identifier, @SchemaName must be NULL!',16,10); + END + + SELECT @SchemaName = CleanSchemaName, + @TableName = CleanTableName + FROM tSQLt.Private_ResolveFakeTableNamesForBackwardCompatibility(@TableName, @SchemaName); + + EXEC tSQLt.Private_ValidateFakeTableParameters @SchemaName,@OrigTableName,@OrigSchemaName; + + EXEC tSQLt.Private_RenameObjectToUniqueName @SchemaName, @TableName, @NewNameOfOriginalTable OUTPUT; + + SELECT @OrigTableFullName = S.base_object_name + FROM sys.synonyms AS S + WHERE S.object_id = OBJECT_ID(@SchemaName + '.' + @NewNameOfOriginalTable); + + IF(@OrigTableFullName IS NOT NULL) + BEGIN + IF(COALESCE(OBJECT_ID(@OrigTableFullName,'U'),OBJECT_ID(@OrigTableFullName,'V')) IS NULL) + BEGIN + RAISERROR('Cannot fake synonym %s.%s as it is pointing to %s, which is not a table or view!',16,10,@SchemaName,@TableName,@OrigTableFullName); + END; + END; + ELSE + BEGIN + SET @OrigTableFullName = @SchemaName + '.' + @NewNameOfOriginalTable; + END; + + EXEC tSQLt.Private_CreateFakeOfTable @SchemaName, @TableName, @OrigTableFullName, @Identity, @ComputedColumns, @Defaults; + + EXEC tSQLt.Private_MarkFakeTable @SchemaName, @TableName, @NewNameOfOriginalTable; +END + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/GetNewTranName.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/GetNewTranName.sql new file mode 100644 index 0000000..8bed6cb --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/GetNewTranName.sql @@ -0,0 +1,8 @@ + + +CREATE PROCEDURE tSQLt.GetNewTranName + @TranName CHAR(32) OUTPUT +AS +BEGIN + SELECT @TranName = LEFT('tSQLtTran'+REPLACE(CAST(NEWID() AS NVARCHAR(60)),'-',''),32); +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/InstallExternalAccessKey.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/InstallExternalAccessKey.sql new file mode 100644 index 0000000..86c8db1 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/InstallExternalAccessKey.sql @@ -0,0 +1,57 @@ +CREATE PROCEDURE tSQLt.InstallExternalAccessKey +AS +BEGIN + IF(NOT EXISTS(SELECT * FROM sys.fn_my_permissions(NULL,'server') AS FMP WHERE FMP.permission_name = 'CONTROL SERVER')) + BEGIN + RAISERROR('Only principals with CONTROL SERVER permission can execute this procedure.',16,10); + RETURN -1; + END; + + DECLARE @cmd NVARCHAR(MAX); + DECLARE @cmd2 NVARCHAR(MAX); + DECLARE @master_sys_sp_executesql NVARCHAR(MAX); SET @master_sys_sp_executesql = 'master.sys.sp_executesql'; + + SET @cmd = 'IF EXISTS(SELECT * FROM sys.assemblies WHERE name = ''tSQLtExternalAccessKey'') DROP ASSEMBLY tSQLtExternalAccessKey;'; + EXEC @master_sys_sp_executesql @cmd; + + SET @cmd2 = 'SELECT @cmd = ''DROP ASSEMBLY ''+QUOTENAME(A.name)+'';'''+ + ' FROM master.sys.assemblies AS A'+ + ' WHERE A.clr_name LIKE ''tsqltexternalaccesskey, %'';'; + EXEC sys.sp_executesql @cmd2,N'@cmd NVARCHAR(MAX) OUTPUT',@cmd OUT; + EXEC @master_sys_sp_executesql @cmd; + + SELECT @cmd = + 'CREATE ASSEMBLY tSQLtExternalAccessKey AUTHORIZATION dbo FROM ' + + BH.prefix + + ' WITH PERMISSION_SET = SAFE;' + FROM tSQLt.Private_GetExternalAccessKeyBytes() AS PGEAKB + CROSS APPLY tSQLt.Private_Bin2Hex(PGEAKB.ExternalAccessKeyBytes) BH; + EXEC @master_sys_sp_executesql @cmd; + + IF SUSER_ID('tSQLtExternalAccessKey') IS NOT NULL DROP LOGIN tSQLtExternalAccessKey; + + SET @cmd = N'IF ASYMKEY_ID(''tSQLtExternalAccessKey'') IS NOT NULL DROP ASYMMETRIC KEY tSQLtExternalAccessKey;'; + EXEC @master_sys_sp_executesql @cmd; + + SET @cmd2 = 'SELECT @cmd = ISNULL(''DROP LOGIN ''+QUOTENAME(SP.name)+'';'','''')+''DROP ASYMMETRIC KEY '' + QUOTENAME(AK.name) + '';'''+ + ' FROM master.sys.asymmetric_keys AS AK'+ + ' JOIN tSQLt.Private_GetExternalAccessKeyBytes() AS PGEAKB'+ + ' ON AK.thumbprint = PGEAKB.ExternalAccessKeyThumbPrint'+ + ' LEFT JOIN master.sys.server_principals AS SP'+ + ' ON AK.sid = SP.sid;'; + EXEC sys.sp_executesql @cmd2,N'@cmd NVARCHAR(MAX) OUTPUT',@cmd OUT; + EXEC @master_sys_sp_executesql @cmd; + + SET @cmd = 'CREATE ASYMMETRIC KEY tSQLtExternalAccessKey FROM ASSEMBLY tSQLtExternalAccessKey;'; + EXEC @master_sys_sp_executesql @cmd; + + SET @cmd = 'CREATE LOGIN tSQLtExternalAccessKey FROM ASYMMETRIC KEY tSQLtExternalAccessKey;'; + EXEC @master_sys_sp_executesql @cmd; + + SET @cmd = 'DROP ASSEMBLY tSQLtExternalAccessKey;'; + EXEC @master_sys_sp_executesql @cmd; + + SET @cmd = 'GRANT EXTERNAL ACCESS ASSEMBLY TO tSQLtExternalAccessKey;'; + EXEC @master_sys_sp_executesql @cmd; + +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/LogCapturedOutput.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/LogCapturedOutput.sql new file mode 100644 index 0000000..c3cf2a6 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/LogCapturedOutput.sql @@ -0,0 +1,8 @@ + +CREATE PROCEDURE tSQLt.LogCapturedOutput @text NVARCHAR(MAX) +AS +BEGIN + INSERT INTO tSQLt.CaptureOutputLog (OutputText) VALUES (@text); +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/NewConnection.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/NewConnection.sql new file mode 100644 index 0000000..b5771e9 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/NewConnection.sql @@ -0,0 +1,4 @@ +CREATE PROCEDURE [tSQLt].[NewConnection] +@command NVARCHAR (MAX) NULL +AS EXTERNAL NAME [tSQLtCLR].[tSQLtCLR.StoredProcedures].[NewConnection] + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/NewTestClass.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/NewTestClass.sql new file mode 100644 index 0000000..ac78086 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/NewTestClass.sql @@ -0,0 +1,25 @@ + +CREATE PROCEDURE tSQLt.NewTestClass + @ClassName NVARCHAR(MAX) +AS +BEGIN + BEGIN TRY + EXEC tSQLt.Private_DisallowOverwritingNonTestSchema @ClassName; + + EXEC tSQLt.DropClass @ClassName = @ClassName; + + DECLARE @QuotedClassName NVARCHAR(MAX); + SELECT @QuotedClassName = tSQLt.Private_QuoteClassNameForNewTestClass(@ClassName); + + EXEC ('CREATE SCHEMA ' + @QuotedClassName); + EXEC tSQLt.Private_MarkSchemaAsTestClass @QuotedClassName; + END TRY + BEGIN CATCH + DECLARE @ErrMsg NVARCHAR(MAX);SET @ErrMsg = ERROR_MESSAGE() + ' (Error originated in ' + ERROR_PROCEDURE() + ')'; + DECLARE @ErrSvr INT;SET @ErrSvr = ERROR_SEVERITY(); + + RAISERROR(@ErrMsg, @ErrSvr, 10); + END CATCH; +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/NullTestResultFormatter.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/NullTestResultFormatter.sql new file mode 100644 index 0000000..578f92c --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/NullTestResultFormatter.sql @@ -0,0 +1,6 @@ + +CREATE PROCEDURE tSQLt.NullTestResultFormatter +AS +BEGIN + RETURN 0; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ApplyCheckConstraint.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ApplyCheckConstraint.sql new file mode 100644 index 0000000..aa76547 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ApplyCheckConstraint.sql @@ -0,0 +1,22 @@ + +CREATE PROCEDURE tSQLt.Private_ApplyCheckConstraint + @ConstraintObjectId INT +AS +BEGIN + DECLARE @Cmd NVARCHAR(MAX); + SELECT @Cmd = 'CONSTRAINT ' + QUOTENAME(name) + ' CHECK' + definition + FROM sys.check_constraints + WHERE object_id = @ConstraintObjectId; + + DECLARE @QuotedTableName NVARCHAR(MAX); + + SELECT @QuotedTableName = QuotedTableName FROM tSQLt.Private_GetQuotedTableNameForConstraint(@ConstraintObjectId); + + EXEC tSQLt.Private_RenameObjectToUniqueNameUsingObjectId @ConstraintObjectId; + SELECT @Cmd = 'ALTER TABLE ' + @QuotedTableName + ' ADD ' + @Cmd + FROM sys.objects + WHERE object_id = @ConstraintObjectId; + + EXEC (@Cmd); + +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ApplyForeignKeyConstraint.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ApplyForeignKeyConstraint.sql new file mode 100644 index 0000000..95ba0d7 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ApplyForeignKeyConstraint.sql @@ -0,0 +1,30 @@ + +CREATE PROCEDURE tSQLt.Private_ApplyForeignKeyConstraint + @ConstraintObjectId INT, + @NoCascade BIT +AS +BEGIN + DECLARE @SchemaName NVARCHAR(MAX); + DECLARE @OrgTableName NVARCHAR(MAX); + DECLARE @TableName NVARCHAR(MAX); + DECLARE @ConstraintName NVARCHAR(MAX); + DECLARE @CreateFkCmd NVARCHAR(MAX); + DECLARE @AlterTableCmd NVARCHAR(MAX); + DECLARE @CreateIndexCmd NVARCHAR(MAX); + DECLARE @FinalCmd NVARCHAR(MAX); + + SELECT @SchemaName = SchemaName, + @OrgTableName = OrgTableName, + @TableName = TableName, + @ConstraintName = OBJECT_NAME(@ConstraintObjectId) + FROM tSQLt.Private_GetQuotedTableNameForConstraint(@ConstraintObjectId); + + SELECT @CreateFkCmd = cmd, @CreateIndexCmd = CreIdxCmd + FROM tSQLt.Private_GetForeignKeyDefinition(@SchemaName, @OrgTableName, @ConstraintName, @NoCascade); + SELECT @AlterTableCmd = 'ALTER TABLE ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + + ' ADD ' + @CreateFkCmd; + SELECT @FinalCmd = @CreateIndexCmd + @AlterTableCmd; + + EXEC tSQLt.Private_RenameObjectToUniqueName @SchemaName, @ConstraintName; + EXEC (@FinalCmd); +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ApplyUniqueConstraint.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ApplyUniqueConstraint.sql new file mode 100644 index 0000000..1647c6c --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ApplyUniqueConstraint.sql @@ -0,0 +1,26 @@ + +CREATE PROCEDURE tSQLt.Private_ApplyUniqueConstraint + @ConstraintObjectId INT +AS +BEGIN + DECLARE @SchemaName NVARCHAR(MAX); + DECLARE @OrgTableName NVARCHAR(MAX); + DECLARE @TableName NVARCHAR(MAX); + DECLARE @ConstraintName NVARCHAR(MAX); + DECLARE @CreateConstraintCmd NVARCHAR(MAX); + DECLARE @AlterColumnsCmd NVARCHAR(MAX); + + SELECT @SchemaName = SchemaName, + @OrgTableName = OrgTableName, + @TableName = TableName, + @ConstraintName = OBJECT_NAME(@ConstraintObjectId) + FROM tSQLt.Private_GetQuotedTableNameForConstraint(@ConstraintObjectId); + + SELECT @AlterColumnsCmd = NotNullColumnCmd, + @CreateConstraintCmd = CreateConstraintCmd + FROM tSQLt.Private_GetUniqueConstraintDefinition(@ConstraintObjectId, QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName)); + + EXEC tSQLt.Private_RenameObjectToUniqueName @SchemaName, @ConstraintName; + EXEC (@AlterColumnsCmd); + EXEC (@CreateConstraintCmd); +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CleanTestResult.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CleanTestResult.sql new file mode 100644 index 0000000..dd3ea10 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CleanTestResult.sql @@ -0,0 +1,5 @@ +CREATE PROCEDURE tSQLt.Private_CleanTestResult +AS +BEGIN + DELETE FROM tSQLt.TestResult; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CompareTables.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CompareTables.sql new file mode 100644 index 0000000..38f2561 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CompareTables.sql @@ -0,0 +1,60 @@ +CREATE PROCEDURE tSQLt.Private_CompareTables + @Expected NVARCHAR(MAX), + @Actual NVARCHAR(MAX), + @ResultTable NVARCHAR(MAX), + @ColumnList NVARCHAR(MAX), + @MatchIndicatorColumnName NVARCHAR(MAX) +AS +BEGIN + DECLARE @cmd NVARCHAR(MAX); + DECLARE @RestoredRowIndexCounterColName NVARCHAR(MAX); + SET @RestoredRowIndexCounterColName = @MatchIndicatorColumnName + '_RR'; + + SELECT @cmd = + ' + INSERT INTO ' + @ResultTable + ' (' + @MatchIndicatorColumnName + ', ' + @ColumnList + ') + SELECT + CASE + WHEN RestoredRowIndex.'+@RestoredRowIndexCounterColName+' <= CASE WHEN [_{Left}_]<[_{Right}_] THEN [_{Left}_] ELSE [_{Right}_] END + THEN ''='' + WHEN RestoredRowIndex.'+@RestoredRowIndexCounterColName+' <= [_{Left}_] + THEN ''<'' + ELSE ''>'' + END AS ' + @MatchIndicatorColumnName + ', ' + @ColumnList + ' + FROM( + SELECT SUM([_{Left}_]) AS [_{Left}_], + SUM([_{Right}_]) AS [_{Right}_], + ' + @ColumnList + ' + FROM ( + SELECT 1 AS [_{Left}_], 0[_{Right}_], ' + @ColumnList + ' + FROM ' + @Expected + ' + UNION ALL + SELECT 0[_{Left}_], 1 AS [_{Right}_], ' + @ColumnList + ' + FROM ' + @Actual + ' + ) AS X + GROUP BY ' + @ColumnList + ' + ) AS CollapsedRows + CROSS APPLY ( + SELECT TOP(CASE WHEN [_{Left}_]>[_{Right}_] THEN [_{Left}_] + ELSE [_{Right}_] END) + ROW_NUMBER() OVER(ORDER BY(SELECT 1)) + FROM (SELECT 1 + FROM ' + @Actual + ' UNION ALL SELECT 1 FROM ' + @Expected + ') X(X) + ) AS RestoredRowIndex(' + @RestoredRowIndexCounterColName + ');'; + + EXEC (@cmd); --MainGroupQuery + + SET @cmd = 'SET @r = + CASE WHEN EXISTS( + SELECT 1 + FROM ' + @ResultTable + + ' WHERE ' + @MatchIndicatorColumnName + ' IN (''<'', ''>'')) + THEN 1 ELSE 0 + END'; + DECLARE @UnequalRowsExist INT; + EXEC sp_executesql @cmd, N'@r INT OUTPUT',@UnequalRowsExist OUTPUT; + + RETURN @UnequalRowsExist; +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CompareTablesFailIfUnequalRowsExists.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CompareTablesFailIfUnequalRowsExists.sql new file mode 100644 index 0000000..4c2a751 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CompareTablesFailIfUnequalRowsExists.sql @@ -0,0 +1,21 @@ +CREATE PROCEDURE tSQLt.Private_CompareTablesFailIfUnequalRowsExists + @UnequalRowsExist INT, + @ResultTable NVARCHAR(MAX), + @ResultColumn NVARCHAR(MAX), + @ColumnList NVARCHAR(MAX), + @FailMsg NVARCHAR(MAX) +AS +BEGIN + IF @UnequalRowsExist > 0 + BEGIN + DECLARE @TableToTextResult NVARCHAR(MAX); + DECLARE @OutputColumnList NVARCHAR(MAX); + SELECT @OutputColumnList = '[_m_],' + @ColumnList; + EXEC tSQLt.TableToText @TableName = @ResultTable, @OrderBy = @ResultColumn, @PrintOnlyColumnNameAliasList = @OutputColumnList, @txt = @TableToTextResult OUTPUT; + + DECLARE @Message NVARCHAR(MAX); + SELECT @Message = @FailMsg + CHAR(13) + CHAR(10); + + EXEC tSQLt.Fail @Message, @TableToTextResult; + END; +END diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CreateFakeFunction.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CreateFakeFunction.sql new file mode 100644 index 0000000..a0cec59 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CreateFakeFunction.sql @@ -0,0 +1,47 @@ +CREATE PROCEDURE tSQLt.Private_CreateFakeFunction + @FunctionName NVARCHAR(MAX), + @FakeFunctionName NVARCHAR(MAX), + @FunctionObjectId INT, + @FakeFunctionObjectId INT, + @IsScalarFunction BIT +AS +BEGIN + DECLARE @ReturnType NVARCHAR(MAX); + SELECT @ReturnType = T.TypeName + FROM sys.parameters AS P + CROSS APPLY tSQLt.Private_GetFullTypeName(P.user_type_id,P.max_length,P.precision,P.scale,NULL) AS T + WHERE P.object_id = @FunctionObjectId + AND P.parameter_id = 0; + + DECLARE @ParameterList NVARCHAR(MAX); + SELECT @ParameterList = COALESCE( + STUFF((SELECT ','+P.name+' '+T.TypeName+CASE WHEN T.IsTableType = 1 THEN ' READONLY' ELSE '' END + FROM sys.parameters AS P + CROSS APPLY tSQLt.Private_GetFullTypeName(P.user_type_id,P.max_length,P.precision,P.scale,NULL) AS T + WHERE P.object_id = @FunctionObjectId + AND P.parameter_id > 0 + ORDER BY P.parameter_id + FOR XML PATH(''),TYPE + ).value('.','NVARCHAR(MAX)'),1,1,''),''); + + DECLARE @ParameterCallList NVARCHAR(MAX); + SELECT @ParameterCallList = COALESCE( + STUFF((SELECT ','+P.name + FROM sys.parameters AS P + CROSS APPLY tSQLt.Private_GetFullTypeName(P.user_type_id,P.max_length,P.precision,P.scale,NULL) AS T + WHERE P.object_id = @FunctionObjectId + AND P.parameter_id > 0 + ORDER BY P.parameter_id + FOR XML PATH(''),TYPE + ).value('.','NVARCHAR(MAX)'),1,1,''),''); + + + IF(@IsScalarFunction = 1) + BEGIN + EXEC('CREATE FUNCTION '+@FunctionName+'('+@ParameterList+') RETURNS '+@ReturnType+' AS BEGIN RETURN '+@FakeFunctionName+'('+@ParameterCallList+');END;'); + END + ELSE + BEGIN + EXEC('CREATE FUNCTION '+@FunctionName+'('+@ParameterList+') RETURNS TABLE AS RETURN SELECT * FROM '+@FakeFunctionName+'('+@ParameterCallList+');'); + END; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CreateFakeOfTable.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CreateFakeOfTable.sql new file mode 100644 index 0000000..cfbc7db --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CreateFakeOfTable.sql @@ -0,0 +1,40 @@ + +CREATE PROCEDURE tSQLt.Private_CreateFakeOfTable + @SchemaName NVARCHAR(MAX), + @TableName NVARCHAR(MAX), + @OrigTableFullName NVARCHAR(MAX), + @Identity BIT, + @ComputedColumns BIT, + @Defaults BIT +AS +BEGIN + DECLARE @Cmd NVARCHAR(MAX); + DECLARE @Cols NVARCHAR(MAX); + + SELECT @Cols = + ( + SELECT + ',' + + QUOTENAME(name) + + cc.ColumnDefinition + + dc.DefaultDefinition + + id.IdentityDefinition + + CASE WHEN cc.IsComputedColumn = 1 OR id.IsIdentityColumn = 1 + THEN '' + ELSE ' NULL' + END + FROM sys.columns c + CROSS APPLY tSQLt.Private_GetDataTypeOrComputedColumnDefinition(c.user_type_id, c.max_length, c.precision, c.scale, c.collation_name, c.object_id, c.column_id, @ComputedColumns) cc + CROSS APPLY tSQLt.Private_GetDefaultConstraintDefinition(c.object_id, c.column_id, @Defaults) AS dc + CROSS APPLY tSQLt.Private_GetIdentityDefinition(c.object_id, c.column_id, @Identity) AS id + WHERE object_id = OBJECT_ID(@OrigTableFullName) + ORDER BY column_id + FOR XML PATH(''), TYPE + ).value('.', 'NVARCHAR(MAX)'); + + SELECT @Cmd = 'CREATE TABLE ' + @SchemaName + '.' + @TableName + '(' + STUFF(@Cols,1,1,'') + ')'; + + EXEC (@Cmd); +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CreateProcedureSpy.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CreateProcedureSpy.sql new file mode 100644 index 0000000..c373e59 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CreateProcedureSpy.sql @@ -0,0 +1,96 @@ + +CREATE PROCEDURE tSQLt.Private_CreateProcedureSpy + @ProcedureObjectId INT, + @OriginalProcedureName NVARCHAR(MAX), + @LogTableName NVARCHAR(MAX), + @CommandToExecute NVARCHAR(MAX) = NULL +AS +BEGIN + DECLARE @Cmd NVARCHAR(MAX); + DECLARE @ProcParmList NVARCHAR(MAX), + @TableColList NVARCHAR(MAX), + @ProcParmTypeList NVARCHAR(MAX), + @TableColTypeList NVARCHAR(MAX); + + DECLARE @Seperator CHAR(1), + @ProcParmTypeListSeparater CHAR(1), + @ParamName sysname, + @TypeName sysname, + @IsOutput BIT, + @IsCursorRef BIT, + @IsTableType BIT; + + + + SELECT @Seperator = '', @ProcParmTypeListSeparater = '', + @ProcParmList = '', @TableColList = '', @ProcParmTypeList = '', @TableColTypeList = ''; + + DECLARE Parameters CURSOR FOR + SELECT p.name, t.TypeName, p.is_output, p.is_cursor_ref, t.IsTableType + FROM sys.parameters p + CROSS APPLY tSQLt.Private_GetFullTypeName(p.user_type_id,p.max_length,p.precision,p.scale,NULL) t + WHERE object_id = @ProcedureObjectId; + + OPEN Parameters; + + FETCH NEXT FROM Parameters INTO @ParamName, @TypeName, @IsOutput, @IsCursorRef, @IsTableType; + WHILE (@@FETCH_STATUS = 0) + BEGIN + IF @IsCursorRef = 0 + BEGIN + SELECT @ProcParmList = @ProcParmList + @Seperator + + CASE WHEN @IsTableType = 1 + THEN '(SELECT * FROM '+@ParamName+' FOR XML PATH(''row''),TYPE,ROOT('''+STUFF(@ParamName,1,1,'')+'''))' + ELSE @ParamName + END, + @TableColList = @TableColList + @Seperator + '[' + STUFF(@ParamName,1,1,'') + ']', + @ProcParmTypeList = @ProcParmTypeList + @ProcParmTypeListSeparater + @ParamName + ' ' + @TypeName + + CASE WHEN @IsTableType = 1 THEN ' READONLY' ELSE ' = NULL ' END+ + CASE WHEN @IsOutput = 1 THEN ' OUT' ELSE '' END, + @TableColTypeList = @TableColTypeList + ',[' + STUFF(@ParamName,1,1,'') + '] ' + + CASE + WHEN @IsTableType = 1 + THEN 'XML' + WHEN @TypeName LIKE '%nchar%' + OR @TypeName LIKE '%nvarchar%' + THEN 'NVARCHAR(MAX)' + WHEN @TypeName LIKE '%char%' + THEN 'VARCHAR(MAX)' + ELSE @TypeName + END + ' NULL'; + + SELECT @Seperator = ','; + SELECT @ProcParmTypeListSeparater = ','; + END + ELSE + BEGIN + SELECT @ProcParmTypeList = @ProcParmTypeListSeparater + @ParamName + ' CURSOR VARYING OUTPUT'; + SELECT @ProcParmTypeListSeparater = ','; + END; + + FETCH NEXT FROM Parameters INTO @ParamName, @TypeName, @IsOutput, @IsCursorRef, @IsTableType; + END; + + CLOSE Parameters; + DEALLOCATE Parameters; + + DECLARE @InsertStmt NVARCHAR(MAX); + SELECT @InsertStmt = 'INSERT INTO ' + @LogTableName + + CASE WHEN @TableColList = '' THEN ' DEFAULT VALUES' + ELSE ' (' + @TableColList + ') SELECT ' + @ProcParmList + END + ';'; + + SELECT @Cmd = 'CREATE TABLE ' + @LogTableName + ' (_id_ int IDENTITY(1,1) PRIMARY KEY CLUSTERED ' + @TableColTypeList + ');'; + EXEC(@Cmd); + + SELECT @Cmd = 'CREATE PROCEDURE ' + @OriginalProcedureName + ' ' + @ProcParmTypeList + + ' AS BEGIN ' + + @InsertStmt + + ISNULL(@CommandToExecute, '') + ';' + + ' END;'; + EXEC(@Cmd); + + RETURN 0; +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CreateResultTableForCompareTables.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CreateResultTableForCompareTables.sql new file mode 100644 index 0000000..62af48c --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_CreateResultTableForCompareTables.sql @@ -0,0 +1,14 @@ +CREATE PROCEDURE tSQLt.Private_CreateResultTableForCompareTables + @ResultTable NVARCHAR(MAX), + @ResultColumn NVARCHAR(MAX), + @BaseTable NVARCHAR(MAX) +AS +BEGIN + DECLARE @Cmd NVARCHAR(MAX); + SET @Cmd = ' + SELECT ''='' AS ' + @ResultColumn + ', Expected.* INTO ' + @ResultTable + ' + FROM tSQLt.Private_NullCellTable N + LEFT JOIN ' + @BaseTable + ' AS Expected ON N.I <> N.I + TRUNCATE TABLE ' + @ResultTable + ';' --Need to insert an actual row to prevent IDENTITY property from transfering (IDENTITY_COL can't be NULLable); + EXEC(@Cmd); +END diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_DisallowOverwritingNonTestSchema.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_DisallowOverwritingNonTestSchema.sql new file mode 100644 index 0000000..c317532 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_DisallowOverwritingNonTestSchema.sql @@ -0,0 +1,12 @@ + +CREATE PROCEDURE tSQLt.Private_DisallowOverwritingNonTestSchema + @ClassName NVARCHAR(MAX) +AS +BEGIN + IF SCHEMA_ID(@ClassName) IS NOT NULL AND tSQLt.Private_IsTestClass(@ClassName) = 0 + BEGIN + RAISERROR('Attempted to execute tSQLt.NewTestClass on ''%s'' which is an existing schema but not a test class', 16, 10, @ClassName); + END +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_GetCursorForRunAll.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_GetCursorForRunAll.sql new file mode 100644 index 0000000..2c136a2 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_GetCursorForRunAll.sql @@ -0,0 +1,11 @@ + +CREATE PROCEDURE tSQLt.Private_GetCursorForRunAll + @TestClassCursor CURSOR VARYING OUTPUT +AS +BEGIN + SET @TestClassCursor = CURSOR LOCAL FAST_FORWARD FOR + SELECT Name + FROM tSQLt.TestClasses; + + OPEN @TestClassCursor; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_GetCursorForRunNew.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_GetCursorForRunNew.sql new file mode 100644 index 0000000..fc63a46 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_GetCursorForRunNew.sql @@ -0,0 +1,13 @@ + +CREATE PROCEDURE tSQLt.Private_GetCursorForRunNew + @TestClassCursor CURSOR VARYING OUTPUT +AS +BEGIN + SET @TestClassCursor = CURSOR LOCAL FAST_FORWARD FOR + SELECT TC.Name + FROM tSQLt.TestClasses AS TC + JOIN tSQLt.Private_NewTestClassList AS PNTCL + ON PNTCL.ClassName = TC.Name; + + OPEN @TestClassCursor; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_GetSetupProcedureName.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_GetSetupProcedureName.sql new file mode 100644 index 0000000..7d23592 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_GetSetupProcedureName.sql @@ -0,0 +1,12 @@ + + +CREATE PROCEDURE tSQLt.Private_GetSetupProcedureName + @TestClassId INT = NULL, + @SetupProcName NVARCHAR(MAX) OUTPUT +AS +BEGIN + SELECT @SetupProcName = tSQLt.Private_GetQuotedFullName(object_id) + FROM sys.procedures + WHERE schema_id = @TestClassId + AND LOWER(name) = 'setup'; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_Init.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_Init.sql new file mode 100644 index 0000000..bd09ed4 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_Init.sql @@ -0,0 +1,25 @@ +CREATE PROCEDURE tSQLt.Private_Init +AS +BEGIN + EXEC tSQLt.Private_CleanTestResult; + + DECLARE @enable BIT; SET @enable = 1; + DECLARE @version_match BIT;SET @version_match = 0; + BEGIN TRY + EXEC sys.sp_executesql N'SELECT @r = CASE WHEN I.Version = I.ClrVersion THEN 1 ELSE 0 END FROM tSQLt.Info() AS I;',N'@r BIT OUTPUT',@version_match OUT; + END TRY + BEGIN CATCH + RAISERROR('Cannot access CLR. Assembly might be in an invalid state. Try running EXEC tSQLt.EnableExternalAccess @enable = 0; or reinstalling tSQLt.',16,10); + RETURN; + END CATCH; + IF(@version_match = 0) + BEGIN + RAISERROR('tSQLt is in an invalid state. Please reinstall tSQLt.',16,10); + RETURN; + END; + + IF((SELECT SqlEdition FROM tSQLt.Info()) <> 'SQL Azure') + BEGIN + EXEC tSQLt.EnableExternalAccess @enable = @enable, @try = 1; + END; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_InputBuffer.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_InputBuffer.sql new file mode 100644 index 0000000..33e78b5 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_InputBuffer.sql @@ -0,0 +1,9 @@ +CREATE PROCEDURE tSQLt.Private_InputBuffer + @InputBuffer NVARCHAR(MAX) OUTPUT +AS +BEGIN + CREATE TABLE #inputbuffer(EventType SYSNAME, Parameters SMALLINT, EventInfo NVARCHAR(MAX)); + INSERT INTO #inputbuffer + EXEC('DBCC INPUTBUFFER(@@SPID) WITH NO_INFOMSGS;'); + SELECT @InputBuffer = I.EventInfo FROM #inputbuffer AS I; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_MarkFakeTable.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_MarkFakeTable.sql new file mode 100644 index 0000000..c02371d --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_MarkFakeTable.sql @@ -0,0 +1,18 @@ + +CREATE PROCEDURE tSQLt.Private_MarkFakeTable + @SchemaName NVARCHAR(MAX), + @TableName NVARCHAR(MAX), + @NewNameOfOriginalTable NVARCHAR(4000) +AS +BEGIN + DECLARE @UnquotedSchemaName NVARCHAR(MAX);SET @UnquotedSchemaName = OBJECT_SCHEMA_NAME(OBJECT_ID(@SchemaName+'.'+@TableName)); + DECLARE @UnquotedTableName NVARCHAR(MAX);SET @UnquotedTableName = OBJECT_NAME(OBJECT_ID(@SchemaName+'.'+@TableName)); + + EXEC sys.sp_addextendedproperty + @name = N'tSQLt.FakeTable_OrgTableName', + @value = @NewNameOfOriginalTable, + @level0type = N'SCHEMA', @level0name = @UnquotedSchemaName, + @level1type = N'TABLE', @level1name = @UnquotedTableName; +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_MarkObjectBeforeRename.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_MarkObjectBeforeRename.sql new file mode 100644 index 0000000..18c1dd7 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_MarkObjectBeforeRename.sql @@ -0,0 +1,11 @@ + +CREATE PROCEDURE tSQLt.Private_MarkObjectBeforeRename + @SchemaName NVARCHAR(MAX), + @OriginalName NVARCHAR(MAX) +AS +BEGIN + INSERT INTO tSQLt.Private_RenamedObjectLog (ObjectId, OriginalName) + VALUES (OBJECT_ID(@SchemaName + '.' + @OriginalName), @OriginalName); +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_MarkSchemaAsTestClass.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_MarkSchemaAsTestClass.sql new file mode 100644 index 0000000..cd10559 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_MarkSchemaAsTestClass.sql @@ -0,0 +1,30 @@ + +CREATE PROCEDURE tSQLt.Private_MarkSchemaAsTestClass + @QuotedClassName NVARCHAR(MAX) +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @UnquotedClassName NVARCHAR(MAX); + + SELECT @UnquotedClassName = name + FROM sys.schemas + WHERE QUOTENAME(name) = @QuotedClassName; + + EXEC sp_addextendedproperty @name = N'tSQLt.TestClass', + @value = 1, + @level0type = 'SCHEMA', + @level0name = @UnquotedClassName; + + INSERT INTO tSQLt.Private_NewTestClassList(ClassName) + SELECT @UnquotedClassName + WHERE NOT EXISTS + ( + SELECT * + FROM tSQLt.Private_NewTestClassList AS NTC + WITH(UPDLOCK,ROWLOCK,HOLDLOCK) + WHERE NTC.ClassName = @UnquotedClassName + ); +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_OutputTestResults.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_OutputTestResults.sql new file mode 100644 index 0000000..1b88a30 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_OutputTestResults.sql @@ -0,0 +1,9 @@ + +CREATE PROCEDURE tSQLt.Private_OutputTestResults + @TestResultFormatter NVARCHAR(MAX) = NULL +AS +BEGIN + DECLARE @Formatter NVARCHAR(MAX); + SELECT @Formatter = COALESCE(@TestResultFormatter, tSQLt.GetTestResultFormatter()); + EXEC (@Formatter); +END diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_Print.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_Print.sql new file mode 100644 index 0000000..fbf7a6b --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_Print.sql @@ -0,0 +1,29 @@ +CREATE PROCEDURE tSQLt.Private_Print + @Message NVARCHAR(MAX), + @Severity INT = 0 +AS +BEGIN + DECLARE @SPos INT;SET @SPos = 1; + DECLARE @EPos INT; + DECLARE @Len INT; SET @Len = LEN(@Message); + DECLARE @SubMsg NVARCHAR(MAX); + DECLARE @Cmd NVARCHAR(MAX); + + DECLARE @CleanedMessage NVARCHAR(MAX); + SET @CleanedMessage = REPLACE(@Message,'%','%%'); + + WHILE (@SPos <= @Len) + BEGIN + SET @EPos = CHARINDEX(CHAR(13)+CHAR(10),@CleanedMessage+CHAR(13)+CHAR(10),@SPos); + SET @SubMsg = SUBSTRING(@CleanedMessage, @SPos, @EPos - @SPos); + SET @Cmd = N'RAISERROR(@Msg,@Severity,10) WITH NOWAIT;'; + EXEC sp_executesql @Cmd, + N'@Msg NVARCHAR(MAX),@Severity INT', + @SubMsg, + @Severity; + SELECT @SPos = @EPos + 2, + @Severity = 0; --Print only first line with high severity + END + + RETURN 0; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_PrintXML.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_PrintXML.sql new file mode 100644 index 0000000..2e9e188 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_PrintXML.sql @@ -0,0 +1,8 @@ + +CREATE PROCEDURE tSQLt.Private_PrintXML + @Message XML +AS +BEGIN + SELECT @Message FOR XML PATH('');--Required together with ":XML ON" sqlcmd statement to allow more than 1mb to be returned + RETURN 0; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RemoveSchemaBinding.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RemoveSchemaBinding.sql new file mode 100644 index 0000000..9f54a64 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RemoveSchemaBinding.sql @@ -0,0 +1,10 @@ +CREATE PROCEDURE tSQLt.Private_RemoveSchemaBinding + @object_id INT +AS +BEGIN + DECLARE @cmd NVARCHAR(MAX); + SELECT @cmd = tSQLt.[Private]::GetAlterStatementWithoutSchemaBinding(SM.definition) + FROM sys.sql_modules AS SM + WHERE SM.object_id = @object_id; + EXEC(@cmd); +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RemoveSchemaBoundReferences.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RemoveSchemaBoundReferences.sql new file mode 100644 index 0000000..ec66b31 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RemoveSchemaBoundReferences.sql @@ -0,0 +1,21 @@ +CREATE PROCEDURE tSQLt.Private_RemoveSchemaBoundReferences + @object_id INT +AS +BEGIN + DECLARE @cmd NVARCHAR(MAX); + SELECT @cmd = + ( + SELECT + 'EXEC tSQLt.Private_RemoveSchemaBoundReferences @object_id = '+STR(SED.referencing_id)+';'+ + 'EXEC tSQLt.Private_RemoveSchemaBinding @object_id = '+STR(SED.referencing_id)+';' + FROM + ( + SELECT DISTINCT SEDI.referencing_id,SEDI.referenced_id + FROM sys.sql_expression_dependencies AS SEDI + WHERE SEDI.is_schema_bound_reference = 1 + ) AS SED + WHERE SED.referenced_id = @object_id + FOR XML PATH(''),TYPE + ).value('.','NVARCHAR(MAX)'); + EXEC(@cmd); +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RenameObjectToUniqueName.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RenameObjectToUniqueName.sql new file mode 100644 index 0000000..b55248c --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RenameObjectToUniqueName.sql @@ -0,0 +1,22 @@ + +CREATE PROCEDURE tSQLt.Private_RenameObjectToUniqueName + @SchemaName NVARCHAR(MAX), + @ObjectName NVARCHAR(MAX), + @NewName NVARCHAR(MAX) = NULL OUTPUT +AS +BEGIN + SET @NewName=tSQLt.Private::CreateUniqueObjectName(); + + DECLARE @RenameCmd NVARCHAR(MAX); + SET @RenameCmd = 'EXEC sp_rename ''' + + @SchemaName + '.' + @ObjectName + ''', ''' + + @NewName + ''';'; + + EXEC tSQLt.Private_MarkObjectBeforeRename @SchemaName, @ObjectName; + + + EXEC tSQLt.SuppressOutput @RenameCmd; + +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RenameObjectToUniqueNameUsingObjectId.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RenameObjectToUniqueNameUsingObjectId.sql new file mode 100644 index 0000000..066378e --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RenameObjectToUniqueNameUsingObjectId.sql @@ -0,0 +1,15 @@ + +CREATE PROCEDURE tSQLt.Private_RenameObjectToUniqueNameUsingObjectId + @ObjectId INT, + @NewName NVARCHAR(MAX) = NULL OUTPUT +AS +BEGIN + DECLARE @SchemaName NVARCHAR(MAX); + DECLARE @ObjectName NVARCHAR(MAX); + + SELECT @SchemaName = QUOTENAME(OBJECT_SCHEMA_NAME(@ObjectId)), @ObjectName = QUOTENAME(OBJECT_NAME(@ObjectId)); + + EXEC tSQLt.Private_RenameObjectToUniqueName @SchemaName,@ObjectName, @NewName OUTPUT; +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ResetNewTestClassList.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ResetNewTestClassList.sql new file mode 100644 index 0000000..4fc8e41 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ResetNewTestClassList.sql @@ -0,0 +1,6 @@ +CREATE PROCEDURE tSQLt.Private_ResetNewTestClassList +AS +BEGIN + SET NOCOUNT ON; + DELETE FROM tSQLt.Private_NewTestClassList; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_Run.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_Run.sql new file mode 100644 index 0000000..c872c69 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_Run.sql @@ -0,0 +1,39 @@ + +CREATE PROCEDURE tSQLt.Private_Run + @TestName NVARCHAR(MAX), + @TestResultFormatter NVARCHAR(MAX) +AS +BEGIN +SET NOCOUNT ON; + DECLARE @FullName NVARCHAR(MAX); + DECLARE @TestClassId INT; + DECLARE @IsTestClass BIT; + DECLARE @IsTestCase BIT; + DECLARE @IsSchema BIT; + DECLARE @SetUp NVARCHAR(MAX);SET @SetUp = NULL; + + SELECT @TestName = tSQLt.Private_GetLastTestNameIfNotProvided(@TestName); + EXEC tSQLt.Private_SaveTestNameForSession @TestName; + + SELECT @TestClassId = schemaId, + @FullName = quotedFullName, + @IsTestClass = isTestClass, + @IsSchema = isSchema, + @IsTestCase = isTestCase + FROM tSQLt.Private_ResolveName(@TestName); + + IF @IsSchema = 1 + BEGIN + EXEC tSQLt.Private_RunTestClass @FullName; + END + + IF @IsTestCase = 1 + BEGIN + DECLARE @SetupProcName NVARCHAR(MAX); + EXEC tSQLt.Private_GetSetupProcedureName @TestClassId, @SetupProcName OUTPUT; + + EXEC tSQLt.Private_RunTest @FullName, @SetupProcName; + END; + + EXEC tSQLt.Private_OutputTestResults @TestResultFormatter; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunAll.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunAll.sql new file mode 100644 index 0000000..404b066 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunAll.sql @@ -0,0 +1,7 @@ + +CREATE PROCEDURE tSQLt.Private_RunAll + @TestResultFormatter NVARCHAR(MAX) +AS +BEGIN + EXEC tSQLt.Private_RunCursor @TestResultFormatter = @TestResultFormatter, @GetCursorCallback = 'tSQLt.Private_GetCursorForRunAll'; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunCursor.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunCursor.sql new file mode 100644 index 0000000..0fa1067 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunCursor.sql @@ -0,0 +1,28 @@ + + +CREATE PROCEDURE tSQLt.Private_RunCursor + @TestResultFormatter NVARCHAR(MAX), + @GetCursorCallback NVARCHAR(MAX) +AS +BEGIN + SET NOCOUNT ON; + DECLARE @TestClassName NVARCHAR(MAX); + DECLARE @TestProcName NVARCHAR(MAX); + + DECLARE @TestClassCursor CURSOR; + EXEC @GetCursorCallback @TestClassCursor = @TestClassCursor OUT; +---- + WHILE(1=1) + BEGIN + FETCH NEXT FROM @TestClassCursor INTO @TestClassName; + IF(@@FETCH_STATUS<>0)BREAK; + + EXEC tSQLt.Private_RunTestClass @TestClassName; + + END; + + CLOSE @TestClassCursor; + DEALLOCATE @TestClassCursor; + + EXEC tSQLt.Private_OutputTestResults @TestResultFormatter; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunMethodHandler.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunMethodHandler.sql new file mode 100644 index 0000000..b667761 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunMethodHandler.sql @@ -0,0 +1,22 @@ + +CREATE PROCEDURE tSQLt.Private_RunMethodHandler + @RunMethod NVARCHAR(MAX), + @TestResultFormatter NVARCHAR(MAX) = NULL, + @TestName NVARCHAR(MAX) = NULL +AS +BEGIN + SELECT @TestResultFormatter = ISNULL(@TestResultFormatter,tSQLt.GetTestResultFormatter()); + + EXEC tSQLt.Private_Init; + IF(@@ERROR = 0) + BEGIN + IF(EXISTS(SELECT * FROM sys.parameters AS P WHERE P.object_id = OBJECT_ID(@RunMethod) AND name = '@TestName')) + BEGIN + EXEC @RunMethod @TestName = @TestName, @TestResultFormatter = @TestResultFormatter; + END; + ELSE + BEGIN + EXEC @RunMethod @TestResultFormatter = @TestResultFormatter; + END; + END; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunNew.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunNew.sql new file mode 100644 index 0000000..d1ae35b --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunNew.sql @@ -0,0 +1,7 @@ + +CREATE PROCEDURE tSQLt.Private_RunNew + @TestResultFormatter NVARCHAR(MAX) +AS +BEGIN + EXEC tSQLt.Private_RunCursor @TestResultFormatter = @TestResultFormatter, @GetCursorCallback = 'tSQLt.Private_GetCursorForRunNew'; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunTest.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunTest.sql new file mode 100644 index 0000000..0d89426 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunTest.sql @@ -0,0 +1,210 @@ + +CREATE PROCEDURE tSQLt.Private_RunTest + @TestName NVARCHAR(MAX), + @SetUp NVARCHAR(MAX) = NULL +AS +BEGIN + DECLARE @Msg NVARCHAR(MAX); SET @Msg = ''; + DECLARE @Msg2 NVARCHAR(MAX); SET @Msg2 = ''; + DECLARE @Cmd NVARCHAR(MAX); SET @Cmd = ''; + DECLARE @TestClassName NVARCHAR(MAX); SET @TestClassName = ''; + DECLARE @TestProcName NVARCHAR(MAX); SET @TestProcName = ''; + DECLARE @Result NVARCHAR(MAX); SET @Result = 'Success'; + DECLARE @TranName CHAR(32); EXEC tSQLt.GetNewTranName @TranName OUT; + DECLARE @TestResultId INT; + DECLARE @PreExecTrancount INT; + + DECLARE @VerboseMsg NVARCHAR(MAX); + DECLARE @Verbose BIT; + SET @Verbose = ISNULL((SELECT CAST(Value AS BIT) FROM tSQLt.Private_GetConfiguration('Verbose')),0); + + TRUNCATE TABLE tSQLt.CaptureOutputLog; + CREATE TABLE #ExpectException(ExpectException INT,ExpectedMessage NVARCHAR(MAX), ExpectedSeverity INT, ExpectedState INT, ExpectedMessagePattern NVARCHAR(MAX), ExpectedErrorNumber INT, FailMessage NVARCHAR(MAX)); + + IF EXISTS (SELECT 1 FROM sys.extended_properties WHERE name = N'SetFakeViewOnTrigger') + BEGIN + RAISERROR('Test system is in an invalid state. SetFakeViewOff must be called if SetFakeViewOn was called. Call SetFakeViewOff after creating all test case procedures.', 16, 10) WITH NOWAIT; + RETURN -1; + END; + + SELECT @Cmd = 'EXEC ' + @TestName; + + SELECT @TestClassName = OBJECT_SCHEMA_NAME(OBJECT_ID(@TestName)), --tSQLt.Private_GetCleanSchemaName('', @TestName), + @TestProcName = tSQLt.Private_GetCleanObjectName(@TestName); + + INSERT INTO tSQLt.TestResult(Class, TestCase, TranName, Result) + SELECT @TestClassName, @TestProcName, @TranName, 'A severe error happened during test execution. Test did not finish.' + OPTION(MAXDOP 1); + SELECT @TestResultId = SCOPE_IDENTITY(); + + IF(@Verbose = 1) + BEGIN + SET @VerboseMsg = 'tSQLt.Run '''+@TestName+'''; --Starting'; + EXEC tSQLt.Private_Print @Message =@VerboseMsg, @Severity = 0; + END; + + BEGIN TRAN; + SAVE TRAN @TranName; + + SET @PreExecTrancount = @@TRANCOUNT; + + TRUNCATE TABLE tSQLt.TestMessage; + + DECLARE @TmpMsg NVARCHAR(MAX); + DECLARE @TestEndTime DATETIME; SET @TestEndTime = NULL; + BEGIN TRY + IF (@SetUp IS NOT NULL) EXEC @SetUp; + EXEC (@Cmd); + SET @TestEndTime = GETDATE(); + IF(EXISTS(SELECT 1 FROM #ExpectException WHERE ExpectException = 1)) + BEGIN + SET @TmpMsg = COALESCE((SELECT FailMessage FROM #ExpectException)+' ','')+'Expected an error to be raised.'; + EXEC tSQLt.Fail @TmpMsg; + END + END TRY + BEGIN CATCH + SET @TestEndTime = ISNULL(@TestEndTime,GETDATE()); + IF ERROR_MESSAGE() LIKE '%tSQLt.Failure%' + BEGIN + SELECT @Msg = Msg FROM tSQLt.TestMessage; + SET @Result = 'Failure'; + END + ELSE + BEGIN + DECLARE @ErrorInfo NVARCHAR(MAX); + SELECT @ErrorInfo = + COALESCE(ERROR_MESSAGE(), '') + + '[' +COALESCE(LTRIM(STR(ERROR_SEVERITY())), '') + ','+COALESCE(LTRIM(STR(ERROR_STATE())), '') + ']' + + '{' + COALESCE(ERROR_PROCEDURE(), '') + ',' + COALESCE(CAST(ERROR_LINE() AS NVARCHAR), '') + '}'; + + IF(EXISTS(SELECT 1 FROM #ExpectException)) + BEGIN + DECLARE @ExpectException INT; + DECLARE @ExpectedMessage NVARCHAR(MAX); + DECLARE @ExpectedMessagePattern NVARCHAR(MAX); + DECLARE @ExpectedSeverity INT; + DECLARE @ExpectedState INT; + DECLARE @ExpectedErrorNumber INT; + DECLARE @FailMessage NVARCHAR(MAX); + SELECT @ExpectException = ExpectException, + @ExpectedMessage = ExpectedMessage, + @ExpectedSeverity = ExpectedSeverity, + @ExpectedState = ExpectedState, + @ExpectedMessagePattern = ExpectedMessagePattern, + @ExpectedErrorNumber = ExpectedErrorNumber, + @FailMessage = FailMessage + FROM #ExpectException; + + IF(@ExpectException = 1) + BEGIN + SET @Result = 'Success'; + SET @TmpMsg = COALESCE(@FailMessage+' ','')+'Exception did not match expectation!'; + IF(ERROR_MESSAGE() <> @ExpectedMessage) + BEGIN + SET @TmpMsg = @TmpMsg +CHAR(13)+CHAR(10)+ + 'Expected Message: <'+@ExpectedMessage+'>'+CHAR(13)+CHAR(10)+ + 'Actual Message : <'+ERROR_MESSAGE()+'>'; + SET @Result = 'Failure'; + END + IF(ERROR_MESSAGE() NOT LIKE @ExpectedMessagePattern) + BEGIN + SET @TmpMsg = @TmpMsg +CHAR(13)+CHAR(10)+ + 'Expected Message to be like <'+@ExpectedMessagePattern+'>'+CHAR(13)+CHAR(10)+ + 'Actual Message : <'+ERROR_MESSAGE()+'>'; + SET @Result = 'Failure'; + END + IF(ERROR_NUMBER() <> @ExpectedErrorNumber) + BEGIN + SET @TmpMsg = @TmpMsg +CHAR(13)+CHAR(10)+ + 'Expected Error Number: '+CAST(@ExpectedErrorNumber AS NVARCHAR(MAX))+CHAR(13)+CHAR(10)+ + 'Actual Error Number : '+CAST(ERROR_NUMBER() AS NVARCHAR(MAX)); + SET @Result = 'Failure'; + END + IF(ERROR_SEVERITY() <> @ExpectedSeverity) + BEGIN + SET @TmpMsg = @TmpMsg +CHAR(13)+CHAR(10)+ + 'Expected Severity: '+CAST(@ExpectedSeverity AS NVARCHAR(MAX))+CHAR(13)+CHAR(10)+ + 'Actual Severity : '+CAST(ERROR_SEVERITY() AS NVARCHAR(MAX)); + SET @Result = 'Failure'; + END + IF(ERROR_STATE() <> @ExpectedState) + BEGIN + SET @TmpMsg = @TmpMsg +CHAR(13)+CHAR(10)+ + 'Expected State: '+CAST(@ExpectedState AS NVARCHAR(MAX))+CHAR(13)+CHAR(10)+ + 'Actual State : '+CAST(ERROR_STATE() AS NVARCHAR(MAX)); + SET @Result = 'Failure'; + END + IF(@Result = 'Failure') + BEGIN + SET @Msg = @TmpMsg; + END + END + ELSE + BEGIN + SET @Result = 'Failure'; + SET @Msg = + COALESCE(@FailMessage+' ','')+ + 'Expected no error to be raised. Instead this error was encountered:'+ + CHAR(13)+CHAR(10)+ + @ErrorInfo; + END + END + ELSE + BEGIN + SET @Result = 'Error'; + SET @Msg = @ErrorInfo; + END + END; + END CATCH + + BEGIN TRY + ROLLBACK TRAN @TranName; + END TRY + BEGIN CATCH + DECLARE @PostExecTrancount INT; + SET @PostExecTrancount = @PreExecTrancount - @@TRANCOUNT; + IF (@@TRANCOUNT > 0) ROLLBACK; + BEGIN TRAN; + IF( @Result <> 'Success' + OR @PostExecTrancount <> 0 + ) + BEGIN + SELECT @Msg = COALESCE(@Msg, '') + ' (There was also a ROLLBACK ERROR --> ' + COALESCE(ERROR_MESSAGE(), '') + '{' + COALESCE(ERROR_PROCEDURE(), '') + ',' + COALESCE(CAST(ERROR_LINE() AS NVARCHAR), '') + '})'; + SET @Result = 'Error'; + END + END CATCH + + If(@Result <> 'Success') + BEGIN + SET @Msg2 = @TestName + ' failed: (' + @Result + ') ' + @Msg; + EXEC tSQLt.Private_Print @Message = @Msg2, @Severity = 0; + END + + IF EXISTS(SELECT 1 FROM tSQLt.TestResult WHERE Id = @TestResultId) + BEGIN + UPDATE tSQLt.TestResult SET + Result = @Result, + Msg = @Msg, + TestEndTime = @TestEndTime + WHERE Id = @TestResultId; + END + ELSE + BEGIN + INSERT tSQLt.TestResult(Class, TestCase, TranName, Result, Msg) + SELECT @TestClassName, + @TestProcName, + '?', + 'Error', + 'TestResult entry is missing; Original outcome: ' + @Result + ', ' + @Msg; + END + + + COMMIT; + + IF(@Verbose = 1) + BEGIN + SET @VerboseMsg = 'tSQLt.Run '''+@TestName+'''; --Finished'; + EXEC tSQLt.Private_Print @Message =@VerboseMsg, @Severity = 0; + END; + +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunTestClass.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunTestClass.sql new file mode 100644 index 0000000..0bab517 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_RunTestClass.sql @@ -0,0 +1,31 @@ + +CREATE PROCEDURE tSQLt.Private_RunTestClass + @TestClassName NVARCHAR(MAX) +AS +BEGIN + DECLARE @TestCaseName NVARCHAR(MAX); + DECLARE @TestClassId INT; SET @TestClassId = tSQLt.Private_GetSchemaId(@TestClassName); + DECLARE @SetupProcName NVARCHAR(MAX); + EXEC tSQLt.Private_GetSetupProcedureName @TestClassId, @SetupProcName OUTPUT; + + DECLARE testCases CURSOR LOCAL FAST_FORWARD + FOR + SELECT tSQLt.Private_GetQuotedFullName(object_id) + FROM sys.procedures + WHERE schema_id = @TestClassId + AND LOWER(name) LIKE 'test%'; + + OPEN testCases; + + FETCH NEXT FROM testCases INTO @TestCaseName; + + WHILE @@FETCH_STATUS = 0 + BEGIN + EXEC tSQLt.Private_RunTest @TestCaseName, @SetupProcName; + + FETCH NEXT FROM testCases INTO @TestCaseName; + END; + + CLOSE testCases; + DEALLOCATE testCases; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_SaveTestNameForSession.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_SaveTestNameForSession.sql new file mode 100644 index 0000000..21a54e6 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_SaveTestNameForSession.sql @@ -0,0 +1,15 @@ + +CREATE PROCEDURE tSQLt.Private_SaveTestNameForSession + @TestName NVARCHAR(MAX) +AS +BEGIN + DELETE FROM tSQLt.Run_LastExecution + WHERE SessionId = @@SPID; + + INSERT INTO tSQLt.Run_LastExecution(TestName, SessionId, LoginTime) + SELECT TestName = @TestName, + session_id, + login_time + FROM sys.dm_exec_sessions + WHERE session_id = @@SPID; +END diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_SetConfiguration.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_SetConfiguration.sql new file mode 100644 index 0000000..82a7c35 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_SetConfiguration.sql @@ -0,0 +1,17 @@ +CREATE PROCEDURE tSQLt.Private_SetConfiguration + @Name NVARCHAR(100), + @Value SQL_VARIANT +AS +BEGIN + IF(EXISTS(SELECT 1 FROM tSQLt.Private_Configurations WITH(ROWLOCK,UPDLOCK) WHERE Name = @Name)) + BEGIN + UPDATE tSQLt.Private_Configurations SET + Value = @Value + WHERE Name = @Name; + END; + ELSE + BEGIN + INSERT tSQLt.Private_Configurations(Name,Value) + VALUES(@Name,@Value); + END; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_SetFakeViewOff_SingleView.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_SetFakeViewOff_SingleView.sql new file mode 100644 index 0000000..68d9961 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_SetFakeViewOff_SingleView.sql @@ -0,0 +1,20 @@ + +CREATE PROCEDURE [tSQLt].[Private_SetFakeViewOff_SingleView] + @ViewName NVARCHAR(MAX) +AS +BEGIN + DECLARE @Cmd NVARCHAR(MAX), + @SchemaName NVARCHAR(MAX), + @TriggerName NVARCHAR(MAX); + + SELECT @SchemaName = QUOTENAME(OBJECT_SCHEMA_NAME(ObjId)), + @TriggerName = QUOTENAME(OBJECT_NAME(ObjId) + '_SetFakeViewOn') + FROM (SELECT OBJECT_ID(@ViewName) AS ObjId) X; + + SET @Cmd = 'DROP TRIGGER %SCHEMA_NAME%.%TRIGGER_NAME%;'; + + SET @Cmd = REPLACE(@Cmd, '%SCHEMA_NAME%', @SchemaName); + SET @Cmd = REPLACE(@Cmd, '%TRIGGER_NAME%', @TriggerName); + + EXEC(@Cmd); +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_SetFakeViewOn_SingleView.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_SetFakeViewOn_SingleView.sql new file mode 100644 index 0000000..b8f2809 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_SetFakeViewOn_SingleView.sql @@ -0,0 +1,39 @@ + +CREATE PROCEDURE [tSQLt].[Private_SetFakeViewOn_SingleView] + @ViewName NVARCHAR(MAX) +AS +BEGIN + DECLARE @Cmd NVARCHAR(MAX), + @SchemaName NVARCHAR(MAX), + @TriggerName NVARCHAR(MAX); + + SELECT @SchemaName = OBJECT_SCHEMA_NAME(ObjId), + @ViewName = OBJECT_NAME(ObjId), + @TriggerName = OBJECT_NAME(ObjId) + '_SetFakeViewOn' + FROM (SELECT OBJECT_ID(@ViewName) AS ObjId) X; + + SET @Cmd = + 'CREATE TRIGGER $$SCHEMA_NAME$$.$$TRIGGER_NAME$$ + ON $$SCHEMA_NAME$$.$$VIEW_NAME$$ INSTEAD OF INSERT AS + BEGIN + RAISERROR(''Test system is in an invalid state. SetFakeViewOff must be called if SetFakeViewOn was called. Call SetFakeViewOff after creating all test case procedures.'', 16, 10) WITH NOWAIT; + RETURN; + END; + '; + + SET @Cmd = REPLACE(@Cmd, '$$SCHEMA_NAME$$', QUOTENAME(@SchemaName)); + SET @Cmd = REPLACE(@Cmd, '$$VIEW_NAME$$', QUOTENAME(@ViewName)); + SET @Cmd = REPLACE(@Cmd, '$$TRIGGER_NAME$$', QUOTENAME(@TriggerName)); + EXEC(@Cmd); + + EXEC sp_addextendedproperty @name = N'SetFakeViewOnTrigger', + @value = 1, + @level0type = 'SCHEMA', + @level0name = @SchemaName, + @level1type = 'VIEW', + @level1name = @ViewName, + @level2type = 'TRIGGER', + @level2name = @TriggerName; + + RETURN 0; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ValidateFakeTableParameters.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ValidateFakeTableParameters.sql new file mode 100644 index 0000000..4da9139 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ValidateFakeTableParameters.sql @@ -0,0 +1,17 @@ + +CREATE PROCEDURE tSQLt.Private_ValidateFakeTableParameters + @SchemaName NVARCHAR(MAX), + @OrigTableName NVARCHAR(MAX), + @OrigSchemaName NVARCHAR(MAX) +AS +BEGIN + IF @SchemaName IS NULL + BEGIN + DECLARE @FullName NVARCHAR(MAX); SET @FullName = @OrigTableName + COALESCE('.' + @OrigSchemaName, ''); + + RAISERROR ('FakeTable could not resolve the object name, ''%s''. (When calling tSQLt.FakeTable, avoid the use of the @SchemaName parameter, as it is deprecated.)', + 16, 10, @FullName); + END; +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ValidateObjectsCompatibleWithFakeFunction.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ValidateObjectsCompatibleWithFakeFunction.sql new file mode 100644 index 0000000..ede0981 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ValidateObjectsCompatibleWithFakeFunction.sql @@ -0,0 +1,47 @@ +CREATE PROCEDURE tSQLt.Private_ValidateObjectsCompatibleWithFakeFunction + @FunctionName NVARCHAR(MAX), + @FakeFunctionName NVARCHAR(MAX), + @FunctionObjectId INT OUTPUT, + @FakeFunctionObjectId INT OUTPUT, + @IsScalarFunction BIT OUTPUT +AS +BEGIN + SET @FunctionObjectId = OBJECT_ID(@FunctionName); + SET @FakeFunctionObjectId = OBJECT_ID(@FakeFunctionName); + + IF(@FunctionObjectId IS NULL) + BEGIN + RAISERROR('%s does not exist!',16,10,@FunctionName); + END; + IF(@FakeFunctionObjectId IS NULL) + BEGIN + RAISERROR('%s does not exist!',16,10,@FakeFunctionName); + END; + + DECLARE @FunctionType CHAR(2); + DECLARE @FakeFunctionType CHAR(2); + SELECT @FunctionType = type FROM sys.objects WHERE object_id = @FunctionObjectId; + SELECT @FakeFunctionType = type FROM sys.objects WHERE object_id = @FakeFunctionObjectId; + + IF((@FunctionType IN('FN','FS') AND @FakeFunctionType NOT IN('FN','FS')) + OR + (@FunctionType IN('TF','IF','FT') AND @FakeFunctionType NOT IN('TF','IF','FT')) + OR + (@FunctionType NOT IN('FN','FS','TF','IF','FT')) + ) + BEGIN + RAISERROR('Both parameters must contain the name of either scalar or table valued functions!',16,10); + END; + + SET @IsScalarFunction = CASE WHEN @FunctionType IN('FN','FS') THEN 1 ELSE 0 END; + + IF(EXISTS(SELECT 1 + FROM sys.parameters AS P + WHERE P.object_id IN(@FunctionObjectId,@FakeFunctionObjectId) + GROUP BY P.name, P.max_length, P.precision, P.scale, P.parameter_id + HAVING COUNT(1) <> 2 + )) + BEGIN + RAISERROR('Parameters of both functions must match! (This includes the return type for scalar functions.)',16,10); + END; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ValidateProcedureCanBeUsedWithSpyProcedure.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ValidateProcedureCanBeUsedWithSpyProcedure.sql new file mode 100644 index 0000000..217d91b --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ValidateProcedureCanBeUsedWithSpyProcedure.sql @@ -0,0 +1,15 @@ + +CREATE PROCEDURE tSQLt.Private_ValidateProcedureCanBeUsedWithSpyProcedure + @ProcedureName NVARCHAR(MAX) +AS +BEGIN + IF NOT EXISTS(SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(@ProcedureName)) + BEGIN + RAISERROR('Cannot use SpyProcedure on %s because the procedure does not exist', 16, 10, @ProcedureName) WITH NOWAIT; + END; + + IF (1020 < (SELECT COUNT(*) FROM sys.parameters WHERE object_id = OBJECT_ID(@ProcedureName))) + BEGIN + RAISERROR('Cannot use SpyProcedure on procedure %s because it contains more than 1020 parameters', 16, 10, @ProcedureName) WITH NOWAIT; + END; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ValidateThatAllDataTypesInTableAreSupported.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ValidateThatAllDataTypesInTableAreSupported.sql new file mode 100644 index 0000000..8ffc3ed --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Private_ValidateThatAllDataTypesInTableAreSupported.sql @@ -0,0 +1,12 @@ +CREATE PROCEDURE tSQLt.Private_ValidateThatAllDataTypesInTableAreSupported + @ResultTable NVARCHAR(MAX), + @ColumnList NVARCHAR(MAX) +AS +BEGIN + BEGIN TRY + EXEC('DECLARE @EatResult INT; SELECT @EatResult = COUNT(1) FROM ' + @ResultTable + ' GROUP BY ' + @ColumnList + ';'); + END TRY + BEGIN CATCH + RAISERROR('The table contains a datatype that is not supported for tSQLt.AssertEqualsTable. Please refer to http://tsqlt.org/user-guide/assertions/assertequalstable/ for a list of unsupported datatypes.',16,10); + END CATCH +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RemoveExternalAccessKey.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RemoveExternalAccessKey.sql new file mode 100644 index 0000000..2e2a0a1 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RemoveExternalAccessKey.sql @@ -0,0 +1,15 @@ +CREATE PROCEDURE tSQLt.RemoveExternalAccessKey +AS +BEGIN + IF(NOT EXISTS(SELECT * FROM sys.fn_my_permissions(NULL,'server') AS FMP WHERE FMP.permission_name = 'CONTROL SERVER')) + BEGIN + RAISERROR('Only principals with CONTROL SERVER permission can execute this procedure.',16,10); + RETURN -1; + END; + + DECLARE @master_sys_sp_executesql NVARCHAR(MAX); SET @master_sys_sp_executesql = 'master.sys.sp_executesql'; + + IF SUSER_ID('tSQLtExternalAccessKey') IS NOT NULL DROP LOGIN tSQLtExternalAccessKey; + EXEC @master_sys_sp_executesql N'IF ASYMKEY_ID(''tSQLtExternalAccessKey'') IS NOT NULL DROP ASYMMETRIC KEY tSQLtExternalAccessKey;'; + EXEC @master_sys_sp_executesql N'IF EXISTS(SELECT * FROM sys.assemblies WHERE name = ''tSQLtExternalAccessKey'') DROP ASSEMBLY tSQLtExternalAccessKey;'; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RemoveObject.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RemoveObject.sql new file mode 100644 index 0000000..2044fdb --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RemoveObject.sql @@ -0,0 +1,17 @@ +CREATE PROCEDURE tSQLt.RemoveObject + @ObjectName NVARCHAR(MAX), + @NewName NVARCHAR(MAX) = NULL OUTPUT, + @IfExists INT = 0 +AS +BEGIN + DECLARE @ObjectId INT; + SELECT @ObjectId = OBJECT_ID(@ObjectName); + + IF(@ObjectId IS NULL) + BEGIN + IF(@IfExists = 1) RETURN; + RAISERROR('%s does not exist!',16,10,@ObjectName); + END; + + EXEC tSQLt.Private_RenameObjectToUniqueNameUsingObjectId @ObjectId, @NewName = @NewName OUTPUT; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RemoveObjectIfExists.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RemoveObjectIfExists.sql new file mode 100644 index 0000000..1bb2d07 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RemoveObjectIfExists.sql @@ -0,0 +1,7 @@ +CREATE PROCEDURE tSQLt.RemoveObjectIfExists + @ObjectName NVARCHAR(MAX), + @NewName NVARCHAR(MAX) = NULL OUTPUT +AS +BEGIN + EXEC tSQLt.RemoveObject @ObjectName = @ObjectName, @NewName = @NewName OUT, @IfExists = 1; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RenameClass.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RenameClass.sql new file mode 100644 index 0000000..9e342da --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RenameClass.sql @@ -0,0 +1,36 @@ + +CREATE PROCEDURE tSQLt.RenameClass + @SchemaName NVARCHAR(MAX), + @NewSchemaName NVARCHAR(MAX) +AS +BEGIN + DECLARE @MigrateObjectsCommand NVARCHAR(MAX); + + SELECT @NewSchemaName = PARSENAME(@NewSchemaName, 1), + @SchemaName = PARSENAME(@SchemaName, 1); + + EXEC tSQLt.NewTestClass @NewSchemaName; + + SELECT @MigrateObjectsCommand = ( + SELECT Cmd AS [text()] FROM ( + SELECT 'ALTER SCHEMA ' + QUOTENAME(@NewSchemaName) + ' TRANSFER ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(name) + ';' AS Cmd + FROM sys.objects + WHERE schema_id = SCHEMA_ID(@SchemaName) + AND type NOT IN ('PK', 'F') + UNION ALL + SELECT 'ALTER SCHEMA ' + QUOTENAME(@NewSchemaName) + ' TRANSFER XML SCHEMA COLLECTION::' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(name) + ';' AS Cmd + FROM sys.xml_schema_collections + WHERE schema_id = SCHEMA_ID(@SchemaName) + UNION ALL + SELECT 'ALTER SCHEMA ' + QUOTENAME(@NewSchemaName) + ' TRANSFER TYPE::' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(name) + ';' AS Cmd + FROM sys.types + WHERE schema_id = SCHEMA_ID(@SchemaName) + ) AS Cmds + FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'); + + EXEC (@MigrateObjectsCommand); + + EXEC tSQLt.DropClass @SchemaName; +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Reset.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Reset.sql new file mode 100644 index 0000000..6905745 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Reset.sql @@ -0,0 +1,5 @@ +CREATE PROCEDURE tSQLt.Reset +AS +BEGIN + EXEC tSQLt.Private_ResetNewTestClassList; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ResultSetFilter.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ResultSetFilter.sql new file mode 100644 index 0000000..dfc78a4 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/ResultSetFilter.sql @@ -0,0 +1,4 @@ +CREATE PROCEDURE [tSQLt].[ResultSetFilter] +@ResultsetNo INT NULL, @Command NVARCHAR (MAX) NULL +AS EXTERNAL NAME [tSQLtCLR].[tSQLtCLR.StoredProcedures].[ResultSetFilter] + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Run.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Run.sql new file mode 100644 index 0000000..92eb0ab --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Run.sql @@ -0,0 +1,8 @@ + +CREATE PROCEDURE tSQLt.Run + @TestName NVARCHAR(MAX) = NULL, + @TestResultFormatter NVARCHAR(MAX) = NULL +AS +BEGIN + EXEC tSQLt.Private_RunMethodHandler @RunMethod = 'tSQLt.Private_Run', @TestResultFormatter = @TestResultFormatter, @TestName = @TestName; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunAll.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunAll.sql new file mode 100644 index 0000000..ab28804 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunAll.sql @@ -0,0 +1,5 @@ +CREATE PROCEDURE tSQLt.RunAll +AS +BEGIN + EXEC tSQLt.Private_RunMethodHandler @RunMethod = 'tSQLt.Private_RunAll'; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunC.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunC.sql new file mode 100644 index 0000000..16518c1 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunC.sql @@ -0,0 +1,12 @@ +CREATE PROCEDURE tSQLt.RunC +AS +BEGIN + DECLARE @TestName NVARCHAR(MAX);SET @TestName = NULL; + DECLARE @InputBuffer NVARCHAR(MAX); + EXEC tSQLt.Private_InputBuffer @InputBuffer = @InputBuffer OUT; + IF(@InputBuffer LIKE 'EXEC tSQLt.RunC;--%') + BEGIN + SET @TestName = LTRIM(RTRIM(STUFF(@InputBuffer,1,18,''))); + END; + EXEC tSQLt.Run @TestName = @TestName; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunNew.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunNew.sql new file mode 100644 index 0000000..95471cc --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunNew.sql @@ -0,0 +1,6 @@ + +CREATE PROCEDURE tSQLt.RunNew +AS +BEGIN + EXEC tSQLt.Private_RunMethodHandler @RunMethod = 'tSQLt.Private_RunNew'; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunTest.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunTest.sql new file mode 100644 index 0000000..e2cd659 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunTest.sql @@ -0,0 +1,7 @@ + +CREATE PROCEDURE tSQLt.RunTest + @TestName NVARCHAR(MAX) +AS +BEGIN + RAISERROR('tSQLt.RunTest has been retired. Please use tSQLt.Run instead.', 16, 10); +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunTestClass.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunTestClass.sql new file mode 100644 index 0000000..b148633 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunTestClass.sql @@ -0,0 +1,7 @@ + +CREATE PROCEDURE tSQLt.RunTestClass + @TestClassName NVARCHAR(MAX) +AS +BEGIN + EXEC tSQLt.Run @TestClassName; +END diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunWithNullResults.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunWithNullResults.sql new file mode 100644 index 0000000..21c214b --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunWithNullResults.sql @@ -0,0 +1,7 @@ + +CREATE PROCEDURE tSQLt.RunWithNullResults + @TestName NVARCHAR(MAX) = NULL +AS +BEGIN + EXEC tSQLt.Run @TestName = @TestName, @TestResultFormatter = 'tSQLt.NullTestResultFormatter'; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunWithXmlResults.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunWithXmlResults.sql new file mode 100644 index 0000000..6bd793c --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/RunWithXmlResults.sql @@ -0,0 +1,7 @@ + +CREATE PROCEDURE tSQLt.RunWithXmlResults + @TestName NVARCHAR(MAX) = NULL +AS +BEGIN + EXEC tSQLt.Run @TestName = @TestName, @TestResultFormatter = 'tSQLt.XmlResultFormatter'; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SetFakeViewOff.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SetFakeViewOff.sql new file mode 100644 index 0000000..1dd9e34 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SetFakeViewOff.sql @@ -0,0 +1,26 @@ + +CREATE PROCEDURE [tSQLt].[SetFakeViewOff] + @SchemaName NVARCHAR(MAX) +AS +BEGIN + DECLARE @ViewName NVARCHAR(MAX); + + DECLARE viewNames CURSOR LOCAL FAST_FORWARD FOR + SELECT QUOTENAME(OBJECT_SCHEMA_NAME(t.parent_id)) + '.' + QUOTENAME(OBJECT_NAME(t.parent_id)) AS viewName + FROM sys.extended_properties ep + JOIN sys.triggers t + on ep.major_id = t.object_id + WHERE ep.name = N'SetFakeViewOnTrigger' + OPEN viewNames; + + FETCH NEXT FROM viewNames INTO @ViewName; + WHILE @@FETCH_STATUS = 0 + BEGIN + EXEC tSQLt.Private_SetFakeViewOff_SingleView @ViewName; + + FETCH NEXT FROM viewNames INTO @ViewName; + END; + + CLOSE viewNames; + DEALLOCATE viewNames; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SetFakeViewOn.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SetFakeViewOn.sql new file mode 100644 index 0000000..06964b4 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SetFakeViewOn.sql @@ -0,0 +1,25 @@ + +CREATE PROCEDURE [tSQLt].[SetFakeViewOn] + @SchemaName NVARCHAR(MAX) +AS +BEGIN + DECLARE @ViewName NVARCHAR(MAX); + + DECLARE viewNames CURSOR LOCAL FAST_FORWARD FOR + SELECT QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + '.' + QUOTENAME([name]) AS viewName + FROM sys.views + WHERE schema_id = SCHEMA_ID(@SchemaName); + + OPEN viewNames; + + FETCH NEXT FROM viewNames INTO @ViewName; + WHILE @@FETCH_STATUS = 0 + BEGIN + EXEC tSQLt.Private_SetFakeViewOn_SingleView @ViewName; + + FETCH NEXT FROM viewNames INTO @ViewName; + END; + + CLOSE viewNames; + DEALLOCATE viewNames; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SetTestResultFormatter.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SetTestResultFormatter.sql new file mode 100644 index 0000000..b808b92 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SetTestResultFormatter.sql @@ -0,0 +1,23 @@ + + + +CREATE PROCEDURE tSQLt.SetTestResultFormatter + @Formatter NVARCHAR(4000) +AS +BEGIN + IF EXISTS (SELECT 1 FROM sys.extended_properties WHERE [name] = N'tSQLt.ResultsFormatter') + BEGIN + EXEC sp_dropextendedproperty @name = N'tSQLt.ResultsFormatter', + @level0type = 'SCHEMA', + @level0name = 'tSQLt', + @level1type = 'PROCEDURE', + @level1name = 'Private_OutputTestResults'; + END; + + EXEC sp_addextendedproperty @name = N'tSQLt.ResultsFormatter', + @value = @Formatter, + @level0type = 'SCHEMA', + @level0name = 'tSQLt', + @level1type = 'PROCEDURE', + @level1name = 'Private_OutputTestResults'; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SetVerbose.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SetVerbose.sql new file mode 100644 index 0000000..fd937c5 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SetVerbose.sql @@ -0,0 +1,6 @@ +CREATE PROCEDURE tSQLt.SetVerbose + @Verbose BIT = 1 +AS +BEGIN + EXEC tSQLt.Private_SetConfiguration @Name = 'Verbose', @Value = @Verbose; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SpyProcedure.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SpyProcedure.sql new file mode 100644 index 0000000..7553e6a --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SpyProcedure.sql @@ -0,0 +1,22 @@ + +CREATE PROCEDURE tSQLt.SpyProcedure + @ProcedureName NVARCHAR(MAX), + @CommandToExecute NVARCHAR(MAX) = NULL +AS +BEGIN + DECLARE @ProcedureObjectId INT; + SELECT @ProcedureObjectId = OBJECT_ID(@ProcedureName); + + EXEC tSQLt.Private_ValidateProcedureCanBeUsedWithSpyProcedure @ProcedureName; + + DECLARE @LogTableName NVARCHAR(MAX); + SELECT @LogTableName = QUOTENAME(OBJECT_SCHEMA_NAME(@ProcedureObjectId)) + '.' + QUOTENAME(OBJECT_NAME(@ProcedureObjectId)+'_SpyProcedureLog'); + + EXEC tSQLt.Private_RenameObjectToUniqueNameUsingObjectId @ProcedureObjectId; + + EXEC tSQLt.Private_CreateProcedureSpy @ProcedureObjectId, @ProcedureName, @LogTableName, @CommandToExecute; + + RETURN 0; +END; + + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/StubRecord.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/StubRecord.sql new file mode 100644 index 0000000..36262ae --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/StubRecord.sql @@ -0,0 +1,97 @@ +CREATE PROCEDURE tSQLt.StubRecord(@SnTableName AS NVARCHAR(MAX), @BintObjId AS BIGINT) +AS +BEGIN + + RAISERROR('Warning, tSQLt.StubRecord is not currently supported. Use at your own risk!', 0, 1) WITH NOWAIT; + + DECLARE @VcInsertStmt NVARCHAR(MAX), + @VcInsertValues NVARCHAR(MAX); + DECLARE @SnColumnName NVARCHAR(MAX); + DECLARE @SintDataType SMALLINT; + DECLARE @NvcFKCmd NVARCHAR(MAX); + DECLARE @VcFKVal NVARCHAR(MAX); + + SET @VcInsertStmt = 'INSERT INTO ' + @SnTableName + ' (' + + DECLARE curColumns CURSOR + LOCAL FAST_FORWARD + FOR + SELECT syscolumns.name, + syscolumns.xtype, + cmd.cmd + FROM syscolumns + LEFT OUTER JOIN dbo.sysconstraints ON syscolumns.id = sysconstraints.id + AND syscolumns.colid = sysconstraints.colid + AND sysconstraints.status = 1 -- Primary key constraints only + LEFT OUTER JOIN (select fkeyid id,fkey colid,N'select @V=cast(min('+syscolumns.name+') as NVARCHAR) from '+sysobjects.name cmd + from sysforeignkeys + join sysobjects on sysobjects.id=sysforeignkeys.rkeyid + join syscolumns on sysobjects.id=syscolumns.id and syscolumns.colid=rkey) cmd + on cmd.id=syscolumns.id and cmd.colid=syscolumns.colid + WHERE syscolumns.id = OBJECT_ID(@SnTableName) + AND (syscolumns.isnullable = 0 ) + ORDER BY ISNULL(sysconstraints.status, 9999), -- Order Primary Key constraints first + syscolumns.colorder + + OPEN curColumns + + FETCH NEXT FROM curColumns + INTO @SnColumnName, @SintDataType, @NvcFKCmd + + -- Treat the first column retrieved differently, no commas need to be added + -- and it is the ObjId column + IF @@FETCH_STATUS = 0 + BEGIN + SET @VcInsertStmt = @VcInsertStmt + @SnColumnName + SELECT @VcInsertValues = ')VALUES(' + ISNULL(CAST(@BintObjId AS nvarchar), 'NULL') + + FETCH NEXT FROM curColumns + INTO @SnColumnName, @SintDataType, @NvcFKCmd + END + ELSE + BEGIN + -- No columns retrieved, we need to insert into any first column + SELECT @VcInsertStmt = @VcInsertStmt + syscolumns.name + FROM syscolumns + WHERE syscolumns.id = OBJECT_ID(@SnTableName) + AND syscolumns.colorder = 1 + + SELECT @VcInsertValues = ')VALUES(' + ISNULL(CAST(@BintObjId AS nvarchar), 'NULL') + + END + + WHILE @@FETCH_STATUS = 0 + BEGIN + SET @VcInsertStmt = @VcInsertStmt + ',' + @SnColumnName + SET @VcFKVal=',0' + if @NvcFKCmd is not null + BEGIN + set @VcFKVal=null + exec sp_executesql @NvcFKCmd,N'@V NVARCHAR(MAX) output',@VcFKVal output + set @VcFKVal=isnull(','''+@VcFKVal+'''',',NULL') + END + SET @VcInsertValues = @VcInsertValues + @VcFKVal + + FETCH NEXT FROM curColumns + INTO @SnColumnName, @SintDataType, @NvcFKCmd + END + + CLOSE curColumns + DEALLOCATE curColumns + + SET @VcInsertStmt = @VcInsertStmt + @VcInsertValues + ')' + + IF EXISTS (SELECT 1 + FROM syscolumns + WHERE status = 128 + AND id = OBJECT_ID(@SnTableName)) + BEGIN + SET @VcInsertStmt = 'SET IDENTITY_INSERT ' + @SnTableName + ' ON ' + CHAR(10) + + @VcInsertStmt + CHAR(10) + + 'SET IDENTITY_INSERT ' + @SnTableName + ' OFF ' + END + + EXEC (@VcInsertStmt) -- Execute the actual INSERT statement + +END + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SuppressOutput.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SuppressOutput.sql new file mode 100644 index 0000000..c8bf227 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/SuppressOutput.sql @@ -0,0 +1,4 @@ +CREATE PROCEDURE [tSQLt].[SuppressOutput] +@command NVARCHAR (MAX) NULL +AS EXTERNAL NAME [tSQLtCLR].[tSQLtCLR.StoredProcedures].[SuppressOutput] + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/TableToText.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/TableToText.sql new file mode 100644 index 0000000..9cbb198 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/TableToText.sql @@ -0,0 +1,9 @@ +CREATE PROCEDURE tSQLt.TableToText + @txt NVARCHAR(MAX) OUTPUT, + @TableName NVARCHAR(MAX), + @OrderBy NVARCHAR(MAX) = NULL, + @PrintOnlyColumnNameAliasList NVARCHAR(MAX) = NULL +AS +BEGIN + SET @txt = tSQLt.Private::TableToString(@TableName, @OrderBy, @PrintOnlyColumnNameAliasList); +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Uninstall.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Uninstall.sql new file mode 100644 index 0000000..5054163 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/Uninstall.sql @@ -0,0 +1,10 @@ + +CREATE PROCEDURE tSQLt.Uninstall +AS +BEGIN + DROP TYPE tSQLt.Private; + + EXEC tSQLt.DropClass 'tSQLt'; + + DROP ASSEMBLY tSQLtCLR; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/XmlResultFormatter.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/XmlResultFormatter.sql new file mode 100644 index 0000000..ad8bd10 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Stored Procedures/XmlResultFormatter.sql @@ -0,0 +1,212 @@ + +CREATE PROCEDURE tSQLt.XmlResultFormatter +AS +BEGIN + DECLARE @XmlOutput XML; + + SELECT @XmlOutput = ( + SELECT *--Tag, Parent, [testsuites!1!hide!hide], [testsuite!2!name], [testsuite!2!tests], [testsuite!2!errors], [testsuite!2!failures], [testsuite!2!timestamp], [testsuite!2!time], [testcase!3!classname], [testcase!3!name], [testcase!3!time], [failure!4!message] + FROM ( + SELECT 1 AS Tag, + NULL AS Parent, + 'root' AS [testsuites!1!hide!hide], + NULL AS [testsuite!2!id], + NULL AS [testsuite!2!name], + NULL AS [testsuite!2!tests], + NULL AS [testsuite!2!errors], + NULL AS [testsuite!2!failures], + NULL AS [testsuite!2!timestamp], + NULL AS [testsuite!2!time], + NULL AS [testsuite!2!hostname], + NULL AS [testsuite!2!package], + NULL AS [properties!3!hide!hide], + NULL AS [testcase!4!classname], + NULL AS [testcase!4!name], + NULL AS [testcase!4!time], + NULL AS [failure!5!message], + NULL AS [failure!5!type], + NULL AS [error!6!message], + NULL AS [error!6!type], + NULL AS [system-out!7!hide], + NULL AS [system-err!8!hide] + UNION ALL + SELECT 2 AS Tag, + 1 AS Parent, + 'root', + ROW_NUMBER()OVER(ORDER BY Class), + Class, + COUNT(1), + SUM(CASE Result WHEN 'Error' THEN 1 ELSE 0 END), + SUM(CASE Result WHEN 'Failure' THEN 1 ELSE 0 END), + CONVERT(VARCHAR(19),MIN(TestResult.TestStartTime),126), + CAST(CAST(DATEDIFF(MILLISECOND,MIN(TestResult.TestStartTime),MAX(TestResult.TestEndTime))/1000.0 AS NUMERIC(20,3))AS VARCHAR(MAX)), + CAST(SERVERPROPERTY('ServerName') AS NVARCHAR(MAX)), + 'tSQLt', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + FROM tSQLt.TestResult + GROUP BY Class + UNION ALL + SELECT 3 AS Tag, + 2 AS Parent, + 'root', + NULL, + Class, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + Class, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + FROM tSQLt.TestResult + GROUP BY Class + UNION ALL + SELECT 4 AS Tag, + 2 AS Parent, + 'root', + NULL, + Class, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + Class, + TestCase, + CAST(CAST(DATEDIFF(MILLISECOND,TestResult.TestStartTime,TestResult.TestEndTime)/1000.0 AS NUMERIC(20,3))AS VARCHAR(MAX)), + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + FROM tSQLt.TestResult + UNION ALL + SELECT 5 AS Tag, + 4 AS Parent, + 'root', + NULL, + Class, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + Class, + TestCase, + CAST(CAST(DATEDIFF(MILLISECOND,TestResult.TestStartTime,TestResult.TestEndTime)/1000.0 AS NUMERIC(20,3))AS VARCHAR(MAX)), + Msg, + 'tSQLt.Fail', + NULL, + NULL, + NULL, + NULL + FROM tSQLt.TestResult + WHERE Result IN ('Failure') + UNION ALL + SELECT 6 AS Tag, + 4 AS Parent, + 'root', + NULL, + Class, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + Class, + TestCase, + CAST(CAST(DATEDIFF(MILLISECOND,TestResult.TestStartTime,TestResult.TestEndTime)/1000.0 AS NUMERIC(20,3))AS VARCHAR(MAX)), + NULL, + NULL, + Msg, + 'SQL Error', + NULL, + NULL + FROM tSQLt.TestResult + WHERE Result IN ( 'Error') + UNION ALL + SELECT 7 AS Tag, + 2 AS Parent, + 'root', + NULL, + Class, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + Class, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + FROM tSQLt.TestResult + GROUP BY Class + UNION ALL + SELECT 8 AS Tag, + 2 AS Parent, + 'root', + NULL, + Class, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + Class, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + FROM tSQLt.TestResult + GROUP BY Class + ) AS X + ORDER BY [testsuite!2!name],CASE WHEN Tag IN (7,8) THEN 1 ELSE 0 END, [testcase!4!name], Tag + FOR XML EXPLICIT + ); + + EXEC tSQLt.Private_PrintXML @XmlOutput; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/CaptureOutputLog.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/CaptureOutputLog.sql new file mode 100644 index 0000000..9caeb14 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/CaptureOutputLog.sql @@ -0,0 +1,6 @@ +CREATE TABLE [tSQLt].[CaptureOutputLog] ( + [Id] INT IDENTITY (1, 1) NOT NULL, + [OutputText] NVARCHAR (MAX) NULL, + PRIMARY KEY CLUSTERED ([Id] ASC) +); + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_AssertEqualsTableSchema_Actual.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_AssertEqualsTableSchema_Actual.sql new file mode 100644 index 0000000..2649906 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_AssertEqualsTableSchema_Actual.sql @@ -0,0 +1,13 @@ +CREATE TABLE [tSQLt].[Private_AssertEqualsTableSchema_Actual] ( + [name] NVARCHAR (256) NULL, + [RANK(column_id)] INT NULL, + [system_type_id] NVARCHAR (MAX) NULL, + [user_type_id] NVARCHAR (MAX) NULL, + [max_length] SMALLINT NULL, + [precision] TINYINT NULL, + [scale] TINYINT NULL, + [collation_name] NVARCHAR (256) NULL, + [is_nullable] BIT NULL, + [is_identity] BIT NULL +); + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_AssertEqualsTableSchema_Expected.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_AssertEqualsTableSchema_Expected.sql new file mode 100644 index 0000000..10bbc63 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_AssertEqualsTableSchema_Expected.sql @@ -0,0 +1,13 @@ +CREATE TABLE [tSQLt].[Private_AssertEqualsTableSchema_Expected] ( + [name] NVARCHAR (256) NULL, + [RANK(column_id)] INT NULL, + [system_type_id] NVARCHAR (MAX) NULL, + [user_type_id] NVARCHAR (MAX) NULL, + [max_length] SMALLINT NULL, + [precision] TINYINT NULL, + [scale] TINYINT NULL, + [collation_name] NVARCHAR (256) NULL, + [is_nullable] BIT NULL, + [is_identity] BIT NULL +); + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_Configurations.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_Configurations.sql new file mode 100644 index 0000000..e00fe10 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_Configurations.sql @@ -0,0 +1,6 @@ +CREATE TABLE [tSQLt].[Private_Configurations] ( + [Name] NVARCHAR (100) NOT NULL, + [Value] SQL_VARIANT NULL, + PRIMARY KEY CLUSTERED ([Name] ASC) +); + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_ExpectException.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_ExpectException.sql new file mode 100644 index 0000000..a40b5bb --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_ExpectException.sql @@ -0,0 +1,4 @@ +CREATE TABLE [tSQLt].[Private_ExpectException] ( + [i] INT NULL +); + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_NewTestClassList.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_NewTestClassList.sql new file mode 100644 index 0000000..953687b --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_NewTestClassList.sql @@ -0,0 +1,5 @@ +CREATE TABLE [tSQLt].[Private_NewTestClassList] ( + [ClassName] NVARCHAR (450) NOT NULL, + PRIMARY KEY CLUSTERED ([ClassName] ASC) +); + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_NullCellTable.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_NullCellTable.sql new file mode 100644 index 0000000..78092c2 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_NullCellTable.sql @@ -0,0 +1,12 @@ +CREATE TABLE [tSQLt].[Private_NullCellTable] ( + [I] INT NULL +); + + +GO + +CREATE TRIGGER tSQLt.Private_NullCellTable_StopDeletes ON tSQLt.Private_NullCellTable INSTEAD OF DELETE, INSERT, UPDATE +AS +BEGIN + RETURN; +END; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_RenamedObjectLog.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_RenamedObjectLog.sql new file mode 100644 index 0000000..0fc5cd4 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Private_RenamedObjectLog.sql @@ -0,0 +1,7 @@ +CREATE TABLE [tSQLt].[Private_RenamedObjectLog] ( + [Id] INT IDENTITY (1, 1) NOT NULL, + [ObjectId] INT NOT NULL, + [OriginalName] NVARCHAR (MAX) NOT NULL, + CONSTRAINT [PK__Private_RenamedObjectLog__Id] PRIMARY KEY CLUSTERED ([Id] ASC) +); + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Run_LastExecution.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Run_LastExecution.sql new file mode 100644 index 0000000..f958991 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/Run_LastExecution.sql @@ -0,0 +1,6 @@ +CREATE TABLE [tSQLt].[Run_LastExecution] ( + [TestName] NVARCHAR (MAX) NULL, + [SessionId] INT NULL, + [LoginTime] DATETIME NULL +); + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/TestMessage.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/TestMessage.sql new file mode 100644 index 0000000..f4ee2dd --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/TestMessage.sql @@ -0,0 +1,4 @@ +CREATE TABLE [tSQLt].[TestMessage] ( + [Msg] NVARCHAR (MAX) NULL +); + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/TestResult.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/TestResult.sql new file mode 100644 index 0000000..492dc86 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Tables/TestResult.sql @@ -0,0 +1,13 @@ +CREATE TABLE [tSQLt].[TestResult] ( + [Id] INT IDENTITY (1, 1) NOT NULL, + [Class] NVARCHAR (MAX) NOT NULL, + [TestCase] NVARCHAR (MAX) NOT NULL, + [Name] AS ((quotename([Class])+'.')+quotename([TestCase])), + [TranName] NVARCHAR (MAX) NOT NULL, + [Result] NVARCHAR (MAX) NULL, + [Msg] NVARCHAR (MAX) NULL, + [TestStartTime] DATETIME CONSTRAINT [DF:TestResult(TestStartTime)] DEFAULT (getdate()) NOT NULL, + [TestEndTime] DATETIME NULL, + PRIMARY KEY CLUSTERED ([Id] ASC) +); + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/User Defined Types/AssertStringTable.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/User Defined Types/AssertStringTable.sql new file mode 100644 index 0000000..e5960bb --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/User Defined Types/AssertStringTable.sql @@ -0,0 +1,3 @@ +CREATE TYPE [tSQLt].[AssertStringTable] AS TABLE ( + [value] NVARCHAR (MAX) NULL); + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/User Defined Types/Private.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/User Defined Types/Private.sql new file mode 100644 index 0000000..33f4a84 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/User Defined Types/Private.sql @@ -0,0 +1,3 @@ +CREATE TYPE [tSQLt].[Private] + EXTERNAL NAME [tSQLtCLR].[tSQLtCLR.tSQLtPrivate]; + diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Views/Private_SysIndexes.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Views/Private_SysIndexes.sql new file mode 100644 index 0000000..824a893 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Views/Private_SysIndexes.sql @@ -0,0 +1 @@ +CREATE VIEW tSQLt.Private_SysIndexes AS SELECT * FROM sys.indexes; \ No newline at end of file diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Views/Private_SysTypes.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Views/Private_SysTypes.sql new file mode 100644 index 0000000..17aeecc --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Views/Private_SysTypes.sql @@ -0,0 +1 @@ +CREATE VIEW tSQLt.Private_SysTypes AS SELECT * FROM sys.types AS T; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Views/TestClasses.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Views/TestClasses.sql new file mode 100644 index 0000000..2e8ed86 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Views/TestClasses.sql @@ -0,0 +1,9 @@ + +---------------------------------------------------------------------- +CREATE VIEW tSQLt.TestClasses +AS + SELECT s.name AS Name, s.schema_id AS SchemaId + FROM sys.extended_properties ep + JOIN sys.schemas s + ON ep.major_id = s.schema_id + WHERE ep.name = N'tSQLt.TestClass'; diff --git a/src/SQLCover/test/DatabaseWithTests/tSQLt/Views/Tests.sql b/src/SQLCover/test/DatabaseWithTests/tSQLt/Views/Tests.sql new file mode 100644 index 0000000..0d75ba8 --- /dev/null +++ b/src/SQLCover/test/DatabaseWithTests/tSQLt/Views/Tests.sql @@ -0,0 +1,8 @@ + +CREATE VIEW tSQLt.Tests +AS + SELECT classes.SchemaId, classes.Name AS TestClassName, + procs.object_id AS ObjectId, procs.name AS Name + FROM tSQLt.TestClasses classes + JOIN sys.procedures procs ON classes.SchemaId = procs.schema_id + WHERE LOWER(procs.name) LIKE 'test%';