Skip to content

Commit 5cfd5e3

Browse files
committed
Removed snapshot'ing from FakeFunction.
1 parent fe3ba03 commit 5cfd5e3

2 files changed

Lines changed: 146 additions & 52 deletions

File tree

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

Tests/FakeFunctionTests.class.sql

Lines changed: 129 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -464,79 +464,83 @@ BEGIN
464464

465465
END;
466466
GO
467-
CREATE PROCEDURE FakeFunctionTests.[test can fake Inline table function using a temp table as fake data source]
467+
CREATE PROCEDURE FakeFunctionTests.[test can fake Inline table function using a table as fake data source]
468468
AS
469469
BEGIN
470470
EXEC('CREATE FUNCTION FakeFunctionTests.AFunction() RETURNS TABLE AS RETURN (SELECT 1 AS one);');
471471

472-
CREATE TABLE #expected (a CHAR(1));
473-
INSERT INTO #expected VALUES('a');
472+
CREATE TABLE FakeFunctionTests.Expected (a CHAR(1));
473+
INSERT INTO FakeFunctionTests.Expected VALUES('a');
474+
SELECT TOP(0) A.* INTO FakeFunctionTests.Actual FROM FakeFunctionTests.Expected A RIGHT JOIN FakeFunctionTests.Expected X ON 1=0;
474475

475-
EXEC tSQLt.FakeFunction @FunctionName = 'FakeFunctionTests.AFunction', @FakeDataSource = '#expected';
476+
EXEC tSQLt.FakeFunction @FunctionName = 'FakeFunctionTests.AFunction', @FakeDataSource = 'FakeFunctionTests.Expected';
476477

477-
SELECT * INTO #actual FROM FakeFunctionTests.AFunction();
478+
INSERT INTO FakeFunctionTests.Actual SELECT * FROM FakeFunctionTests.AFunction();
478479

