Skip to content

Commit 5924b6b

Browse files
authored
Merge pull request #115 from tSQLt-org/undoTestDoubles
Undo test doubles
2 parents ca47207 + 5fca51c commit 5924b6b

19 files changed

+1019
-137
lines changed

Build/CommonFunctionsAndMethods.ps1

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -201,16 +201,20 @@ Function Remove-ResourceGroup{
201201
Function Get-SnipContent {
202202
[CmdletBinding()]
203203
param (
204-
[Parameter(Mandatory=$true)][AllowEmptyString()][String[]] $searchArray,
204+
[Parameter(Mandatory=$true,ValueFromPipeline=$true)][AllowEmptyString()][string[]]$searchArray,
205205
[Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][String] $startSnipPattern,
206206
[Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][String] $endSnipPattern
207207
)
208-
$outputOn = $false;
209-
(
208+
begin {
209+
$outputOn = $false;
210+
};
211+
process {
210212
$searchArray | ForEach-Object {
211213
if($_ -eq $endSnipPattern) { $outputOn = $false };
212214
if($outputOn) { $_ };
213215
if($_ -eq $startSnipPattern) { $outputOn = $true };
214-
}
215-
);
216+
}
217+
};
218+
end {
219+
};
216220
}

Build/CreateDropClassStatement.ps1

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
$scriptPath = $MyInvocation.MyCommand.Path;
2+
$invocationDir = Split-Path $scriptPath;
3+
$buildPath = $invocationDir +'/';
4+
$tempPath = $invocationDir + '/temp/tSQLtBuild/';
5+
$outputPath = $invocationDir + '/output/tSQLtBuild/';
6+
$sourcePath = $invocationDir + '/../Source/';
7+
$testUtilPath = $invocationDir + '/../TestUtil/';
8+
9+
.($buildPath+"CommonFunctionsAndMethods.ps1");
10+
11+
Log-Output '<#--=======================================================================-->'
12+
Log-Output '<!--======== Start CreateDropClassStatement.ps1 =========-->'
13+
Log-Output '<#--=======================================================================-->'
14+
15+
$DropClassFileContent = Get-Content -path ($sourcePath+"tSQLt.DropClass.ssp.sql");
16+
$GetDropItemCmdFileContent = Get-Content -path ($sourcePath+"tSQLt.Private_GetDropItemCmd.sfn.sql");
17+
$OutputFilePath = $tempPath+"TempDropClass.sql";
18+
19+
$DropClassSnip = ($DropClassFileContent | Get-SnipContent -startSnipPattern "/*SnipStart: CreateDropClassStatement.ps1*/" -endSnipPattern "/*SnipEnd: CreateDropClassStatement.ps1*/");
20+
$DropItemSnip = ($GetDropItemCmdFileContent | Get-SnipContent -startSnipPattern "/*SnipStart: CreateDropClassStatement.ps1*/" -endSnipPattern "/*SnipEnd: CreateDropClassStatement.ps1*/");
21+
$DropItemParamSnip = ($GetDropItemCmdFileContent | Get-SnipContent -startSnipPattern "/*SnipParamStart: CreateDropClassStatement.ps1*/" -endSnipPattern "/*SnipParamEnd: CreateDropClassStatement.ps1*/");
22+
23+
$VariablesString = ($DropItemParamSnip.trim() -join ' ')
24+
25+
$VariableNames = (Select-String '@\S+' -input $VariablesString -AllMatches|ForEach-Object{$_.matches.Value});
26+
#$VariableNames
27+
28+
$DISP1 = ($DropItemSnip | ForEach-Object{
29+
$s=$_;
30+
for($i = 0;$i -lt $VariableNames.count;$i++){
31+
$s=$s -replace $VariableNames[$i], ("($"+($i+1)+")")
32+
};
33+
$s;
34+
});
35+
$DISP2 = $DISP1.trim() -join ' ';
36+
37+
$DropItemSnipPrepared = "("+ $DISP2 + ")";
38+
$RawDropClassStatement = $DropClassSnip -replace 'tSQLt.Private_GetDropItemCmd\s*\(\s*([^,]*)\s*,\s*([^)]*)\s*\)',$DropItemSnipPrepared;
39+
40+
$DropClassStatement = ($RawDropClassStatement.trim()|Where-Object {$_ -ne "" -and $_ -notmatch "^GO(\s.*)?"}) -join ' ';
41+
42+
Set-Content -Path $OutputFilePath -Value $DropClassStatement;
43+
44+
Log-Output '<#--=======================================================================-->'
45+
Log-Output '<!--======== End CreateDropClassStatement.ps1 =========-->'
46+
Log-Output '<#--=======================================================================-->'
47+
48+
49+
<# TODO
50+
--> Test this: Empty File TempDropClass.sql file should throw an error
51+
--> Test this: If the $tempPath does not exist, BuildHelper.exe seems to currently throw an error, but does that stop the build?
52+
--> Test this: If the $sourcePath does not exist, BuildHelper.exe seems to currently throw an error, but does that stop the build?
53+
#>

