Skip to content

Commit 440a8fa

Browse files
committed
Removed extra quotes from AntTarget default value (all); updated tSQLt.Private_MarktSQLtTempObject.ssp.sql to allow only BIT type for IsTempObject value; Finished UndoTestDoubles code and test.
1 parent 0c7c875 commit 440a8fa

File tree

5 files changed

+246
-29
lines changed

5 files changed

+246
-29
lines changed

Build/LocalBuild.bat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ ECHO SQLInstanceName: "%SQLInstanceName%"
1616
SET DBName=%~5
1717
ECHO DBName: "%DBName%"
1818
SET DBLogin=-E
19-
SET AntTarget="all"
19+
SET AntTarget=all
2020
IF NOT "%~6"=="-v" IF NOT "%~6"=="" SET DBLogin=%~6
2121
IF NOT "%~7"=="-v" IF NOT "%~7"=="" SET SQLPackagePath=%~7
2222
IF NOT "%~8"=="-v" IF NOT "%~8"=="" SET AntTarget=%~8

Source/tSQLt.Private_MarktSQLtTempObject.ssp.sql

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ BEGIN
1010
DECLARE @UnquotedSchemaName NVARCHAR(MAX);
1111
DECLARE @UnquotedObjectName NVARCHAR(MAX);
1212
DECLARE @UnquotedParentName NVARCHAR(MAX);
13+
DECLARE @TempObjectFlagOn BIT = 1;
1314
SELECT
1415
@UnquotedSchemaName = SCHEMA_NAME(O.schema_id),
1516
@UnquotedObjectName = O.name,
@@ -21,7 +22,7 @@ BEGIN
2122
BEGIN
2223
EXEC sys.sp_addextendedproperty
2324
@name = N'tSQLt.IsTempObject',
24-
@value = 1,
25+
@value = @TempObjectFlagOn,
2526
@level0type = N'SCHEMA', @level0name = @UnquotedSchemaName,
2627
@level1type = @ObjectType, @level1name = @UnquotedObjectName;
2728

@@ -35,7 +36,7 @@ BEGIN
3536
BEGIN
3637
EXEC sys.sp_addextendedproperty
3738
@name = N'tSQLt.IsTempObject',
38-
@value = 1,
39+
@value = @TempObjectFlagOn,
3940
@level0type = N'SCHEMA', @level0name = @UnquotedSchemaName,
4041
@level1type = N'TABLE', @level1name = @UnquotedParentName,
4142
@level2type = @ObjectType, @level2name = @UnquotedObjectName;

Source/tSQLt.UndoTestDoubles.ssp.sql

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,41 @@ GO
33
---Build+
44
GO
55
CREATE PROCEDURE tSQLt.UndoTestDoubles
6+
@Force BIT = 0
67
AS
78
BEGIN
89
DECLARE @cmd NVARCHAR(MAX);
910

10-
SELECT @cmd = 'RAISERROR(''Cannot drop '+Collisions.List+' as it is not marked as temporary. Use @Force = 1 to override.'',16,10)'
11+
IF (@Force = 1)
12+
BEGIN
13+
SET @cmd = 'EXEC tSQLt.Private_Print @Message = ''WARNING: @Force has been set to 1. Dropping the following objects that are not marked as temporary. (%s)'';';
14+
END;
15+
ELSE
16+
BEGIN
17+
SET @cmd = 'RAISERROR(''Cannot drop these objects as they are not marked as temporary. Use @Force = 1 to override. (%s)'',16,10)';
18+
END;
19+
20+
SELECT @cmd = REPLACE(@cmd,'%s',Collisions.List)
1121
FROM
1222
(
1323
SELECT
14-
QUOTENAME(OBJECT_SCHEMA_NAME(TestDouble.object_id))+'.'+QUOTENAME(TestDouble.name)
15-
FROM tSQLt.Private_RenamedObjectLog AS ROL
16-
JOIN sys.objects AS TestDouble
17-
ON TestDouble.object_id = OBJECT_ID(QUOTENAME(OBJECT_SCHEMA_NAME(ROL.ObjectId))+'.'+QUOTENAME(PARSENAME(ROL.OriginalName,1)))
18-
LEFT JOIN sys.extended_properties AS EP
19-
ON EP.class_desc = 'OBJECT_OR_COLUMN'
20-
AND EP.major_id = TestDouble.object_id
21-
AND EP.name = 'tSQLt.IsTempObject'
22-
AND EP.value = 1
23-
WHERE EP.value IS NULL
24+
STUFF (
25+
(
26+
SELECT
27+
', ' + QUOTENAME(OBJECT_SCHEMA_NAME(TestDouble.object_id))+'.'+QUOTENAME(TestDouble.name)
28+
FROM tSQLt.Private_RenamedObjectLog AS ROL
29+
JOIN sys.objects AS TestDouble
30+
ON TestDouble.object_id = OBJECT_ID(QUOTENAME(OBJECT_SCHEMA_NAME(ROL.ObjectId))+'.'+QUOTENAME(PARSENAME(ROL.OriginalName,1)))
31+
LEFT JOIN sys.extended_properties AS EP
32+
ON EP.class_desc = 'OBJECT_OR_COLUMN'
33+
AND EP.major_id = TestDouble.object_id
34+
AND EP.name = 'tSQLt.IsTempObject'
35+
AND EP.value = 1
36+
WHERE EP.value IS NULL
37+
ORDER BY 1
38+
FOR XML PATH (''), TYPE
39+
).value('.','NVARCHAR(MAX)'),
40+
1,2,'')
2441
) Collisions(List)
2542
EXEC(@cmd);
2643