479-
EXEC tSQLt.AssertEqualsTable '#expected', '#actual';
480+
EXEC tSQLt.AssertEqualsTable 'FakeFunctionTests.Expected', 'FakeFunctionTests.Actual';
480481
END;
481482
GO
482-
CREATE PROCEDURE FakeFunctionTests.[test can fake multi-statement table function using a temp table as fake data source]
483+
CREATE PROCEDURE FakeFunctionTests.[test can fake multi-statement table function using a table as fake data source]
483484
AS
484485
BEGIN
485486
EXEC('CREATE FUNCTION FakeFunctionTests.AFunction(@a int) RETURNS @t TABLE (a int) AS BEGIN;
486487
INSERT INTO @t (a) VALUES (0) RETURN; END;');
487488

488-
CREATE TABLE #expected (a CHAR(1));
489-
INSERT INTO #expected VALUES('a');
489+
CREATE TABLE FakeFunctionTests.Expected (a CHAR(1));
490+
INSERT INTO FakeFunctionTests.Expected VALUES('a');
491+
SELECT TOP(0) A.* INTO FakeFunctionTests.Actual FROM FakeFunctionTests.Expected A RIGHT JOIN FakeFunctionTests.Expected X ON 1=0;
490492

491-
EXEC tSQLt.FakeFunction @FunctionName = 'FakeFunctionTests.AFunction', @FakeDataSource = '#expected';
493+
EXEC tSQLt.FakeFunction @FunctionName = 'FakeFunctionTests.AFunction', @FakeDataSource = 'FakeFunctionTests.Expected';
492494

493-
SELECT * INTO #actual FROM FakeFunctionTests.AFunction(123);
495+
INSERT INTO FakeFunctionTests.Actual SELECT * FROM FakeFunctionTests.AFunction(123);
494496

495-
EXEC tSQLt.AssertEqualsTable '#expected', '#actual';
497+
EXEC tSQLt.AssertEqualsTable 'FakeFunctionTests.Expected', 'FakeFunctionTests.Actual';
496498
END;
497499
GO
498-
CREATE PROCEDURE FakeFunctionTests.[test can fake CLR table function using a temp table as fake data source]
500+
CREATE PROCEDURE FakeFunctionTests.[test can fake CLR table function using a table as fake data source]
499501
AS
500502
BEGIN
503+
CREATE TABLE FakeFunctionTests.Expected (a CHAR(1));
504+
INSERT INTO FakeFunctionTests.Expected VALUES('a');
505+
SELECT TOP(0) A.* INTO FakeFunctionTests.Actual FROM FakeFunctionTests.Expected A RIGHT JOIN FakeFunctionTests.Expected X ON 1=0;
506+
507+
EXEC tSQLt.FakeFunction @FunctionName = 'tSQLt_testutil.AClrTvf', @FakeDataSource = 'FakeFunctionTests.Expected';
501508

502-
CREATE TABLE #expected (a CHAR(1));
503-
INSERT INTO #expected VALUES('a');
509+
INSERT INTO FakeFunctionTests.Actual SELECT * FROM tSQLt_testutil.AClrTvf('', '');
504510

505-
EXEC tSQLt.FakeFunction @FunctionName = 'tSQLt_testutil.AClrTvf', @FakeDataSource = '#expected';
506-
507-
SELECT * INTO #actual FROM tSQLt_testutil.AClrTvf('', '');
508-
509-
EXEC tSQLt.AssertEqualsTable '#expected', '#actual';
511+
EXEC tSQLt.AssertEqualsTable 'FakeFunctionTests.Expected', 'FakeFunctionTests.Actual';
510512
END;
511513
GO
512514
CREATE PROCEDURE FakeFunctionTests.[test can fake function with one parameter]
513515
AS
514516
BEGIN
515517
EXEC('CREATE FUNCTION FakeFunctionTests.AFunction(@a int) RETURNS TABLE AS RETURN (SELECT @a AS one);');
516518

517-
CREATE TABLE #expected (a INT);
518-
INSERT INTO #expected VALUES(1);
519+
CREATE TABLE FakeFunctionTests.Expected (a INT);
520+
INSERT INTO FakeFunctionTests.Expected VALUES(1);
521+
SELECT TOP(0) A.* INTO FakeFunctionTests.Actual FROM FakeFunctionTests.Expected A RIGHT JOIN FakeFunctionTests.Expected X ON 1=0;
519522

520-
EXEC tSQLt.FakeFunction @FunctionName = 'FakeFunctionTests.AFunction', @FakeDataSource = '#expected';
523+
EXEC tSQLt.FakeFunction @FunctionName = 'FakeFunctionTests.AFunction', @FakeDataSource = 'FakeFunctionTests.Expected';
521524

522-
SELECT * INTO #actual FROM FakeFunctionTests.AFunction(123);
525+
INSERT INTO FakeFunctionTests.Actual SELECT * FROM FakeFunctionTests.AFunction(123);
523526

524-
EXEC tSQLt.AssertEqualsTable '#expected', '#actual';
527+
EXEC tSQLt.AssertEqualsTable 'FakeFunctionTests.Expected', 'FakeFunctionTests.Actual';
525528
END;
526529
GO
527530
CREATE PROCEDURE FakeFunctionTests.[test can fake function with multiple parameters]
528531
AS
529532
BEGIN
530533
EXEC('CREATE FUNCTION FakeFunctionTests.AFunction(@a int, @b int, @c char(1)) RETURNS TABLE AS RETURN (SELECT @a AS one);');
531534

532-
CREATE TABLE #expected (a INT);
533-
INSERT INTO #expected VALUES(1);
534-
535-
EXEC tSQLt.FakeFunction @FunctionName = 'FakeFunctionTests.AFunction', @FakeDataSource = '#expected';
535+
CREATE TABLE FakeFunctionTests.Expected (a INT);
536+
INSERT INTO FakeFunctionTests.Expected VALUES(1);
537+
SELECT TOP(0) A.* INTO FakeFunctionTests.Actual FROM FakeFunctionTests.Expected A RIGHT JOIN FakeFunctionTests.Expected X ON 1=0;
538+
539+
EXEC tSQLt.FakeFunction @FunctionName = 'FakeFunctionTests.AFunction', @FakeDataSource = 'FakeFunctionTests.Expected';
536540

537-
SELECT * INTO #actual FROM FakeFunctionTests.AFunction(123, 321, 'a');
541+
INSERT INTO FakeFunctionTests.Actual SELECT * FROM FakeFunctionTests.AFunction(123, 321, 'a');
538542

539-
EXEC tSQLt.AssertEqualsTable '#expected', '#actual';
543+
EXEC tSQLt.AssertEqualsTable 'FakeFunctionTests.Expected', 'FakeFunctionTests.Actual';
540544
END;
541545
GO
542546
CREATE PROCEDURE FakeFunctionTests.[test can fake function with VALUES clause as fake data source]
@@ -657,21 +661,102 @@ BEGIN
657661
EXEC tSQLt.AssertEqualsTable 'FakeFunctionTests.Expected', @NewTable;
658662
END;
659663
GO
660-
CREATE PROCEDURE FakeFunctionTests.[test Private_PrepareFakeFunctionOutputTable creates snapshot table in passed in schema]
661-
AS
662-
BEGIN
663-
DECLARE @NewTable NVARCHAR(MAX);
664+
-- THIS CODE FEELS UNNECESSARY
665+
-- DECLARE @newTbleName NVARCHAR(MAX);
666+
-- EXEC tSQLt.Private_PrepareFakeFunctionOutputTable @FakeDataSource, @newTbleName OUTPUT;
664667

665-
EXEC('CREATE SCHEMA [a random schema];');
668+
--THESE TESTS FAIL without a snapshot because they use temp tables
669+
--CREATE PROCEDURE FakeFunctionTests.[test can fake function with multiple parameters]
670+
--AS
671+
--BEGIN
672+
-- EXEC('CREATE FUNCTION FakeFunctionTests.AFunction(@a int, @b int, @c char(1)) RETURNS TABLE AS RETURN (SELECT @a AS one);');
666673

667-
EXEC tSQLt.Private_PrepareFakeFunctionOutputTable @FakeDataSource = 'SELECT 1013 AS a',@SchemaName = 'a random schema', @NewTableName = @NewTable OUT;
674+
-- CREATE TABLE #expected (a INT);
675+
-- INSERT INTO #expected VALUES(1);
668676

669-
SELECT SCHEMA_NAME(O.schema_id) SchemaName INTO #Actual FROM sys.objects O WHERE O.object_id = OBJECT_ID(@NewTable);
677+
-- EXEC tSQLt.FakeFunction @FunctionName = 'FakeFunctionTests.AFunction', @FakeDataSource = '#expected';
670678

671-
SELECT TOP(0) A.* INTO #Expected FROM #Actual A RIGHT JOIN #Actual X ON 1=0;
672-
INSERT INTO #Expected
673-
VALUES('a random schema');
679+
-- SELECT * INTO #actual FROM FakeFunctionTests.AFunction(123, 321, 'a');
680+
681+
-- EXEC tSQLt.AssertEqualsTable '#expected', '#actual';
682+
--END;
683+
--GO
684+
--CREATE PROCEDURE FakeFunctionTests.[test can fake CLR table function using a temp table as fake data source]
685+
--AS
686+
--BEGIN
687+
688+
-- CREATE TABLE #expected (a CHAR(1));
689+
-- INSERT INTO #expected VALUES('a');
690+
691+
-- EXEC tSQLt.FakeFunction @FunctionName = 'tSQLt_testutil.AClrTvf', @FakeDataSource = '#expected';
692+
693+
-- SELECT * INTO #actual FROM tSQLt_testutil.AClrTvf('', '');
694+
695+
-- EXEC tSQLt.AssertEqualsTable '#expected', '#actual';
696+
--END;
697+
--GO
698+
--CREATE PROCEDURE FakeFunctionTests.[test can fake function with one parameter]
699+
--AS
700+
--BEGIN
701+
-- EXEC('CREATE FUNCTION FakeFunctionTests.AFunction(@a int) RETURNS TABLE AS RETURN (SELECT @a AS one);');
702+
703+
-- CREATE TABLE #expected (a INT);
704+
-- INSERT INTO #expected VALUES(1);
705+
706+
-- EXEC tSQLt.FakeFunction @FunctionName = 'FakeFunctionTests.AFunction', @FakeDataSource = '#expected';
707+
708+
-- SELECT * INTO #actual FROM FakeFunctionTests.AFunction(123);
709+
710+
-- EXEC tSQLt.AssertEqualsTable '#expected', '#actual';
711+
--END;
712+
--GO
713+
--CREATE PROCEDURE FakeFunctionTests.[test can fake Inline table function using a temp table as fake data source]
714+
--AS
715+
--BEGIN
716+
-- EXEC('CREATE FUNCTION FakeFunctionTests.AFunction() RETURNS TABLE AS RETURN (SELECT 1 AS one);');
717+
718+
-- CREATE TABLE #expected (a CHAR(1));
719+
-- INSERT INTO #expected VALUES('a');
720+
721+
-- EXEC tSQLt.FakeFunction @FunctionName = 'FakeFunctionTests.AFunction', @FakeDataSource = '#expected';
722+
723+
-- SELECT * INTO #actual FROM FakeFunctionTests.AFunction();
724+
725+
-- EXEC tSQLt.AssertEqualsTable '#expected', '#actual';
726+
--END;
727+
--GO
728+
--CREATE PROCEDURE FakeFunctionTests.[test can fake multi-statement table function using a temp table as fake data source]
729+
--AS
730+
--BEGIN
731+
-- EXEC('CREATE FUNCTION FakeFunctionTests.AFunction(@a int) RETURNS @t TABLE (a int) AS BEGIN;
732+
-- INSERT INTO @t (a) VALUES (0) RETURN; END;');
733+
734+
-- CREATE TABLE #expected (a CHAR(1));
735+
-- INSERT INTO #expected VALUES('a');
736+
737+
-- EXEC tSQLt.FakeFunction @FunctionName = 'FakeFunctionTests.AFunction', @FakeDataSource = '#expected';
738+
739+
-- SELECT * INTO #actual FROM FakeFunctionTests.AFunction(123);
740+
741+
-- EXEC tSQLt.AssertEqualsTable '#expected', '#actual';
742+
--END;
743+
--GO
744+
--CREATE PROCEDURE FakeFunctionTests.[test Private_PrepareFakeFunctionOutputTable creates snapshot table in passed in schema]
745+
--AS
746+
--BEGIN
747+
-- DECLARE @NewTable NVARCHAR(MAX);
748+
749+
-- EXEC('CREATE SCHEMA [a random schema];');
750+
751+
-- EXEC tSQLt.Private_PrepareFakeFunctionOutputTable @FakeDataSource = 'SELECT 1013 AS a',@SchemaName = 'a random schema', @NewTableName = @NewTable OUT;
752+
753+
-- SELECT SCHEMA_NAME(O.schema_id) SchemaName INTO #Actual FROM sys.objects O WHERE O.object_id = OBJECT_ID(@NewTable);
754+
755+
-- SELECT TOP(0) A.* INTO #Expected FROM #Actual A RIGHT JOIN #Actual X ON 1=0;
756+
-- INSERT INTO #Expected
757+
-- VALUES('a random schema');
758+
759+
-- EXEC tSQLt.AssertEqualsTable #Expected, #Actual
760+
--END;
761+
--GO
674762

675-
EXEC tSQLt.AssertEqualsTable #Expected, #Actual
676-
END;
677-
GO

0 commit comments

Comments
 (0)