Build/tSQLt.build.xml

Lines changed: 3 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -214,50 +214,10 @@
214214
</target>
215215

216216
<target name="package.create.tSQLtDrop">
217-
218-
<echo message="Starting package.create.tSQLtDrop {===" />
219-
220-
<exec executable="cmd" dir="." failonerror="true">
221-
<arg value="/c"/>
222-
<arg value="BuildHelper.exe"/>
223-
<arg value="../Source/tSQLtDropBuildOrder.txt"/>
224-
<arg value="temp/tSQLtBuild/TempDropClass.sql"/>
225-
<arg value="---Build"/>
217+
<exec dir="." executable="powershell" failonerror="true">
218+
<arg line="-ExecutionPolicy bypass" />
219+
<arg line="-File CreateDropClassStatement.ps1" />
226220
</exec>
227-
228-
<antcall target="replace.in.file">
229-
<param name="replace.file" value="temp/tSQLtBuild/TempDropClass.sql" />
230-
<param name="replace.token" value="tSQLt." />
231-
<param name="replace.value" value="#" />
232-
</antcall>
233-
234-
<antcall target="replace.in.file">
235-
<param name="replace.file" value="temp/tSQLtBuild/TempDropClass.sql" />
236-
<param name="replace.token" value="OBJECT_ID('#" />
237-
<param name="replace.value" value="OBJECT_ID('tempdb..#" />
238-
</antcall>
239-
240-
<antcall target="replace.in.file">
241-
<param name="replace.file" value="temp/tSQLtBuild/TempDropClass.sql" />
242-
<param name="replace.token" value="---Build-" />
243-
<param name="replace.value" value="" />
244-
</antcall>
245-
246-
<antcall target="replace.in.file">
247-
<param name="replace.file" value="temp/tSQLtBuild/TempDropClass.sql" />
248-
<param name="replace.token" value="---Build+" />
249-
<param name="replace.value" value="" />
250-
</antcall>
251-
252-
<replaceregexp match="^(?:[\t ]*(?:\r?\n|\r))+" replace="" flags="gm" byline="false" file="temp/tSQLtBuild/TempDropClass.sql" />
253-
<replaceregexp match="^\s*GO\s*((\r?\n)\s*GO\s*)+$" replace="GO" flags="gm" byline="false" file="temp/tSQLtBuild/TempDropClass.sql" />
254-
<replaceregexp match="(\r?\n)" replace=" " flags="gm" byline="false" file="temp/tSQLtBuild/TempDropClass.sql" />
255-
<replaceregexp match="\s+" replace=" " flags="gm" byline="false" file="temp/tSQLtBuild/TempDropClass.sql" />
256-
<replaceregexp match="GO\s*$" replace="" flags="gm" byline="false" file="temp/tSQLtBuild/TempDropClass.sql" />
257-
<replaceregexp match="^.*?BEGIN" replace="---Build+${line.separator}DECLARE @ClassName NVARCHAR(MAX) ='tSQLt';BEGIN" flags="gm" byline="false" file="temp/tSQLtBuild/TempDropClass.sql" />
258-
259-
<echo message="Starting package.create.tSQLtDrop {===" />
260-
261221
</target>
262222

263223