@@ -83,8 +100,31 @@ BEGIN
83100
FOR XML PATH(''),TYPE
84101
).value('.','NVARCHAR(MAX)')
85102
EXEC(@cmd);
103+
104+
WITH L AS
105+
(
106+
SELECT
107+
TempO.Name,
108+
SCHEMA_NAME(TempO.schema_id) SchemaName,
109+
TempO.type ObjectType
110+
FROM sys.objects TempO
111+
JOIN sys.extended_properties AS EP
112+
ON EP.class_desc = 'OBJECT_OR_COLUMN'
113+
AND EP.major_id = TempO.object_id
114+
AND EP.name = 'tSQLt.IsTempObject'
115+
AND EP.value = 1
116+
)
117+
SELECT @cmd =
118+
(
119+
SELECT
120+
DC.cmd+';'
121+
FROM L
122+
CROSS APPLY tSQLt.Private_GetDropItemCmd(QUOTENAME(L.SchemaName)+'.'+QUOTENAME(L.Name),L.ObjectType) DC
123+
FOR XML PATH(''),TYPE
124+
).value('.','NVARCHAR(MAX)')
125+
EXEC(@cmd);
126+
86127
COMMIT;
87128
END;
88129
GO
89130

90-

Tests/Private_MarktSQLtTempObjectTests.class.sql

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,28 @@ BEGIN
8888

8989
EXEC Private_MarktSQLtTempObjectTests.[assert creates two extended properties on object]
9090
@ObjectName = 'Private_MarktSQLtTempObjectTests.TempTrigger',
91-
@ObjectType = N'TRIGGERX';
91+
@ObjectType = N'TRIGGER';
9292
END;
9393
GO
94+
CREATE PROCEDURE Private_MarktSQLtTempObjectTests.[test tSQLt.IsTempObject Data Type is BIT]
95+
AS
96+
BEGIN
97+
CREATE TABLE Private_MarktSQLtTempObjectTests.TempTable1(i INT NOT NULL);
98+
EXEC Private_MarktSQLtTempObjectTests.[assert creates two extended properties on object]
99+
@ObjectName = 'Private_MarktSQLtTempObjectTests.TempTable1',
100+
@ObjectType = N'TABLE';
101+
102+
SELECT UPPER(CAST(SQL_VARIANT_PROPERTY(EP.value,'BaseType') AS NVARCHAR(MAX))) IsTempObject_DataType
103+
INTO #Actual
104+
FROM sys.extended_properties AS EP
105+
WHERE EP.class_desc = 'OBJECT_OR_COLUMN'
106+
AND EP.major_id = OBJECT_ID('Private_MarktSQLtTempObjectTests.TempTable1')
107+
AND EP.name = 'tSQLt.IsTempObject';
108+
109+
SELECT TOP(0) A.* INTO #Expected FROM #Actual A RIGHT JOIN #Actual X ON 1=0;
110+
INSERT INTO #Expected VALUES('BIT');
111+
112+
EXEC tSQLt.AssertEqualsTable '#Expected','#Actual';
113+
114+
END;
115+
GO

Tests/UndoTestDoublesTests.class.sql

