From 780ce43c319fd436742724354dc988cfb1a4c706 Mon Sep 17 00:00:00 2001 From: Nick Reilingh Date: Sun, 27 Nov 2016 12:33:05 -0500 Subject: [PATCH 1/3] Added tSQLt.DropAllClasses ssp This procedure runs DropClass on all schemas that are marked with a tSQLt.TestClass extended property. This can be used to easily reset your development environment, especially for those of us who make heavy use of query shortcuts (like RunAll) in lieu of GUI tools. --- Source/BuildOrder.txt | 1 + Source/Source.ssmssqlproj | 6 ++++++ Source/tSQLt.DropAllClasses.ssp.sql | 31 +++++++++++++++++++++++++++++ Tests/DropAllClassesTests.class.sql | 31 +++++++++++++++++++++++++++++ Tests/Tests.ssmssqlproj | 6 ++++++ 5 files changed, 75 insertions(+) create mode 100644 Source/tSQLt.DropAllClasses.ssp.sql create mode 100644 Tests/DropAllClassesTests.class.sql 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..6635bea87 --- /dev/null +++ b/Source/tSQLt.DropAllClasses.ssp.sql @@ -0,0 +1,31 @@ +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 s.name + FROM sys.schemas s + JOIN sys.extended_properties b + ON s.schema_id = b.major_id + AND b.class = 3 + AND b.name = 'tSQLt.TestClass'; + + 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/Tests/DropAllClassesTests.class.sql b/Tests/DropAllClassesTests.class.sql new file mode 100644 index 000000000..42f2727d8 --- /dev/null +++ b/Tests/DropAllClassesTests.class.sql @@ -0,0 +1,31 @@ +EXEC tSQLt.NewTestClass 'DropAllClassesTests'; +GO +CREATE PROC DropAllClassesTests.[test that all test classes are dropped] +AS +BEGIN + EXEC tSQLt.NewTestClass 'MyTestClass1'; + EXEC tSQLt.NewTestClass 'MyTestClass2'; + + EXEC tSQLt.ExpectNoException; + + EXEC tSQLt.DropAllClasses; + + IF(SCHEMA_ID('MyTestClass1') IS NOT NULL) + EXEC tSQLt.Fail 'DropAllClasses did not drop MyTestClass1'; + IF(SCHEMA_ID('MyTestClass2') IS NOT NULL) + EXEC tSQLt.Fail 'DropAllClasses did not drop MyTestClass2'; +END; +GO +CREATE PROC DropAllClassesTests.[test that schemas that are not test classes are not dropped] +AS +BEGIN + EXEC('CREATE SCHEMA MyGenericSchema;'); + + EXEC tSQLt.ExpectNoException; + + EXEC tSQLt.DropAllClasses; + + IF(SCHEMA_ID('MyGenericSchema') IS NULL) + EXEC tSQLt.Fail 'DropAllClasses dropped MyGenericSchema'; +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 From 3cf758ea72f8912926b511a00e676941da2dbf39 Mon Sep 17 00:00:00 2001 From: Nick Reilingh Date: Sun, 27 Nov 2016 22:06:04 -0500 Subject: [PATCH 2/3] modified to use TestClasses view and rewrote tests for 0-1-some pattern --- Source/tSQLt.DropAllClasses.ssp.sql | 7 +--- Tests/DropAllClassesTests.class.sql | 55 ++++++++++++++++++++--------- 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/Source/tSQLt.DropAllClasses.ssp.sql b/Source/tSQLt.DropAllClasses.ssp.sql index 6635bea87..791dd2f9c 100644 --- a/Source/tSQLt.DropAllClasses.ssp.sql +++ b/Source/tSQLt.DropAllClasses.ssp.sql @@ -6,12 +6,7 @@ AS BEGIN DECLARE TestClass CURSOR LOCAL FAST_FORWARD FOR - SELECT s.name - FROM sys.schemas s - JOIN sys.extended_properties b - ON s.schema_id = b.major_id - AND b.class = 3 - AND b.name = 'tSQLt.TestClass'; + SELECT Name FROM tSQLt.TestClasses; DECLARE @schema sysname; OPEN TestClass; diff --git a/Tests/DropAllClassesTests.class.sql b/Tests/DropAllClassesTests.class.sql index 42f2727d8..2a899235f 100644 --- a/Tests/DropAllClassesTests.class.sql +++ b/Tests/DropAllClassesTests.class.sql @@ -1,31 +1,52 @@ EXEC tSQLt.NewTestClass 'DropAllClassesTests'; GO -CREATE PROC DropAllClassesTests.[test that all test classes are dropped] +CREATE PROC DropAllClassesTests.[SetUp] +AS +BEGIN + EXEC tSQLt.FakeTable 'tSQLt.TestClasses'; + EXEC tSQLt.SpyProcedure 'tSQLt.DropClass'; +END; +GO +CREATE PROC DropAllClassesTests.[test DropClass not called if no test classes exist] AS BEGIN - EXEC tSQLt.NewTestClass 'MyTestClass1'; - EXEC tSQLt.NewTestClass 'MyTestClass2'; - - EXEC tSQLt.ExpectNoException; - EXEC tSQLt.DropAllClasses; - IF(SCHEMA_ID('MyTestClass1') IS NOT NULL) - EXEC tSQLt.Fail 'DropAllClasses did not drop MyTestClass1'; - IF(SCHEMA_ID('MyTestClass2') IS NOT NULL) - EXEC tSQLt.Fail 'DropAllClasses did not drop MyTestClass2'; + EXEC tSQLt.AssertEmptyTable 'tSQLt.DropClass_SpyProcedureLog'; + END; GO -CREATE PROC DropAllClassesTests.[test that schemas that are not test classes are not dropped] +CREATE PROC DropAllClassesTests.[test that one test class results in one call to DropClass] AS BEGIN - EXEC('CREATE SCHEMA MyGenericSchema;'); + EXEC('INSERT INTO tSQLt.TestClasses (Name) + VALUES (''MyTestClass'');'); - EXEC tSQLt.ExpectNoException; - EXEC tSQLt.DropAllClasses; - - IF(SCHEMA_ID('MyGenericSchema') IS NULL) - EXEC tSQLt.Fail 'DropAllClasses dropped MyGenericSchema'; + + SELECT TOP 0 * INTO #expected FROM tSQLt.DropClass_SpyProcedureLog; + INSERT INTO #expected (ClassName) + VALUES ('MyTestClass'); + + EXEC tSQLt.AssertEqualsTable '#expected', 'tSQLt.DropClass_SpyProcedureLog'; +END; +GO +CREATE PROC DropAllClassesTests.[test that multiple test classes are all sent to DropClass] +AS +BEGIN + EXEC('INSERT INTO tSQLt.TestClasses (Name) + VALUES (''MyTestClass1''), + (''MyTestClass2''), + (''MyTestClass3'');'); + + EXEC tSQLt.DropAllClasses; + + SELECT TOP 0 * INTO #expected FROM tSQLt.DropClass_SpyProcedureLog; + INSERT INTO #expected (ClassName) + VALUES ('MyTestClass1'), + ('MyTestClass2'), + ('MyTestClass3'); + + EXEC tSQLt.AssertEqualsTable '#expected', 'tSQLt.DropClass_SpyProcedureLog'; END; GO From 77c99e9934e4f1f350ce585ca7dd4aeef344a43d Mon Sep 17 00:00:00 2001 From: Nick Reilingh Date: Mon, 28 Nov 2016 11:06:47 -0500 Subject: [PATCH 3/3] Improvements and minor refactoring to test class --- Tests/DropAllClassesTests.class.sql | 32 ++++++++++++++--------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/Tests/DropAllClassesTests.class.sql b/Tests/DropAllClassesTests.class.sql index 2a899235f..1f8ee67ee 100644 --- a/Tests/DropAllClassesTests.class.sql +++ b/Tests/DropAllClassesTests.class.sql @@ -1,52 +1,50 @@ EXEC tSQLt.NewTestClass 'DropAllClassesTests'; GO -CREATE PROC DropAllClassesTests.[SetUp] + +CREATE PROC DropAllClassesTests.[test DropClass not called if no test classes exist] AS BEGIN EXEC tSQLt.FakeTable 'tSQLt.TestClasses'; EXEC tSQLt.SpyProcedure 'tSQLt.DropClass'; -END; -GO -CREATE PROC DropAllClassesTests.[test DropClass not called if no test classes exist] -AS -BEGIN + 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 TOP 0 * INTO #expected FROM tSQLt.DropClass_SpyProcedureLog; - INSERT INTO #expected (ClassName) - VALUES ('MyTestClass'); + SELECT ClassName INTO #actual FROM tSQLt.DropClass_SpyProcedureLog; - EXEC tSQLt.AssertEqualsTable '#expected', '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 TOP 0 * INTO #expected FROM tSQLt.DropClass_SpyProcedureLog; - INSERT INTO #expected (ClassName) - VALUES ('MyTestClass1'), - ('MyTestClass2'), - ('MyTestClass3'); + SELECT ClassName INTO #actual FROM tSQLt.DropClass_SpyProcedureLog; - EXEC tSQLt.AssertEqualsTable '#expected', 'tSQLt.DropClass_SpyProcedureLog'; + EXEC tSQLt.AssertEqualsTable '#expected', '#actual'; END; GO