Experiments/Experiments.ssmssqlproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@
6666
<AssociatedConnUserName />
6767
<FullPath>NameResolutionResearch.sql</FullPath>
6868
</FileNode>
69+
<FileNode Name="ParsingDisaster.sql">
70+
<AssociatedConnectionMoniker />
71+
<AssociatedConnSrvName />
72+
<AssociatedConnUserName />
73+
<FullPath>ParsingDisaster.sql</FullPath>
74+
</FileNode>
6975
<FileNode Name="RunExternalAccessKeyExistsTests.sql">
7076
<AssociatedConnectionMoniker />
7177
<AssociatedConnSrvName />

Experiments/ParsingDisaster.sql

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--execute, then comment out the line below and execute again
2+
SELECT 1 AS [A
3+
GO
4+
SELECT 0 AS [X]
5+
6+
--/* <-- execute, then delete '--' and execute again
7+
/*Comment*/
8+
SELECT 2
9+
,2.2
10+
--*/SELECT 3 /*
11+
--*/,3.2,'
12+
SELECT 4
13+
,4.2
14+
--' /*
15+
--*/SELECT 5 /*
16+
--*/,5.2 /*
17+
--*/
18+
SELECT 6

Source/BuildOrder.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ tSQLt._Header.sql
22
../Build/temp/tSQLtBuild/TempDropClass.sql
33
tSQLt.schema.sql
44
tSQLt.TestClass.user.sql
5+
tSQLt.Private_GetDropItemCmd.sfn.sql
56
tSQLt.DropClass.ssp.sql
67
tSQLt.Uninstall.ssp.sql
78
tSQLt.TestClasses.view.sql
@@ -34,6 +35,7 @@ tSQLtCLR_CreateProcs.sql
3435
tSQLt.Private_PrepareFakeFunctionOutputTable.ssp.sql
3536
tSQLt.TableToText.ssp.sql
3637
tSQLt.Private_RenamedObjectLog.tbl.sql
38+
tSQLt.Private_RenameObject.ssp.sql
3739
tSQLt.Private_MarkObjectBeforeRename.ssp.sql
3840
tSQLt.Private_RenameObjectToUniqueName.ssp.sql
3941
tSQLt.Private_RenameObjectToUniqueNameUsingObjectId.ssp.sql
@@ -106,4 +108,6 @@ tSQLt.(at)tSQLt_RunOnlyOnHostPlatform.sfn.sql
106108
tSQLt.RemoveExternalAccessKey.ssp.sql
107109
tSQLt.InstallExternalAccessKey.ssp.sql
108110
tSQLt.Private_InstallationInfo.sfn.sql
109-
tSQLt._Footer.sql
111+
tSQLt.UndoSingleTestDouble.ssp.sql
112+
tSQLt.UndoTestDoubles.ssp.sql
113+
tSQLt._Footer.sql

Source/Source.ssmssqlproj

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,12 @@
318318
<AssociatedConnUserName />
319319
<FullPath>tSQLt.Private_GetDefaultConstraintDefinition.sfn.sql</FullPath>
320320
</FileNode>
321+
<FileNode Name="tSQLt.Private_GetDropItemCmd.sfn.sql">
322+
<AssociatedConnectionMoniker />
323+
<AssociatedConnSrvName />
324+
<AssociatedConnUserName />
325+
<FullPath>tSQLt.Private_GetDropItemCmd.sfn.sql</FullPath>
326+
</FileNode>
321327
<FileNode Name="tSQLt.Private_GetForeignKeyDefinition.sfn.sql">
322328
<AssociatedConnectionMoniker />
323329
<AssociatedConnSrvName />
@@ -414,6 +420,12 @@
414420
<AssociatedConnUserName />
415421
<FullPath>tSQLt.Private_NullCellTable.tbl.sql</FullPath>
416422
</FileNode>
423+
<FileNode Name="tSQLt.Private_PrepareFakeFunctionOutputTable.ssp.sql">
424+
<AssociatedConnectionMoniker />
425+
<AssociatedConnSrvName />
426+
<AssociatedConnUserName />
427+
<FullPath>tSQLt.Private_PrepareFakeFunctionOutputTable.ssp.sql</FullPath>
428+
</FileNode>
417429
<FileNode Name="tSQLt.Private_ProcessTestAnnotations.ssp.sql">
418430
<AssociatedConnectionMoniker />
419431
<AssociatedConnSrvName />
@@ -438,6 +450,12 @@
438450
<AssociatedConnUserName />
439451
<FullPath>tSQLt.Private_RemoveSchemaBoundReferences.ssp.sql</FullPath>
440452
</FileNode>
453+
<FileNode Name="tSQLt.Private_RenameObject.ssp.sql">
454+
<AssociatedConnectionMoniker />
455+
<AssociatedConnSrvName />
456+
<AssociatedConnUserName />
457+
<FullPath>tSQLt.Private_RenameObject.ssp.sql</FullPath>
458+
</FileNode>
441459
<FileNode Name="tSQLt.Private_RenameObjectToUniqueName.ssp.sql">
442460
<AssociatedConnectionMoniker />
443461
<AssociatedConnSrvName />
@@ -636,6 +654,18 @@
636654
<AssociatedConnUserName />
637655
<FullPath>tSQLt.Tests.view.sql</FullPath>
638656
</FileNode>
657+
<FileNode Name="tSQLt.UndoSingleTestDouble.ssp.sql">
658+
<AssociatedConnectionMoniker />
659+
<AssociatedConnSrvName />
660+
<AssociatedConnUserName />
661+
<FullPath>tSQLt.UndoSingleTestDouble.ssp.sql</FullPath>
662+
</FileNode>
663+
<FileNode Name="tSQLt.UndoTestDoubles.ssp.sql">
664+
<AssociatedConnectionMoniker />
665+
<AssociatedConnSrvName />
666+
<AssociatedConnUserName />
667+
<FullPath>tSQLt.UndoTestDoubles.ssp.sql</FullPath>
668+
</FileNode>
639669
<FileNode Name="tSQLt.Uninstall.ssp.sql">
640670
<AssociatedConnectionMoniker />
641671
<AssociatedConnSrvName />

Source/tSQLt.DropClass.ssp.sql

Lines changed: 31 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,64 +5,60 @@ CREATE PROCEDURE tSQLt.DropClass
55
@ClassName NVARCHAR(MAX)
66
AS
77
BEGIN
8+
/*SnipStart: CreateDropClassStatement.ps1*/
89
DECLARE @Cmd NVARCHAR(MAX);
910

10-
WITH ObjectInfo(name, type) AS
11+
WITH ObjectInfo(FullName, ItemType) AS
1112
(
12-
SELECT QUOTENAME(SCHEMA_NAME(O.schema_id))+'.'+QUOTENAME(O.name) , O.type
13+
SELECT
14+
QUOTENAME(SCHEMA_NAME(O.schema_id))+'.'+QUOTENAME(O.name),
15+
O.type
1316
FROM sys.objects AS O
1417
WHERE O.schema_id = SCHEMA_ID(@ClassName)
1518
),
16-
TypeInfo(name) AS
19+
TypeInfo(FullName, ItemType) AS
1720
(
18-
SELECT QUOTENAME(SCHEMA_NAME(T.schema_id))+'.'+QUOTENAME(T.name)
21+
SELECT
22+
QUOTENAME(SCHEMA_NAME(T.schema_id))+'.'+QUOTENAME(T.name),
23+
'type'
1924
FROM sys.types AS T
2025
WHERE T.schema_id = SCHEMA_ID(@ClassName)
2126
),
22-
XMLSchemaInfo(name) AS
27+
XMLSchemaInfo(FullName, ItemType) AS
2328
(
24-
SELECT QUOTENAME(SCHEMA_NAME(XSC.schema_id))+'.'+QUOTENAME(XSC.name)
29+
SELECT
30+
QUOTENAME(SCHEMA_NAME(XSC.schema_id))+'.'+QUOTENAME(XSC.name),
31+
'xml_schema_collection'
2532
FROM sys.xml_schema_collections AS XSC
2633
WHERE XSC.schema_id = SCHEMA_ID(@ClassName)
2734
),
28-
DropStatements(no,cmd) AS
35+
SchemaInfo(FullName, ItemType) AS
2936
(
30-
SELECT 10,
31-
'DROP ' +
32-
CASE type WHEN 'P' THEN 'PROCEDURE'
33-
WHEN 'PC' THEN 'PROCEDURE'
34-
WHEN 'U' THEN 'TABLE'
35-
WHEN 'IF' THEN 'FUNCTION'
36-
WHEN 'TF' THEN 'FUNCTION'
37-
WHEN 'FN' THEN 'FUNCTION'
38-
WHEN 'FT' THEN 'FUNCTION'
39-
WHEN 'V' THEN 'VIEW'
40-
END +
41-
' ' +
42-
name +
43-
';'
37+
SELECT
38+
QUOTENAME(S.name),
39+
'schema'
40+
FROM sys.schemas AS S
41+
WHERE S.schema_id = SCHEMA_ID(PARSENAME(@ClassName,1))
42+
),
43+
DropStatements(no,FullName,ItemType) AS
44+
(
45+
SELECT 10, FullName, ItemType
4446
FROM ObjectInfo
4547
UNION ALL
46-
SELECT 20,
47-
'DROP TYPE ' +
48-
name +
49-
';'
48+
SELECT 20, FullName, ItemType
5049
FROM TypeInfo
5150
UNION ALL
52-
SELECT 30,
53-
'DROP XML SCHEMA COLLECTION ' +
54-
name +
55-
';'
51+
SELECT 30, FullName, ItemType
5652
FROM XMLSchemaInfo
5753
UNION ALL
58-
SELECT 10000,'DROP SCHEMA ' + QUOTENAME(name) +';'
59-
FROM sys.schemas
60-
WHERE schema_id = SCHEMA_ID(PARSENAME(@ClassName,1))
54+
SELECT 10000, FullName, ItemType
55+
FROM SchemaInfo
6156
),
6257
StatementBlob(xml)AS
6358
(
64-
SELECT cmd [text()]
65-
FROM DropStatements
59+
SELECT GDIC.cmd [text()]
60+
FROM DropStatements DS
61+
CROSS APPLY tSQLt.Private_GetDropItemCmd(DS.FullName, DS.ItemType) GDIC
6662
ORDER BY no
6763
FOR XML PATH(''), TYPE
6864
)
@@ -71,5 +67,6 @@ BEGIN
7167

7268
EXEC(@Cmd);
7369
END;
70+
/*SnipEnd: CreateDropClassStatement.ps1*/
7471
---Build-
7572
GO

Source/tSQLt.Private_CreateFakeFunction.ssp.sql

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,24 @@ BEGIN
4545
BEGIN
4646
EXEC('CREATE FUNCTION '+@FunctionName+'('+@ParameterList+') RETURNS '+@ReturnType+' AS BEGIN RETURN '+@FakeFunctionName+'('+@ParameterCallList+');END;');
4747
END
48-
ELSE IF (@FakeDataSource IS NOT NULL)
48+
ELSE
4949
BEGIN
50-
DECLARE @newTbleName NVARCHAR(MAX);
51-
EXEC tSQLt.Private_PrepareFakeFunctionOutputTable @FakeDataSource, @newTbleName OUTPUT;
52-
EXEC ('CREATE FUNCTION '+@FunctionName+'('+@ParameterList+') RETURNS TABLE AS RETURN ( SELECT * FROM '+@newTbleName+');');
53-
END
54-
ELSE
55-
BEGIN
56-
EXEC('CREATE FUNCTION '+@FunctionName+'('+@ParameterList+') RETURNS TABLE AS RETURN SELECT * FROM '+@FakeFunctionName+'('+@ParameterCallList+');');
50+
DECLARE @cmd NVARCHAR(MAX);
51+
IF (@FakeDataSource IS NOT NULL)
52+
BEGIN
53+
SET @cmd =
54+
CASE
55+
WHEN OBJECT_ID(@FakeDataSource) IS NOT NULL THEN 'SELECT * FROM '+@FakeDataSource
56+
WHEN @FakeDataSource LIKE '(%)%(%)' THEN 'SELECT * FROM '+@FakeDataSource
57+
ELSE @FakeDataSource
58+
END;
59+
END
60+
ELSE
61+
BEGIN
62+
SET @cmd = 'SELECT * FROM '+@FakeFunctionName+'('+@ParameterCallList+')';
63+
END;
64+
SET @cmd = 'CREATE FUNCTION '+@FunctionName+'('+@ParameterList+') RETURNS TABLE AS RETURN '+@cmd+';'
65+
EXEC(@cmd);
5766
END;
5867
END;
5968
GO

0 commit comments

Comments
 (0)