Lines changed: 167 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -387,39 +387,193 @@ BEGIN
387387
EXEC tSQLt.AssertEmptyTable @TableName = '#ShouldBeEmpty';
388388
END;
389389
GO
390-
CREATE PROCEDURE UndoTestDoublesTests.[test if FakeFunctionWithSnapshot exists we need to write tests]
390+
CREATE PROCEDURE UndoTestDoublesTests.[test drops only objects that are marked as temporary (IsTempObject = 1)]
391391
AS
392392
BEGIN
393-
IF EXISTS (SELECT * FROM sys.objects WHERE UPPER(name) LIKE 'FAKEFUNCTION_%')
394-
BEGIN
395-
EXEC tSQLt.Fail 'More tests to be written!'
396-
-- Also remove tSQLt_TempObject_s
397-
END;
393+
CREATE TABLE UndoTestDoublesTests.SimpleTable1 (i INT);
394+
395+
EXEC tSQLt.RemoveObject @ObjectName = 'UndoTestDoublesTests.SimpleTable1';
396+
CREATE TABLE UndoTestDoublesTests.SimpleTable1 (i INT);
397+
398+
EXEC tSQLt.ExpectException @ExpectedMessage = 'Cannot drop these objects as they are not marked as temporary. Use @Force = 1 to override. ([UndoTestDoublesTests].[SimpleTable1])', @ExpectedSeverity = 16, @ExpectedState = 10;
399+
400+
EXEC tSQLt.UndoTestDoubles;
398401
END;
399402
GO
400-
CREATE PROCEDURE UndoTestDoublesTests.[test drops only objects that are marked as temporary (IsTempObject = 1)]
403+
CREATE PROCEDURE UndoTestDoublesTests.[test does not drop multiple unmarked objects (IsTempObject is not set or is not 1)]
401404
AS
402405
BEGIN
403406
CREATE TABLE UndoTestDoublesTests.SimpleTable1 (i INT);
407+
CREATE TABLE UndoTestDoublesTests.SimpleTable2 (i INT);
408+
CREATE TABLE UndoTestDoublesTests.SimpleTable3 (i INT);
404409

405410
EXEC tSQLt.RemoveObject @ObjectName = 'UndoTestDoublesTests.SimpleTable1';
411+
EXEC tSQLt.RemoveObject @ObjectName = 'UndoTestDoublesTests.SimpleTable2';
412+
EXEC tSQLt.RemoveObject @ObjectName = 'UndoTestDoublesTests.SimpleTable3';
413+
406414
CREATE TABLE UndoTestDoublesTests.SimpleTable1 (i INT);
415+
CREATE TABLE UndoTestDoublesTests.SimpleTable2 (i INT);
416+
CREATE TABLE UndoTestDoublesTests.SimpleTable3 (i INT);
407417

408-
EXEC tSQLt.ExpectException @ExpectedMessage = 'Cannot drop [UndoTestDoublesTests].[SimpleTable1] as it is not marked as temporary. Use @Force = 1 to override.', @ExpectedSeverity = 16, @ExpectedState = 10;
418+
EXEC tSQLt.ExpectException @ExpectedMessage = 'Cannot drop these objects as they are not marked as temporary. Use @Force = 1 to override. ([UndoTestDoublesTests].[SimpleTable1], [UndoTestDoublesTests].[SimpleTable2], [UndoTestDoublesTests].[SimpleTable3])', @ExpectedSeverity = 16, @ExpectedState = 10;
409419

410420
EXEC tSQLt.UndoTestDoubles;
421+
END;
422+
GO
423+
CREATE PROCEDURE UndoTestDoublesTests.[test does not drop marked object where IsTempObject is not 1]
424+
AS
425+
BEGIN
426+
CREATE TABLE UndoTestDoublesTests.SimpleTable1 (i INT);
411427

