diff --git a/Source/BuildOrder.txt b/Source/BuildOrder.txt index fb97a1066..71483abdb 100644 --- a/Source/BuildOrder.txt +++ b/Source/BuildOrder.txt @@ -1,5 +1,6 @@ tSQLt._Header.sql tSQLt.DropClass.ssp.sql +tSQLt.DropAllClasses.ssp.sql tSQLt.Private_Bin2Hex.sfn.sql tSQLt.Private_NewTestClassList.tbl.sql tSQLt.Private_ResetNewTestClassList.ssp.sql diff --git a/Source/Source.ssmssqlproj b/Source/Source.ssmssqlproj index ed043c2a4..2319a8fc3 100644 --- a/Source/Source.ssmssqlproj +++ b/Source/Source.ssmssqlproj @@ -139,6 +139,12 @@ tSQLt.CaptureOutputLog.tbl.sql + + + + + tSQLt.DropAllClasses.ssp.sql + 8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True Dev_tSQLt diff --git a/Source/tSQLt.DropAllClasses.ssp.sql b/Source/tSQLt.DropAllClasses.ssp.sql new file mode 100644 index 000000000..791dd2f9c --- /dev/null +++ b/Source/tSQLt.DropAllClasses.ssp.sql @@ -0,0 +1,26 @@ +IF OBJECT_ID('tSQLt.DropAllClasses') IS NOT NULL DROP PROCEDURE tSQLt.DropAllClasses; +GO +---Build+ +CREATE PROCEDURE tSQLt.DropAllClasses +AS +BEGIN + DECLARE TestClass CURSOR LOCAL FAST_FORWARD + FOR + SELECT Name FROM tSQLt.TestClasses; + + DECLARE @schema sysname; + OPEN TestClass; + + WHILE 1 = 1 + BEGIN + FETCH NEXT FROM TestClass INTO @schema; + IF @@FETCH_STATUS <> 0 + BREAK; + EXEC tSQLt.DropClass @ClassName = @schema; + END; + + CLOSE TestClass; + DEALLOCATE TestClass; +END; +---Build- +GO diff --git a/Source/tSQLt.class.sql b/Source/tSQLt.class.sql index f20b85632..30ccb2b49 100644 --- a/Source/tSQLt.class.sql +++ b/Source/tSQLt.class.sql @@ -541,6 +541,8 @@ GO CREATE PROCEDURE tSQLt.Uninstall AS BEGIN + EXEC tSQLt.DropAllClasses; + DROP TYPE tSQLt.Private; EXEC tSQLt.DropClass 'tSQLt'; diff --git a/Tests/DropAllClassesTests.class.sql b/Tests/DropAllClassesTests.class.sql new file mode 100644 index 000000000..1f8ee67ee --- /dev/null +++ b/Tests/DropAllClassesTests.class.sql @@ -0,0 +1,50 @@ +EXEC tSQLt.NewTestClass 'DropAllClassesTests'; +GO + +CREATE PROC DropAllClassesTests.[test DropClass not called if no test classes exist] +AS +BEGIN + EXEC tSQLt.FakeTable 'tSQLt.TestClasses'; + EXEC tSQLt.SpyProcedure 'tSQLt.DropClass'; + + EXEC tSQLt.DropAllClasses; + + EXEC tSQLt.AssertEmptyTable 'tSQLt.DropClass_SpyProcedureLog'; +END; +GO +CREATE PROC DropAllClassesTests.[test that one test class results in one call to DropClass] +AS +BEGIN + EXEC tSQLt.FakeTable 'tSQLt.TestClasses'; + EXEC tSQLt.SpyProcedure 'tSQLt.DropClass'; + EXEC('INSERT INTO tSQLt.TestClasses (Name) + VALUES (''MyTestClass'');'); + + SELECT ClassName = Name INTO #expected FROM tSQLt.TestClasses; + + EXEC tSQLt.DropAllClasses; + + SELECT ClassName INTO #actual FROM tSQLt.DropClass_SpyProcedureLog; + + EXEC tSQLt.AssertEqualsTable '#expected', '#actual'; +END; +GO +CREATE PROC DropAllClassesTests.[test that multiple test classes are all sent to DropClass] +AS +BEGIN + EXEC tSQLt.FakeTable 'tSQLt.TestClasses'; + EXEC tSQLt.SpyProcedure 'tSQLt.DropClass'; + EXEC('INSERT INTO tSQLt.TestClasses (Name) + VALUES (''MyTestClass1''), + (''MyTestClass2''), + (''MyTestClass3'');'); + + SELECT ClassName = Name INTO #expected FROM tSQLt.TestClasses; + + EXEC tSQLt.DropAllClasses; + + SELECT ClassName INTO #actual FROM tSQLt.DropClass_SpyProcedureLog; + + EXEC tSQLt.AssertEqualsTable '#expected', '#actual'; +END; +GO diff --git a/Tests/Tests.ssmssqlproj b/Tests/Tests.ssmssqlproj index fbd9eac4f..f22bbfedf 100644 --- a/Tests/Tests.ssmssqlproj +++ b/Tests/Tests.ssmssqlproj @@ -91,6 +91,12 @@ BootStrapTest.sql + + + + + DropAllClassesTests.class.sql + 8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True Dev_tSQLt diff --git a/Tests/tSQLt_test.class.sql b/Tests/tSQLt_test.class.sql index f009c5fc5..21c76e16c 100644 --- a/Tests/tSQLt_test.class.sql +++ b/Tests/tSQLt_test.class.sql @@ -1606,6 +1606,28 @@ BEGIN END; GO +CREATE PROCEDURE tSQLt_test.[test Uninstall removes test classes] +AS +BEGIN + EXEC tSQLt.SpyProcedure 'tSQLt.DropAllClasses'; + DECLARE @call INT; + BEGIN TRAN; + DECLARE @TranName CHAR(32); EXEC tSQLt.GetNewTranName @TranName OUT; + SAVE TRAN @TranName; + + EXEC tSQLt.Uninstall; + SET @call = (SELECT 1 FROM tSQLt.DropAllClasses_SpyProcedureLog); + + ROLLBACK TRAN @TranName; + COMMIT TRAN; + + IF @id IS NULL + BEGIN + EXEC tSQLt.Fail 'DropAllClasses not called'; + END; +END; +GO + CREATE PROCEDURE tSQLt_test.[test Uninstall removes schema tSQLt] AS BEGIN @@ -1671,4 +1693,4 @@ END; GO --ROLLBACK ---tSQLt_test \ No newline at end of file +--tSQLt_test