428+
EXEC tSQLt.RemoveObject @ObjectName = 'UndoTestDoublesTests.SimpleTable1';
429+
CREATE TABLE UndoTestDoublesTests.SimpleTable1 (i INT);
430+
EXEC sys.sp_addextendedproperty
431+
@name = N'tSQLt.IsTempObject',
432+
@value = 42,
433+
@level0type = N'SCHEMA', @level0name = 'UndoTestDoublesTests',
434+
@level1type = N'TABLE', @level1name = 'SimpleTable1';
435+
436+
EXEC tSQLt.ExpectException @ExpectedMessage = 'Cannot drop these objects as they are not marked as temporary. Use @Force = 1 to override. ([UndoTestDoublesTests].[SimpleTable1])', @ExpectedSeverity = 16, @ExpectedState = 10;
437+
438+
EXEC tSQLt.UndoTestDoubles;
412439
END;
413440
GO
414-
CREATE PROCEDURE UndoTestDoublesTests.[test can handle multiple unmarked objects (IsTempObject is not set or is not 1)]
441+
CREATE PROCEDURE UndoTestDoublesTests.[test objects renamed by RemoveObject are restored and conflicting objects without IsTempObject property are deleted if @Force=1]
415442
AS
416443
BEGIN
417-
EXEC tSQLt.Fail 'write me.';
444+
EXEC ('CREATE TABLE UndoTestDoublesTests.aSimpleTable(i INT);');
445+
446+
SELECT O.object_id,SCHEMA_NAME(O.schema_id) schema_name, O.name object_name, O.type_desc
447+
INTO #OriginalObjectIds
448+
FROM sys.objects O;
449+
450+
EXEC tSQLt.RemoveObject @ObjectName='UndoTestDoublesTests.aSimpleTable';
451+
EXEC ('CREATE PROCEDURE UndoTestDoublesTests.aSimpleTable AS PRINT ''Who came up with that name?'';');
452+
453+
EXEC tSQLt.UndoTestDoubles @Force=1;
454+
455+
SELECT O.object_id,SCHEMA_NAME(O.schema_id) schema_name, O.name object_name, O.type_desc
456+
INTO #RestoredObjectIds
457+
FROM sys.objects O;
458+
459+
SELECT * INTO #ShouldBeEmpty
460+
FROM
461+
(
462+
SELECT 'Expected' T,* FROM (SELECT * FROM #OriginalObjectIds EXCEPT SELECT * FROM #RestoredObjectIds) E
463+
UNION ALL
464+
SELECT 'Actual' T,* FROM (SELECT * FROM #RestoredObjectIds EXCEPT SELECT * FROM #OriginalObjectIds) A
465+
) T;
466+
EXEC tSQLt.AssertEmptyTable @TableName = '#ShouldBeEmpty';
418467
END;
419468
GO
420-
CREATE PROCEDURE UndoTestDoublesTests.[test can handle marked object where IsTempObject is not 1]
469+
CREATE PROCEDURE UndoTestDoublesTests.[test warning message is printed for objects without IsTempObject property that are deleted if @Force=1]
421470
AS
422471
BEGIN
423-
EXEC tSQLt.Fail 'write me.';
472+
EXEC ('CREATE TABLE UndoTestDoublesTests.aSimpleTable(i INT);');
473+
474+
EXEC tSQLt.RemoveObject @ObjectName='UndoTestDoublesTests.aSimpleTable';
475+
EXEC ('CREATE PROCEDURE UndoTestDoublesTests.aSimpleTable AS PRINT ''Who came up with that name?'';');
476+
EXEC tSQLt.SpyProcedure @ProcedureName = 'tSQLt.Private_Print';
477+
478+
EXEC tSQLt.UndoTestDoubles @Force=1;
479+
480+
SELECT Message INTO #Actual FROM tSQLt.Private_Print_SpyProcedureLog;
481+
482+
SELECT TOP(0) A.* INTO #Expected FROM #Actual A RIGHT JOIN #Actual X ON 1=0;
483+
INSERT INTO #Expected
484+
VALUES('WARNING: @Force has been set to 1. Dropping the following objects that are not marked as temporary. ([UndoTestDoublesTests].[aSimpleTable])');
485+
486+
EXEC tSQLt.AssertEqualsTable '#Expected','#Actual';
487+
424488
END;
425-
GO
489+
GO
490+
CREATE PROCEDURE UndoTestDoublesTests.[test objects that are replaced multiple times by objects not marked as IsTempObject are restored if @Force=1]
491+
AS
492+
BEGIN
493+
EXEC ('CREATE TABLE UndoTestDoublesTests.aSimpleTable(i INT);');
494+
495+
SELECT O.object_id,SCHEMA_NAME(O.schema_id) schema_name, O.name object_name, O.type_desc
496+
INTO #OriginalObjectIds
497+
FROM sys.objects O;
498+
499+
EXEC tSQLt.RemoveObject @ObjectName='UndoTestDoublesTests.aSimpleTable';
500+
EXEC ('CREATE PROCEDURE UndoTestDoublesTests.aSimpleTable AS PRINT ''Replacement 1'';');
501+
EXEC tSQLt.RemoveObject @ObjectName='UndoTestDoublesTests.aSimpleTable';
502+
EXEC ('CREATE PROCEDURE UndoTestDoublesTests.aSimpleTable AS PRINT ''Replacement 2'';');
503+
EXEC tSQLt.RemoveObject @ObjectName='UndoTestDoublesTests.aSimpleTable';
504+
EXEC ('CREATE PROCEDURE UndoTestDoublesTests.aSimpleTable AS PRINT ''Replacement 3'';');
505+
506+
EXEC tSQLt.UndoTestDoubles @Force=1;
507+
508+
SELECT O.object_id,SCHEMA_NAME(O.schema_id) schema_name, O.name object_name, O.type_desc
509+
INTO #RestoredObjectIds
510+
FROM sys.objects O;
511+
512+
SELECT * INTO #ShouldBeEmpty
513+
FROM
514+
(
515+
SELECT 'Expected' T,* FROM (SELECT * FROM #OriginalObjectIds EXCEPT SELECT * FROM #RestoredObjectIds) E
516+
UNION ALL
517+
SELECT 'Actual' T,* FROM (SELECT * FROM #RestoredObjectIds EXCEPT SELECT * FROM #OriginalObjectIds) A
518+
) T;
519+
EXEC tSQLt.AssertEmptyTable @TableName = '#ShouldBeEmpty';
520+
END;
521+
GO
522+
CREATE PROCEDURE UndoTestDoublesTests.[test drops a marked object even if it is not conflicting with an original object]
523+
AS
524+
BEGIN
525+
SELECT O.object_id,SCHEMA_NAME(O.schema_id) schema_name, O.name object_name, O.type_desc
526+
INTO #OriginalObjectIds
527+
FROM sys.objects O;
528+
529+
CREATE TABLE UndoTestDoublesTests.SimpleTable1 (i INT);
530+
531+
EXEC tSQLt.Private_MarktSQLtTempObject @ObjectName = 'UndoTestDoublesTests.SimpleTable1', @ObjectType = 'TABLE', @NewNameOfOriginalObject = NULL;
532+
533+
EXEC tSQLt.UndoTestDoubles;
534+
535+
SELECT O.object_id,SCHEMA_NAME(O.schema_id) schema_name, O.name object_name, O.type_desc
536+
INTO #RestoredObjectIds
537+
FROM sys.objects O;
538+
539+
SELECT * INTO #ShouldBeEmpty
540+
FROM
541+
(
542+
SELECT 'Expected' T,* FROM (SELECT * FROM #OriginalObjectIds EXCEPT SELECT * FROM #RestoredObjectIds) E
543+
UNION ALL
544+
SELECT 'Actual' T,* FROM (SELECT * FROM #RestoredObjectIds EXCEPT SELECT * FROM #OriginalObjectIds) A
545+
) T;
546+
EXEC tSQLt.AssertEmptyTable @TableName = '#ShouldBeEmpty';
547+
END;
548+
GO
549+
CREATE PROCEDURE UndoTestDoublesTests.[test drops multiple marked objects even if they do not conflict with an original object]
550+
AS
551+
BEGIN
552+
SELECT O.object_id,SCHEMA_NAME(O.schema_id) schema_name, O.name object_name, O.type_desc
553+
INTO #OriginalObjectIds
554+
FROM sys.objects O;
555+
556+
CREATE TABLE UndoTestDoublesTests.SimpleTable1 (i INT);
557+
CREATE TABLE UndoTestDoublesTests.SimpleTable2 (i INT);
558+
CREATE TABLE UndoTestDoublesTests.SimpleTable3 (i INT);
559+
560+
EXEC tSQLt.Private_MarktSQLtTempObject @ObjectName = 'UndoTestDoublesTests.SimpleTable1', @ObjectType = 'TABLE', @NewNameOfOriginalObject = NULL;
561+
EXEC tSQLt.Private_MarktSQLtTempObject @ObjectName = 'UndoTestDoublesTests.SimpleTable2', @ObjectType = 'TABLE', @NewNameOfOriginalObject = NULL;
562+
EXEC tSQLt.Private_MarktSQLtTempObject @ObjectName = 'UndoTestDoublesTests.SimpleTable3', @ObjectType = 'TABLE', @NewNameOfOriginalObject = NULL;
563+
564+
EXEC tSQLt.UndoTestDoubles;
565+
566+
SELECT O.object_id,SCHEMA_NAME(O.schema_id) schema_name, O.name object_name, O.type_desc
567+
INTO #RestoredObjectIds
568+
FROM sys.objects O;
569+
570+
SELECT * INTO #ShouldBeEmpty
571+
FROM
572+
(
573+
SELECT 'Expected' T,* FROM (SELECT * FROM #OriginalObjectIds EXCEPT SELECT * FROM #RestoredObjectIds) E
574+
UNION ALL
575+
SELECT 'Actual' T,* FROM (SELECT * FROM #RestoredObjectIds EXCEPT SELECT * FROM #OriginalObjectIds) A
576+
) T;
577+
EXEC tSQLt.AssertEmptyTable @TableName = '#ShouldBeEmpty';
578+
END;
579+
GO

0 commit comments

Comments
 (0)